diff --git a/platform/hosting_platform.drush.inc b/platform/hosting_platform.drush.inc
index bb11e8a..38506d8 100644
--- a/platform/hosting_platform.drush.inc
+++ b/platform/hosting_platform.drush.inc
@@ -31,6 +31,7 @@ function hosting_platform_post_hosting_verify_task($task, $data) {
     $packages = $context['packages'];
 
     $node->verified = mktime(); // set verified flag on platform, to let it know it has been checked.
+    $node->platform_status = HOSTING_PLATFORM_ENABLED;
     // Save the platform being verified
     node_save($node);
 
@@ -65,3 +66,24 @@ function hosting_platform_post_hosting_verify_task($task, $data) {
   }
 }
 
+/**
+ * implementation of hook_hosting_post_DELETE
+ */
+function hosting_platform_post_hosting_delete_task($task, $data) {
+  $task->ref->platform_status = HOSTING_PLATFORM_DELETED;
+  $task->ref->no_verify = TRUE;
+  node_save($task->ref);
+}
+
+function hosting_platform_post_hosting_lock_task($task, $data) {
+  $task->ref->platform_status = HOSTING_PLATFORM_LOCKED;
+  $task->ref->no_verify = TRUE;
+  node_save($task->ref);
+}
+
+function hosting_platform_post_hosting_unlock_task($task, $data) {
+  $task->ref->platform_status = HOSTING_PLATFORM_ENABLED;
+  $task->ref->no_verify = TRUE;
+  node_save($task->ref);
+}
+
diff --git a/platform/hosting_platform.install b/platform/hosting_platform.install
index 1fcd434..a25a56f 100644
--- a/platform/hosting_platform.install
+++ b/platform/hosting_platform.install
@@ -40,6 +40,12 @@ function hosting_platform_schema() {
         'not null' => TRUE,
         'default' => 0,
       ),
+      'status' => array(
+        'type' => 'int',
+        'size' => 'tiny',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
     ),
     'primary key' => array('vid'),
   );
@@ -66,3 +72,10 @@ function hosting_platform_update_1() {
   }
   return $ret;
 }
+
+// Add a status field to platforms so we can Delete tasks on them
+function hosting_platform_update_2() {
+  $ret = array();
+  $ret[] = update_sql("ALTER TABLE {hosting_platform} ADD COLUMN status int(11) NOT NULL default '1'");
+  return $ret;
+}
diff --git a/platform/hosting_platform.module b/platform/hosting_platform.module
index 35f6393..8721187 100644
--- a/platform/hosting_platform.module
+++ b/platform/hosting_platform.module
@@ -1,4 +1,10 @@
 <?php
+
+define('HOSTING_PLATFORM_DELETED', -2);
+define('HOSTING_PLATFORM_LOCKED', -1);
+define('HOSTING_PLATFORM_QUEUED', 0);
+define('HOSTING_PLATFORM_ENABLED', 1);
+
 /**
  * @file Platform node type definition
  */
@@ -26,6 +32,29 @@ function hosting_platform_hosting_tasks($type) {
       'description' => t('Verify that the platform is correctly installed and working.'),
       'weight' => 10,
     );
