Completely rework the protocol system