diff --git a/plugins/facetapi/widget_links.inc b/plugins/facetapi/widget_links.inc
index 728ae18..910e299 100644
--- a/plugins/facetapi/widget_links.inc
+++ b/plugins/facetapi/widget_links.inc
@@ -2,13 +2,13 @@
 
 /**
  * @file
- * Widgets for facets rendered as UI sliders with Min/Max respect.
+ * Widgets for facets rendered as test link ranges.
  */
 
 /**
- * Widget that renders facets as a UI slider.
+ * Widget that renders facets as a series of text links.
  */
-class SearchApiRangesWidgetUISlider extends FacetapiWidget {
+class SearchApiRangesWidgetLinks extends FacetapiWidgetLinks {
 
   /**
    * Renders the links.
@@ -16,13 +16,31 @@ class SearchApiRangesWidgetUISlider extends FacetapiWidget {
   public function execute() {
     $element = &$this->build[$this->facet['field alias']];
 
-    $theme_suffix = '';
-    $theme_suffix .= '__' . preg_replace('/\W+/', '_', $this->facet->getAdapter()->getSearcher());
-    $theme_suffix .= '__' . preg_replace('/\W+/', '_', $this->facet['field alias']);
+    // Get Search API stuff
+    $searcher = $this->facet->getAdapter()->getSearcher();
+    $index_id = explode('@', $searcher);
+    $index = search_api_index_load($index_id[1]);
+    list($query, $results) = $this->facet->getAdapter()->getCurrentSearch();
+
+    // Prepare variables for min/max query
+    $variables = array(
+      'element' => $element,
+      'index' => $index,
+      'range_field' => $this->facet['field alias'],
+      'query' => $query,
+      'prefix' => $this->settings->settings['prefix'],
+      'suffix' => $this->settings->settings['suffix'],
+    );
 
+    // Generate the ranges to the be used for the text links
+    $element = search_api_ranges_generate_ranges_simple($variables, $this->settings->settings['range_simple']);
+
+    // Sets each item's theme hook, builds item list.
+    $this->setThemeHooks($element);
     $element = array(
-      '#theme' => 'search_api_ranges_slider' . $theme_suffix,
-      '#slider' => $this->_buildUISliderForm(),
+      '#theme' => 'item_list',
+      '#items' => $this->buildListItems($element),
+      '#attributes' => $this->build['#attributes'],
     );
   }
 
@@ -35,28 +53,55 @@ class SearchApiRangesWidgetUISlider extends FacetapiWidget {
       '#title' => t('Name'),
       '#default_value' => $this->settings->settings['name'],
       '#description' => t('The name of the range field.'),
-      '#states' => array('visible' => array('select[name="widget"]' => array('value' => $this->id), ), ),
+      '#states' => array(
+        'visible' => array(
+          'select[name="widget"]' => array('value' => $this->id),
+        ),
+      ),
     );
     $form['widget']['widget_settings']['links'][$this->id]['prefix'] = array(
       '#type' => 'textfield',
       '#title' => t('Prefix'),
       '#default_value' => $this->settings->settings['prefix'],
-      '#description' => t('Adds a prefix to the slider, e.g. $, #.'),
-      '#states' => array('visible' => array('select[name="widget"]' => array('value' => $this->id), ), ),
+      '#description' => t('Adds a prefix to the text links, e.g. $, #.'),
+      '#states' => array(
+        'visible' => array(
+          'select[name="widget"]' => array('value' => $this->id),
+        ),
+      ),
     );
     $form['widget']['widget_settings']['links'][$this->id]['suffix'] = array(
       '#type' => 'textfield',
       '#title' => t('Suffix'),
       '#default_value' => $this->settings->settings['suffix'],
-      '#description' => t('Adds a suffix to the slider, e.g. &euro;, pcs., etc.'),
-      '#states' => array('visible' => array('select[name="widget"]' => array('value' => $this->id), ), ),
+      '#description' => t('Adds a suffix to the text links, e.g. &euro;, pcs., etc.'),
+      '#states' => array(
+        'visible' => array(
+          'select[name="widget"]' => array('value' => $this->id),
+        ),
+      ),
     );
-    $form['widget']['widget_settings']['links'][$this->id]['auto-submit-delay'] = array(
+    $form['widget']['widget_settings']['links'][$this->id]['range_simple'] = array(
       '#type' => 'textfield',
-      '#title' => t('Auto Submit Delay'),
-      '#default_value' => $this->settings->settings['auto-submit-delay'],
-      '#description' => t('Automatically submit form after the user changes releases slider handles. Enter a delay in milliseconds, i.e. 1000 for 1 second.'),
-      '#states' => array('visible' => array('select[name="widget"]' => array('value' => $this->id), ), ),
+      '#title' => t('Simple range'),
+      '#default_value' => $this->settings->settings['range_simple'],
+      '#description' => t('Add a fixed range to create "range facet". For example, "10" on a price field will create 10 - 20, 20 - 30 etc.'),
+      '#states' => array(
+        'visible' => array(
+          'select[name="widget"]' => array('value' => $this->id),
+        ),
+      ),
+    );
+    $form['widget']['widget_settings']['links'][$this->id]['range_advanced'] = array(
+      '#type' => 'textarea',
+      '#title' => t('Advanced range'),
+      '#default_value' => $this->settings->settings['range_advanced'],
+      '#description' => t('Add a pre-defined list of ranges to create "range facets". For examples, refer to README in search api range.'),
+      '#states' => array(
+        'visible' => array(
+          'select[name="widget"]' => array('value' => $this->id),
+        ),
+      ),
     );
   }
 
@@ -68,79 +113,9 @@ class SearchApiRangesWidgetUISlider extends FacetapiWidget {
       'name' => '',
       'prefix' => '',
       'suffix' => '',
-      'auto-submit-delay' => 1500,
-    );
-  }
-
-  /**
-   * Builds a UI slider themed form.
-   * Performs min/max queries through Search API.
-   */
-  public function _buildUISliderForm() {
-    $slider = array();
-
-    // Get Search API stuff
-    $searcher = $this->facet->getAdapter()->getSearcher();
-    $index_id = explode('@', $searcher);
-    $index = search_api_index_load($index_id[1]);
-    list($query, $results) = $this->facet->getAdapter()->getCurrentSearch();
-
-    // Prepare variables for min/max query
-    $variables = array(
-      'index' => $index,
-      'range_field' => $this->facet['field alias'],
-      'query' => $query,
-    );
-
-    // Query the min/max values for the range slider
-    $min_value = search_api_ranges_minmax($variables, 'ASC');
-    $max_value = search_api_ranges_minmax($variables, 'DESC');
-
-    // Kill widget if there is nothing to do
-    if (empty($min_value) && empty($max_value)) {
-      return array();
-    }
-
-    // Calculate user input from/to values (different concept than min/max)
-    foreach ($this->facet->getAdapter()->getAllActiveItems() as $key => $active_item) {
-      if ($active_item['field alias'] == $this->facet['field alias']) {
-        $values = explode(' ', substr($active_item['value'], 1, -1));
-        $from_value = round($values[0]);
-        $to_value = round($values[2]);
-        break;
-      }
-    }
-
-    // User from/to cannot exceed queried min/max, adjust if needed
-    if (!isset($from_value) || $from_value < $min_value) {
-      $from_value = $min_value;
-    }
-    if (!isset($to_value) || $max_value < $to_value) {
-      $to_value = $max_value;
-    }
-
-    // Get facet path field/alias
-    $range_field = $this->facet['field alias'];
-    if (module_exists('facetapi_pretty_paths')) {
-      $processor = new FacetapiUrlProcessorPrettyPaths($this->facet->getAdapter());
-      $range_field = $processor->getFacetPrettyPathsAlias($this->facet->getFacet());
-    }
-
-    // Prepare the slider variables and return themed form
-    // @see search-api-ranges-slider.tpl.php
-    $variables = array(
-      'range_field' => rawurlencode($range_field),
-      'name' => $this->settings->settings['name'],
-      'prefix' => $this->settings->settings['prefix'],
-      'suffix' => $this->settings->settings['suffix'],
-      'min' => $min_value,
-      'max' => $max_value,
-      'from' => $from_value,
-      'to' => $to_value,
-      'auto_submit_delay' => is_numeric($this->settings->settings['auto-submit-delay']) ? $this->settings->settings['auto-submit-delay'] : 0,
-      'active_items' => $this->facet->getAdapter()->getAllActiveItems(),
+      'range_simple' => 10,
+      'range_advanced' => '',
     );
-    return drupal_get_form('search_api_ranges_block_view_form', $variables);
   }
 
 }
diff --git a/plugins/facetapi/widget_slider.inc b/plugins/facetapi/widget_slider.inc
new file mode 100644
index 0000000..5b07cb5
--- /dev/null
+++ b/plugins/facetapi/widget_slider.inc
@@ -0,0 +1,146 @@
+<?php
+
+/**
+ * @file
+ * Widgets for facets rendered as UI sliders with Min/Max respect.
+ */
+
+/**
+ * Widget that renders facets as a UI slider.
+ */
+class SearchApiRangesWidgetUISlider extends FacetapiWidget {
+
+  /**
+   * Renders the links.
+   */
+  public function execute() {
+    $element = &$this->build[$this->facet['field alias']];
+
+    $theme_suffix = '';
+    $theme_suffix .= '__' . preg_replace('/\W+/', '_', $this->facet->getAdapter()->getSearcher());
+    $theme_suffix .= '__' . preg_replace('/\W+/', '_', $this->facet['field alias']);
+
+    $element = array(
+      '#theme' => 'search_api_ranges_slider' . $theme_suffix,
+      '#slider' => $this->_buildUISliderForm(),
+    );
+  }
+
+  /**
+   * Allows the widget to provide additional settings to the form.
+   */
+  function settingsForm(&$form, &$form_state) {
+    $form['widget']['widget_settings']['links'][$this->id]['name'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Name'),
+      '#default_value' => $this->settings->settings['name'],
+      '#description' => t('The name of the range field.'),
+      '#states' => array('visible' => array('select[name="widget"]' => array('value' => $this->id), ), ),
+    );
+    $form['widget']['widget_settings']['links'][$this->id]['prefix'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Prefix'),
+      '#default_value' => $this->settings->settings['prefix'],
+      '#description' => t('Adds a prefix to the slider, e.g. $, #.'),
+      '#states' => array('visible' => array('select[name="widget"]' => array('value' => $this->id), ), ),
+    );
+    $form['widget']['widget_settings']['links'][$this->id]['suffix'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Suffix'),
+      '#default_value' => $this->settings->settings['suffix'],
+      '#description' => t('Adds a suffix to the slider, e.g. &euro;, pcs., etc.'),
+      '#states' => array('visible' => array('select[name="widget"]' => array('value' => $this->id), ), ),
+    );
+    $form['widget']['widget_settings']['links'][$this->id]['auto-submit-delay'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Auto Submit Delay'),
+      '#default_value' => $this->settings->settings['auto-submit-delay'],
+      '#description' => t('Automatically submit form after the user changes releases slider handles. Enter a delay in milliseconds, i.e. 1000 for 1 second.'),
+      '#states' => array('visible' => array('select[name="widget"]' => array('value' => $this->id), ), ),
+    );
+  }
+
+  /**
+   * Returns defaults for the settings this widget provides.
+   */
+  function getDefaultSettings() {
+    return array(
+      'name' => '',
+      'prefix' => '',
+      'suffix' => '',
+      'auto-submit-delay' => 1500,
+    );
+  }
+
+  /**
+   * Builds a UI slider themed form.
+   * Performs min/max queries through Search API.
+   */
+  public function _buildUISliderForm() {
+    $slider = array();
+
+    // Get Search API stuff
+    $searcher = $this->facet->getAdapter()->getSearcher();
+    $index_id = explode('@', $searcher);
+    $index = search_api_index_load($index_id[1]);
+    list($query, $results) = $this->facet->getAdapter()->getCurrentSearch();
+
+    // Prepare variables for min/max query
+    $variables = array(
+      'index' => $index,
+      'range_field' => $this->facet['field alias'],
+      'query' => $query,
+    );
+
+    // Query the min/max values for the range slider
+    $min_value = search_api_ranges_minmax($variables, 'ASC');
+    $max_value = search_api_ranges_minmax($variables, 'DESC');
+
+    // Kill widget if there is nothing to do
+    if (empty($min_value) && empty($max_value)) {
+      return array();
+    }
+
+    // Calculate user input from/to values (different concept than min/max)
+    foreach ($this->facet->getAdapter()->getAllActiveItems() as $key => $active_item) {
+      if ($active_item['field alias'] == $this->facet['field alias']) {
+        $values = explode(' ', substr($active_item['value'], 1, -1));
+        $from_value = round($values[0]);
+        $to_value = round($values[2]);
+        break;
+      }
+    }
+
+    // User from/to cannot exceed queried min/max, adjust if needed
+    if (!isset($from_value) || $from_value < $min_value) {
+      $from_value = $min_value;
+    }
+    if (!isset($to_value) || $max_value < $to_value) {
+      $to_value = $max_value;
+    }
+
+    // Get facet path field/alias
+    $range_field = $this->facet['field alias'];
+    if (module_exists('facetapi_pretty_paths')) {
+      $processor = new FacetapiUrlProcessorPrettyPaths($this->facet->getAdapter());
+      $range_field = $processor->getFacetPrettyPathsAlias($this->facet->getFacet());
+    }
+
+    // Prepare the slider variables and return themed form
+    // @see search-api-ranges-slider.tpl.php
+    $variables = array(
+      'range_field' => rawurlencode($range_field),
+      'name' => $this->settings->settings['name'],
+      'prefix' => $this->settings->settings['prefix'],
+      'suffix' => $this->settings->settings['suffix'],
+      'min' => $min_value,
+      'max' => $max_value,
+      'from' => $from_value,
+      'to' => $to_value,
+      'auto_submit_delay' => is_numeric($this->settings->settings['auto-submit-delay']) ? $this->settings->settings['auto-submit-delay'] : 0,
+      'active_items' => $this->facet->getAdapter()->getAllActiveItems(),
+    );
+    return drupal_get_form('search_api_ranges_block_slider_view_form', $variables);
+  }
+
+}
diff --git a/search_api_ranges.info b/search_api_ranges.info
index fdc3775..8ff6bf1 100644
--- a/search_api_ranges.info
+++ b/search_api_ranges.info
@@ -5,5 +5,6 @@ dependencies[] = search_api
 dependencies[] = search_api_facetapi
 files[] = includes/callback_search_api_ranges.inc
 files[] = plugins/facetapi/widget_links.inc
+files[] = plugins/facetapi/widget_slider.inc
 core = 7.x
 package = Search
diff --git a/search_api_ranges.module b/search_api_ranges.module
index 377d2f1..f95220a 100644
--- a/search_api_ranges.module
+++ b/search_api_ranges.module
@@ -15,7 +15,7 @@ function search_api_ranges_theme() {
       'variables' => array('slider' => ''),
       'file' => 'search_api_ranges.theme.inc',
     ),
-    'search_api_ranges_block_view_form' => array(
+    'search_api_ranges_block_slider_view_form' => array(
       'arguments' => array('form' => NULL),
       'template' => 'search-api-ranges-slider',
       'render element' => 'form',
@@ -48,11 +48,22 @@ function search_api_ranges_preprocess_page() {
  * Implements hook_facetapi_widgets().
  */
 function search_api_ranges_facetapi_widgets() {
-  return array('search_api_ranges_ui_slider' => array('handler' => array(
+  return array(
+    'search_api_ranges_ui_slider' => array(
+      'handler' => array(
         'label' => t('Ranges: Min/Max UI Slider'),
         'class' => 'SearchApiRangesWidgetUISlider',
         'query types' => array('term'),
-      ), ), );
+      ),
+    ),
+    'search_api_ranges_ui_links' => array(
+      'handler' => array(
+        'label' => t('Ranges: Text links'),
+        'class' => 'SearchApiRangesWidgetLinks',
+        'query types' => array('term'),
+      ),
+    ),
+  );
 }
 
 /**
@@ -209,7 +220,7 @@ function search_api_ranges_minmax_execute(SearchApiQuery $query) {
 /**
  * Generates the jQuery range slider form for range facet blocks
  */
-function search_api_ranges_block_view_form($form, &$form_state, $variables) {
+function search_api_ranges_block_slider_view_form($form, &$form_state, $variables) {
   $form = array();
 
   // For compatibility with Search API ajax,
@@ -282,7 +293,7 @@ function search_api_ranges_block_view_form($form, &$form_state, $variables) {
 /**
  * Handle slider block submit
  */
-function search_api_ranges_block_view_form_submit($form, &$form_state) {
+function search_api_ranges_block_slider_view_form_submit($form, &$form_state) {
   $values = $form_state['values'];
   $range_field = $form_state['input']['range-field'];
 
@@ -353,3 +364,92 @@ function search_api_ranges_search_api_alter_callback_info() {
   );
   return $callbacks;
 }
+
+/**
+ * Generate the available ranges given the active facets
+ *
+ * @param array $variables
+ *   An array with at least the following keys => values:
+ *   - (string) range_field: the name of the slider range field
+ *   - (array) query: the Search API query object
+ *
+ * @param integer $step
+ *   used as the increment between elements in the range sequence.
+ *
+ * @return array
+ *   An array of text link arrays, each with the following keys => values:
+ *   - (string) text: A textrual representation of the range,
+ *   - (integer) min: The minimum vaule for the range.
+ *   - (integer) max: The maximum value for the range.
+ */
+function search_api_ranges_generate_ranges_simple($variables, $step) {
+  $element = $variables['element'];
+
+  // Calculate the min and max of the ranges.
+  $values = array_keys($element);
+  $min_value = $values[0];
+  $max_value = $values[count($values) - 1];
+
+  // Kill widget if there is nothing to do
+//   if ((empty($min_value) && empty($max_value)) || $min_value == $max_value) {
+//     return array();
+//   }
+
+  // Get a handle on params and existing filter (if any)
+  $params = drupal_get_query_parameters($_GET, array('q', 'page'));
+
+  $count = 0;
+  $ranges = array();
+  $min = floor($min_value / $step) * $step;
+  $max = $min + $step;
+  foreach ($values as $val) {
+    if ($val > $max) {
+      $ranges[$min . ' - ' . $max] = _search_api_generate_range($min, $max, $count, $variables, $params);
+
+      $min = $max;
+      $max += $step;
+      $count = 0;
+    }
+
+    $count += $element[$val]['#count'];
+  }
+  if ($count) {
+    $ranges[$min . ' - ' . $max] = _search_api_generate_range($min, $max, $count, $variables, $params);
+  }
+
+  return $ranges;
+}
+
+function _search_api_generate_range($min, $max, $count, $variables, $params) {
+  // Generate the new query
+  $query = urlencode($variables['range_field']) . ":[$min TO $max]";
+  $active = FALSE;
+
+  // Add the new query to any existing queries.
+  // Or remove it if the range is already active.
+  if (empty($params['f'])) {
+    $params['f'] = array($query);
+  }
+  else {
+    $key = array_search($query, $params['f']);
+    if ($key !== FALSE) {
+      unset($params['f'][$key]);
+      $active = TRUE;
+    }
+    else {
+      $params_clone['f'][] = $query;
+    }
+  }
+
+  // Build up a render array.
+  return array(
+    '#markup' => $variables['prefix'] . $min . $variables['suffix'] . '–' . $variables['prefix'] . $max . $variables['suffix'],
+    '#path' => $_GET['q'],
+    '#html' => FALSE,
+    '#indexed_value' => 'TODO: what to put here?',
+    '#count' => $count,
+    '#query' => $params,
+    '#active' => $active,
+  );
+
+}
