diff --git a/facetapi.abstract.inc b/facetapi.abstract.inc
index 4cc1b07..bcb0b16 100644
--- a/facetapi.abstract.inc
+++ b/facetapi.abstract.inc
@@ -366,7 +366,7 @@ abstract class FacetapiAdapter {
     }
 
     // Adds JavaScript, initializes render array.
-    drupal_add_js(drupal_get_path('module', 'facetapi') . '/js/facetapi.js');
+    drupal_add_js(drupal_get_path('module', 'facetapi') . '/facetapi.js');
     $build = array(
       '#adapter' => $this,
       '#realm' => $realm,
diff --git a/facetapi.info b/facetapi.info
index bae4d80..31629ab 100644
--- a/facetapi.info
+++ b/facetapi.info
@@ -7,3 +7,4 @@ files[] = facetapi.abstract.inc
 files[] = plugins/facetapi/query_type.inc
 files[] = plugins/facetapi/widget.inc
 files[] = plugins/facetapi/widget_links.inc
+files[] = plugins/facetapi/widget_checkbox_links.inc
diff --git a/facetapi.js b/facetapi.js
new file mode 100644
index 0000000..5fc86f1
--- /dev/null
+++ b/facetapi.js
@@ -0,0 +1,65 @@
+(function ($) {
+
+Drupal.behaviors.facetapi = {
+  attach: function(context, settings) {
+    $('.facetapi-hidden-facet', context).hide();
+    $('<a href="#" class="facetapi-showhide"></a>').text(Drupal.t('Show more')).click(function() {
+      if ($(this).parent().find('.facet-hidden:visible').length == 0) {
+        $(this).parent().find('.facet-hidden').show();
+        $(this).text(Drupal.t('Show fewer'));
+      }
+      else {
+        $(this).parent().find('.facet-hidden').hide();
+        $(this).text(Drupal.t('Show more'));
+      }
+      return false;
+    }).appendTo($(settings.apachesolr_show_more_blocks, context));
+
+    // Find all checkbox facet links and give them a checkbox
+    $('a.facet-checkbox.facet-click', context).each(Drupal.facetapi.addCheckbox);
+    // Find all unclick links and turn them into checkboxes
+    $('a.facet-checkbox.facet-unclick', context).each(Drupal.facetapi.makeCheckbox);
+  }
+}
+
+Drupal.facetapi = {}
+
+/**
+ * Constructor for a class.
+ */
+Drupal.facetapi.Redirect = function(href) {
+  this.href = href;
+}
+
+/**
+ * Method to redirect to the stored href.
+ */
+Drupal.facetapi.Redirect.prototype.gotoHref = function() {
+  window.location.href = this.href;
+}
+
+Drupal.facetapi.addCheckbox = function() {
+  if (!$(this).hasClass('facet-checkbox-processed')) {
+    // Create an unchecked checkbox.
+    var checkbox = $('<input type="checkbox" class="facet-checkbox" />');
+    // Get the href of the link that is this DOM object.
+    var href = $(this).attr('href');
+    redirect = new Drupal.facetapi.Redirect(href);
+    checkbox.click($.proxy(redirect, 'gotoHref'));
+    $(this).before(checkbox).before('&nbsp;');
+    $(this).addClass('facet-checkbox-processed');
+  }
+}
+
+Drupal.facetapi.makeCheckbox = function() {
+  // Create a checked checkbox.
+  var checkbox = $('<input type="checkbox" class="facet-checkbox" checked="true" />');
+  // Get the href of the link that is this DOM object.
+  var href = $(this).attr('href');
+  redirect = new Drupal.facetapi.Redirect(href);
+  checkbox.click($.proxy(redirect, 'gotoHref'));
+  // Add the checkbox, hide the link.
+  $(this).before(checkbox).hide();
+}
+
+})(jQuery);
diff --git a/facetapi.module b/facetapi.module
index 0aef506..b18f549 100644
--- a/facetapi.module
+++ b/facetapi.module
@@ -581,6 +581,12 @@ function facetapi_facetapi_widgets() {
         'class' => 'FacetapiWidgetLinks',
       ),
     ),
