This paper describes an object-oriented design model for structuring reliable distributed systems. A system is viewed as a collection of objects that are accessed and modified by transactions. Recovery techniques are incorporated to make transactions atomic in the presence of component crashes and concurrent operations. Atomicity of transactions is based on constructing recoverable objects using multiple versions and commit protocols. These concepts are extended to nested transactions. The operations on distributed objects are performed as remote procedure calls. This requires implementation of remote procedure calls in a reliable fashion. The facilities of reliable nested transactions and remote procedure calls are used to synthesize distributed objects that are highly reliable.