Despite the inherent flexibility of software as a material, experience has shown that the overall software architecture determines the system's adaptability and evolvability. In order to achieve adaptability and evolvability a software architecture has to consist of self-contained building blocks -so-called software components - and explicit descriptions of component connections. In this paper we propose a specific notion of a software component which requires the description of the provided features and the requirements to other software components without actually referencing other components. We discuss a language - the #PI#-language - which supports the specification of such software components. In this approach a software system is giv...