Hardware in various environments such as High Performance Computing and Embedded Systems has become ever more heterogeneous in order to improve computational performance and as an aspect of managing power and energy constraints. This increase in heterogeneity requires middleware and programming model abstractions to eliminate additional complexities that it brings. This chapter explores self-adaptation including aspects such as automated configuration and deployment of applications to different heterogeneous infrastructure and for their redeployment. This therefore not only mitigates complexity but aims to take advantage of the existing hardware heterogeneity. The overall result of is a self-adaptive framework that manages application Quality of Service (QoS) at runtime, which includes the automatic migration of applications between different accelerated infrastructures. Two case studies are considered: HPC and embedded systems. Discussion covers when this migration is appropriate and quantifies the likely benefits.