diff --git a/migrate.hostmaster.inc b/migrate.hostmaster.inc
index e4a2abe..7e27b19 100644
--- a/migrate.hostmaster.inc
+++ b/migrate.hostmaster.inc
@@ -3,6 +3,19 @@
 /**
  * @file manual site migrate system
  */
+
+/**
+ * Convert a directory name to a drush aliasname, stripping unwanted chars.
+ *
+ * @param string $name The directory name.
+ *
+ * @return string
+ *   A drush alias name for the platform.
+ */
+function _provision_path_to_platform_alias($name) {
+  return '@platform_' . preg_replace("/[!\W]/", "", basename(rtrim($name, '/')));
+}
+
 function drush_provision_hostmaster_migrate_validate($site, $platform) {
   // XXX: this doesn't actually document the pre alpha9 upgrade path
   drush_print('
@@ -43,7 +56,7 @@ We are making the following assumptions:
     drush_set_option('site_name', '@hostmaster');
     drush_set_option('old_platform', d('@hostmaster')->platform->name);
 
-    $new_platform = '@platform_' . preg_replace("/[!\W]/", "", basename(rtrim($platform, '/')));
+    $new_platform = _provision_path_to_platform_alias($platform);
     drush_invoke_process('@none', "provision-save", array($new_platform), array(
       'context_type' => 'platform',
       'server' => '@server_master',
@@ -95,7 +108,7 @@ We are making the following assumptions:
     }
 
 
-    $old_platform = '@platform_' . preg_replace("/[!\W]/", "", basename(rtrim($data['publish_path'], '/')));
+    $old_platform = _provision_path_to_platform_alias($data['publish_path']);
     drush_invoke_process('@none', "provision-save", array($old_platform), array(
       'context_type' => 'platform',
       'server' => $server,
@@ -109,7 +122,7 @@ We are making the following assumptions:
       return false;
     }
 
-    $new_platform = '@platform_' . preg_replace("/[!\W]/", "", basename(rtrim($platform, '/')));
+    $new_platform = _provision_path_to_platform_alias($platform);
     drush_invoke_process('@none', "provision-save", array($new_platform), array(
       'context_type' => 'platform',
       'server' => $server,
diff --git a/platform/drupal/packages_8.inc b/platform/drupal/packages_8.inc
index 86da08f..272c3a6 100644
--- a/platform/drupal/packages_8.inc
+++ b/platform/drupal/packages_8.inc
@@ -99,6 +99,8 @@ function _provision_system_query($type) {
     if ($frags[0] == 'sites' && $frags[1] != 'all') {
       $package->platform = -1;
     }
+    // In Drupal 8, system_get_info returns enabled modules/themes.
+    $package->status = 1;
 
     $package->filename = realpath($package->filename);
 
diff --git a/platform/install.provision.inc b/platform/install.provision.inc
index adfe6a3..d5a1968 100644
--- a/platform/install.provision.inc
+++ b/platform/install.provision.inc
@@ -19,7 +19,35 @@ function drush_provision_drupal_provision_install_validate() {
     return drush_set_error("PROVISION_URL_REQUIRED", dt("You need to specify a valid url to install a site"));
   }
   if (_provision_drupal_site_exists()) {
-    return drush_set_error('PROVISION_SITE_INSTALLED');
+
+    // If "force-reinstall" option is set, delete the database and files.
+    if (drush_get_option('force-reinstall', FALSE)) {
+
+      drush_log(dt('Forcing reinstall...'), 'ok');
+
+      // Load the current database name from drushrc.php.
+      // I cannot find another way to find the current db_name!
+      require_once(d()->site_path . '/drushrc.php');
+      $old_db_name = $options['db_name'];
+
+      if (d()->service('db')->database_exists($old_db_name)) {
+        d()->service('db')->drop_database($old_db_name);
+        drush_log(dt('Dropped database @database.', array(
+          '@database' => $old_db_name,
+        )), 'ok');
+      }
+
+      // Destroy site_path
+      if (file_exists(d()->site_path)) {
+        _provision_recursive_delete( d()->site_path );
+        drush_log(dt('Deleted @site_path.', array('@site_path' => d()->site_path)), 'ok');
+      }
+    }
+
+    // Check again if site does not exist after the forced reinstall.
+    if (_provision_drupal_site_exists()) {
+      return drush_set_error('PROVISION_SITE_INSTALLED');
+    }
   }
 }
 
@@ -59,14 +87,28 @@ function drush_provision_drupal_provision_install() {
 
   drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_SITE);
 
-  // call a backend task to do the actual installation.
-  $result = provision_backend_invoke(d()->name, "provision-install-backend", array(), array('client_email' => drush_get_option('client_email')));
-  // pass the login link back to the front end.
-  drush_set_option('login_link', $result['context']['login_link']);
+  // Install site according to site_install_method.
+  drush_log(dt('Installing site with the "!method" method.', array(
+    '!method' => drush_get_option('site_install_method', 'profile'),
+  )), 'ok');
+
+  // Run Drupal installation if option was specified
+  if (drush_get_option('site_install_method', 'profile') == 'profile') {
+
+    // call a backend task to do the actual installation.
+    $result = provision_backend_invoke(d()->name, "provision-install-backend", array(), array('client_email' => drush_get_option('client_email')));
+    // pass the login link back to the front end.
+    drush_set_option('login_link', $result['context']['login_link']);
+
+    drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_FULL);
+    drush_set_option('installed', TRUE, 'site');
+  }
+  elseif (drush_get_option('site_install_method', 'profile') == 'manual') {
+    drush_set_option('login_link', 'http://' . d()->uri . '/install.php');
+  }
 
-  drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_FULL);
-  drush_set_option('installed', TRUE, 'site');
   _provision_drupal_maintain_aliases();
+
 }
 
 /**
@@ -74,10 +116,17 @@ function drush_provision_drupal_provision_install() {
  * any changes to things such as available modules/ themes can take affect.
  */
 function drush_provision_drupal_post_provision_install() {
-  drush_set_option('installed', TRUE, 'site');
-  _provision_drupal_rebuild_caches();
-  drush_set_option('packages', _scrub_object(provision_drupal_system_map()), 'site');
-  _provision_client_create_symlink();
-  drush_include_engine('drupal', 'cron_key');
+
+  // If Drupal profile was installed, rebuild drupal caches and save enabled packages for aegir.
+  if (drush_get_option('site_install_method', 'profile') == 'profile' && drush_get_option('installed', FALSE, 'site')) {
+    _provision_drupal_rebuild_caches();
+    drush_set_option('packages', _scrub_object(provision_drupal_system_map()), 'site');
+    _provision_client_create_symlink();
+    drush_include_engine('drupal', 'cron_key');
+  }
+  // For all other install methods, just create the symlink.
+  else {
+    _provision_client_create_symlink();
+  }
 }
 
diff --git a/platform/migrate.provision.inc b/platform/migrate.provision.inc
index b3fec3a..d47413f 100644
--- a/platform/migrate.provision.inc
+++ b/platform/migrate.provision.inc
@@ -80,7 +80,7 @@ function drush_provision_drupal_provision_migrate($platform, $new_name = NULL) {
   // If the site is migrated between platforms and not just renamed,
   // we should update the info collected about source and target platform first.
   // Note that we have to exclude Hostmaster platform from this extra verify.
-  if (!provision_is_hostmaster_site()) {
+  if (!provision_is_hostmaster_site() && drush_get_option('provision_verify_platforms_before_migrate', TRUE)) {
     if (!is_null(d($platform)->name) && (d($platform)->name != d()->platform->name)) {
       provision_backend_invoke('@hostmaster', 'hosting-task', array(d()->platform->name, 'verify'), array('force' => TRUE));
       sleep(5); // A small trick to avoid high load and race conditions.
diff --git a/provision.api.php b/provision.api.php
index 436cbcd..3f491ff 100644
--- a/provision.api.php
+++ b/provision.api.php
@@ -7,6 +7,16 @@
  * @see drush_command_invoke_all()
  */
 
+/**
+ * Possible variables to set in local.drushrc.php or another drushrc location Drush supports.
+ *
+ * usage:
+ *   $options['provision_backup_suffix'] = '.tar.bz2';
+ *
+ * provision_verify_platforms_before_migrate - When migrating many sites turning this off can save time, default TRUE.
+ * provision_backup_suffix - Method to set the compression used for backups... e.g. '.tar.bz2' or '.tar.', defaults to '.tar.gz'.
+ *
+ */
 
 /**
  * Implements hook_drush_load(). Deprecated. Removed in Drush 7.x.
