diff --git a/facetapi.admin.inc b/facetapi.admin.inc
index 8af6741..e442ac7 100644
--- a/facetapi.admin.inc
+++ b/facetapi.admin.inc
@@ -359,6 +359,7 @@ function facetapi_facet_settings_form($form, &$form_state, FacetapiAdapter $adap
 
   $form['global'] = array(
     '#type' => 'fieldset',
+    '#tree' => TRUE,
     '#title' => t('Global settings'),
     '#description' => t('The configuration options below apply to this facet across <em>all</em> realms.'),
   );
@@ -389,6 +390,15 @@ function facetapi_facet_settings_form($form, &$form_state, FacetapiAdapter $adap
     '#description' => t('Display no more than this number of facet items.')
   );
 
+  $form['global']['facet_missing'] = array(
+    '#type' => 'radios',
+    '#access' => $facet['facet missing allowed'] && $adapter->supportsFacetMissing(),
+    '#title' => t('Add facet for missing values'),
+    '#default_value' => $global_settings->settings['facet_missing'],
+    '#options' => array(0 => t('No'), 1 => t('Yes')),
+    '#description' => t('Adds an extra facet matching documents with no value at all for this field.')
+  );
+
   ////
   ////
   //// Finalizes form
@@ -496,6 +506,8 @@ function facetapi_facet_settings_form_submit($form, &$form_state) {
   $adapter = $form['#facetapi']['adapter'];
   $realm = $form['#facetapi']['realm'];
   $facet = $form['#facetapi']['facet'];
+  $global_values = $form_state['values']['global'];
+  unset($form_state['values']['global']);
 
   // Loads settings, saves all form values as settings other than excluded.
   $facet_settings = $adapter->getFacet($facet)->getSettings($realm);
@@ -503,16 +515,15 @@ function facetapi_facet_settings_form_submit($form, &$form_state) {
     $form_state['values'],
     array_flip($form['#facetapi']['excluded_values'])
   ));
-  unset($facet_settings->settings['operator']);
-  unset($facet_settings->settings['hard_limit']);
 
   // Converts sort_weight:* and sort_order:* settings to associative arrays.
   facetapi_combine_settings('sort_weight', $facet_settings);
   facetapi_combine_settings('sort_order', $facet_settings);
 
   $global_settings = $adapter->getFacet($facet)->getSettings();
-  $global_settings->settings['operator'] = $form_state['values']['operator'];
-  $global_settings->settings['hard_limit'] = $form_state['values']['hard_limit'];
+  foreach ($global_values as $key => $value) {
+    $global_settings->settings[$key] = $value;
+  }
 
   $success = TRUE;
   if (FALSE === ctools_export_crud_save('facetapi', $facet_settings)) {
diff --git a/facetapi.callbacks.inc b/facetapi.callbacks.inc
index 8e7092e..31d056c 100644
--- a/facetapi.callbacks.inc
+++ b/facetapi.callbacks.inc
@@ -9,8 +9,12 @@
  * Map callback for node types.
  */
 function facetapi_map_bundle(array $values) {
+  $map = array();
   $names = node_type_get_names();
-  return array_intersect_key($names, array_flip($values));
+  foreach (array_intersect_key($names, array_flip($values)) as $key => $value) {
+    $map[$key]['#markup'] = $value;
+  }
+  return $map;
 }
 
 /**
@@ -24,10 +28,10 @@ function facetapi_map_author(array $values) {
 
   $map = array();
   while ($record = $result->fetchAssoc()) {
-    $map[$record['uid']] = $record['name'];
+    $map[$record['uid']]['#markup'] = $record['name'];
   }
   if (isset($map[0])) {
-    $map[0] = variable_get('anonymous', t('Anonymous'));
+    $map[0]['#markup'] = variable_get('anonymous', t('Anonymous'));
   }
   return $map;
 }
@@ -40,10 +44,10 @@ function facetapi_map_language(array $values) {
   $language_list = language_list();
   foreach ($values as $language) {
     if (isset($language_list[$language])) {
-      $map[$language] = $language_list[$language]->name;
+      $map[$language]['#markup'] = $language_list[$language]->name;
     }
     else {
-      $map[$language] = t('Language neutral');
+      $map[$language]['#markup'] = t('Language neutral');
     }
   }
   return $map;
@@ -64,7 +68,7 @@ function facetapi_map_date(array $values) {
     $range = explode(' TO ', trim($value, '{[]}'));
     if (2 == count($range)) {
       $gap = facetapi_get_date_gap($range[0], $range[1]);
-      $map[$value] = facetapi_format_date($range[0], $gap);
+      $map[$value]['#markup'] = facetapi_format_date($range[0], $gap);
     }
   }
   return $map;
@@ -111,7 +115,7 @@ function facetapi_map_taxonomy_terms(array $values) {
   $map = array();
   $terms = taxonomy_term_load_multiple($values);
   foreach ($terms as $term) {
-    $map[$term->tid] = $term->name;
+    $map[$term->tid]['#markup'] = $term->name;
   }
   return $map;
 }
diff --git a/facetapi.module b/facetapi.module
index 194fe55..186a7cf 100644
--- a/facetapi.module
+++ b/facetapi.module
@@ -192,6 +192,10 @@ function facetapi_theme() {
       'arguments' => array('title' => NULL),
       'file' => 'facetapi.theme.inc',
     ),
+    'facetapi_facet_missing' => array(
+      'arguments' => array('field_name' => NULL),
+      'file' => 'facetapi.theme.inc',
+    ),
     'facetapi_count' => array(
       'arguments' => array('count' => NULL),
       'file' => 'facetapi.theme.inc',
@@ -342,6 +346,7 @@ function facetapi_get_searcher_info() {
     $searcher_info[$searcher] += array(
       'name' => $searcher,
       'type' => 'node',
+      'supports facet missing' => FALSE,
     );
   }
   drupal_alter('facetapi_searcher_info', $searcher_info);
@@ -398,6 +403,7 @@ function facetapi_get_facet_info($searcher) {
       'query type' => 'term',
       'dependency plugins' => array(),
       'allowed operators' => array(FACETAPI_OPERATOR_AND => TRUE, FACETAPI_OPERATOR_OR => TRUE),
+      'facet missing allowed' => FALSE,
       'weight' => 0,
       'map callback' => FALSE,
       'map options' => array(),
diff --git a/facetapi.theme.inc b/facetapi.theme.inc
index 62a1692..15a3c4c 100644
--- a/facetapi.theme.inc
+++ b/facetapi.theme.inc
@@ -6,6 +6,13 @@
  */
 
 /**
+ * Themes a missing facet.
+ */
+function theme_facetapi_facet_missing($variables) {
+  return t('Missing %field_name', array('%field_name' => $variables['field_name']));
+}
+
+/**
  * Themes the facet title.
  */
 function theme_facetapi_title($variables) {
diff --git a/plugins/facetapi/adapter.inc b/plugins/facetapi/adapter.inc
index b8dee63..880bd4a 100644
--- a/plugins/facetapi/adapter.inc
+++ b/plugins/facetapi/adapter.inc
@@ -331,6 +331,16 @@ abstract class FacetapiAdapter {
   }
 
   /**
+   * Returns TRUE if the back-end supports "missing".
+   *
+   * @return bool
+   *   TRUE or FALSE.
+   */
+  public function supportsFacetMissing() {
+    return $this->info['supports facet missing'];
+  }
+
+  /**
    * Adds facet query type plugins to the queue and invokes the execute() hook
    * to allow for the backend to add filters to its native query object.
    *
@@ -468,7 +478,7 @@ abstract class FacetapiAdapter {
       return $this->processors[$facet_name]->getMappedValue($value);
     }
     else {
-      return '';
+      return array('#markup' => '');
     }
   }
 
@@ -513,11 +523,11 @@ abstract class FacetapiAdapter {
 
       // The last item should be text, not a link.
       if ($last == $item) {
-        $breadcrumb[] = check_plain($value);
+        $breadcrumb[] = !empty($value['#html']) ? $value['#markup'] : check_plain($value['#markup']);
       }
       else {
         // Appends the filter to the breadcrumb trail.
-        $breadcrumb[] = l($value, $_GET['q'], array('query' => $query));
+        $breadcrumb[] = l($value['#markup'], $_GET['q'], array('query' => $query, 'html' => !empty($value['#html'])));
       }
     }
 
@@ -553,12 +563,13 @@ abstract class FacetapiAdapter {
       }
 
       // Builds variables for active link theme.
+      $mapped = $this->getMappedValue($item['facets'][0], $item['value']);
       $variables = array(
-        'text' => $this->getMappedValue($item['facets'][0], $item['value']),
+        'text' => $mapped['#markup'],
         'path' => $_GET['q'],
         'options' => array(
           'attributes' => array('class' => array()),
-          'html' => FALSE,
+          'html' => !empty($mapped['#html']),
           'query' => $this->processors[$item['facets'][0]]->getQueryString($values, 1),
         ),
       );
@@ -863,12 +874,12 @@ class FacetapiFacet implements ArrayAccess {
 
       }
       else {
-
         // Initializes settings.
         $settings->settings = array(
           'operator' => FACETAPI_OPERATOR_AND,
           'hard_limit' => 50,
           'dependencies' => array(),
+          'facet_missing' => 0,
         );
 
         // Loads the default settings from the adapter.
@@ -1051,6 +1062,7 @@ class FacetapiFacetProcessor {
     // Build array defaults.
     $defaults = array(
       '#markup' => '',
+      '#html' => FALSE,
       '#indexed_value' => '',
       '#count' => 0,
       '#active' => 0,
@@ -1208,7 +1220,8 @@ class FacetapiFacetProcessor {
  */
 function facetapi_replace_ids(array &$item, $key, array $map) {
   if (isset($map[$key])) {
-    $item['#markup'] = $map[$key];
+    $item['#markup'] = $map[$key]['#markup'];
+    $item['#html'] = !empty($map[$key]['#html']);
   }
 }
 
diff --git a/plugins/facetapi/widget_links.inc b/plugins/facetapi/widget_links.inc
index ba2fe96..560d95a 100644
--- a/plugins/facetapi/widget_links.inc
+++ b/plugins/facetapi/widget_links.inc
@@ -83,7 +83,7 @@ class FacetapiWidgetLinks extends FacetapiWidget {
         'count' => $item['#count'],
         'options' => array(
           'attributes' => array('class' => $this->getItemClasses()),
-          'html' => FALSE,
+          'html' => $item['#html'],
           'query' => $item['#query'],
         ),
       );
