diff --git a/commands/make/make.drush.inc b/commands/make/make.drush.inc
index 0929c05..0ea72a3 100644
--- a/commands/make/make.drush.inc
+++ b/commands/make/make.drush.inc
@@ -509,7 +509,7 @@ function make_move_build($build_path) {
         // TODO: This only protects one level of directories from being removed.
         $files = drush_scan_directory($file->filename, '/./', array('.', '..'), 0, FALSE);
         foreach ($files as $file) {
-          $ret = $ret && drush_copy_dir($file->filename, $destination . DIRECTORY_SEPARATOR . $file->basename, TRUE);
+          $ret = $ret && drush_copy_dir($file->filename, $destination . DIRECTORY_SEPARATOR . $file->basename, FILE_EXISTS_MERGE);
         }
       }
       else {
diff --git a/includes/filesystem.inc b/includes/filesystem.inc
index 7b049c4..53c7c28 100644
--- a/includes/filesystem.inc
+++ b/includes/filesystem.inc
@@ -5,6 +5,13 @@
  * @{
  */
 
+/**
+ * Behavior for drush_copy_dir() and drush_move_dir() when destinations exist.
+ */
+define('FILE_EXISTS_ABORT', 0);
+define('FILE_EXISTS_OVERWRITE', 1);
+define('FILE_EXISTS_MERGE', 2);
+
  /**
   * Determines whether the provided path is absolute or not
   * on the specified O.S. -- starts with "/" on *nix, or starts
@@ -158,19 +165,26 @@ function drush_delete_tmp_dir($dir) {
  *   $src = "/b/a" and $dest = "/c/a".  To copy "a" to "/c" and rename
  *   it to "d", then $dest = "/c/d".
  * @param $overwrite
- *   If TRUE, the destination will be deleted if it exists.
+ *   Action to take if destination already exists.
+ *     - FILE_EXISTS_OVERWRITE - completely removes existing directory.
+ *     - FILE_EXISTS_ABORT - aborts the operation.
+ *     - FILE_EXISTS_MERGE - Leaves existing files and directories in place.
  * @return
  *   TRUE on success, FALSE on failure.
  */
-function drush_copy_dir($src, $dest, $overwrite = FALSE) {
+function drush_copy_dir($src, $dest, $overwrite = FILE_EXISTS_ABORT) {
   // Preflight based on $overwrite if $dest exists.
   if (file_exists($dest)) {
-    if ($overwrite) {
+    if ($overwrite === FILE_EXISTS_OVERWRITE) {
       drush_op('drush_delete_dir', $dest, TRUE);
     }
-    else {
+    elseif ($overwrite === FILE_EXISTS_ABORT) {
       return drush_set_error('DRUSH_DESTINATION_EXISTS', dt('Destination directory !dest already exists.', array('!dest' => $dest)));
     }
+    elseif ($overwrite === FILE_EXISTS_MERGE) {
+      // $overwrite flag may indicate we should merge instead.
+      drush_log(dt('Merging existing !dest directory', array('!dest' => $dest)));
+    }
   }
   // $src readable?
   if (!is_readable($src)) {
diff --git a/tests/makeTest.php b/tests/makeTest.php
index 7342829..b634725 100644
--- a/tests/makeTest.php
+++ b/tests/makeTest.php
@@ -244,7 +244,7 @@ class makeMakefileCase extends Drush_CommandTestCase {
    */
   function testMakeMoveBuild() {
     // Manually download a module.
-    $this->drush('pm-download', array('cck_signup'), array('destination' => UNISH_SANDBOX . '/modules', 'yes' => NULL));
+    $this->drush('pm-download', array('cck_signup'), array('destination' => UNISH_SANDBOX . '/sites/all/modules/contrib', 'yes' => NULL));
 
     // Build a make file.
     $config = $this->getMakefile('contrib-destination');
@@ -252,7 +252,7 @@ class makeMakefileCase extends Drush_CommandTestCase {
     $this->drush('make', array($makefile, '.'), $config['options']);
 
     // Verify that the manually downloaded module still exists.
-    $this->assertFileExists(UNISH_SANDBOX . '/modules/cck_signup/README.txt');
+    $this->assertFileExists(UNISH_SANDBOX . '/sites/all/modules/contrib/cck_signup/README.txt');
   }
 
   function getMakefile($key) {
