3.3. Implementing primitives and messages