diff --git INSTALL.txt INSTALL.txt
index 55d2c2b..718df25 100644
--- INSTALL.txt
+++ INSTALL.txt
@@ -2,7 +2,7 @@ Installation
 ------------
 Drush make depends on drush (the DRUpal SHell). To use drush_make, you
 first download and install drush from http://drupal.org/project/drush. Install
-instructions can be found at http://tinyurl.com/drush-installation. It contains
+instructions can be found at http://tinyurl.com/install-drush. It contains
 a section about installing other commands like drush_make.
 
 Here is the relevant section.
diff --git drush_make.download.inc drush_make.download.inc
index 8199166..27bf1cb 100644
--- drush_make.download.inc
+++ drush_make.download.inc
@@ -81,6 +81,14 @@ function _drush_make_download_file($download) {
     $download_mechanism = drush_get_option('download-mechanism');
   }
 
+  // Check if curl is available.
+  if (!isset($download_mechanism)) {
+    $download_mechanism = 'drush_make';
+    if (drush_shell_exec("curl --version")) {
+      $download_mechanism = 'curl';
+    }
+  }
+
   $tmp_path = drush_make_tmp();
   $filename = FALSE;
   if (is_string($download)) {
@@ -99,11 +107,10 @@ function _drush_make_download_file($download) {
       $download_path = $tmp_path . '/__download__';
       drush_make_mkdir($download_path);
 
-      if (!isset($download_mechanism) || $download_mechanism == 'curl') {
+      if ($download_mechanism == 'curl') {
         $header_file = $tmp_path . '/__header__';
         touch($header_file);
-        drush_shell_exec("ls %s", $download_path);
-        $files = drush_shell_exec_output();
+        $files = scandir($download_path);
         if ($download['request_type'] == 'get' && drush_shell_cd_and_exec($download_path, 'curl -LOD %s %s', $header_file, $url)) {
           $download_mechanism = 'curl';
           $success = TRUE;
@@ -113,8 +120,7 @@ function _drush_make_download_file($download) {
           $success = TRUE;
         }
 
-        drush_shell_exec("ls %s", $download_path);
-        $files_new = drush_shell_exec_output();
+        $files_new = scandir($download_path);
         // Can't use list beacuse it's not guarenteed to be at offset 0.
         $diff = array_diff($files_new, $files);
         $filename = $tmp_path . '/__download__/' . array_shift($diff);
@@ -225,9 +231,14 @@ function _drush_make_download_file($download) {
       if ($content_type) {
         $file .= '.' . $content_type;
       }
-      drush_shell_exec('mv %s %s', $filename, $tmp_path . '/' . $file);
-      drush_shell_exec('rm -f %s', $tmp_path . '/__header__');
-      drush_shell_exec('rm -rf %s', $tmp_path . '/__download__');
+      if (drush_copy_dir($filename, $tmp_path . '/' . $file, TRUE)) {
+        drush_op('drush_delete_tmp_dir', $filename);
+      }
+      if (file_exists($tmp_path . '/__header__')) {
+        drush_delete_tmp_dir($tmp_path . '/__header__');
+      }
+      drush_delete_tmp_dir($tmp_path . '/__download__');
+
       return $tmp_path . '/' . $file;
     }
   }
@@ -249,79 +260,140 @@ function drush_make_download_file_unpack($filename, $download_location, $name) {
       drush_make_download_file_unpack_zip($filename, $download_location);
       break;
     default:
-      drush_shell_exec('mv %s %s', $filename, $download_location . ($name ? '/' . $name : ''));
+      if (drush_copy_dir($filename, $download_location . ($name ? '/' . $name : ''), TRUE)) {
+        drush_op('drush_delete_tmp_dir', $filename);
+      }
+  }
+}
+
+/**
+ * If available use the drush archiver extension.
+ * @see git://github.com/das-peter/drush_archiver.git
+ *
+ * @todo Contribute the archiver extension for drush :).
+ *
+ * @param string $file
+ * @param string $location
+ */
+function drush_make_unpack_archive($file, $location) {
+  $drush_commands = drush_get_commands();
+  if(isset($drush_commands['archiver-extract'])) {
+    $drush_commands['archiver-extract']['arguments']['archive'] = $file;
+    $drush_commands['archiver-extract']['arguments']['location'] = $location;
+    drush_dispatch($drush_commands['archiver-extract']);
+    return TRUE;
   }
+  return FALSE;
 }
 
 function drush_make_download_file_unpack_tar($filename, $download_location) {
-  $tmp_path = drush_make_tmp();
+  static $native_tar;
+
+  // Check for native tar support.
+  if (!is_bool($native_tar)) {
+    $native_tar = drush_shell_exec("tar --version");
+  }
 
-  list($main_directory) = array_reverse(explode('/', $download_location));
+  if (!$native_tar) {
+    return drush_make_unpack_archive($filename, $download_location);
+  }
+  else {
+    $tmp_path = drush_make_tmp();
+
+    list($main_directory) = array_reverse(explode('/', $download_location));
 
-  drush_make_mkdir($tmp_path . '/__unzip__');
-  drush_shell_exec('tar -x -C %s -f %s', $tmp_path . '/__unzip__', $filename);
+    drush_make_mkdir($tmp_path . '/__unzip__');
+    drush_shell_exec('tar -x -C %s -f %s', $tmp_path . '/__unzip__', $filename);
 
-  _drush_make_download_file_move($tmp_path, $filename, $download_location);
+    _drush_make_download_file_move($tmp_path, $filename, $download_location);
+    return TRUE;
+  }
+  return FALSE;
 }
 
 function drush_make_download_file_unpack_gzip($filename, $download_location) {
-  // Find out where contents will end up. Retrieve last column of output using awk.
-  drush_shell_exec("gzip --list %s", $filename);
-  $info = drush_shell_exec_output();
-  if ($info) {
-    foreach ($info as $line) {
-      $matches = array();
-      preg_match('/^\s+[0-9]+\s+[0-9-]+\s+[0-9\.%]+\s+(.*)$/', $line, $matches);
-      if (isset($matches[1])) {
-        $file = $matches[1];
-        break;
+  static $native_gzip;
+
+  // Check for native gzip support.
+  if (!is_bool($native_gzip)) {
+    $native_gzip = drush_shell_exec("gzip --version");
+  }
+
+  if (!$native_gzip) {
+    return drush_make_unpack_archive($filename, $download_location);
+  }
+  else {
+    // Find out where contents will end up. Retrieve last column of output using awk.
+    drush_shell_exec("gzip --list %s", $filename);
+    $info = drush_shell_exec_output();
+    if ($info) {
+      foreach ($info as $line) {
+        $matches = array();
+        preg_match('/^\s+[0-9]+\s+[0-9-]+\s+[0-9\.%]+\s+(.*)$/', $line, $matches);
+        if (isset($matches[1])) {
+          $file = $matches[1];
+          break;
+        }
+      }
+      if (isset($file)) {
+        // Unzip it and then delete the tar file.
+        drush_shell_exec('gzip -d %s', $filename);
+        return drush_make_download_file_unpack_tar($file, $download_location);
       }
     }
-    if (isset($file)) {
-      // Unzip it and then delete the tar file.
-      drush_shell_exec('gzip -d %s', $filename);
-      return drush_make_download_file_unpack_tar($file, $download_location);
-    }
+    drush_make_error('PACKAGE_ERROR', dt('Could not retrieve package information for %filename.', array('%filename' => $filename)));
+    return FALSE;
   }
-  drush_make_error('PACKAGE_ERROR', dt('Could not retrieve package information for %filename.', array('%filename' => $filename)));
-  return;
 }
 
 function drush_make_download_file_unpack_zip($filename, $download_location) {
-  $tmp_path = drush_make_tmp();
+    static $native_zip;
+
+  // Check for native tar support.
+  if (!is_bool($native_zip)) {
+    $native_zip = drush_shell_exec("unzip --version");
+  }
+
+  if (!$native_zip) {
+    return drush_make_unpack_archive($filename, $download_location);
+  }
+  else {
+    $tmp_path = drush_make_tmp();
 
-  list($main_directory) = array_reverse(explode('/', $download_location));
+    list($main_directory) = array_reverse(explode('/', $download_location));
 
-  drush_make_mkdir($tmp_path . '/__unzip__');
-  drush_shell_exec("unzip %s -d %s", $filename, $tmp_path . '/__unzip__');
+    drush_make_mkdir($tmp_path . '/__unzip__');
+    drush_shell_exec("unzip %s -d %s", $filename, $tmp_path . '/__unzip__');
 
-  _drush_make_download_file_move($tmp_path, $filename, $download_location);
+    _drush_make_download_file_move($tmp_path, $filename, $download_location);
+  }
 }
 
 function _drush_make_download_file_move($tmp_path, $filename, $download_location) {
-  drush_shell_exec('ls %s', $tmp_path . '/__unzip__');
-  $lines = drush_shell_exec_output();
+  $lines = scandir($tmp_path . '/__unzip__');
   $main_directory = basename($download_location);
   if (count($lines) == 1) {
     $directory = array_shift($lines);
     if ($directory != $main_directory) {
-      drush_shell_exec('mv %s %s', $tmp_path . '/__unzip__/' . $directory, $tmp_path . '/__unzip__/' . $main_directory);
+      drush_copy_dir($tmp_path . '/__unzip__/' . $directory, $tmp_path . '/__unzip__/' . $main_directory, TRUE);
     }
-    drush_shell_exec('cp -Rf %s %s', $tmp_path . '/__unzip__/' . $main_directory, dirname($download_location));
-    drush_shell_exec('rm -rf %s', $tmp_path . '/__unzip__');
+    drush_copy_dir($tmp_path . '/__unzip__/' . $main_directory, dirname($download_location), TRUE);
+    drush_delete_tmp_dir($tmp_path . '/__unzip__');
   }
   elseif (count($lines) > 1) {
-    drush_shell_exec('rm -rf %s', $download_location);
-    drush_shell_exec('mv %s %s', $tmp_path . '/__unzip__', $download_location);
+    if (drush_copy_dir($tmp_path . '/__unzip__', $download_location, TRUE)) {
+      drush_op('drush_delete_tmp_dir', $tmp_path . '/__unzip__');
+    }
+    drush_delete_tmp_dir($download_location);
   }
 
   // Remove the tarball.
   if (file_exists($filename)) {
-    drush_shell_exec('rm %s', $filename);
+    drush_op('unlink', $filename);
   }
 
   if (file_exists($tmp_path . '/__unzip__')) {
-    drush_shell_exec('rm -rf %s', $tmp_path . '/__unzip__');
+    drush_delete_tmp_dir($tmp_path . '/__unzip__');
   }
 }
 
@@ -361,10 +433,11 @@ function drush_make_download_git($name, $download, $download_location) {
   // protocol = http://
   // site = example.com/
   // resource = blog/index?name=foo
-  $regex = '#^(.*?//)*(.*@)*([\w\.\d]*)(:(\d+))*(/*)(.*)$#';
+  $regex = '#^(.*?//)*(.*@)*([\w\.\-\d]*)(:(\d+))*(/*)(.*)$#';
   $matches = array();
   preg_match($regex, $download['url'], $matches);
   // Assign the matched parts of url to the result array
+  $url_array['protocol'] = $matches[1];
   $url_array['user']     = $matches[2];
   $url_array['port']     = $matches[5];
   $url_array['host']     = $matches[3];
@@ -384,23 +457,25 @@ function drush_make_download_git($name, $download, $download_location) {
     // build url for git clone to support different protocols
     // currently all protocols seems to use the same url schema
     switch ($url_array['protocol']) {
+      case 'http':
+        $url_array['protocol']= 'git';
       case 'git':
+      case 'git+ssh':
         // github uses two different urls, working copy urls using scp format
         // git@domain:repo export url format are git://domain/repo
-        if ($wc) {
+        if ($wc && stristr($url_array['host'], 'github')) {
           // working copy is set
           $url = 'git@'. $url_array['host'] .':'. $url_array['resource'];
           break;
         }
-      case 'ssh':
-      case 'http':
       case 'https':
+      case 'ssh':
       case 'ftp':
       case 'ftps':
       case 'rsync':
       case 'file':
         // @TODO: implement port & user options
-        $url_array['protocol'] .'://'. $url_array['user'] . $url_array['host'] .'/'. $url_array['resource'];
+        $url = $url_array['protocol'] .'://'. $url_array['user'] . $url_array['host'] .'/'. $url_array['resource'];
         break;
 
       default:
@@ -423,7 +498,7 @@ function drush_make_download_git($name, $download, $download_location) {
       // get current directory (for move back later)
       $cwd = getcwd();
       // change path to working copy of cloned repo
-      chdir($tmp_location);
+      drush_op('chdir', $tmp_location);
 
       // Progress branch / tag / revision download. Ensure that only one option ist set (branch OR tag OR revision)
       // check if branch a other than master
@@ -475,15 +550,16 @@ function drush_make_download_git($name, $download, $download_location) {
         }
       }
       // move back to last current directory (first line)
-      chdir($cwd);
+      drush_op('chdir', $cwd);
     }
 
     // Remove .git/ directory if working-copy flag was not specified.
     if (!$wc && file_exists($tmp_location . '/.git')) {
-      drush_shell_exec("rm -rf %s", $tmp_location . '/.git');
+      drush_delete_tmp_dir($tmp_location . '/.git');
+    }
+    if (drush_copy_dir($tmp_location, $download_location, TRUE)) {
+      drush_op('drush_delete_tmp_dir', $tmp_location);
     }
-    drush_shell_exec('cp -Rf %s %s', $tmp_location, dirname($download_location));
-    drush_shell_exec("rm -rf %s", dirname($tmp_location));
     return dirname($tmp_location);
   }
   else {
@@ -522,8 +598,9 @@ function drush_make_download_bzr($name, $download, $download_location) {
     array_unshift($args, $command);
     if (call_user_func_array('drush_shell_exec', $args)) {
       drush_log(dt('%project downloaded from %url.', array('%project' => $name, '%url' => $download['url'])), 'ok');
-      drush_shell_exec('cp -Rf %s %s', $tmp_location, dirname($download_location));
-      drush_shell_exec('rm -rf %s', dirname($tmp_location));
+      if (drush_copy_dir($tmp_location, dirname($download_location), TRUE)) {
+        drush_op('drush_delete_tmp_dir', $tmp_location);
+      }
       return dirname($download_location);
     }
   }
@@ -531,7 +608,7 @@ function drush_make_download_bzr($name, $download, $download_location) {
     $download['url'] = dt("unspecified location");
   }
   drush_make_error('DOWNLOAD_ERROR', dt('Unable to download %project from %url.', array('%project' => $name, '%url' => $download['url'])));
-  drush_shell_exec('rm -rf %s', dirname($tmp_location));
+  drush_delete_tmp_dir(dirname($download_location));
   return FALSE;
 }
 
diff --git drush_make.drush.inc drush_make.drush.inc
index eea53f6..f762a5c 100644
--- drush_make.drush.inc
+++ drush_make.drush.inc
@@ -164,6 +164,7 @@ function drush_make_projects($recursion, $contrib_destination, $info) {
     }
   }
   $ignore_checksums = drush_get_option('ignore-checksums');
+  $build_path = drush_get_context('drush_make_build_path');
   foreach ($info['projects'] as $key => $project) {
     // Merge the known data onto the project info.
     $project += array(
@@ -381,16 +382,18 @@ function drush_make_move_build($build_path) {
   $tmp_path = drush_make_tmp();
   $ret = TRUE;
   if ($build_path == '.') {
-    drush_shell_exec('ls -A %s', $tmp_path . '/__build__');
-    $info = drush_shell_exec_output();
+    $info = scandir($tmp_path . '/__build__');
     foreach ($info as $file) {
-      $ret = $ret && drush_shell_exec("cp -Rf %s %s", $tmp_path . '/__build__/' . $file, $build_path);
+      $ret = $ret && drush_copy_dir($tmp_path . '/__build__/' . $file, $build_path, TRUE);
     }
   }
   else {
-    drush_make_mkdir(dirname($build_path));
-    drush_shell_exec("mv %s %s", $tmp_path . '/__build__', $tmp_path . '/' . basename($build_path));
-    drush_shell_exec("cp -Rf %s %s", $tmp_path . '/' . basename($build_path), dirname($build_path));
+    drush_make_mkdir(realpath(dirname($build_path)) . '/' . $build_path);
+    if (drush_copy_dir($tmp_path . '/__build__', $tmp_path . '/' . basename($build_path), TRUE)) {
+      drush_op('drush_delete_tmp_dir', $tmp_path . '/__build__');
+    }
+
+    drush_copy_dir($tmp_path . '/' . basename($build_path), realpath($build_path), TRUE);
   }
   if (!$ret) {
     drush_set_error(dt("Cannot move build into place"));
diff --git drush_make.project.inc drush_make.project.inc
index 3359046..4d3c567 100644
--- drush_make.project.inc
+++ drush_make.project.inc
@@ -170,12 +170,16 @@ class DrushMakeProject {
             if ($this->type === 'core') {
               drush_make_mkdir($this->project_directory . '/profiles/default/translations');
               drush_make_mkdir($this->project_directory . '/modules/system/translations');
-              drush_shell_exec("cp %s %s", $filename, $this->project_directory . '/profiles/default/translations/' . $langcode . '.po');
-              drush_shell_exec("mv %s %s", $filename, $this->project_directory . '/modules/system/translations');
+              drush_copy_dir($filename, $this->project_directory . '/profiles/default/translations/' . $langcode . '.po', TRUE);
+              if (drush_copy_dir($filename, $this->project_directory . '/modules/system/translations')) {
+                drush_op('drush_delete_tmp_dir', $filename);
+              }
             }
             else {
               drush_make_mkdir($this->project_directory . '/translations');
-              drush_shell_exec("mv %s %s", $filename, $this->project_directory . '/translations');
+              if (drush_copy_dir($filename, $this->project_directory . '/translations')) {
+                drush_op('drush_delete_tmp_dir', $filename);
+              }
             }
           }
           else {
@@ -243,7 +247,6 @@ class DrushMakeProject {
     }
     $build_path = $this->buildPath($this->name);
     drush_make_projects(TRUE, trim($build_path, '/'), $info);
-    drush_make_libraries(trim($build_path, '/'), $info);
   }
 }
 
@@ -294,7 +297,7 @@ class DrushMakeProject_Module extends DrushMakeProject {
 class DrushMakeProject_Profile extends DrushMakeProject {
   public function __construct(&$project) {
     parent::__construct($project);
-    $this->contrib_destination = ($this->destination ? $this->destination : 'profiles');
+    $this->contrib_destination = (!empty($this->destination) ? $this->destination : 'profiles');
   }
 
   protected function buildPath($directory) {
diff --git drush_make.utilities.inc drush_make.utilities.inc
index 46a3923..49b79e7 100644
--- drush_make.utilities.inc
+++ drush_make.utilities.inc
@@ -249,7 +249,7 @@ function drush_make_clean_tmp() {
     return;
   }
   if (!drush_get_option('no-clean', FALSE)) {
-    drush_shell_exec('rm -rf %s', $tmp_dir);
+    drush_delete_tmp_dir($tmp_dir);
   }
   else {
     drush_log(dt('Temporary directory: %dir', array('%dir' => $tmp_dir)), 'ok');
@@ -258,25 +258,27 @@ function drush_make_clean_tmp() {
 
 function drush_make_prepare_install($build_path) {
   $default = drush_make_tmp() . '/__build__/sites/default';
-  drush_shell_exec("cp %s %s", $default . '/default.settings.php', $default . '/settings.php');
+  drush_copy_dir($default . '/default.settings.php', $default . '/settings.php', TRUE);
   drush_make_mkdir($default . '/files');
-  drush_shell_exec("chmod a+w %s %s", $default . '/settings.php', $default . '/files');
+  drush_op('chmod', $default . '/settings.php', 0666);
+  drush_op('chmod', $default . '/files', 0666);
 }
 
 function drush_make_md5() {
-  if (drush_shell_exec("( find %s -type f -exec cksum {} \; )", drush_make_tmp())) {
+  $tmp_folder = drush_make_tmp();
+  $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($tmp_folder));
+  if (count($files)) {
     $hashes = array();
-    foreach (drush_shell_exec_output() as $line) {
-      // Remove the temporary build path which includes a (relatively)
-      // unique timestamp.
-      $line = str_replace(drush_make_tmp(), '', $line);
-      // Trim to sanitize.
-      $line = trim($line);
-      $hashes[] = $line;
+    foreach ($files as $item) {
+      $filepath = $tmp_folder . DIRECTORY_SEPARATOR . $item;
+      if ($item->isFile() && !$item->isDir()) {
+        $hashes[] = md5_file($item->getPathname()) . ' ' . $item->getSize() . ' ' . str_replace('\\', '/', str_replace($tmp_folder . DIRECTORY_SEPARATOR, '', $item->getPathname()));
+      }
     }
     sort($hashes);
     $output = implode("\n", $hashes);
     drush_log(dt('Build hash: %md5', array('%md5' => md5($output))), 'ok');
+    return $output;
   }
 }
 
@@ -288,14 +290,20 @@ function drush_make_tar($build_path) {
   $dirname = basename($build_path, '.tar.gz');
   // Move the build directory to a more human-friendly name, so that tar will
   // use it instead.
-  drush_shell_exec("mv %s %s", $tmp_path . '/__build__', $tmp_path . '/' . $dirname);
+  if (drush_copy_dir($tmp_path . '/__build__', $tmp_path . '/' . $dirname, TRUE)) {
+    drush_op('drush_delete_tmp_dir', $tmp_path . '/__build__');
+  }
   // Only move the tar file to it's final location if it's been built
   // successfully.
   if (drush_shell_exec("tar -C %s -Pczf %s %s", $tmp_path, $tmp_path . '/' . $filename, $dirname)) {
-    drush_shell_exec("mv %s %s", $tmp_path . '/' . $filename, $build_path);
+    if (drush_copy_dir($tmp_path . '/' . $filename, $build_path, TRUE)) {
+      drush_op('drush_delete_tmp_dir', $tmp_path . '/' . $filename);
+    }
   };
   // Move the build directory back to it's original location for consistency.
-  drush_shell_exec("mv %s %s", $tmp_path . '/' . $dirname, $tmp_path . '/__build__');
+  if (drush_copy_dir($tmp_path . '/' . $dirname, $tmp_path . '/__build__', TRUE)) {
+    drush_op('drush_delete_tmp_dir', $tmp_path . '/' . $dirname);
+  }
 }
 
 /**
@@ -613,5 +621,5 @@ function drush_make_http_request($url, $destination, $headers = array(), $method
  * @see http://theserverpages.com/php/manual/en/function.mkdir.php#50383
  */
 function drush_make_mkdir($path) {
-  return is_dir($path) || (drush_make_mkdir(dirname($path)) && drush_shell_exec('mkdir %s', $path));
+  return is_dir($path) || (drush_mkdir(dirname($path)) && mkdir($path));
 }
