Migration, the process of moving work from one processor to another, is a very flexible tool that can be used to solve a variety of problems in parallel computing. For example, migration can be used to improve load balance, by migrating work away from overloaded processors [11,4,41,6]. Migration can improve communication performance, by moving pieces of work that communicate with each other closer together [33]. Migration can allow all the work to be moved off a processor [17] to allow another job to run there [10], or to vacate a node that is expected to fail or be shut down [34]. Migration techniques can also be used to implement checkpoint/restart for fault tolerance [12,42] -- under this model, checkpointing is simply migration to disk or the local memory of a remote processor. In this section, we discuss issues related to the migration of the flows of control. However, we will mainly focus on the thread migration techniques that we developed in the Charm++/AMPI runtime systems.