The requirements of distributed software systems become increasingly complex. Among the aspects that characterize such a complexity are the inherent distribution of resources and activity - that makes global control practically infeasible and emphasizes the need for decentralized control - and the highly dynamic and changing operating conditions in which today's distributed applications operate - that calls for open and adaptive software.