This course examines the fundamental principles that are vital to the construction of distributed systems. Topics include models of distributed systems, synchronization, mutual exclusion, fault tolerance, naming, group communication, transactions, and distributed algorithms. As well it examines higher level abstractions such as distributed file systems; process scheduling and peer-to-peer overlay networks.