part of the system that you need to change. 2) Re-factor the rest of the system to use the abstraction layer 3) Create new classes in your new implementation, and have your abstraction layer delegate to the old or the new classes as required. 4) Remove the old implementation 5) Rinse and repeat the previous two steps, shipping your system in the meantime if desired 6) Once the old implementation has been completely replaced, you can remove the abstraction layer if you like