The focus of this course is on object-oriented design. The course starts with an introduction to object-oriented programming. Java is used as the reference programming language. Then, in the first part of the course students will (i) learn how to assess (both manually and automatically) the design quality of object-oriented systems, and (ii) get a deep understanding of design patterns. The course takes a hands-on, learning-by-doing approach with assignments performed on open source systems. For example, students will be required to run a "design critique" of well-known open source systems, identifying design flaws and refactoring them. In the second part of the course, students will apply the acquired expertise in the context of a group project.