The ISIS system transforms abstract type specifications into fault-tolerant distributed implementations, while insulating users from the mechanisms whereby fault-tolerance is achieved. This paper discusses the transformations that are used within ISIS, methods for achieving improved performance by concurrently updating replicated data, and user-level issues that arise when ISIS is employed to solve a fault-tolerant distributed problem. We describe a small set of communication primitives upon which the system is based. These achieve high levels of concurrency while respecting ordering requirements imposed by the caller. Finally, the performance of a prototype is reported for a variety of system loads and configurations. In particular, we demonstrate that performance of a replicated object in ISIS can equal or exceed that of a nonreplicated object.