add more implementation of protocol