It looks like ByteToMessageDecoder fires the remaining unread bytes when the handler is removed.  So as long as the new decoder is added before the old decoder is removed (and the new decoder appears later in the pipeline) then this should work.