+    $options['delete'] = array(
+      'title' => t('Delete'),
+      'description' => t('Deleting this platform will completely remove it from the hosting system.
+          This process can not be undone. It can not be performed if you have sites currently
+          running on this platform.
+          Are you really sure you want to delete this platform?'),
+      'weight' => 10,
+    );
+    $options['lock'] = array(
+      'title' => t('Lock'),
+      'description' => t('Locking this platform will not delete or disable it or its sites, but will
+          prevent any new sites from being created on it. This may be useful when you have sites that
+          cannot be migrated onto a newer platform, but you wish to prevent other administrators or
+          clients from continuing to provision on this platform. The platform can be unlocked later.
+          Are you really sure you want to lock this platform?'),
+      'weight' => 10,
+    );
+    $options['unlock'] = array(
+      'title' => t('Unlock'),
+      'description' => t('Unlocking this platform will allow sites to be provisioned on it. 
+          Are you really sure you want to unlock this platform?'),
+      'weight' => 10,
+    );
   }
   return $options;
 }
@@ -46,7 +75,7 @@ function hosting_platform_hosting_feature() {
  * Implementation of hook_perm()
  */
 function hosting_platform_perm() {
-  return array('create platform', 'view platform', 'edit platform', 'delete platform');
+  return array('create platform', 'view platform', 'edit platform', 'delete platform', 'lock platform', 'unlock platform', 'view locked platforms');
 }
 
 /**
@@ -67,15 +96,45 @@ function hosting_platform_access($op, $node, $account) {
     case 'delete':
       return user_access('delete platform', $account);
       break;
-  }  
+    case 'lock':
+      return user_access('lock platform', $account);
+      break;
+    case 'unlock':
+      return user_access('unlock platform', $account);
+      break;
+  } 
 }
 
 /**
- * Small helper function to get platforms.
+ * Small helper function to get platforms that haven't been deleted.
 */ 
 function _hosting_get_platforms() {
   $return = array();
-  $result = db_query("SELECT nid, title FROM {node} WHERE type='platform' AND status=1");
+  $result = db_query("SELECT n.nid, n.title FROM {node} n LEFT JOIN {hosting_platform} h ON n.nid = h.nid WHERE n.type='platform' AND n.status=1 AND h.status <> '%d'", HOSTING_PLATFORM_DELETED);
+  while($server = db_fetch_object($result)) {
+    $return[$server->nid] = $server->title;
+  }
+  return $return;
+}
+
+/**
+ * Small helper function to get platforms that haven't been deleted or locked.
+*/
+function _hosting_get_enabled_platforms() {
+  $return = array();
+  $result = db_query("SELECT n.nid, n.title FROM {node} n LEFT JOIN {hosting_platform} h ON n.nid = h.nid WHERE n.type='platform' AND n.status=1 AND h.status > '%d'", HOSTING_PLATFORM_LOCKED);
+  while($server = db_fetch_object($result)) {
+    $return[$server->nid] = $server->title;
+  }
+  return $return;
+}
+
+/**
+ * Small helper function to get platforms that have been locked.
+*/
+function _hosting_get_locked_platforms() {
+  $return = array();
+  $result = db_query("SELECT n.nid, n.title FROM {node} n LEFT JOIN {hosting_platform} h ON n.nid = h.nid WHERE n.type='platform' AND n.status=1 AND h.status = '%d'", HOSTING_PLATFORM_LOCKED);
   while($server = db_fetch_object($result)) {
     $return[$server->nid] = $server->title;
   }
@@ -137,6 +196,19 @@ function hosting_platform_form(&$node) {
 }
 
 /**
+ * Hide the delete button on platform nodes
+ */
+function hosting_platform_form_alter(&$form, &$form_state, $form_id) {
+  // Remove delete button from platform edit form, unless the platform's already been deleted via the Delete task
+  if ($form_id == 'platform_node_form') {
+    $node = $form['#node'];
+    if ($node->platform_status !== '-2') {
+      $form['buttons']['delete']['#type'] = 'hidden';
+    }
+  }
+}
+
+/**
  * Implementation of hook_insert().
  */
 function hosting_platform_insert($node) {
@@ -146,8 +218,8 @@ function hosting_platform_insert($node) {
   if (!isset($node->no_verify)) {
     hosting_add_task($node->nid, 'verify');
   }
-  db_query("INSERT INTO {hosting_platform} (vid, nid, publish_path, verified, web_server) VALUES (%d, %d, '%s', %d, %d)",
-    $node->vid, $node->nid, hosting_path_normalize($node->publish_path), $node->verified, $node->web_server);
+  db_query("INSERT INTO {hosting_platform} (vid, nid, publish_path, verified, web_server, status) VALUES (%d, %d, '%s', %d, %d, %d)",
+    $node->vid, $node->nid, $node->publish_path, $node->verified, $node->web_server, $node->platform_status);
 }
 
 /**
@@ -165,8 +237,8 @@ function hosting_platform_update($node) {
     if ($node->default_platform == 1) {
       variable_set('hosting_default_platform', $node->nid);
     }
-    db_query("UPDATE {hosting_platform} SET publish_path = '%s', web_server = %d, verified = %d WHERE nid=%d",
-              hosting_path_normalize($node->publish_path), $node->web_server, $node->verified, $node->nid);
+    db_query("UPDATE {hosting_platform} SET publish_path = '%s', web_server = %d, verified = %d, status= %d WHERE nid=%d",
+              $node->publish_path, $node->web_server, $node->verified, $node->platform_status, $node->nid);
   }
 }
 
@@ -197,7 +269,7 @@ function hosting_platform_delete($node) {
  * Implementation of hook_validate()
  */
 function hosting_platform_validate($node, &$form) {
-  if ($node->op != t('Delete') && $result = db_fetch_object(db_query("SELECT n.title AS name FROM {hosting_platform} AS h INNER JOIN {node} AS n ON n.nid = h.nid WHERE publish_path = '%s' AND web_server = %d AND n.nid <> %d", hosting_path_normalize($node->publish_path), $node->web_server, $node->nid))) {
+  if ($node->op != t('Delete') && $result = db_fetch_object(db_query("SELECT n.title AS name FROM {hosting_platform} AS h INNER JOIN {node} AS n ON n.nid = h.nid WHERE publish_path = '%s' AND web_server = %d AND n.nid <> %d AND h.status >= %d", hosting_path_normalize($node->publish_path), $node->web_server, $node->nid, HOSTING_PLATFORM_QUEUED))) {
     form_set_error('publish_path', t('Path already defined in platform %name', array('%name' => $result->name)));
   }
 }
@@ -206,7 +278,7 @@ function hosting_platform_validate($node, &$form) {
  * Implementation of hook_load().
  */
 function hosting_platform_load($node) {
-  $additions = db_fetch_object(db_query('SELECT publish_path, verified, web_server FROM {hosting_platform} WHERE vid = %d', $node->vid));
+  $additions = db_fetch_object(db_query('SELECT publish_path, verified, web_server, status AS platform_status FROM {hosting_platform} WHERE vid = %d', $node->vid));
   $iid = db_result(db_query("SELECT iid FROM {hosting_package_instance} i left join {hosting_package} p on p.nid=i.package_id WHERE p.package_type='platform' AND i.rid=%d", $node->nid));
   $additions->release = hosting_package_instance_load($iid);
   return $additions;
@@ -241,6 +313,11 @@ function hosting_platform_view($node, $teaser = FALSE, $page = FALSE) {
     '#value' => _hosting_node_link($node->web_server),
     '#weight' => -7
   );
+  $node->content['info']['status'] = array(
+    '#type' => 'item',
+    '#title' => t('Status'),
+    '#value' => _hosting_platform_status($node),
+  );
 
   if ($node->release) {
     $release = sprintf("%s %s", $node->release->title, $node->release->version);
@@ -281,12 +358,27 @@ function hosting_platform_view($node, $teaser = FALSE, $page = FALSE) {
   return $node;
 }
 
+function _hosting_platform_status($node) {
+  static $labels = array(
+    HOSTING_PLATFORM_QUEUED => "Queued",
+    HOSTING_PLATFORM_ENABLED => "Enabled",
+    HOSTING_PLATFORM_DELETED => "Deleted",
+    HOSTING_PLATFORM_LOCKED => "Locked",
+  );
+  return $labels[$node->platform_status];
+}
+
 /**
  * Implementation of hook_hosting_summary()
  */
 function hosting_platform_hosting_summary() {
   $summary = array();
-  $platforms = _hosting_get_platforms();
+  if (user_access('view locked platforms', $account)) {
+    $platforms = _hosting_get_platforms();
+  }
+  else {
+    $platforms = _hosting_get_enabled_platforms();
+  }
   $summary['platforms'] = theme('item_list', array_map('_hosting_node_link', array_keys($platforms)), t('Platforms'));
   return $summary;
 }
diff --git a/site/hosting_site.module b/site/hosting_site.module
index b67e72f..2c63ff9 100644
--- a/site/hosting_site.module
+++ b/site/hosting_site.module
@@ -309,23 +309,28 @@ function hosting_site_form($node) {
   }
 
   if (!$node->nid) {
-    $platforms = _hosting_get_platforms();
-    if (sizeof($platforms) > 1) {
-      $form['platform'] = array(
-        '#type' => 'radios',
-        '#title' => t('Platform'),
-        '#required' => TRUE,
-        '#description' => t('The platform you want the site to be hosted on.'),
-        '#options' => $platforms,
-        '#default_value' => HOSTING_DEFAULT_PLATFORM,
-      );
+    $platforms = _hosting_get_enabled_platforms();
+    if (sizeof($platforms)) {
+      if (sizeof($platforms) > 1) {
+        $form['platform'] = array(
+          '#type' => 'radios',
+          '#title' => t('Platform'),
+          '#required' => TRUE,
+          '#description' => t('The platform you want the site to be hosted on.'),
+          '#options' => $platforms,
+          '#default_value' => HOSTING_DEFAULT_PLATFORM,
+        );
+      }
+      else {
+        $form['platform'] = array('#type' => 'hidden', '#value' => key($platforms));
+      }
+      $form['port'] = _hosting_site_form_port();
+      $form['profile'] = _hosting_site_form_profile();
+      $form['site_language'] = _hosting_site_form_site_language();
     }
     else {
-      $form['platform'] = array('#type' => 'hidden', '#value' => key($platforms));
+      drupal_set_message(t('You have no enabled platforms! Please add or unlock a platform before attempting to create a site.'), 'error');
     }
-    $form['port'] = _hosting_site_form_port();
-    $form['profile'] = _hosting_site_form_profile();
-    $form['site_language'] = _hosting_site_form_site_language();
   }
   else {
     $form['info']['platform'] = array(
@@ -382,7 +387,6 @@ function hosting_site_form($node) {
     foreach(array('verified', 'last_cron', 'site_status') as $extra_attribute) {
       $form["$extra_attribute"] = array('#type' => 'value', '#value' => $node->$extra_attribute);
     }
-
   return $form;
 }
 
@@ -786,7 +790,7 @@ function hosting_site_list($filter_by = null, $filter_value = null) {
     array('data' => t('Language'), 'field' => 'site_language'),
     array('data' => t('Created'), 'field' => 'created', 'sort' => 'desc'),
   );
-  $platforms = _hosting_get_platforms();
+  $platforms = _hosting_get_enabled_platforms();
   if (sizeof($platforms) > 1) {
     $header[] = array('data' => t('Platform'), 'field' => 'platform');
   }
diff --git a/task/hosting_task.module b/task/hosting_task.module
index 05c09af..87f2f03 100644
--- a/task/hosting_task.module
+++ b/task/hosting_task.module
@@ -52,6 +52,21 @@ function hosting_task_menu_access($node, $task) {
       $on_delete_task = ($task == 'enable' || $task == 'delete');
       $site_enabled = (hosting_task_outstanding($node->nid, 'enable') || ($node->site_status == HOSTING_SITE_ENABLED));
       return (!$site_enabled && $on_delete_task) || ($site_enabled && !$on_delete_task);
+    }
+    if ($node->type == 'platform') {
+      // If the platform is in a deleted state, nothing else can be done with it
+      if (hosting_task_outstanding($node->nid, 'delete') || ($node->platform_status ==  HOSTING_PLATFORM_DELETED)) {
+        return FALSE;
+      }
+      // If the platform's been locked, we can unlock it, and delete or verify
+      if ($node->platform_status == HOSTING_PLATFORM_LOCKED) {
+        $platform_tasks = array('verify', 'unlock', 'delete');
+      }
+      else {
+      // If the platform's unlocked, we can lock it
+        $platform_tasks = array('verify', 'lock', 'delete');
+      }
+      return (in_array($task, $platform_tasks)); 
     } else {
       return true;
     }
