This document discusses self-adaptive software and provides examples of where static software failed to adapt. It describes the architectural elements of self-adaptive software, including services/components, a service registry, context manager, adaptation planner, component executor. It presents a case study of Tekio, a self-adaptive vision system, and experimental results showing it can adapt faster and more robustly than static implementations. Lessons learned are that modern software needs to adapt to context, rely on dynamically loaded services, and the adaptation planner is key to mapping context to configurations, while maintaining performance.