use companion type system for all messages