Traditionally, an application has to be stopped to be adapted. This approach is not suitable for critical systems that have to be non-stop and highly available like bank, internet or telecommunication services. In these kinds of systems the adaptation must take place at run-time and the application should not be entirely stopped. In Component-based software engineering, the old notion of developing systems by writing code has been replaced by assembling existing components. Adapting a component-based application means adapting one or more of its components, and in general, adapting a component at run-time means disconnecting it from the application and connecting a new version of this component. The adaptation may also imply the modification of the connections between components, the migration of components from an execution site to another or the modification of the services provided by a specific component. In this paper, we start by a presentation of the dynamic adaptation problem ...