added protocol implementation