correct implementation of the protocol