event support
fold event into protocol, add test