diff --git a/platform/clone.provision.inc b/platform/clone.provision.inc
index 7309c4e..c8963ca 100644
--- a/platform/clone.provision.inc
+++ b/platform/clone.provision.inc
@@ -13,29 +13,37 @@
  * Make sure we have a valid site being cloned, and that the file being cloned from exists
  */
 function drush_provision_drupal_provision_clone_validate($new_uri = null, $platform = null) {
+  if (d()->type == 'site') {
   drush_bootstrap(DRUSH_BOOTSTRAP_DRUPAL_SITE);
+  }
 }
 
 /**
  * Make a backup before making any changes, and add extract the file we are restoring from
  */
 function drush_provision_drupal_pre_provision_clone($new_uri, $platform = null) {
+  if (d()->type == 'site') {
   drush_invoke('provision-backup');
+  }
 }
 
 /**
  * Remove the extracted site directory
  */
 function drush_provision_drupal_pre_provision_clone_rollback($new_uri, $platform = null) {
+  if (d()->type == 'site') {
   $success =  provision_file()->unlink(drush_get_option('backup_file'))
     ->succeed('Removed unused clone site package')
     ->fail('Could not remove unused clone site package');
+  }
 }
 
 /**
  * Switch the clone directories around now that we have the new db installed
  */
-function drush_provision_drupal_provision_clone($new_uri, $platform = null) {
+function drush_provision_drupal_provision_clone($new_name, $platform = null) {
+  if (d()->type == 'site') {
+    $new_uri = $new_name;
   drush_set_option('old_platform', d()->platform->name);
 
   $options = d()->options;
@@ -70,5 +78,61 @@ function drush_provision_drupal_provision_clone($new_uri, $platform = null) {
   if (!drush_get_error()) {
     provision_backend_invoke($new_uri, 'provision-verify');
   }
+  }
+  elseif (d()->type == 'platform') {
+    // TODO filter $new_name for invalid chars
+    $new_platform_name = $new_name;
+    $old_platform_dir = d()->root . '/';
+    $options = d()->options;
+
+    if (empty($options['publish_path'])) {
+      $platforms_root = dirname($old_platform_dir);
+      $new_platform_dir = $platforms_root . '/' . $new_platform_name;
+    }
+    else {
+      $new_platform_dir = $options['publish_path'];
+    }
+    $options['root'] = $new_platform_dir;
+
+    // @todo: check the check
+    if (provision_file()->exists($options['root'])) {
+      drush_set_error('PROVISION_PLATFORM_ROOT_EXISTS', dt("The new platform root %root already exists!", array('%root' => $options['root'])));
+    }
+
+    $options['#name'] = '';
+
+    // todo: copied preg_replace from hosting_platform_insert(), could we generalise that code?
+    $platform_alias = '@platform_' . preg_replace("/[!\W]/", "", $new_platform_name);
 
+    drush_invoke_process('@none', 'provision-save', array($platform_alias), $options);
+
+    $regenerate_from_makefile = isset($options['regenerate_from_makefile']) ? $options['regenerate_from_makefile'] : FALSE;
+    if (!$regenerate_from_makefile || empty($options['makefile'])) {
+
+      $prior = drush_get_context('DRUSH_AFFIRMATIVE');
+      drush_set_context('DRUSH_AFFIRMATIVE', TRUE);
+
+      $rsync_options = array(
+        'exclude-sites' => TRUE,
+        'include-vcs' => TRUE,
+      );
+
+      if (drush_core_rsync($old_platform_dir, $new_platform_dir, $rsync_options, FALSE, FALSE)) {
+
+        drush_log(dt('Platform cloned from @old to @new.', array('@old' => $old_platform_dir, '@new' => $new_platform_dir)));
+      }
+      else {
+        drush_set_error('PROVISION_PLATFORM_CLONE_FAILED', dt('@old could not be cloned to @new. (error: %msg)',
+          array('@old' => $old_platform_dir, '@new' => $new_platform_dir, '%msg' => join("\n", drush_shell_exec_output()))));
+      }
+      drush_set_context('DRUSH_AFFIRMATIVE', $prior);
+    }
+    else {
+      // Re-generation from makefile is done in provision-verify.
+    }
+
+    if (!drush_get_error()) {
+      provision_backend_invoke($platform_alias, 'provision-verify');
+    }
+  }
 }
diff --git a/platform/provision_drupal.drush.inc b/platform/provision_drupal.drush.inc
index 2c75953..06ee299 100644
--- a/platform/provision_drupal.drush.inc
+++ b/platform/provision_drupal.drush.inc
@@ -290,6 +290,7 @@ function _provision_find_profiles() {
 
 function provision_drupal_find_sites() {
   if ($dir = opendir("./sites")) {
+    $sites = array();
     while (FALSE !== ($subdir = readdir($dir))) {
       // skip internal directory pointers
       if ($subdir != '.' && $subdir != '..') {
diff --git a/provision.drush.inc b/provision.drush.inc
index 0d25eaf..b2fde24 100644
--- a/provision.drush.inc
+++ b/provision.drush.inc
@@ -193,8 +193,14 @@ function provision_drush_command() {
     'arguments' => array(
       '@new_site' => dt('The Drush alias of the new site as generated by provision-save.'),
       '@platform_name' => dt('The Drush alias of the platform to clone the site onto.')),
+    'options' => array(
+      '--regenerate_from_makefile' => dt("When cloning a platform, regenerate it from the original makefile."),
+      '--publish_path' => dt('Directory path for the new platform'),
+      '--web_server' => dt('The server this new platform should be placed on, defaults to the same server as @platform'),
+    ),
     'examples' => array(
       'drush @site provision-clone @new_site @platform_name' => 'Clone the original site to the new site on a platform',
+      'drush @platform provision-clone @new_platform' => 'Clone the original platform to the a new platform',
     ),
     'bootstrap' => DRUSH_BOOTSTRAP_DRUPAL_ROOT
   );
