diff --git a/platform/hosting_platform.drush.inc b/platform/hosting_platform.drush.inc
index bb11e8a..2af8980 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,12 @@ 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);
+}
+
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 d7d929e..a37fbd6 100644
--- a/platform/hosting_platform.module
+++ b/platform/hosting_platform.module
@@ -1,4 +1,9 @@
 <?php
+
+define('HOSTING_PLATFORM_DELETED', -2);
+define('HOSTING_PLATFORM_QUEUED', 0);
+define('HOSTING_PLATFORM_ENABLED', 1);
+
 /**
  * @file Platform node type definition
  */
@@ -26,6 +31,14 @@ 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,
+    );
   }
   return $options;
 }
@@ -68,7 +81,7 @@ function hosting_platform_access($op, $node, $account) {
 */ 
 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;
   }
@@ -129,7 +142,18 @@ function hosting_platform_form(&$node) {
   return $form;
 }
 
-
+/**
+ * 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().
@@ -141,8 +165,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, $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);
 }
 
 /**
@@ -160,8 +184,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",
-              $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);
   }
 }
 
@@ -198,7 +222,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;
@@ -233,6 +257,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);
@@ -273,6 +302,15 @@ 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",
+  );
+  return $labels[$node->platform_status];
+}
+
 function hosting_platform_hosting_summary() {
   $summary = array();
   $platforms = _hosting_get_platforms();
diff --git a/site/hosting_site.module b/site/hosting_site.module
index 4cf9729..b9a432d 100644
--- a/site/hosting_site.module
+++ b/site/hosting_site.module
@@ -360,7 +360,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;
 }
 
diff --git a/task/hosting_task.module b/task/hosting_task.module
index 2c90c42..c66bcb5 100644
--- a/task/hosting_task.module
+++ b/task/hosting_task.module
@@ -44,6 +44,9 @@ 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' && (hosting_task_outstanding($node->nid, 'delete') || ($node->platform_status ==  HOSTING_PLATFORM_DELETED)) ) {
+      return FALSE;
     } else {
       return true;
     }
