Computer Networks is an important, and often compulsory, course in most Computer Science curricula. Teaching it is often challenging due to the abstract nature of the subject, and the wide range of material that has to be covered. At the same time, an understanding of core concepts in computer networking is increasingly important to students, due to the increasing proliferation of networked devices, and the associated challenges in designing and developing networked and distributed applications. In this paper we discuss our experiences in bringing a stronger practical content to this course over several years,following the Conceive Design - Implement - Operate (CDIO) philosophy. This introduced a series of carefully designed practical assignments throughout the course, building on traditional simple client-server program exercises, through a puzzle based assignment using hand crafted packets, to the final project which involves the construction of a collaborative peer-to-peer network running on student laptops involving the entire class. We will discuss how the practical content is purposefully designed to support the more theoretical aspects of the course, as well as some of the technical challenges encountered.