I don't believe anything is broken.

That's why they are called collaborating channel adapters. The inbound message is not sent the TcpSendingMessageHandler (outbound-adapter); it's sent to the TcpReceivingChannelAdapter (inbound adapter).

Regarding the header; the example I gave shows how to populate the header on an error channel.

I need to understand more of your message flow, and what you are trying to do with your messages.