At the end of the course students should be able to: (i) Present a conceptual model of distributed systems; (ii) Describe key components of a distributed system and evaluate the trade offs of alternative architectural models; (iii) Suggest algorithm suitable for application in distributed systems; (iv) Build prototype implementations of distributed systems; and (v) Demonstrate an understanding of the challenges faced by future distributed systems