Principles and practice of distributed system design. Computations, consistency semantics, and failure models. Programming paradigms including group communication, RPC, distributed shared memory, and distributed objects. Operating system kernel support; distributed system services including replication, caching, fi le system management, naming, clock synchronization, and multicast communication. Case studies.