The research develops techniques that simplify the design and verification of fault-tolerant protocols for distributed computing systems. Protocol designers provided with the abstraction of a virtual system with perfect processor synchronization, reliable communication, and simple processor failures. Protocols written for this virtual system are translated into protocols that run correctly in "real" systems with unsynchronized processors, unreliable communication, and more complex failures. This methodology shields the designer from several aspects of the underlying system complexity; protocols are designed and verified for the simpler virtual system, and then run by simulation in the more complex underlying system.