diff --git a/modules/hosting/site/hosting_site.form.inc b/modules/hosting/site/hosting_site.form.inc
index a6eaa51..db53575 100644
--- a/modules/hosting/site/hosting_site.form.inc
+++ b/modules/hosting/site/hosting_site.form.inc
@@ -88,7 +88,7 @@ function _hosting_site_form_pre_render($elements) {
  * fields are available for selection.
  *
  */
-function hosting_site_available_options($node) {
+function hosting_site_available_options($node, $platform = NULL) {
   // cast to object if it's an array.
   $node = (is_array($node)) ? (object) $node : clone $node;
 
@@ -125,10 +125,16 @@ function hosting_site_available_options($node) {
                         JOIN hosting_platform l ON l.nid = i.rid WHERE i.package_id = %d
                         AND p.package_type = 'profile' AND l.status = %d;", $id, HOSTING_PLATFORM_ENABLED);
     $allowed_plats = _hosting_get_allowed_platforms($user->uid);
+    if (!is_null($platform)) {
+      $allowed_plats = array($platform => $platform);
+    }
     $access_check = FALSE;
 
     while ($row = db_fetch_array($result)) {
-      if (array_key_exists($row['nid'], $allowed_plats)) {
+      if (!is_null($platform) && array_key_exists($row['nid'], $allowed_plats)) {
+        $platform_profiles[$id] = $name;
+      }
+      elseif (array_key_exists($row['nid'], $allowed_plats)) {
         $access_check = TRUE;
       }
       // open access if no platform access has been set
@@ -141,6 +147,9 @@ function hosting_site_available_options($node) {
       unset($profiles[$id]);
     }
   }
+  if (!is_null($platform)) {
+    $profiles = $platform_profiles;
+  }
   reset($profiles);
   $return['profile'] = array_keys($profiles);
 
@@ -149,20 +158,26 @@ function hosting_site_available_options($node) {
   }
 
   // filter the available platforms based on which clients the user has access to.
-  $options = array();
-  $platforms = hosting_get_profile_platforms($node->profile, isset($node->check_profile_migrations) ? $node->check_profile_migrations : FALSE);
-  if (sizeof($platforms)) {
-    foreach ($platforms as $nid => $title) {
-      $platform = node_load($nid);
-
-      if ($platform->platform_status != HOSTING_PLATFORM_LOCKED) {
-        if (!isset($platform->clients) || sizeof(array_intersect(array_keys($user->client_id), $platform->clients)) || $user->uid == 1) {
-          $options[] = $nid;
+  if (!is_null($platform)) {
+    $node->profile = $return['profile'][0];
+    $return['platform'] = array($platform);
+  }
+  else {
+    $options = array();
+    $platforms = hosting_get_profile_platforms($node->profile, isset($node->check_profile_migrations) ? $node->check_profile_migrations : FALSE);
+    if (sizeof($platforms)) {
+      foreach ($platforms as $nid => $title) {
+        $platform = node_load($nid);
+
+        if ($platform->platform_status != HOSTING_PLATFORM_LOCKED) {
+          if (!isset($platform->clients) || sizeof(array_intersect(array_keys($user->client_id), $platform->clients)) || $user->uid == 1) {
+            $options[] = $nid;
+          }
         }
       }
-    }
 
-    $return['platform'] = $options;
+      $return['platform'] = $options;
+    }
   }
 
   if (!isset($node->platform) || !in_array($node->platform, $return['platform'])) {
diff --git a/modules/hosting/site/hosting_site.form.js b/modules/hosting/site/hosting_site.form.js
index 6e6e88f..b2bd282 100644
--- a/modules/hosting/site/hosting_site.form.js
+++ b/modules/hosting/site/hosting_site.form.js
@@ -168,7 +168,7 @@ Drupal.hosting.siteFormCheck = function(element) {
 
   $.ajax({
     type: 'POST',
-    url: Drupal.settings.hosting.site.form_check_url,
+    url: Drupal.settings.hosting.site.form_check_url + window.location.search,
     data: post_data,
     // Handle the success callback.
     success: function(data) {
diff --git a/modules/hosting/site/hosting_site.module b/modules/hosting/site/hosting_site.module
index 2f63464..39054cc 100644
--- a/modules/hosting/site/hosting_site.module
+++ b/modules/hosting/site/hosting_site.module
@@ -58,6 +58,15 @@ function hosting_site_menu() {
     'access arguments' => array('create', 'site'),
   );
 
+  $items['node/%node/add'] = array(
+    'title' => 'Add site',
+    'type' => MENU_LOCAL_TASK,
+    'page callback' => 'hosting_site_add_by_platform',
+    'page arguments' => array(1),
+    'access callback' => 'hosting_site_add_by_platform_access',
+    'access arguments' => array(1),
+  );
+
   $items['hosting/hosting_site_form_check'] = array(
     'page callback' =>'_hosting_site_form_check',
     'type' => MENU_CALLBACK,
@@ -77,8 +86,12 @@ function hosting_site_menu() {
 }
 
 function _hosting_site_form_check() {
+  $platform = NULL;
+  if (isset($_GET['platform'])) {
+    $platform = $_GET['platform'];
+  }
   drupal_json(
-    hosting_site_available_options($_POST)
+    hosting_site_available_options($_POST, $platform)
   );
   exit();
 }
@@ -332,6 +345,20 @@ function hosting_site_access($op, $node, $account) {
 }
 
 /**
+ * Access callback for Site add by platform.
+ */
+function hosting_site_add_by_platform_access($node) {
+  return $node->type == 'platform' && node_access('create', 'site');
+}
+
+/**
+ * Page callback for Site add by platform.
+ */
+function hosting_site_add_by_platform($node) {
+  drupal_goto('node/add/site', "platform={$node->nid}");
+}
+
+/**
  * Returns a count of sites.
  *
  * This is used by cron and statistics to batch the number of sites that are
