ce2cb3060de15e0dc50c48de25b95683b889df87
 alias/hosting_alias.module | 30 +++++++++++++++++++++++++-----
 site/hosting_site.form.inc |  2 +-
 site/hosting_site.module   | 41 ++++++++++++++++++++++++++++++++---------
 3 files changed, 58 insertions(+), 15 deletions(-)

diff --git a/alias/hosting_alias.module b/alias/hosting_alias.module
index 0211f20..154ee32 100644
--- a/alias/hosting_alias.module
+++ b/alias/hosting_alias.module
@@ -72,7 +72,7 @@ function hosting_alias_form_site_node_form_alter(&$form, &$form_state) {
 function hosting_alias_site_form_validate($form, &$form_state) {
   $aliases = $form_state['values']['aliases'] = array_filter($form_state['values']['aliases']);
   foreach ($aliases as $key => $alias) {
-    hosting_alias_validate_alias($form_state['node'], $alias, $key);
+    hosting_alias_validate_alias($form_state['values'], $alias, $key);
   }
 }
 
@@ -365,8 +365,7 @@ function hosting_alias_node_revision_delete($node) {
 function hosting_alias_validate_alias($site, $alias, $key) {
   if ($alias = strtolower(trim($alias))) {
     $alias = strtolower(trim($alias));
-    $params = isset($site->nid) ? array('nid' => $site->nid) : array();
-    if (!hosting_domain_allowed($alias, $params) || $alias == $site->title) {
+    if (!hosting_domain_allowed($alias, (array) $site) || $alias == $site->title) {
       form_set_error("aliases][$key", t('The domain name @alias is already in use', array('@alias' => $alias)));
     }
     if (!_hosting_valid_fqdn_wildcard($alias)) {
@@ -524,6 +523,14 @@ function hosting_alias_automatic_aliases($url) {
  * generated aliases to ensure that this url has not been used before
  */
 function hosting_alias_allow_domain($url, $params = array()) {
+  // Convert url to root domain.
+  $url_array = explode('.', $url);
+  $domain_array = array_slice($url_array, -2, 2);
+  $domain = implode('.', $domain_array);
+
+  // Get the client node from the client name.
+  $client = hosting_get_client($params['client']);
+
   $query = db_select('node', 'n')
     ->fields('n', array('nid'))
     ->condition('n.type', 'site');
@@ -532,12 +539,25 @@ function hosting_alias_allow_domain($url, $params = array()) {
   $query->condition('h.status', HOSTING_SITE_DELETED, '<>');
 
   $query->leftJoin('hosting_site_alias', 'a', 'n.vid = a.vid');
-  $query->condition('a.alias', $url);
+
+  // Check for either ...
+  $or = db_or();
+    // Exact matches ...
+    $or->condition('a.alias', $url);
+
+    // Or root domain matches of other clients
+    $and = db_and();
+      $and->condition('a.alias', '%'. db_like($domain), 'LIKE');
+      $and->condition('h.client', $client->nid, '<>');
+
+    $or->condition($and);
+
+  $query->condition($or);
 
   // For existing sites, don't match the site's current aliases.
   if (isset($params['nid'])) {
     $query->condition('n.nid', $params['nid'], '<>');
   }
-  return !$query->countQuery()->execute()->fetchField();
 
+  return !$query->countQuery()->execute()->fetchField();
 }
diff --git a/site/hosting_site.form.inc b/site/hosting_site.form.inc
index af8a786..c208cb7 100644
--- a/site/hosting_site.form.inc
+++ b/site/hosting_site.form.inc
@@ -392,7 +392,7 @@ function hosting_site_validate($node, &$form) {
 
   // TODO: maybe we should allow creation of sites that conflict with HOSTING_SITE_DISABLED (which would then need to be renamed before being re-enabled)
   if (!hosting_domain_allowed($url, (array) $node)) {
-    form_set_error('title', t("The domain name you have specified is already in use."));
+    form_set_error('title', t("The domain name you have specified is already in use, or does not belang to you."));
   }
 
   // If the quota module is loaded and this is a new node, check
diff --git a/site/hosting_site.module b/site/hosting_site.module
index 38a9175..a742284 100644
--- a/site/hosting_site.module
+++ b/site/hosting_site.module
@@ -661,18 +661,41 @@ function hosting_site_status_codes($type = NULL) {
  * @see hosting_domain_allowed()
  */
 function hosting_site_allow_domain($url, $params = array()) {
-  $query = "SELECT COUNT(n.nid) FROM {node} n
-    JOIN {hosting_site} h ON n.nid = h.nid
-    WHERE type = 'site' AND n.title = :title AND h.status <> :status";
-  $args[':title'] = $url;
-  $args[':status'] = HOSTING_SITE_DELETED;
+  // Convert url to root domain.
+  $url_array = explode('.', $url);
+  $domain_array = array_slice($url_array, -2, 2);
+  $domain = implode('.', $domain_array);
 
+  // Get the client node from the client name.
+  $client = hosting_get_client($params['client']);
+
+  $query = db_select('node', 'n')
+    ->fields('n', array('nid'))
+    ->condition('n.type', 'site');
+
+  $query->leftJoin('hosting_site', 'h', 'h.nid = n.nid');
+  $query->condition('h.status', HOSTING_SITE_DELETED, '<>');
+
+  // Check for either ...
+  $or = db_or();
+    // Exact matches ...
+    $or->condition('n.title', $url);
+
+    // Or root domain matches of other clients
+    $and = db_and();
+      $and->condition('n.title', '%'. db_like($domain), 'LIKE');
+      $and->condition('h.client', $client->nid, '<>');
+
+    $or->condition($and);
+
+  $query->condition($or);
+
+  // For existing sites, don't match the site's current url.
   if (isset($params['nid'])) {
-    $query .= " AND n.nid <> :nid";
-    $args[':nid'] = $params['nid'];
+    $query->condition('n.nid', $params['nid'], '<>');
   }
-  $result = !db_query($query, $args)->fetchField();
-  return $result;
+
+  return !$query->countQuery()->execute()->fetchField();
 }
 
 /**
