diff --git a/hosting_sync/README.md b/hosting_sync/README.md
new file mode 100644
index 0000000..2c68f2f
--- /dev/null
+++ b/hosting_sync/README.md
@@ -0,0 +1,26 @@
+Hosting Sync
+============
+
+Lets a user sync database and files from one site to another.
+
+
+Custom Alias
+------------
+
+You can also specify a custom alias, one not managed by Aegir, for a sync task.
+
+
+A minimal example could be:
+```php
+<?php
+
+$aliases['live.example.com'] = array(
+  'remote-host' => 'server.example.com',
+  'remote-user' => 'www-admin',
+  'root' => '/other/path/to/drupal',
+  'uri' => 'http://www.example.com',
+);
+```
+
+Only the last two lines are added for compatibility with hosting_sync.
+See the Drush documentation for more options.
diff --git a/hosting_sync/drush/sync.provision.inc b/hosting_sync/drush/sync.provision.inc
index 986e5cf..52454e1 100644
--- a/hosting_sync/drush/sync.provision.inc
+++ b/hosting_sync/drush/sync.provision.inc
@@ -17,13 +17,15 @@ function _drush_provision_sync_validate_alias($alias) {
     $result = drush_invoke_process('@none', 'site-alias', array($alias), array('format' => 'json'), FALSE);
     drush_log($result['output'], 'debug');
     $result_arr = json_decode($result['output'], $assoc = TRUE );
-    if ($result['error_status'] === DRUSH_SUCCESS && $result_arr[trim($alias, '@')]['context_type'] === 'site') {
+
+    if ($result['error_status'] === DRUSH_SUCCESS && !empty($result_arr[trim($alias, '@')]['uri'])) {
       return TRUE;
     }
+
   }
   else {
     if (DRUSH_VERSION >= 5) {
-      $result = drush_invoke_process('@none', 'site-alias', array($alias), array('component' => 'context_type'));
+      $result = drush_invoke_process('@none', 'site-alias', array($alias));
     }
     else {
       $result = drush_backend_invoke('site-alias', array(0 => $alias, 'component' => 'context_type'), 'GET', FALSE);
diff --git a/hosting_sync/hosting_sync.tasks.inc b/hosting_sync/hosting_sync.tasks.inc
index e837866..4c9c2f5 100644
--- a/hosting_sync/hosting_sync.tasks.inc
+++ b/hosting_sync/hosting_sync.tasks.inc
@@ -221,21 +221,50 @@ function hosting_task_sync_form($node) {
   // Get a list of compatible sources for this site as the destination.
   $sites = hosting_sync_get_compatible_sites($node, 'destination');
 
-  if (count($sites) == 0) {
-    $form['source'] = array(
-      '#type' => 'item',
-      '#title' => t('Source'),
-      '#markup' => t('No sources are currently available.'),
-    );
-    return $form;
-  }
-
-  $form['source'] = array_merge(array(
+  $form['source'] = array(
     '#type' => 'item',
     '#title' => t('Source'),
     '#required' => TRUE,
     '#description' => t('Choose the site to copy data and/or files from.'),
-  ), _hosting_sync_sites_elements($node, $sites, array('parameters', 'source')));
+  );
+
+  $parents = array('parameters', 'source');
+
+  if (!empty($sites)) {
+    $form['source'] = array_merge($form['source'], _hosting_sync_sites_elements($node, $sites, $parents));
+  }
+
+  // TODO setting or access control?
+  if (1) {
+    $form['source']['custom_alias'] = array(
+      '#type' => 'fieldset',
+      '#title' => "A custom Drush alias",
+      '#attributes' => array('class' => array('hosting-sync-platform-group')),
+    );
+    $form['source']['custom_alias']['radio'] = array(
+      '#type' => 'radio',
+      '#title' => 'Any Drush alias defined on the hostmaster server.',
+      '#parents' => $parents,
+      '#return_value' => 'CUSTOM',
+    );
+    $form['source']['custom_alias']['text'] = array(
+      '#type' => 'textfield',
+      '#title' => "",
+      '#parents' => $parents,
+      '#states' => array(
+        // Only visible this field when backups is enabled.
+        'visible' => array(
+          ':input[name="parameters[source]"]' => array('value' => 'CUSTOM'),
+        ),
+      ),
+    );
+  }
+  elseif (empty($sites)) {
+    $elements['none'] = array(
+      '#type' => 'item',
+      '#markup' => t('No sources are currently available.'),
+    );
+  }
 
   $form['destination'] = array(
     '#type' => 'value',
