diff --git a/facetapi.admin.inc b/facetapi.admin.inc
index 375dd04..342547c 100644
--- a/facetapi.admin.inc
+++ b/facetapi.admin.inc
@@ -238,6 +238,7 @@ function facetapi_get_settings_path($searcher, $realm_name, $facet_name, $op) {
 function facetapi_facet_settings_form($form, &$form_state, FacetapiAdapter $adapter, array $realm, array $facet) {
   drupal_add_css(drupal_get_path('module', 'facetapi') . '/facetapi.css');
   drupal_add_js(drupal_get_path('module', 'facetapi') . '/facetapi.admin.js');
+  ctools_include('plugins');
 
   // Captures variables and settings for code readability.
   $searcher = $adapter->getSearcher();
@@ -270,7 +271,6 @@ function facetapi_facet_settings_form($form, &$form_state, FacetapiAdapter $adap
   );
 
   // Builds select options for widgets, allows widgets to add settings.
-  ctools_include('plugins');
   $widget_options = array();
   foreach (ctools_get_plugins('facetapi', 'widgets') as $id => $plugin) {
     $widget_options[$id] = $plugin['handler']['label'];
@@ -351,6 +351,29 @@ function facetapi_facet_settings_form($form, &$form_state, FacetapiAdapter $adap
     '#default_value' => $facet_settings->settings['active_sorts'],
   );
 
+  $form['widget']['empty'] = array(
+    '#prefix' => '<div class="facetapi-empty-setting">',
+    '#suffix' => '</div>',
+    '#weight' => 10,
+  );
+
+  $empty_options = array();
+  foreach (ctools_get_plugins('facetapi', 'empty_behaviors') as $id => $plugin) {
+    $empty_options[$id] = $plugin['handler']['label'];
+    $class = $plugin['handler']['class'];
+    $plugin = new $class($facet_settings);
+    $plugin->settingsForm($form, $form_state);
+  }
+
+  $form['widget']['empty']['empty_behavior'] = array(
+    '#type' => 'select',
+    '#title' => t('Empty facet behavior'),
+    '#default_value' => $facet_settings->settings['empty_behavior'],
+    '#options' => $empty_options,
+    '#weight' => -10,
+    '#description' => t('The action to take when a facet has no items.'),
+  );
+
   ////
   ////
   //// Global settings
@@ -457,13 +480,6 @@ function facetapi_facet_settings_form($form, &$form_state, FacetapiAdapter $adap
 }
 
 /**
- * Allows the block realm to add configuration options to the display form.
- */
-function facetapi_block_realm_settings(&$form, &$form_state) {
-  // Nothing to do...
-}
-
-/**
  * Themes a sort settings table.
  */
 function theme_facetapi_sort_settings_table($variables) {
diff --git a/facetapi.admin.js b/facetapi.admin.js
index b746879..76c6ba5 100644
--- a/facetapi.admin.js
+++ b/facetapi.admin.js
@@ -3,10 +3,24 @@
 Drupal.behaviors.facetapi = {
   attach: function(context, settings) {
     // Ensures ALL soft limit select boxes are updated.
-    // @see http://drupal.org/node/735528 for why this is needed.
+    // @see http://drupal.org/node/735528
     $('select[name="soft_limit"]').change(function() {
       $('select[name="soft_limit"]').val($(this).val());
     });
+
+    // Handles bug where input format fieldset is not hidden.
+    // @see http://drupal.org/node/997826
+    if ($('select[name="empty_behavior"]').val() != 'text') {
+      $('fieldset#edit-empty-text-format').hide();
+    }
+    $('select[name="empty_behavior"]').change(function() {
+      if ($(this).val() != 'text') {
+        $('fieldset#edit-empty-text-format').hide();
+      }
+      else {
+        $('fieldset#edit-empty-text-format').show();
+      }
+    });
   }
 }
 
diff --git a/facetapi.css b/facetapi.css
index 40acd76..41ab1ec 100644
--- a/facetapi.css
+++ b/facetapi.css
@@ -123,3 +123,7 @@ td.facetapi-operations {
   width: 30%;
   margin-right: 2em;
 }
+
+.facetapi-empty-setting {
+  clear: right;
+}
diff --git a/facetapi.info b/facetapi.info
index d7a9969..4375064 100644
--- a/facetapi.info
+++ b/facetapi.info
@@ -7,6 +7,8 @@ files[] = plugins/facetapi/adapter.inc
 files[] = plugins/facetapi/dependency.inc
 files[] = plugins/facetapi/dependency_bundle.inc
 files[] = plugins/facetapi/dependency_role.inc
+files[] = plugins/facetapi/empty_behavior.inc
+files[] = plugins/facetapi/empty_behavior_text.inc
 files[] = plugins/facetapi/query_type.inc
 files[] = plugins/facetapi/widget.inc
 files[] = plugins/facetapi/widget_links.inc
diff --git a/facetapi.module b/facetapi.module
index da0206d..1bfb305 100644
--- a/facetapi.module
+++ b/facetapi.module
@@ -174,6 +174,9 @@ function facetapi_ctools_plugin_type() {
     'dependencies' => array(
       'use hooks' => TRUE,
     ),
+    'empty_behaviors' => array(
+      'use hooks' => TRUE,
+    ),
     'query_types' => array(
       'use hooks' => TRUE,
     ),
@@ -514,7 +517,6 @@ function facetapi_facetapi_realm_info() {
     'weight' => -10,
     'sortable' => FALSE,
     'default widget' => 'facetapi_links',
-    'settings callback' => 'facetapi_block_realm_settings',
     'description' => t(
       'The <em>Blocks</em> realm displays each facet in a separate <a href="@block-page">block</a>. Users are able to refine their searches in a drill-down fashion.',
       array('@block-page' => url('admin/structure/block', array('query' => array('destination' => $_GET['q']))))
@@ -675,6 +677,26 @@ function facetapi_facetapi_dependencies() {
   );
 }
 
+/**
+ * Implements hook_facetapi_empty_behaviors().
+ */
+function facetapi_facetapi_empty_behaviors() {
+  return array(
+    'none' => array(
+      'handler' => array(
+        'label' => t('Do not display facet'),
+        'class' => 'FacetapiEmptyBehaviorNone',
+      ),
+    ),
+    'text' => array(
+      'handler' => array(
+        'label' => t('Display text'),
+        'class' => 'FacetapiEmptyBehaviorText',
+      ),
+    ),
+  );
+}
+
 ////
 ////
 //// Utility functions
diff --git a/plugins/facetapi/adapter.inc b/plugins/facetapi/adapter.inc
index 33dfb3a..f3054a9 100644
--- a/plugins/facetapi/adapter.inc
+++ b/plugins/facetapi/adapter.inc
@@ -658,6 +658,11 @@ abstract class FacetapiAdapter {
       // when merging facets with the same field alias such as taxonomy terms in
       // the fieldset realm. We want to merge only the values.
       foreach (element_children($facet_build) as $child) {
+        // Bails if there is nothing to render.
+        if (!element_children($facet_build[$child])) {
+          continue;
+        }
+        // Attempts to merge gracefully.
         if (!isset($build[$child])) {
           $build = array_merge_recursive($build, $facet_build);
         }
@@ -856,6 +861,7 @@ class FacetapiFacet implements ArrayAccess {
           'active_sorts' => array(),
           'sort_weight' => array(),
           'sort_order' => array(),
+          'empty_behavior' => 'none',
         );
 
         // Apply default sort settings.
@@ -901,7 +907,10 @@ class FacetapiFacet implements ArrayAccess {
     // Ensures settings added in later versions of the module are initialized to
     // prevent undefuned index errors after upgrading.
     // @todo Remove in later versions.
-    if (!$realm) {
+    if ($realm) {
+      $settings->settings += array('empty_behavior' => 'none');
+    }
+    else {
       $settings->settings += array('facet_missing' => 0);
     }
 
@@ -922,27 +931,50 @@ class FacetapiFacet implements ArrayAccess {
   public function build(array $realm, FacetapiFacetProcessor $processor) {
     $settings = $this->getSettings($realm);
 
-    // Builds the base render array for this facet across all realms. This
-    // ensures we are only pulling the data from the server once per facet.
+    // Gets the base render array from the facet processor, checks if there are
+    // no items in the facet.
     $this->build = $processor->getBuild();
-
-    // If there are no items, return an empty array.
-    if (!$this->build) {
-      return array();
-    }
-
-    // Instantiates the widget plugin and executes.
+    //$empty = (!$this->build);
+      /*
+      $id = $settings->settings['empty_behavior'];
+      $class = ctools_plugin_load_class('facetapi', 'empty_behaviors', $id, 'handler');
+      $empty_plugin = new $class($settings);
+      return array($this['field alias'] => $empty_plugin->execute());
+      */
+
+    // Instantiates the widget plugin and initializes.
     $widget_name = $settings->settings['widget'];
     $class = ctools_plugin_load_class('facetapi', 'widgets', $widget_name, 'handler');
-    $plugin = new $class($widget_name, $realm, $this, $settings);
-    $plugin->init()->execute();
+    $widget_plugin = new $class($widget_name, $realm, $this, $settings);
+    $widget_plugin->init();
+
+    // Executes widget plugin if not empty, otherwise executes the empty
+    // behavior plugin.
+    if ($this->build) {
+      $widget_plugin->execute();
+      $build = $widget_plugin->getBuild();
+    }
+    else {
+      // Instantiates empty behavior plugin.
+      $id = $settings->settings['empty_behavior'];
+      $class = ctools_plugin_load_class('facetapi', 'empty_behaviors', $id, 'handler');
+      $empty_plugin = new $class($settings);
+      // Executes empty behavior plugin.
+      $build = $widget_plugin->getBuild();
+      $build[$this['field alias']] = $empty_plugin->execute();
+    }
+
+    // If the element is empty, unset it.
+    if (!$build[$this['field alias']]) {
+      unset($build[$this['field alias']]);
+    }
 
     // Adds JavaScript settings in a way that merges with others already set.
-    $merge_settings['facetapi']['facets'][] = $plugin->getJavaScriptSettings();
+    $merge_settings['facetapi']['facets'][] = $widget_plugin->getJavaScriptSettings();
     drupal_add_js($merge_settings, 'setting');
 
     // Returns array keyed by the FacetapiWidget::$key property.
-    return array($plugin->getKey() => $plugin->getBuild());
+    return array($widget_plugin->getKey() => $build);
   }
 }
 
diff --git a/plugins/facetapi/empty_behavior.inc b/plugins/facetapi/empty_behavior.inc
new file mode 100644
index 0000000..2ef9034
--- /dev/null
+++ b/plugins/facetapi/empty_behavior.inc
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * @file
+ * Base class for empty behaviors.
+ */
+
+/**
+ * Abstract class implemented by all empty behavior plugins.
+ */
+abstract class FacetapiEmptyBehavior {
+
+  /**
+   * An array of facet settings.
+   *
+   * @var array
+   */
+  protected $settings;
+
+  /**
+   * Initializes settings.
+   */
+  public function __construct(stdClass $settings) {
+    $this->settings = $settings->settings;
+    $this->settings += $this->getDefaultSettings();
+  }
+
+  /**
+   * Executes the abstract class behavior.
+   *
+   * @return
+   *   The element's render array.
+   */
+  abstract public function execute();
+
+  /**
+   * Allows for backend specific overrides to the settings form.
+   */
+  public function settingsForm(&$form, &$form_state) {
+    // Nothing to do...
+  }
+
+  /**
+   * Returns an array of default settings.
+   */
+  public function getDefaultSettings() {
+    return array();
+  }
+}
+
+/**
+ * Plugin that returns an empty array, meaning
+ */
+class FacetapiEmptyBehaviorNone extends FacetapiEmptyBehavior {
+
+  /**
+   * Returns an empty array.
+   */
+  public function execute() {
+    return array();
+  }
+}
+
diff --git a/plugins/facetapi/empty_behavior_text.inc b/plugins/facetapi/empty_behavior_text.inc
new file mode 100644
index 0000000..a50969d
--- /dev/null
+++ b/plugins/facetapi/empty_behavior_text.inc
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * @file
+ * Empty behavior that returns text.
+ */
+
+/**
+ * Returns text.
+ */
+class FacetapiEmptyBehaviorText extends FacetapiEmptyBehavior {
+
+  /**
+   * A boolean flagging whether the input format is set, FALSE means it is
+   * being pulled from FacetapiEmptyBehavior::getDefaultSettings().
+   */
+  protected $formatSet = FALSE;
+
+  /**
+   * Checks if a format was selected, calls parent's constructor.
+   */
+  public function __construct(stdClass $settings) {
+    if (isset($settings->settings['empty_text']['format'])) {
+      $this->formatSet = TRUE;
+    }
+    parent::__construct($settings);
+  }
+
+  /**
+   * Returns an empty array.
+   */
+  public function execute() {
+    $text = $this->settings['empty_text']['value'];
+    $format_id = $this->settings['empty_text']['format'];
+    return array('#markup' => check_markup($text, $format_id));
+  }
+
+  /**
+   * Adds setting for the empty behavior.
+   */
+  public function settingsForm(&$form, &$form_state) {
+    global $user;
+    $format_id = ($this->formatSet) ? $this->settings['empty_text']['format'] : filter_default_format($user);
+    $format = filter_format_load($format_id);
+
+    // NOTE: There is a core bug with form #states and the text_format #type.
+    // @see http://drupal.org/node/997826
+    $form['widget']['empty']['empty_text'] = array(
+      '#type' => 'text_format',
+      '#access' => $format && filter_access($format, $user),
+      '#title' => t('Empty text'),
+      '#default_value' => $this->settings['empty_text']['value'],
+      '#format' => $format_id,
+      '#states' => array(
+        'visible' => array(
+          'select[name="empty_behavior"]' => array('value' => 'text'),
+        ),
+      ),
+    );
+  }
+
+  /**
+   * Returns an array of default settings.
+   */
+  public function getDefaultSettings() {
+    return array(
+      'empty_text' => array(
+        'value' => '',
+        'format' => filter_fallback_format(),
+      ),
+    );
+  }
+}
diff --git a/plugins/facetapi/widget_links.inc b/plugins/facetapi/widget_links.inc
index 560d95a..ce21f00 100644
--- a/plugins/facetapi/widget_links.inc
+++ b/plugins/facetapi/widget_links.inc
@@ -11,6 +11,21 @@
 class FacetapiWidgetLinks extends FacetapiWidget {
 
   /**
+   * Overrides constructor to reset the key.
+   *
+   * @param array $realm
+   *   The realm being rendered.
+   * @param array $settings
+   *   The realm settings.
+   * @param FacetapiFacet $facet
+   *   The facet object.
+   */
+  public function __construct($id, array $realm, FacetapiFacet $facet, stdClass $settings) {
+    parent::__construct($id, $realm, $facet, $settings);
+    $this->key = $facet['name'];
+  }
+
+  /**
    * Adds JS settings.
    */
   public function init() {
@@ -22,8 +37,6 @@ class FacetapiWidgetLinks extends FacetapiWidget {
    * Renders the links.
    */
   public function execute() {
-    // Sets the key, captures the facet's render array.
-    $this->key = $this->build['#facet']['name'];
     $element = &$this->build[$this->facet['field alias']];
 
     // Sets each item's theme hook, builds item list.
