  Self-adaptivity allows software systems to autonomously adjust their behavior
during run-time to reduce the cost complexities caused by manual maintenance.
In this paper, an approach for building an external adaptation engine for
self-adaptive software systems is proposed. In order to improve the quality of
self-adaptive software systems, this research addresses two challenges in
self-adaptive software systems. The first challenge is managing the complexity
of the adaptation space efficiently and the second is handling the run-time
uncertainty that hinders the adaptation process. This research utilizes
Case-based Reasoning as an adaptation engine along with utility functions for
realizing the managed system's requirements and handling uncertainty.
