diff --git a/facetapi.admin.inc b/facetapi.admin.inc
index d28d007..986c17e 100644
--- a/facetapi.admin.inc
+++ b/facetapi.admin.inc
@@ -130,13 +130,15 @@ function facetapi_realm_settings_form_submit($form, &$form_state) {
 
   // Builds settings object, saves to database.
   foreach ($facet_info as $facet_name => $facet) {
-    $settings = $adapter->getFacet($facet)->getSettings($realm);
-    $settings->enabled = empty($form_state['values']['enabled_facets'][$facet_name]) ? 0 : 1;
+    $status = empty($form_state['values']['enabled_facets'][$facet_name]) ? 0 : 1;
     $weight = $realm['sortable'] ? $form_state['values']['weight:' . $facet_name] : 0;
-    $settings->settings['weight'] = $weight;
-    if (FALSE === ctools_export_crud_save('facetapi', $settings)) {
-      drupal_set_message(t('Error saving settings.'), 'error');
+    if (!facetapi_save_facet_status($adapter, $realm, $facet, $status, $weight, TRUE)) {
       $success = FALSE;
+      $message = t(
+        'Error saving configuration options for the %label facet.',
+        array('%label' => $facet['label'])
+      );
+      drupal_set_message($message, 'error');
     }
   }
 
@@ -151,7 +153,7 @@ function facetapi_realm_settings_form_submit($form, &$form_state) {
     }
   }
 
-  // Saves block cache settings, clears block cache if setting was changed.
+  // Saves block cache settings, clears block cache if settings were changed.
   if (isset($form_state['values']['block_cache'])) {
     $name = 'facetapi:block_cache:' . $adapter->getSearcher();
     $original = variable_get($name, DRUPAL_NO_CACHE);
@@ -161,7 +163,7 @@ function facetapi_realm_settings_form_submit($form, &$form_state) {
     }
   }
 
-  // Clears static cache and delta map delta map.
+  // Clears delta map cache.
   cache_clear_all('facetapi:delta_map', 'cache');
 }
 
