all control flow should be accomplishable by three instructions: allocate copy send Allocate takes two arguments: type (an rvalue), and result (an lvalue). It verifies that type is a Class, fetches the number of slots required for that Class, and allocates that many slots of storage. It places a reference to the new storage in result. Allocate will only accept a small fixed set of type values. It probably also needs a size argument so it can allocate arbitrary sized messages. Copy takes two arguments: from (an rvalue), and to (an lvalue). It makes a copy of the reference in from and places it in to. Send takes one argument: message (an rvalue). It verifies that message is a Message, extracts the target and invokes the target's dispatcher on the Message. All other operations are side effects of particular message sends. An rvalue is either a slot reference, or an immediate value (provided by the loader). An lvalue is a slot reference. The current execution has a reference to the current execution context. That context is at depth zero. Each context has a reference to the parent context, which is at one higher depth than itself. A slot reference is a depth and an offest into the context at that depth. A depth of -1 indicates the message which initiated the current execution. The parent pointer can't be set by a copy; it has to be set automatically by allocate.