﻿diff --git a/apachesolr.module b/apachesolr.module
index 379662e..857ebde 100644
--- a/apachesolr.module
+++ b/apachesolr.module
@@ -1291,8 +1291,18 @@ function apachesolr_load_all_environments() {
     $environments = $cache->data;
   }
   else {
-    $environments = db_query('SELECT * FROM {apachesolr_environment}')->fetchAllAssoc('env_id', PDO::FETCH_ASSOC);
+    // Get environments from code and database
+    if (module_exists('ctools')) {
+      ctools_include('export');
+      $environments = ctools_export_crud_load_all('apachesolr_environment', TRUE);
+    }
+    else {
+      $environments = db_query('SELECT * FROM {apachesolr_environment}')->fetchAllAssoc('env_id', PDO::FETCH_ASSOC);
+    }
+
     foreach ($environments as $id => &$environment) {
+      // Ctools returns objects. Cast them to arrays.
+      $environment = (array) $environment;
       $conf = db_query('SELECT name, value FROM {apachesolr_environment_variable} WHERE env_id = :env_id', array('env_id' => $id))->fetchAllAssoc('name', PDO::FETCH_ASSOC);
       foreach ($conf as $name => $data) {
         $environment['conf'][$name] = unserialize($data['value']);
@@ -1425,7 +1435,13 @@ function apachesolr_create_unique_id($existing, $id) {
  */
 function apachesolr_environment_save($environment) {
   $default = array('env_id' => NULL, 'name' => '', 'url' => '', 'service_class' => '');
-  $is_new = !apachesolr_environment_load($environment['env_id']);
+
+  $environment_exists = apachesolr_environment_load($environment['env_id']);
+  $is_new = FALSE;
+  if (!$environment_exists || isset($environment_exists['in_code_only'])) {
+    $is_new = TRUE;
+  }
+
   $conf = isset($environment['conf']) ? $environment['conf'] : array();
   // Remove any unexpected fields.
   // @todo - getthis from the schema?.
@@ -1454,6 +1470,17 @@ function apachesolr_environment_save($environment) {
 }
 
 /**
+ * Implements hook_features_revert().
+ */
+function apachesolr_environment_features_revert($module) {
+  if ($objects = features_get_default('apachesolr_environment', $module)) {
+    foreach ($objects as $name => $object) {
+      apachesolr_environment_delete($object->env_id);
+    }
+  }
+}
+
+/**
  * Get a named variable, or return the default.
  *
  * @see variable_get()
