diff --git a/Acquia_Search_Service.php b/Acquia_Search_Service.php
index 61f1a3d..7f22744 100644
--- a/Acquia_Search_Service.php
+++ b/Acquia_Search_Service.php
@@ -37,10 +37,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.');
@@ -62,7 +62,7 @@ class AcquiaSearchService extends DrupalApacheSolrService {
    */
   protected function authenticateResponse($response, $nonce, $url) {
     $hmac = acquia_search_extract_hmac($response->headers);
-    if (!acquia_search_valid_response($hmac, $nonce, $response->data)) {
+    if (!acquia_search_valid_response($hmac, $nonce, $response->data, NULL, $this->env_id)) {
       throw new Exception('Authentication of search content failed url: '. $url);
     }
     return $response;
diff --git a/acquia_search.info b/acquia_search.info
index 39fe97d..ca08a81 100644
--- a/acquia_search.info
+++ b/acquia_search.info
@@ -2,6 +2,7 @@ name = Acquia search
 description = "Provides integration between your Drupal site and Acquia's hosted search service."
 package = Acquia Network Connector
 core = 6.x
+version = 6.x-3.x
 
 dependencies[] = acquia_agent
 dependencies[] = apachesolr
diff --git a/acquia_search.module b/acquia_search.module
index 5b33ff9..ce9f683 100644
--- a/acquia_search.module
+++ b/acquia_search.module
@@ -11,14 +11,26 @@ define('REQUEST_TIME', (int) $_SERVER['REQUEST_TIME']);
 /**
  * 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($conf = array()) {
+  if (!empty($conf['acquia_subscription_id'])) {
+    $identifier = $conf['acquia_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')),
-    'service_class' => 'AcquiaSearchService',
+    'url' => variable_get('acquia_search_url', 'http://search.acquia.com/solr/'. $identifier),
+    'conf' => array(
+      'service_class' => array(
+        'file' => 'Acquia_Search_Service',
+        'module' => 'acquia_search',
+        'class' => 'AcquiaSearchService',
+      ),
+    ),
   );
+
+  return $environment;
 }
 
 /**
@@ -26,8 +38,8 @@ function acquia_search_get_environment() {
  */
 function acquia_search_enable() {
   variable_set('acquia_search_version', '6.x-3.x');
+  acquia_search_enable_acquia_solr_environment();
   if (acquia_agent_subscription_is_active()) {
-    acquia_search_enable_acquia_solr_environment();
     // Send a heartbeat so the Acquia Network knows the module is enabled.
     acquia_agent_check_subscription();
   }
@@ -39,24 +51,43 @@ function acquia_search_enable() {
  * Helper function to clear variables we may have set.
  */
 function acquia_search_disable() {
+  // Remove the environment we added.
   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 (acquia_search_environment_connected($environment)) {
+      // remove traces of acquia_search
+      // unset our acquia url and set it back to default
+      $environment['url'] = 'http://localhost:8983/solr';
+      if (variable_get('apachesolr_default_environment', '') == $environment['env_id']) {
+        // Go back to the default.
+        variable_del('apachesolr_default_environment');
+      }
+      // Emptying the service class, unsetting it would not work, since it would
+      // not overwrite the old value
+      if (!is_array($environment['conf'])) {
+        $environment['conf'] = array();
+      }
+      $environment['conf']['service_class'] = '';
+      apachesolr_environment_save($environment);
+    }
   }
 }
 
-/**
- * Implementation of hook_init().
- */
-function acquia_search_init() {
-  if (arg(0) == 'admin' && arg(1) == 'settings' && arg(2) == 'apachesolr'
-      && user_access('administer search')
-      && acquia_agent_subscription_is_active()
-      && apachesolr_default_environment() == ACQUIA_SEARCH_ENVIRONMENT_ID
-      && 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)));
+ /**
+  * Implementation of hook_help().
+  */
+function acquia_search_help($path, $arg) {
+  switch ($path) {
+    case 'admin/settings/apachesolr':
+      $env_id = $arg[4] ? $arg[4] : apachesolr_default_environment();
+      $environment = apachesolr_environment_load($env_id);
+      if (acquia_search_environment_connected($environment) && acquia_agent_subscription_is_active()) {
+        $as_link = l(t('Acquia Search'), 'http://www.acquia.com/products-services/acquia-search');
+        return t("Search is being provided by the !as network service.", array('!as' => $as_link));
+      }
+    break;
   }
 }
 
@@ -64,19 +95,18 @@ 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()) {
-    // Use the Acquia Connector Class
-    variable_set('apachesolr_service_class', array(
-      'file' => 'Acquia_Search_Service',
-      'module' => 'acquia_search',
-      'class' => 'AcquiaSearchService'));
-    apachesolr_environment_save(acquia_search_get_environment());
-  }
-  // Only set the default if we just createdd the environment.
   if (!$environment) {
+    // Only set the default if we just created the environment.
+    // This will almost always happen, unless the module was disabled via SQL.
     variable_set('apachesolr_default_environment', ACQUIA_SEARCH_ENVIRONMENT_ID);
+    $environment['conf'] = array();
   }
+  $environment = array_merge_recursive(acquia_search_get_environment(), $environment);
+  $environment['env_id'] = ACQUIA_SEARCH_ENVIRONMENT_ID;
+  $environment['name'] = t('Acquia Search');
+  apachesolr_environment_save($environment);
 }
 
 /**
@@ -91,10 +121,33 @@ 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', '6.x-3.x');
+  $path = drupal_get_path('module', 'acquia_search') . '/acquia_search.info';
+  $info = drupal_parse_info_file($path);
+  // Send the version, or at least the core compatibility as a fallback.
+  $new_version = isset($info['version']) ? (string)$info['version'] : (string)$info['core'];
+  if ($version != $new_version) {
+    variable_set('acquia_search_version', $new_version);
+  }
+}
+
+/**
+ * Tests whether the environment is connected to Acquia Search.
+ */
+function acquia_search_environment_connected($environment) {
+  return isset($environment['conf']['service_class']['class']) &&
+  ($environment['conf']['service_class']['class'] == 'AcquiaSearchService');
+}
+
+/**
  * 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.
@@ -106,14 +159,14 @@ 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.
+    //  dsm($form);
+    //$table = $form['apachesolr_host_settings']['table']['#value'];
+    //$table_array = explode('<td', $table);
+    //dsm($table_array);
+
   if (acquia_agent_subscription_is_active()) {
-    // Don't show delete operation for the AS environment
-    /*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'] = '';
-        break;
-      }
-    }*/
+    // Don't show delete operation for the Default AS environment. This means
+    // that cloned acquia search environments can be deleted
     $form['advanced']['acquia_search_edismax_default'] = array(
       '#type' => 'radios',
       '#title' => t('Always allow advanced syntax for Acquia Search'),
@@ -129,17 +182,24 @@ 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 ) {
+  // 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;
+
+  if ($environment && acquia_search_environment_connected($environment)) {
     $form['url']['#value'] = $form['url']['#default_value'];
     $form['url']['#attributes'] = array('readonly' => 'readonly');
-    $form['name']['#value'] = $form['name']['#default_value'];
-    $form['name']['#disabled'] = array('readonly' => 'readonly');
     $form['env_id']['#value'] = $form['env_id']['#default_value'];
     $form['env_id']['#disabled'] = array('readonly' => 'readonly');
   }
-  $form['actions']['cancel']['#access'] = FALSE;
-  $form['actions']['delete']['#access'] = FALSE;
+
+  // Don't let the user delete the initial environment.
+  if ($env_id == ACQUIA_SEARCH_ENVIRONMENT_ID) {
+    $form['name']['#value'] = $form['name']['#default_value'];
+    $form['name']['#disabled'] = array('readonly' => 'readonly');
+    $form['actions']['delete']['#access'] = FALSE;
+    $form['actions']['cancel']['#access'] = FALSE;
+  }
   $form['actions']['save']['#validate'][] = 'acquia_search_environment_edit_form_validate';
 }
 
@@ -177,7 +237,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.
@@ -197,10 +257,10 @@ function acquia_search_auth_cookie(&$url, $string = '', $derived_key = NULL) {
   $nonce = base64_encode(acquia_search_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);
 }
@@ -208,35 +268,50 @@ 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() {
-  static $derived_key;
-  if (!isset($derived_key)) {
+function _acquia_search_derived_key($env_id = NULL) {
+  static $derived_key = array();
+  if (empty($env_id)) {
+    $env_id = 0;
+  }
+  if (!isset($derived_key[$env_id])) {
+    // 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 ($env_id) {
+      // Load the explicit environment and a manually set search key.
+      if ($search_key = apachesolr_environment_variable_get($env_id, 'acquia_search_key')) {
+        $derived_key[$env_id] = $search_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');
     // 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
     // ('solr') specific to the service, since we want each service using a
     // derived key to have a separate one.
     if (empty($subscription['active']) || empty($key) || empty($identifier)) {
       // Expired or invalid subscription - don't continue.
-      $derived_key = '';
+      $derived_key[$env_id] = '';
     }
-    else {
+    elseif (!isset($derived_key[$env_id])) {
       $salt = isset($subscription['derived_key_salt']) ? $subscription['derived_key_salt'] : '';
       $derivation_string = $identifier . 'solr' . $salt;
-      $derived_key =  hash_hmac('sha1', str_pad($derivation_string, 80, $derivation_string), $key);
+      $derived_key[$env_id] =  hash_hmac('sha1', str_pad($derivation_string, 80, $derivation_string), $key);
     }
   }
-  return $derived_key;
+  return $derived_key[$env_id];
 }
 
 /**
  * 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.
@@ -254,9 +329,9 @@ function acquia_search_authenticator($string, $nonce, $derived_key = NULL) {
  * @return
  *  TRUE or FALSE.
  */
-function acquia_search_valid_response($hmac, $nonce, $string, $derived_key = NULL) {
+function acquia_search_valid_response($hmac, $nonce, $string, $derived_key = NULL, $env_id = NULL) {
   if (empty($derived_key)) {
-    $derived_key = _acquia_search_derived_key();
+    $derived_key = _acquia_search_derived_key($env_id);
   }
   return $hmac == hash_hmac('sha1', $nonce . $string, $derived_key);
 }
@@ -285,7 +360,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_environment_connected($query->solr('getId')) || $query->getParam('qt') || $query->getParam('defType')) {
     // This is a 'mlt' query or something else custom.
     return;
   }
