This course studies the fundamental aspects of building distributed systems and developing distributed applications. Emphasis is placed on client-server and peer-to-peer application design, implementation using sockets and developing reliable applications through the use of replication, group membership protocols, clock synchronisation and logical timestamps. Students will have the opportunity to develop peer-to-peer and reliable distributed applications.