Peer-to-peer systems typically operate in large-scale, highly unreliable and insecure environments. Tackling this complexity requires good software design. Yet, many peer-to-peer systems are developed in an ad-hoc manner, and little has been published about their software architecture. We studied various academic and open source peer-to-peer systems and identified design patterns for the overlay network, the key architectural component of a peer-to-peer system. In this paper, we present a pattern language for overlay networks, consisting of new patterns as well as adaptations of existing patterns. This language proved highly useful for the development of our own peer-to-peer system. Note: This paper covers a whole pattern language rather than an individual pattern. For a writers' workshop session, we suggest the patterns Message Verifier and Router.