Software systems that execute in embedded and pervasive envi- ronments are frequently required to be self-monitoring, self-adapt- ing, and self-healing. However, supporting these self-* capabilities in pervasive environments creates a number of unique engineering challenges. This paper first describes the challenges that we believe to be the most significant based on our experience develop- ing ... [Show full abstract] real-world pervasive software applications with self-* capabili- ties. We then discuss each challenge in the context of four strategies commonly employed in self-* systems: dynamic soft- ware update, service discovery, transparent replication, and logical mobility. Finally, we explain how each strategy is implemented in our architectural middleware platform, Prism-MW. 1. INTRODUCTION As software engineers have developed new technologies for managing the ever-increasing complexity of designing and imple- menting modern-day software systems, it has become apparent that there is an equally pressing need for mechanisms that automate and simplify the management and modification of distributed sys- tems after they are deployed, i.e., during run-time. For example, safety-critical embedded systems are expected to be robust in the presence of failures that may occur throughout the computing stack — that is, in the hardware, network, operating system, mid- dleware, and application layers. This implies that such a system is self-monitoring, self-diagnosing, self-adapting, and self-healing. Systems with the capability to perform these types of transparent and autonomic dynamic adaptations during run-time in response to changes in the operating environment, non-functional require- ments, or functional specification (e.g., via reconfiguration and/or redeployment of software components) have been consequently termed self-* systems (7).