+    'facetapi_checkbox_links' => array(
+      'handler' => array(
+        'label' => t('Links with checkboxes'),
+        'class' => 'FacetapiWidgetCheckboxLinks',
+      ),
+    ),
   );
 }
 
diff --git a/facetapi.theme.inc b/facetapi.theme.inc
index 2fa3c3d..db4265e 100644
--- a/facetapi.theme.inc
+++ b/facetapi.theme.inc
@@ -26,7 +26,7 @@ function theme_facetapi_link_inactive($variables) {
   if (!empty($variables['count'])) {
     $variables['text'] .= ' ' . theme('facetapi_count', $variables);
   }
-  return theme('link', $variables);
+  return theme_link($variables);
 }
 
 /**
@@ -41,8 +41,15 @@ function theme_facetapi_count($variables) {
  * Themes a facet link for a value that is currently being searched.
  */
 function theme_facetapi_link_active($variables) {
+  $suffix = '';
   if (isset($variables['text'])) {
-    $variables['text'] = '(-) ' . $variables['text'];
+    if (empty($variables['options']['html'])) {
+     $suffix = ' ' . check_plain($variables['text']);
+    }
+    else {
+      $suffix  = ' ' . $variables['text'];
+    }
   }
-  return theme('link', $variables);
+  $variables['text'] = '(-) ';
+  return theme_link($variables) . $suffix;
 }
diff --git a/plugins/facetapi/widget_checkbox_links.inc b/plugins/facetapi/widget_checkbox_links.inc
new file mode 100644
index 0000000..1560da2
--- /dev/null
+++ b/plugins/facetapi/widget_checkbox_links.inc
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * @file
+ *
+ */
+
+/**
+ * Widget that renders facets as a list of clickable links as checkboxes.
+ */
+class FacetapiWidgetCheckboxLinks extends FacetapiWidgetLinks {
+
+  /**
+   * Recursive function that converts the render array into an array that can be
+   * passed to theme_item_list().
+   *
+   * @param array $build
+   *   The facet's render array.
+   *
+   * @return array
+   *   The "items" parameter for theme_item_list().
+   */
+  function buildListItems($build) {
+    $items = array();
+    foreach ($build as $value => $item) {
+      $row = array('class' => array());
+
+      // Initializes variables passed to theme hook.
+      $variables = array(
+        'text' => $item['#markup'],
+        'path' => $_GET['q'],
+        'count' => $item['#count'],
+        'options' => array(
+          'attributes' => array('class' => array('facet-checkbox')),
+          'html' => FALSE,
+          'query' => $item['#query'],
+        ),
+      );
+
+      // We don't display children unless the parent is clicked.
+      if (!empty($item['#item_children'])) {
+        if ($item['#active']) {
+          $row['class'][] = 'expanded';
+          $row['children'] = $this->buildListItems($item['#item_children']);
+        }
+        else {
+          $row['class'][] = 'collapsed';
+        }
+      }
+
+      // Gets theme hook, adds last minute classes.
+      if ($item['#active']) {
+        $variables['options']['attributes']['class'][] = 'facet-unclick';
+      }
+      else {
+        $variables['options']['attributes']['class'][] = 'facet-click';
+      }
+
+      // Themes the link, adds row to items.
+      $row['data'] = theme($item['#theme'], $variables);
+      $items[] = $row;
+    }
+
+    return $items;
+  }
+}
diff --git a/plugins/facetapi/widget_links.inc b/plugins/facetapi/widget_links.inc
index 4d0bc8d..f6fe58a 100644
--- a/plugins/facetapi/widget_links.inc
+++ b/plugins/facetapi/widget_links.inc
@@ -83,7 +83,10 @@ class FacetapiWidgetLinks extends FacetapiWidget {
 
       // Gets theme hook, adds last minute classes.
       if ($item['#active']) {
-        $variables['options']['attributes']['class'][] = 'active';
+        $variables['options']['attributes']['class'][] = 'facet-unclick';
+      }
+      else {
+        $variables['options']['attributes']['class'][] = 'facet-click';
       }
 
       // Themes the link, adds row to items.
