As information technologies become increasingly distributed and accessible to larger number of people and as commercial and government organizations are challenged to scale their applications and services to larger market shares, while reducing costs, there is demand for software methodologies and appli- tions to provide the following features: Richer application end-to-end functionality; Reduction of human involvement in the design and deployment of the software; Flexibility of software behaviour; and Reuse and composition of existing software applications and systems in novel or adaptive ways. When designing new distributed software systems, the above broad requi- ments and their translation into implementations are typically addressed by partial complementarities and overlapping technologies and this situation gives rise to significant software engineering challenges. Some of the challenges that may arise are: determining the components that the distributed applications should contain, organizing the application components, and determining the assumptions that one needs to make in order to implement distributed scalable and flexible applications, etc.