diff --git a/facetapi.api.php b/facetapi.api.php
index e99e92d..f48392d 100644
--- a/facetapi.api.php
+++ b/facetapi.api.php
@@ -144,3 +144,28 @@ function hook_facetapi_sort_info_alter(array &$sort_info) {
 function hook_facetapi_facets_alter(array &$build, FacetapiAdapter $adapter, array $realm) {
 
 }
+
+/**
+ * Forces delta mapping of a facet block.
+ *
+ * This obscure hook is useful for cases where facets are disabled, but their
+ * block positioning needs to be set anyways. If a facet is enabled via the
+ * facetapi_set_facet_enabled() API function, its block needs to be enabled
+ * and assigned to a region despite the facet not being enabled in the Facet API
+ * interface, which would normally prevent the block from being listed.
+ */
+function hook_facetapi_force_delta_mapping() {
+  return array(
+    // The machine-readable name of the searcher.
+    'my_searcher' => array(
+      // The realm we are mapping, usually block.
+      'block' => array(
+        // Machine readable names of facets whose mappping is forced. Regardless
+        // of whether they are enabled via the Facet API interface, their blocks
+        // will be available to enable and position via admin/structure/block.
+        'facet_one',
+        'facet_two',
+      ),
+    ),
+  );
+}
diff --git a/facetapi.block.inc b/facetapi.block.inc
index e3f5ee7..ed69f2c 100644
--- a/facetapi.block.inc
+++ b/facetapi.block.inc
@@ -24,19 +24,19 @@ function facetapi_get_block_info($realm_name = 'block') {
       'cache' => $cache,
     );
 
-    // Adds facet blocks.
-    $facets = facetapi_get_enabled_facets($searcher, $realm_name);
-    foreach ($facets as $facet_name => $facet) {
-
-      // Gets the delta from the delta map.
-      $string = $searcher . ':' . $realm_name . ':' . urlencode($facet_name);
-      $delta = array_search($string, $map);
-
-      // Defines the block.
-      $blocks[$delta] = array(
-        'info' => 'Facet API: ' . $info['label'] . ' : ' . $facet['label'],
-        'cache' => $cache,
-      );
+    // Adds blocks for facets that are enabled or whose delta mapping is forced.
+    foreach (facetapi_get_delta_map_queue($searcher, $realm_name) as $facet_name) {
+      if ($facet = facetapi_facet_load($facet_name, $searcher)) {
+        // Gets the delta from the delta map.
+        $string = $searcher . ':' . $realm_name . ':' . urlencode($facet_name);
+        $delta = array_search($string, $map);
+
+        // Defines the block.
+        $blocks[$delta] = array(
+          'info' => 'Facet API: ' . $info['label'] . ' : ' . $facet['label'],
+          'cache' => $cache,
+        );
+      }
     }
   }
 
@@ -70,7 +70,7 @@ function facetapi_get_block($delta) {
     $realm_name = $facet_name = FALSE;
   }
 
-  // Bails if output is suppressed, such as if a search hasn't been executed.
+  // Bails if adapter can't be loaded.
   if (!$adapter = facetapi_adapter_load($searcher)) {
     return;
   }
@@ -88,6 +88,11 @@ function facetapi_get_block($delta) {
     return;
   }
 
+  // Bails if the facet isn't enabled.
+  if (!facetapi_facet_enabled($searcher, $realm_name, $facet_name)) {
+    return;
+  }
+
   // Builds and caches the entire realm per searcher / realm combination.
   $group = $searcher . ':' . $realm_name;
   if (!isset($builds[$group])) {
@@ -129,9 +134,8 @@ function facetapi_get_delta_map() {
       $map = $data->data;
     }
     else {
-      $map = array();
 
-      // Calculates deltas for facets in the block realm.
+      $map = array();
       foreach (facetapi_get_searcher_info() as $searcher => $info) {
 
         // Maps current search block.
@@ -141,8 +145,8 @@ function facetapi_get_delta_map() {
         // Maps facet deltas.
         // @todo - some other way to define realms that are block-like.
         foreach (array('block') as $realm_name) {
-          foreach (facetapi_get_enabled_facets($searcher, $realm_name) as $facet) {
-            $delta = $searcher . ':' . $realm_name . ':' . urlencode($facet['name']);
+          foreach (facetapi_get_delta_map_queue($searcher, $realm_name) as $facet_name) {
+            $delta = $searcher . ':' . $realm_name . ':' . urlencode($facet_name);
             $map[facetapi_hash_delta($delta)] = $delta;
           }
         }
@@ -168,3 +172,29 @@ function facetapi_get_delta_map() {
 function facetapi_hash_delta($delta) {
   return (strlen($delta) <= 32) ? $delta : substr(drupal_hash_base64($delta), 0, 32);
 }
+
+/**
+ * Returns facets that are enabled or whose delta mapping is forced.
+ *
+ * @param $searcher
+ *   The machine readable name of the searcher.
+ * @param $realm_name
+ *   The machine readable name of the realm.
+ *
+ * @return array
+ *   A list of machine readable facet names.
+ */
+function facetapi_get_delta_map_queue($searcher, $realm_name) {
+  static $forced;
+  if (NULL === $forced) {
+    $forced = module_invoke_all('facetapi_force_delta_mapping');
+  }
+
+  $enabled = array_keys(facetapi_get_enabled_facets($searcher, $realm_name));
+  if (!isset($forced[$searcher][$realm_name])) {
+    $forced[$searcher][$realm_name] = array();
+  }
+
+  // Merges enabled facets and facets whose mapping is forced.
+  return array_unique(array_merge($enabled, $forced[$searcher][$realm_name]));
+}
diff --git a/facetapi.install b/facetapi.install
index 6879d04..664dee8 100644
--- a/facetapi.install
+++ b/facetapi.install
@@ -83,7 +83,12 @@ function facetapi_install() {
  * Implementation of hook_uninstall().
  */
 function facetapi_uninstall() {
-  // Nothing to do...
+  // Remove all variables that start with "facetapi:".
+  $args = array(':module' => 'facetapi%');
+  $result = db_query('SELECT name FROM {variable} WHERE name LIKE :module', $args);
+  foreach ($result as $record) {
+    variable_del($record->name);
+  }
 }
 
 /**
diff --git a/facetapi.module b/facetapi.module
index 9c9c8eb..771bf8b 100644
--- a/facetapi.module
+++ b/facetapi.module
@@ -746,3 +746,197 @@ function facetapi_build_realm($searcher, $realm_name) {
   $adapter = facetapi_adapter_load($searcher);
   return ($adapter) ? $adapter->buildRealm($realm_name) : array();
 }
+
+/**
+ * Enables or disables a facet for this page load only.
+ *
+ * @param $searcher
+ *   The machine readable name of the searcher.
+ * @param $realm_name
+ *   The machine readable name of the realm, pass NULL for all realms.
+ * @param $facet_name
+ *   The machine readable name of the facet.
+ * @param $status
+ *   A boolean flagging whether the facet is enabled or disabled.
+ * @param $batch_process
+ *   A boolean flagging whether batch processing is being performed.  If set to
+ *   TRUE, the list of enabled facets won't be rebuild and the active items
+ *   won't be re-processed.  Note that these tasks will have to be performed
+ *   manually in order for the status to be properly set.
+ */
+function facetapi_set_facet_status($searcher, $realm_name, $facet_name, $status, $batch_process) {
+  // Rebuild static if not batch processing.
+  if (!$batch_process) {
+    drupal_static('facetapi_get_enabled_facets', array(), TRUE);
+  }
+
+  // Pulls the list of enabled facets so we can modify it here.
+  facetapi_get_enabled_facets($searcher, $realm_name);
+  $enabled_facets = &drupal_static('facetapi_get_enabled_facets', array());
+
+  // Performs the operation by setting or unsetting the facet.
+  $cid = $searcher . ':' . (string) $realm_name;
+  if ($status && !isset($enabled_facets[$cid][$facet_name])) {
+    if ($facet = facetapi_facet_load($facet_name, $searcher)) {
+      // Add facet to static, which enables it.
+      $enabled_facets[$cid][$facet_name] = $facet;
+      // If facet isn't already globally enabled, enable it.
+      if (!isset($enabled_facets[$searcher . ':'][$facet_name])) {
+        // Ensure sure static is set before modifying it.
+        facetapi_get_enabled_facets($searcher, NULL);
+        $enabled_facets[$searcher . ':'][$facet_name] = $facet;
+      }
+    }
+  }
+  elseif (!$status && isset($enabled_facets[$cid][$facet_name])) {
+    // Removes facet to static, which disables it.
+    unset($enabled_facets[$cid][$facet_name]);
+    // If acting globally, disable facet in all realms.
+    if (!$realm_name) {
+      foreach (facetapi_get_realm_info() as $realm) {
+        // Ensure sure static is set before unsetting the facet.
+        facetapi_get_enabled_facets($searcher, $realm['name']);
+        unset($enabled_facets[$searcher . ':' . $realm['name']][$facet_name]);
+      }
+    }
+  }
+  else {
+    return;
+  }
+
+  // Re-process the active items since the list of active facets has changed.
+  if (!$batch_process && ($adapter = facetapi_adapter_load($searcher))) {
+    $adapter->processActiveItems();
+  }
+}
+
+/**
+ * Enables a facet for this page load only.
+ *
+ * If you are enabling facets in the block realm, you will have to force the
+ * delta mapping so that the block can be configured even if it is disabled via
+ * the Facet API interface. Otherwise you will not be able to assign the block
+ * to a region because it won't be available in admin/structure/block.
+ *
+ * @param $searcher
+ *   The machine readable name of the searcher.
+ * @param $realm_name
+ *   The machine readable name of the realm, pass NULL for all realms.
+ * @param $facet_name
+ *   The machine readable name of the facet.
+ * @param $batch_process
+ *   A boolean flagging whether batch processing is being performed.
+ *
+ * @see facetapi_set_facet_status()
+ * @see hook_facetapi_force_delta_mapping().
+ */
+function facetapi_set_facet_enabled($searcher, $realm_name, $facet_name, $batch_process = FALSE) {
+  return facetapi_set_facet_status($searcher, $realm_name, $facet_name, TRUE, $batch_process);
+}
+
+/**
+ * Disables a facet for this page load only.
+ *
+ * @param $searcher
+ *   The machine readable name of the searcher.
+ * @param $realm_name
+ *   The machine readable name of the realm, pass NULL for all realms.
+ * @param $facet_name
+ *   The machine readable name of the facet.
+ * @param $batch_process
+ *   A boolean flagging whether batch processing is being performed.
+ *
+ * @see facetapi_set_facet_status()
+ */
+function facetapi_set_facet_disabled($searcher, $realm_name, $facet_name, $batch_process = FALSE) {
+  return facetapi_set_facet_status($searcher, $realm_name, $facet_name, FALSE, $batch_process);
+}
+
+/**
+ * Sets the facet status in a given realm, stores settings in the database.
+ *
+ * @param FacetapiAdapter $adapter
+ *   The adapter object.
+ * @param array $realm
+ *   The realm definition.
+ * @param array $facet
+ *   The facet definition.
+ * @param $status
+ *   Flags whether or not the facet is being enabled or disabled.
+ * @param $weight
+ *   If the realm is sortable, allows the assigning of a weight. Pass FALSE to
+ *   maintain the previously stored value.
+ * @param $batch_process
+ *   A boolean flagging whether batch processing is being performed.  If set to
+ *   TRUE, the caches and statics won't be reset.
+ *
+ * @reutrn boolean
+ *   The success of the operation.
+ */
+function facetapi_save_facet_status(FacetapiAdapter $adapter, array $realm, array $facet, $status, $weight, $batch_process) {
+  // Loads the realm settings, sets enabled flag and weight.
+  $settings = $adapter->getFacet($facet)->getSettings($realm);
+  $settings->enabled = ($status) ? 1 : 0;
+  if (FALSE !== $weight) {
+    $settings->settings['weight'] = $realm['sortable'] ? $weight : 0;
+  }
+
+  // Saves the settings in the database, stores the result.
+  // NOTE: CTools export componenet loaded in the getSettings() method.
+  $success = (FALSE !== ctools_export_crud_save('facetapi', $settings));
+
+  // Clears caches and statics if we are not batch processing.
+  if ($success && !$batch_process) {
+    drupal_static('facetapi_get_enabled_facets', array(), TRUE);
+    if ('block' == $realm['name']) {
+      cache_clear_all(NULL, 'cache_block');
+      cache_clear_all('facetapi:delta_map', 'cache');
+    }
+  }
+
+  return $success;
+}
+
+/**
+ * Enables a facet in a given realm, stores settings in the database.
+ *
+ * @param FacetapiAdapter $adapter
+ *   The adapter object.
+ * @param array $realm
+ *   The realm definition.
+ * @param array $facet
+ *   The facet definition.
+ * @param $weight
+ *   If the realm is sortable, allows the assigning of a weight. Pass FALSE to
+ *   maintain the previously stored value.
+ * @param $batch_process
+ *   A boolean flagging whether batch processing is being performed.
+ *
+ * @reutrn boolean
+ *   The success of the operation.
+ */
+function facetapi_save_facet_enabled(FacetapiAdapter $adapter, array $realm, array $facet, $weight = FALSE, $batch_process = FALSE) {
+  return facetapi_save_facet_status($adapter, $realm, $facet, TRUE, $weight, $batch_process);
+}
+
+/**
+ * Disables a facet in a given realm, stores settings in the database.
+ *
+ * @param FacetapiAdapter $adapter
+ *   The adapter object.
+ * @param array $realm
+ *   The realm definition.
+ * @param array $facet
+ *   The facet definition.
+ * @param $weight
+ *   If the realm is sortable, allows the assigning of a weight. Pass FALSE to
+ *   maintain the previously stored value.
+ * @param $batch_process
+ *   A boolean flagging whether batch processing is being performed.
+ *
+ * @reutrn boolean
+ *   The success of the operation.
+ */
+function facetapi_save_facet_disabled(FacetapiAdapter $adapter, array $realm, array $facet, $weight = FALSE, $batch_process = FALSE) {
+  return facetapi_save_facet_status($adapter, $realm, $facet, FALSE, $weight, $batch_process);
+}
diff --git a/plugins/facetapi/adapter.inc b/plugins/facetapi/adapter.inc
index f6bfe0e..f26b7d1 100644
--- a/plugins/facetapi/adapter.inc
+++ b/plugins/facetapi/adapter.inc
@@ -237,6 +237,16 @@ abstract class FacetapiAdapter {
   }
 
   /**
+   * Returns all searcher info.
+   *
+   * @return array
+   *   The searcher info definition.
+   */
+  public function getSearcherInfo() {
+    return $this->info;
+  }
+
+  /**
    * Returns the id of the adapter plugin.
    *
    * @return string
