This course assumes that you have programming skills in object-oriented languages, preferably Java. Our goal here is to learn to develop programs that consist of several subprograms that work largely independently and are possibly distributed across different computers. Examples of distributed application programs are travel booking systems, banking applications, the Internet and the World-wide Web. You will learn how to coordinate the interaction and data exchange between independent subprograms in such a way that they solve the overall task cooperatively. You will also learn how to avoid blocking program parts, deadlocking the overall program, or producing data inconsistencies caused by poorly regulated access to shared resources. You will learn about different architecture models for distributed applications and understand how to transparently design access to local and remote resources, even across heterogeneous systems borders. Interactive exercises based on H5P serve to deepen and check learning progress as do programming assignments set up as BlueJ projects.