complete protocol impl. revamp