diff --git a/facetapi.admin.js b/facetapi.admin.js
index 76c6ba5..bb81794 100644
--- a/facetapi.admin.js
+++ b/facetapi.admin.js
@@ -7,6 +7,17 @@ Drupal.behaviors.facetapi = {
     $('select[name="soft_limit"]').change(function() {
       $('select[name="soft_limit"]').val($(this).val());
     });
+    
+    // Ensures ALL show expanded checkboxes are updated.
+    // @see http://drupal.org/node/735528
+    $('input[name="show_expanded"]').change(function() {
+      if ($(this).attr('checked')) {
+        $('input[name="show_expanded"]').attr('checked', 'checked');
+      }
+      else {
+        $('input[name="show_expanded"]').removeAttr('checked');
+      }
+    });
 
     // Handles bug where input format fieldset is not hidden.
     // @see http://drupal.org/node/997826
diff --git a/plugins/facetapi/adapter.inc b/plugins/facetapi/adapter.inc
index 88cc955..710235e 100644
--- a/plugins/facetapi/adapter.inc
+++ b/plugins/facetapi/adapter.inc
@@ -1226,18 +1226,18 @@ class FacetapiFacetProcessor {
   protected function processQueryStrings(array &$build) {
     foreach ($build as $value => &$item) {
       $values = array($value);
-      if ($item['#active']) {
-        // If the item is active an has children, gets the paths for the
-        // children. Merges child values with this facet item's value so that
-        // unclicking the parent deactivates the children as well.
-        if (!empty($item['#item_children'])) {
-          $this->processQueryStrings($item['#item_children']);
+      // Calculate paths for the children.
+      if (!empty($item['#item_children'])) {
+        $this->processQueryStrings($item['#item_children']);
+        // Merges the childrens' values if the item is active so the children
+        // are deactivated when the parent is de-selected.
+        if ($item['#active']) {
           $values = array_merge(facetapi_get_child_values($item['#item_children']), $values);
         }
-        // Stores this item's active children so we can deactivate them in the
-        // current search block as well.
-        $this->activeChildren[$value] = $values;
       }
+      // Stores this item's active children so we can deactivate them in the
+      // current search block as well.
+      $this->activeChildren[$value] = $values;
 
       // Formats query string for facet item, sets theme function.
       $item['#query'] = $this->getQueryString($values, $item['#active']);
diff --git a/plugins/facetapi/widget_links.inc b/plugins/facetapi/widget_links.inc
index 3ec71c2..4ae14f5 100644
--- a/plugins/facetapi/widget_links.inc
+++ b/plugins/facetapi/widget_links.inc
@@ -87,12 +87,14 @@ class FacetapiWidgetLinks extends FacetapiWidget {
         ),
       );
 
-      // We don't display children unless the parent is clicked.
+      // If the item has no children, it is a leaf.
       if (empty($item['#item_children'])) {
         $row['class'][] = 'leaf';
       }
       else {
-        if ($item['#active']) {
+        // If the item is active or the "show_expanded" setting is selected,
+        // show this item as expanded so we see its children.
+        if ($item['#active'] || !empty($this->settings->settings['show_expanded'])) {
           $row['class'][] = 'expanded';
           $row['children'] = $this->buildListItems($item['#item_children']);
         }
@@ -134,6 +136,21 @@ class FacetapiWidgetLinks extends FacetapiWidget {
       ),
     );
 
+    // @see http://drupal.org/node/735528
+    if ($this->facet['hierarchy callback']) {
+      $form['widget']['widget_settings']['links'][$this->id]['show_expanded'] = array(
+        '#type' => 'checkbox',
+        '#title' => t('Expand hierarchy'),
+        '#default_value' => !empty($this->settings->settings['show_expanded']),
+        '#description' => t('Show the entire tree regardless of whether the parent items are active.'),
+        '#states' => array(
+          'visible' => array(
+            'select[name="widget"]' => array('value' => $this->id),
+          ),
+        ),
+      );
+    }
+
     // Hides all but the last element. The #states system will override this,
     // however it is necessary if JavaScript is disabled so multiple elements
     // aren't displayed to the user.
