diff --git a/acquia_search/Acquia_Search_Service.php b/acquia_search/Acquia_Search_Service.php
index 60fc7d5..07c73d5 100644
--- a/acquia_search/Acquia_Search_Service.php
+++ b/acquia_search/Acquia_Search_Service.php
@@ -35,10 +35,10 @@ class AcquiaSearchService extends DrupalApacheSolrService {
     }
     $url .= 'request_id=' . $id;
     if ($use_data && isset($options['data'])) {
-      list($cookie, $nonce) = acquia_search_auth_cookie($url, $options['data']);
+      list($cookie, $nonce) = acquia_search_auth_cookie($url, $options['data'], NULL, $this->env_id);
     }
     else {
-      list($cookie, $nonce) = acquia_search_auth_cookie($url);
+      list($cookie, $nonce) = acquia_search_auth_cookie($url, NULL, NULL, $this->env_id);
     }
     if (empty($cookie)) {
       throw new Exception('Invalid authentication string - subscription keys expired or missing.');
diff --git a/acquia_search/acquia_search.module b/acquia_search/acquia_search.module
index 8ce3ace..4d6589e 100644
--- a/acquia_search/acquia_search.module
+++ b/acquia_search/acquia_search.module
@@ -10,14 +10,20 @@ define('ACQUIA_SEARCH_ENVIRONMENT_ID', 'acquia_search_server_1');
 /**
  * Predefined Acquia Search network environment
  */
-function acquia_search_get_environment() {
-  return array(
-    'env_id' => ACQUIA_SEARCH_ENVIRONMENT_ID,
-    'name' => t('Acquia Search'),
+function acquia_search_get_environment($values = array()) {
+  if (!empty($values['subscription_id'])) {
+    $identifier = $values['subscription_id'];
+  }
+  else {
+    $identifier = acquia_agent_settings('acquia_identifier');
+  }
+  $environment = array(
     // @todo - server URL may depend on region info.
-    'url' => variable_get('acquia_search_url', 'http://search.acquia.com/solr/'. acquia_agent_settings('acquia_identifier')),
+    'url' => variable_get('acquia_search_url', 'http://search.acquia.com/solr/'. $identifier),
     'service_class' => 'AcquiaSearchService',
   );
+  $environment = array_merge($environment, $values);
+  return $environment;
 }
 
 /**
@@ -35,11 +41,10 @@ function acquia_search_enable() {
  * Implementation of hook_init().
  */
 function acquia_search_init() {
-  if (arg(0) == 'admin' && arg(1) == 'config' && arg(2) == 'search' && arg(3) == 'apachesolr'
-      && user_access('administer search')
-      && acquia_agent_subscription_is_active()
-      && variable_get('apachesolr_default_environment') == ACQUIA_SEARCH_ENVIRONMENT_ID
-      && empty($_POST)) {
+  $env_id = arg(5);
+  $environment = apachesolr_environment_load(check_plain($env_id));
+  if (acquia_search_get_environment_connected($environment) && user_access('administer search')
+      && acquia_agent_subscription_is_active() && empty($_POST)) {
     $as_link = l(t('Acquia Search'), 'http://acquia.com/products-services/acquia-search');
     drupal_set_message(t("Search is being provided by the !as network service.", array('!as' => $as_link)));
   }
@@ -49,14 +54,17 @@ function acquia_search_init() {
  * Create a new record pointing to the Acquia apachesolr search server and set it as the default
  */
 function acquia_search_enable_acquia_solr_environment() {
+  // Creates the new environment
   $environment = apachesolr_environment_load(ACQUIA_SEARCH_ENVIRONMENT_ID);
   if ($environment != acquia_search_get_environment()) {
-    apachesolr_environment_save(acquia_search_get_environment());
-  }
-  // Only set the default if we just createdd the environment.
-  if (!$environment) {
-    variable_set('apachesolr_default_environment', ACQUIA_SEARCH_ENVIRONMENT_ID);
+    $environment = acquia_search_get_environment();
+    $environment['env_id'] = ACQUIA_SEARCH_ENVIRONMENT_ID;
+    $environment['name'] = t('Acquia Search');
+    $environment['conf']['acquia_search'] = TRUE;
+    apachesolr_environment_save($environment);
   }
+  // Only set the default if we just created the environment.
+  variable_set('apachesolr_default_environment', ACQUIA_SEARCH_ENVIRONMENT_ID);
 }
 
 /**
@@ -65,11 +73,32 @@ function acquia_search_enable_acquia_solr_environment() {
  * Helper function to clear variables we may have set.
  */
 function acquia_search_disable() {
-  apachesolr_environment_delete(ACQUIA_SEARCH_ENVIRONMENT_ID);
-  if (variable_get('apachesolr_default_environment', 'solr') == ACQUIA_SEARCH_ENVIRONMENT_ID) {
-    // Go back to the default.
-    variable_del('apachesolr_default_environment');
+  // Unset all other acquia search environments
+  $environments = apachesolr_load_all_environments();
+  foreach ($environments as $environment) {
+    if (isset($environment['conf']['acquia_search'])) {
+      // remove traces of acquia_search
+      unset($environment['conf']['acquia_search']);
+      // unset our acquia url and set it back to default
+      $environment['url'] = 'http://localhost:8983/solr';
+      if (variable_get('apachesolr_default_environment', 'solr') == $environment['env_id']) {
+        // Go back to the default.
+        variable_del('apachesolr_default_environment');
+      }
+    }
+    if (isset($environment['service_class']) && ($environment['service_class'] == 'AcquiaSearchService')) {
+      // Emptying the service class, unsetting it would not work, since it would
+      // not overwrite the old value
+      $environment['service_class'] = '';
+    }
+    apachesolr_environment_save($environment);
   }
+
+  // for safety, we remove the environment we added.
+  // Leave custom configurations alone! ref: http://www.youtube.com/watch?v=kHmvkRoEowc
+  apachesolr_environment_delete(ACQUIA_SEARCH_ENVIRONMENT_ID);
+  // unset our standard search class
+  variable_del('apachesolr_service_class');
 }
 
 /**
@@ -83,6 +112,9 @@ function acquia_search_menu_alter(&$menu) {
   };
 }
 
+/**
+ * Implementation of hook_cron().
+ */
 function acquia_search_cron() {
   // Cache the cersion in a variable so we can send it at not extra cost.
   $version = variable_get('acquia_search_version', '7.x');
@@ -95,10 +127,22 @@ function acquia_search_cron() {
 }
 
 /**
+ * Tests whether the environment is connected to Acquia Search.
+ */
+function acquia_search_get_environment_connected($environment) {
+  if (isset($environment['conf']['acquia_search'])) {
+    return $environment['conf']['acquia_search'];
+  }
+  else {
+    return FALSE;
+  }
+}
+
+/**
  * Delete environment page access.
  */
 function acquia_search_environment_delete_access($environment) {
-  if ($environment['env_id'] == ACQUIA_SEARCH_ENVIRONMENT_ID) {
+  if (strstr($environment['env_id'], ACQUIA_SEARCH_ENVIRONMENT_ID)) {
     return FALSE;
   }
   // Fall back to the original check.
@@ -111,10 +155,11 @@ function acquia_search_environment_delete_access($environment) {
 function acquia_search_form_apachesolr_settings_alter(&$form, $form_state) {
   // Don't alter the form if there is no subscription.
   if (acquia_agent_subscription_is_active()) {
-    // Don't show delete operation for the AS environment
+    // Don't show delete operation for the Default AS environment. This means
+    // that cloned acquia search environments can be deleted
     foreach ($form['apachesolr_host_settings']['table']['#rows'] as &$row) {
-      if (isset($row['data'][2]['data']) && strpos($row['data'][2]['data'], 'search/apachesolr-env/' . ACQUIA_SEARCH_ENVIRONMENT_ID . '/delete') !== FALSE) {
-        $row['data'][2]['data'] = '';
+      if (isset($row['data']['delete']['data']) && strpos($row['data']['delete']['data'], ACQUIA_SEARCH_ENVIRONMENT_ID . '/delete') !== FALSE) {
+        $row['data']['delete']['data'] = '';
         break;
       }
     }
@@ -133,33 +178,90 @@ function acquia_search_form_apachesolr_settings_alter(&$form, $form_state) {
  * Implementation of hook_form_[form_id]_alter().
  */
 function acquia_search_form_apachesolr_environment_edit_form_alter(&$form, $form_state) {
-  // Do not allow editing of Acquia Search environment parameters
-  if (isset($form['env_id']['#default_value']) && $form['env_id']['#default_value'] == ACQUIA_SEARCH_ENVIRONMENT_ID ) {
-    $form['url']['#disabled'] = TRUE;
-    $form['name']['#disabled'] = TRUE;
-    $form['env_id']['#disabled'] = TRUE;
-  }
+  // Gets environment from form, gets connection status to Acquia Search.
+  $env_id = isset($form['env_id']['#default_value']) ? $form['env_id']['#default_value'] : '';
+  $environment = ($env_id) ? apachesolr_environment_load($env_id) : FALSE;
 
-  $form['actions']['delete']['#access'] = FALSE;
-  $form['actions']['save']['#validate'][] = 'acquia_search_environment_edit_form_validate';
+  // Add options to connect to Acquia
+  $form['acquia_search'] = array(
+    '#type' => 'checkbox',
+    '#title' => 'Connect to Acquia Search',
+    '#default_value' => $environment['conf']['acquia_search'],
+    '#weight' => 10,
+  );
+
+  $form['acquia_override_subscription'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Configure Acquia Search'),
+    '#description' => t('This is usually not necessary unless you really want this
+      search environment to connect to a different acquia search subscription. by default it uses your connected subscription.'),
+    '#collapsed' => TRUE,
+    '#collapsible' => TRUE,
+    '#weight' => 11,
+    '#states' => array(
+      'visible' => array(
+        ':input[name="acquia_search"]' => array('checked' => TRUE),
+      ),
+    ),
+  );
+
+  $form['acquia_override_subscription']['acquia_override_subscription_id'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Enter your Acquia Subscription Identifier'),
+    '#default_value' => isset($environment['conf']['subscription_id']) ? $environment['conf']['subscription_id'] : '',
+  );
+  $form['acquia_override_subscription']['acquia_override_subscription_key'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Enter your Acquia Subscription key'),
+    '#default_value' => isset($environment['conf']['subscription_key']) ? $environment['conf']['subscription_key'] : '',
+  );
+
+  // If we are connecting to Acquia Search, the user shouldn't have to enter
+  // a value into this field. However, it should appear to be required if the
+  // user is not connecting to Acquia search.
+  $form['url']['#attributes']['class'][] = 'form-element';
+  // Hide field "Connect to Acquia Search" checkbox is selected by the user.
+  $form['url']['#states'] = array(
+    'disabled' => array(
+      ':input[name="acquia_search"]' => array('checked' => TRUE),
+    ),
+  );
+
+  array_unshift($form['actions']['save']['#validate'], 'acquia_search_environment_edit_form_validate');
 }
 
 function acquia_search_environment_edit_form_validate($form, &$form_state) {
-  if ($form_state['values']['env_id'] == ACQUIA_SEARCH_ENVIRONMENT_ID) {
-    // make sure that the environment parameters have not been changed
-    $form_state['values'] = array_merge($form_state['values'], acquia_search_get_environment());
+  // make sure that the environment parameters have not been changed
+  if(isset($form_state['values']['acquia_search'])) {
+    $overrive_values = array();
+    $override_values['env_id'] = $form['env_id']['#default_value'];
+    $override_values['name'] = $form_state['values']['name'];
+
+    // Add our acquia_connection check to this environment
+    $form_state['values']['conf']['acquia_search'] = $form_state['values']['acquia_search'];
+
+    // Add our overrides to the configuration
+    if (isset($form_state['values']['acquia_override_subscription_id']) && isset($form_state['values']['acquia_override_subscription_key'])) {
+      $override_values['subscription_id'] = $form_state['values']['acquia_override_subscription_id'];
+      $override_values['subscription_key'] = $form_state['values']['acquia_override_subscription_key'];
+      $form_state['values'] = array_merge($form_state['values'], acquia_search_get_environment($override_values));
+      // Save that to our confs per environment, anything outside of conf is
+      // ignored as extra value, so adding it to that array so it can be saved
+      $form_state['values']['conf']['subscription_id'] = $form_state['values']['acquia_override_subscription_id'];
+      $form_state['values']['conf']['subscription_key'] = $form_state['values']['acquia_override_subscription_key'];
+    }
+    else {
+      // Use our defaults
+      $form_state['values'] = array_merge($form_state['values'], acquia_search_get_environment($override_values));
+    }
   }
 }
 
 /**
  * Implementation of hook_acquia_subscription_status().
  */
-
 function acquia_search_acquia_subscription_status($active) {
-  if ($active) {
-    acquia_search_enable_acquia_solr_environment();
-  }
-  else {
+  if (!$active) {
     acquia_search_disable();
   }
 }
@@ -179,7 +281,7 @@ function acquia_search_acquia_subscription_status($active) {
  *  An array containing the string to be added as the content of the
  *  Cookie header to the request and the nonce.
  */
-function acquia_search_auth_cookie(&$url, $string = '', $derived_key = NULL) {
+function acquia_search_auth_cookie(&$url, $string = '', $derived_key = NULL, $env_id = NULL) {
   $uri = parse_url($url);
 
   // Add a scheme - should always be https if available.
@@ -199,10 +301,10 @@ function acquia_search_auth_cookie(&$url, $string = '', $derived_key = NULL) {
   $nonce = base64_encode(drupal_random_bytes(24));
 
   if ($string) {
-    $auth_header = acquia_search_authenticator($string, $nonce, $derived_key);
+    $auth_header = acquia_search_authenticator($string, $nonce, $derived_key, $env_id);
   }
   else {
-    $auth_header = acquia_search_authenticator($path . $query, $nonce, $derived_key);
+    $auth_header = acquia_search_authenticator($path . $query, $nonce, $derived_key, $env_id);
   }
   return array($auth_header, $nonce);
 }
@@ -210,12 +312,27 @@ function acquia_search_auth_cookie(&$url, $string = '', $derived_key = NULL) {
 /**
  * Derive a key for the solr hmac using the information shared with acquia.com.
  */
-function _acquia_search_derived_key() {
+function _acquia_search_derived_key($env_id = NULL) {
   static $derived_key;
   if (!isset($derived_key)) {
+    // If we set an explicit environment, check if this needs to overridden
+    // Use the default
+    $identifier = acquia_agent_settings('acquia_identifier');
     $key = acquia_agent_settings('acquia_key');
+    // See if we need to overwrite these values
+    if (!empty($env_id)) {
+      // Load the explicit environment
+      $environment = apachesolr_environment_load($env_id);
+      if (!empty($environment['conf']['subscription_id']) &&
+        !empty($environment['conf']['subscription_key'])) {
+        $identifier = $environment['conf']['subscription_id'];
+        $key = $environment['conf']['subscription_key'];
+      }
+    }
+    // In any case, this is equal for all subscriptions. Also
+    // even if the search sub is different, the main subscription should be
+    // active
     $subscription = acquia_agent_settings('acquia_subscription_data');
-    $identifier = acquia_agent_settings('acquia_identifier');
     // We use a salt from acquia.com in key derivation since this is a shared
     // value that we could change on the AN side if needed to force any
     // or all clients to use a new derived key.  We also use a string
@@ -237,9 +354,9 @@ function _acquia_search_derived_key() {
 /**
  * Creates an authenticator based on a data string and HMAC-SHA1.
  */
-function acquia_search_authenticator($string, $nonce, $derived_key = NULL) {
+function acquia_search_authenticator($string, $nonce, $derived_key = NULL, $env_id = NULL) {
   if (empty($derived_key)) {
-    $derived_key = _acquia_search_derived_key();
+    $derived_key = _acquia_search_derived_key($env_id);
   }
   if (empty($derived_key)) {
     // Expired or invalid subscription - don't continue.
@@ -288,7 +405,7 @@ function acquia_search_extract_hmac($headers) {
  */
 function acquia_search_apachesolr_query_alter($query) {
   // @todo - does it make sense to check $caller too?
-  if ($query->solr('getId') != ACQUIA_SEARCH_ENVIRONMENT_ID || $query->getParam('qt') || $query->getParam('defType')) {
+  if (!acquia_search_get_environment_connected($query->solr('getId')) || $query->getParam('qt') || $query->getParam('defType')) {
     // This is a 'mlt' query or something else custom.
     return;
   }
