diff --git a/db/backup.provision.inc b/db/backup.provision.inc
index 8084870..0ce8afd 100644
--- a/db/backup.provision.inc
+++ b/db/backup.provision.inc
@@ -5,7 +5,8 @@ function drush_db_pre_provision_backup() {
 }
 
 function drush_db_pre_provision_backup_rollback() {
-  provision_file()->unlink(d()->site_path . '/database.sql')
+  $database_dump_file = drush_get_option('database_dump_file');
+  provision_file()->unlink($database_dump_file)
     ->succeed('Deleted mysql dump from sites directory')
     ->fail('Could not delete mysql dump from sites directory');
 }
diff --git a/db/deploy.provision.inc b/db/deploy.provision.inc
index 2bd56d5..f536918 100644
--- a/db/deploy.provision.inc
+++ b/db/deploy.provision.inc
@@ -13,14 +13,16 @@ function drush_db_pre_provision_deploy_rollback() {
 }
 
 function drush_db_provision_deploy() {
-  d()->service('db')->import_site_database();
+  $database_dump_file = drush_get_option('database_dump_file');
+  d()->service('db')->import_site_database($database_dump_file);
 }
 
 
 // Rollback doesn't apply here yet. Unless we trigger a deploy of the first dump
 // made. Which could go on infinitely if something is really long.
 function drush_db_post_provision_deploy() {
-  provision_file()->unlink(d()->site_path . '/database.sql')
+  $database_dump_file = drush_get_option('database_dump_file');
+  provision_file()->unlink($database_dump_file)
     ->succeed('Removed dump file @path after restoring from it')
     ->fail('Could not remove dump file @path', 'DRUSH_PERM_ERROR');
 }
diff --git a/platform/backup.provision.inc b/platform/backup.provision.inc
index 6bceb49..b4c01b1 100644
--- a/platform/backup.provision.inc
+++ b/platform/backup.provision.inc
@@ -79,25 +79,8 @@ function drush_provision_drupal_provision_backup() {
     _provision_drupal_create_settings_file();
   }
 
-  $olddir = getcwd();
-  // we need to do this because some retarded implementations of tar (e.g. SunOS) don't support -C
-
-  if (!chdir(d()->site_path)) {
-    return drush_set_error('PROVISION_BACKUP_PATH_NOT_FOUND', dt('cannot change directory to %dir', array('%dir' => d()->site_path)));
-  }
-  if (substr($backup_file, -2) == 'gz') {
-    // same as above: some do not support -z
-    $command = "tar cpf - . | gzip -c > %s";
-  } else {
-    $command = "tar cpf %s .";
-  }
-  $result = drush_shell_exec($command,  $backup_file);
-
-  // Get the size of the backup
-  $size = filesize($backup_file);
-  drush_set_option('backup_file_size', $size);
-
-  chdir($olddir);
+  drush_set_option('destination', $backup_file);
+  $result = drush_invoke('archive-dump');
 
   if (drush_get_option('cloaking_off_temp', FALSE)) {
     drush_log(dt("Re-cloaking database credentials after backup"));
diff --git a/platform/deploy.provision.inc b/platform/deploy.provision.inc
index 75c3966..0a1fb85 100644
--- a/platform/deploy.provision.inc
+++ b/platform/deploy.provision.inc
@@ -31,13 +31,12 @@ function drush_provision_drupal_provision_deploy_validate($backup_file = null) {
     ->succeed('Replacing the existing site at @path')
     ->status();
 
+  // We now always extract to a temp location
+  drush_set_option('extract_path', d()->site_path . '.restore');
+
   if ($exists) {
-    drush_set_option('extract_path', d()->site_path . '.restore');
     drush_set_option('old_db_name', drush_get_option('db_name', ''));
   }
-  else {
-    drush_set_option('extract_path', d()->site_path);
-  }
 
   drush_set_option('deploy_replace_site', $exists);
 }
@@ -52,25 +51,41 @@ function drush_provision_drupal_pre_provision_deploy($backup_file) {
     ->fail('Failed to extract the contents of @path to @target', 'PROVISION_BACKUP_EXTRACTION_FAILED')
     ->status();
   if ($extracted) {
+
+    // Site is probably in 'Site Archive Format' parsing ini...
+    // DEBUG: $manifest = array('docroot' => '/home/foo/bar/qux/web', 'sitedir' => 'sites/example.com');
+    $manifest = drush_archive_read_manifest(drush_get_option('extract_path'));
+
+    $docroot = basename($manifest['docroot']);
+    $extracted_site_path = drush_get_option('extract_path') . '/' . $docroot . '/' . $manifest['sitepath'];
+
+    drush_set_option('database_dump_file', drush_get_option('extract_path') . '/' . $manifest['database-default-file']);
+
+    if (count($manifest > 2)) {
+      drush_log(dt("Archive file contains more then one site, picking the first."), 'notice');
+    }
+
+    if ($ini['Global']['archive_format'] == 'platform') {
+      drush_log(dt("Archive file contains a whole platform, we are using only the site data."));
+    }
+
     // Make sure the files in the files directory are accessible by the web server.
-    provision_file()->chgrp(drush_get_option('extract_path') . '/files', d('@server_master')->web_group, TRUE)
+    provision_file()->chgrp($extracted_site_path . '/files', d('@server_master')->web_group, TRUE)
       ->succeed('Changed group ownership of files in <code>@path</code> to @gid')
       ->fail('Could not change group ownership of files in <code>@path</code> to @gid');
 
-    if (drush_get_option('deploy_replace_site', FALSE)) {
-      $old = d()->site_path . '.restore';
-      $new = d()->site_path;
+    $old = $extracted_site_path;
+    $new = d()->site_path;
 
-      $swapped = provision_file()->switch_paths($old, $new)
-        ->succeed('Swapping out the @path1 and @path2 directories was successful.')
-        ->fail('Swapping the @path1 and @path2 directories has failed.', 'DRUSH_PERM_ERROR')
-        ->status();
-      if ($swapped) {
-        drush_set_option('site_dirs_swapped', TRUE);
-      }
-      else {
-        return false;
-      }
+    $swapped = provision_file()->switch_paths($old, $new)
+      ->succeed('Swapping out the @path1 and @path2 directories was successful.')
+      ->fail('Swapping the @path1 and @path2 directories has failed.', 'DRUSH_PERM_ERROR')
+      ->status();
+    if ($swapped) {
+      drush_set_option('site_dirs_swapped', TRUE);
+    }
+    else {
+      return false;
     }
 
     // We have already created a new database. Save the info to the config files.
@@ -165,7 +180,7 @@ function drush_provision_drupal_post_provision_deploy() {
 
 
   // remove the restore directory 
-  if (!drush_get_error() && drush_get_option('deploy_replace_site', FALSE)) {
+  if (!drush_get_error()) {
     _provision_recursive_delete(drush_get_option('extract_path'));
   }
 
