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.
Gary P. Russell
Spring Integration Team
SpringSource, a division of VMware