diff --git a/date_facets.module b/date_facets.module
index 4d7e4c2..fabde9b 100644
--- a/date_facets.module
+++ b/date_facets.module
@@ -1,10 +1,14 @@
 <?php
-
 /**
  * @file
  * Provides date range facets that are similar to implementations in major search engines.
  */
 
+define('DATE_RANGE_UNIT_HOUR', 60 * 60);
+define('DATE_RANGE_UNIT_DAY', 60 * 60 * 24);
+define('DATE_RANGE_UNIT_MONTH', 60 * 60 * 24 * 30);
+define('DATE_RANGE_UNIT_YEAR', 60 * 60 * 24 * 365);
+
 /**
  * Implements hook_facetapi_facet_info_alter().
  *
@@ -42,33 +46,185 @@ function date_facets_associate_widget(array &$facet_info) {
  *
  * @todo Implement an alter hook?
  */
-function date_facets_get_ranges() {
+function date_facets_get_ranges($ranges) {
   $build = array();
 
-  $build['past_hour'] = array(
-    '#count' => NULL,
-    '#markup' => t('Past hour'),
-  );
+  uasort($ranges, 'drupal_sort_weight');
+  foreach ($ranges as $range_data) {
+    $build[$range_data['machine_name']] = array(
+      '#count' => NULL,
+      '#markup' => $range_data['label'],
+      '#weight' => $range_data['weight'],
+    );
+  }
 
-  $build['past_24_hours'] = array(
-    '#count' => NULL,
-    '#markup' => t('Past 24 hours'),
-  );
+  return $build;
+}
 
-  $build['past_week'] = array(
-    '#count' => NULL,
-    '#markup' => t('Past week'),
+/**
+ * Implements hook_theme().
+ */
+function date_facets_theme() {
+  return array(
+    'date_facets_tabledrag_form' => array(
+      'render element' => 'form',
+    ),
   );
+}
 
-  $build['past_month'] = array(
-    '#count' => NULL,
-    '#markup' => t('Past month'),
+/**
+ * Add a tabledrag table for date ranges on the given date facet.
+ */
+function theme_date_facets_tabledrag_form($variables) {
+  $form = $variables['form'];
+  $header = array(
+    array('data' => t('Name !required', array('!required' => '<span class="form-required" title="' . t('This field is required.') . '">*</span>'))),
+    array('data' => t('Date Range !required', array('!required' => '<span class="form-required" title="' . t('This field is required.') . '">*</span>')), 'colspan' => 2),
+    array('data' => t('Weight')),
+    array('data' => t('Delete'))
   );
-
-  $build['past_year'] = array(
-    '#count' => NULL,
-    '#markup' => t('Past year'),
+  drupal_add_tabledrag('facetapi-date-range-query-date-ranges', 'order', 'self', 'date-range-weight');
+  $rows = array();
+  foreach (element_children($form['widget']['widget_settings']['ranges']) as $range_key) {
+    $row = array();
+    unset($form['widget']['widget_settings']['ranges'][$range_key]['label']['#title']);
+    $row[] = drupal_render($form['widget']['widget_settings']['ranges'][$range_key]['label'])
+      . drupal_render($form['widget']['widget_settings']['ranges'][$range_key]['machine_name']);
+    foreach (array('date_range_start', 'date_range_end') as $element) {
+      $temp_row = '';
+      foreach (array('op', 'amount', 'unit') as $item) {
+        unset($form['widget']['widget_settings']['ranges'][$range_key][$element . '_' . $item]['#title']);
+        $temp_row .= drupal_render($form['widget']['widget_settings']['ranges'][$range_key][$element . '_' . $item]);
+      }
+      $row[] = $temp_row;
+    }
+    foreach (array('weight', 'delete') as $element) {
+      unset($form['widget']['widget_settings']['ranges'][$range_key][$element]['#title']);
+      $row[] = drupal_render($form['widget']['widget_settings']['ranges'][$range_key][$element]);
+    }
+    $rows[] = array(
+      'data' => $row,
+      'class' => array('draggable'),
+    );
+  }
+  $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'facetapi-date-range-query-date-ranges')));
+  $form['widget']['widget_settings']['date_ranges']['ranges'] = array(
+    '#type' => 'markup',
+    '#markup' => $output,
+    '#weight' => 0,
   );
+  return drupal_render_children($form);
+}
 
-  return $build;
+/**
+ * Custom date range form validation.
+ */
+function date_facets_tabledrag_form_validate($form, &$form_state) {
+  $error = FALSE;
+  $temp_error = FALSE;
+  foreach ($form_state['values']['ranges'] as $range_key => $range_data) {
+    if ($range_data['delete']) {
+      unset($form_state['values']['ranges'][$range_key]);
+      continue;
+    }
+    foreach (array('date_range_start', 'date_range_end') as $item) {
+      if ($range_data[$item . '_op'] != 'NOW') {
+        if (empty($range_data[$item . '_amount'])) {
+          $key = $item . '_amount';
+          form_set_error("ranges][$range_key][$key", t('You must enter an amount.'));
+          $error = TRUE;
+        }
+      }
+    }
+    foreach (array('label', 'machine_name') as $element) {
+      if (empty($range_data[$element])) {
+        form_set_error("ranges][$range_key][$element", t('!item is required.', array('!item' => '<em>' . $element . '</em>')));
+        $error = TRUE;
+      }
+    }
+    if (!$error) {
+      unset($form_state['values']['ranges'][$range_key]);
+      $form_state['values']['ranges'][$range_data['machine_name']] = $range_data;
+    }
+  }
+  return !$error;
+}
+
+/**
+ * Date range machine name existence check.
+ * @TODO: Make this actually work.
+ */
+function date_facets_date_range_exists($label) {
+  return FALSE;
+}
+
+/**
+ * Custom date range AJAX handler. Rebuild the entire form for now, unfortunately.
+ */
+function date_facets_tabledrag_form_new_range($form, &$form_state) {
+  $form_state['add_new_range'] = TRUE;
+  return drupal_rebuild_form($form['#form_id'], $form_state, $form);
+}
+
+/**
+ * Provides the default date ranges.
+ */
+function date_facets_default_ranges() {
+  return array(
+    'past_hour' => array(
+      'machine_name' => 'past_hour',
+      'label' => t('Past hour'),
+      'date_range_start_op' => '-',
+      'date_range_start_amount' => '1',
+      'date_range_start_unit' => 'HOUR',
+      'date_range_end_op' => 'NOW',
+      'date_range_end_amount' => '',
+      'date_range_end_unit' => '',
+      'weight' => 0,
+    ),
+    'past_24_hours' => array(
+      'machine_name' => 'past_24_hours',
+      'label' => t('Past 24 hours'),
+      'date_range_start_op' => '-',
+      'date_range_start_amount' => '24',
+      'date_range_start_unit' => 'HOUR',
+      'date_range_end_op' => 'NOW',
+      'date_range_end_amount' => '',
+      'date_range_end_unit' => '',
+      'weight' => 1,
+    ),
+    'past_week' => array(
+      'machine_name' => 'past_week',
+      'label' => t('Past week'),
+      'date_range_start_op' => '-',
+      'date_range_start_amount' => '7',
+      'date_range_start_unit' => 'DAY',
+      'date_range_end_op' => 'NOW',
+      'date_range_end_amount' => '',
+      'date_range_end_unit' => '',
+      'weight' => 2,
+    ),
+    'past_month' => array(
+      'machine_name' => 'past_month',
+      'label' => t('Past month'),
+      'date_range_start_op' => '-',
+      'date_range_start_amount' => '1',
+      'date_range_start_unit' => 'MONTH',
+      'date_range_end_op' => 'NOW',
+      'date_range_end_amount' => '',
+      'date_range_end_unit' => '',
+      'weight' => 3,
+    ),
+    'past_year' => array(
+      'machine_name' => 'past_year',
+      'label' => t('Past year'),
+      'date_range_start_op' => '-',
+      'date_range_start_amount' => '1',
+      'date_range_start_unit' => 'YEAR',
+      'date_range_end_op' => 'NOW',
+      'date_range_end_amount' => '',
+      'date_range_end_unit' => '',
+      'weight' => 4,
+    ),
+  );
 }
diff --git a/lib/Drupal/Apachesolr/Facetapi/QueryType/DateRangeQueryType.php b/lib/Drupal/Apachesolr/Facetapi/QueryType/DateRangeQueryType.php
index 88bc118..0168980 100644
--- a/lib/Drupal/Apachesolr/Facetapi/QueryType/DateRangeQueryType.php
+++ b/lib/Drupal/Apachesolr/Facetapi/QueryType/DateRangeQueryType.php
@@ -25,37 +25,55 @@ class Drupal_Apachesolr_Facetapi_QueryType_DateRangeQueryType extends FacetapiQu
   public function execute($query) {
     $active = $this->getActiveItems();
     $field = $this->facet['field'];
+    
+    $settings = $this->adapter->getFacetSettings($this->facet, facetapi_realm_load('block'));
+    $ranges = (isset($settings->settings['ranges']) ? $settings->settings['ranges'] : date_facets_default_ranges());
+    foreach (array_merge($ranges, date_facets_default_ranges()) as $range) {
+      list($start, $end) = $this->generateRange($range);
+      $query->addParam('facet.query', $this->facet['field'] . ":[$start TO $end]");
+    }
 
     if (!empty($active)) {
+      $range = $ranges[key($active)];
+      list($start, $end) = $this->generateRange($range);
+      $query->addParam('fq', $this->facet['field'] . ":[$start TO $end]");
+    }
+  }
 
-      // Check the first value since only one is allowed.
-      switch (key($active)) {
-        case 'past_hour':
-          $lower = "NOW/HOUR-1HOUR";
-          break;
-
-        case 'past_24_hours':
-          $lower = "NOW/DAY-1DAY";
-          break;
-
-        case 'past_week':
-          $lower = "NOW/DAY-7DAYS";
-          break;
-
-        case 'past_month':
-          $lower = "NOW/MONTH-1MONTH";
-          break;
-
-        case 'past_year':
-          $lower = "NOW/MONTH-1YEAR";
-          break;
-
-        default:
-          return;
-      }
+  /**
+   * Return the divisor for the given unit.
+   */
+  protected function unitDivisor($unit) {
+    switch ($unit) {
+      case "HOUR":
+        return "HOUR";
+      case "DAY":
+        return "DAY";
+      case "MONTH":
+      case "YEAR":
+        return "MONTH";
+    }
+  }
 
-      $query->addParam('fq', $this->facet['field'] . ":[$lower TO NOW/DAY+1DAY]");
+  /**
+   * Generate a Solr version of a lower and upper date range.
+   */
+  protected function generateRange($range) {
+    if ($range['date_range_start_op'] == 'NOW') {
+      $lower = "NOW/DAY";
+    }
+    else {
+      $s = (((int) abs($range['date_range_start_amount']) > 1) ? 'S' : '');
+      $lower = "NOW/" . $this->unitDivisor($range['date_range_start_unit']) . $range['date_range_start_op'] . $range['date_range_start_amount'] . $range['date_range_start_unit'] . $s;
     }
+    if ($range['date_range_end_op'] == 'NOW') {
+      $upper = "NOW/DAY+1DAY";
+    }
+    else {
+      $s = (((int) abs($range['date_range_end_amount']) > 1) ? 'S' : '');
+      $upper = "NOW/" . $this->unitDivisor($range['date_range_end_unit']) . $range['date_range_end_op'] . $range['date_range_end_amount'] . $range['date_range_end_unit'] . $s;
+    }
+    return array($lower, $upper);
   }
 
   /**
@@ -64,6 +82,24 @@ class Drupal_Apachesolr_Facetapi_QueryType_DateRangeQueryType extends FacetapiQu
    * Unlike normal facets, we provide a static list of options.
    */
   public function build() {
-    return date_facets_get_ranges();
+    $settings = $this->adapter->getFacetSettings($this->facet, facetapi_realm_load('block'));
+    $ranges = (isset($settings->settings['ranges']) && !empty($settings->settings['ranges']) ? $settings->settings['ranges'] : date_facets_default_ranges());
+    $build = date_facets_get_ranges($ranges);
+    if ($response = apachesolr_static_response_cache($this->adapter->getSearcher())) {
+      $facet_global_settings = $this->adapter->getFacet($this->facet)->getSettings();
+      $values = (array) $response->facet_counts->facet_queries;
+      // Add result counts from the facet queries added in execute().
+      foreach ($ranges as $range) {
+        list($start, $end) = $this->generateRange($range);
+        $build[$range['machine_name']]['#count'] = $values[($this->facet['field'] . ":[$start TO $end]")];
+      }
+      // Unset options with fewer results than the minimum count setting.
+      foreach ($build as $name => $item) {
+        if ($item['#count'] < $facet_global_settings->settings['facet_mincount']) {
+          unset($build[$name]);
+        }
+      }
+    }
+    return $build;
   }
 }
diff --git a/lib/Drupal/Facetapi/Widget/DateRangeWidget.php b/lib/Drupal/Facetapi/Widget/DateRangeWidget.php
index 8cb081d..ad70d60 100644
--- a/lib/Drupal/Facetapi/Widget/DateRangeWidget.php
+++ b/lib/Drupal/Facetapi/Widget/DateRangeWidget.php
@@ -62,6 +62,262 @@ class Drupal_Apachesolr_Facetapi_Widget_DateRangeWidget extends FacetapiWidgetLi
     parent::settingsForm($form, $form_state);
     unset($form['widget']['widget_settings']['links'][$this->id]['soft_limit']);
     unset($form['widget']['widget_settings']['links'][$this->id]['show_expanded']);
+    $form['widget']['widget_settings']['ranges'] = array(
+      '#type' => 'container',
+      '#tree' => TRUE,
+    );
+    if (!isset($this->settings->settings['ranges'])) {
+      $this->settings->settings['ranges'] = date_facets_default_ranges();
+    }
+    uasort($this->settings->settings['ranges'], 'drupal_sort_weight');
+    foreach($this->settings->settings['ranges'] as $range_data) {
+      $form['widget']['widget_settings']['ranges'][$range_data['machine_name']]['label'] = array(
+        '#type' => 'textfield',
+        '#title' => t('Label'),
+        '#default_value' => (isset($range_data['label']) ? $range_data['label'] : NULL),
+        '#size' => 40,
+        '#tree' => TRUE,
+      );
+      $form['widget']['widget_settings']['ranges'][$range_data['machine_name']]['machine_name'] = array(
+        '#type' => 'machine_name',
+        '#default_value' => (isset($range_data['machine_name']) ? $range_data['machine_name'] : NULL),
+        '#maxlength' => 20,
+        '#machine_name' => array(
+          'exists' => 'date_facets_date_range_exists',
+          'source' => array('widget', 'widget_settings', 'ranges', $range_data['machine_name'], 'label'),
+        ),
+        '#tree' => TRUE,
+      );
+      $form['widget']['widget_settings']['ranges'][$range_data['machine_name']]['date_range_start_op'] = array(
+        '#prefix' => t('FROM'),
+        '#type' => 'select',
+        '#title' => t('Date Range'),
+        '#default_value' => (isset($range_data['date_range_start_op']) ? $range_data['date_range_start_op'] : NULL),
+        '#options' => array(
+          'NOW' => t('today'),
+          '-' => t('past'),
+          '+' => t('future'),
+        ),
+        '#tree' => TRUE,
+      );
+      $form['widget']['widget_settings']['ranges'][$range_data['machine_name']]['date_range_start_amount'] = array(
+        '#type' => 'textfield',
+        '#title' => t('Date Range'),
+        '#default_value' => (isset($range_data['date_range_start_amount']) ? $range_data['date_range_start_amount'] : NULL),
+        '#size' => 5,
+        '#tree' => TRUE,
+        '#states' => array(
+          'invisible' => array(
+            ':input[name*="' . $range_data['machine_name'] . '][date_range_start_op]"]' => array('value' => 'NOW'),
+          ),
+        ),
+      );
+      $form['widget']['widget_settings']['ranges'][$range_data['machine_name']]['date_range_start_unit'] = array(
+        '#type' => 'select',
+        '#title' => t('Date Range'),
+        '#default_value' => (isset($range_data['date_range_start_unit']) ? $range_data['date_range_start_unit'] : NULL),
+        '#options' => array(
+          'HOUR' => t('hour'),
+          'DAY' => t('day'),
+          'MONTH' => t('month'),
+          'YEAR' => t('year'),
+        ),
+        '#states' => array(
+          'invisible' => array(
+            ':input[name*="' . $range_data['machine_name'] . '][date_range_start_op]"]' => array('value' => 'NOW'),
+          ),
+        ),
+        '#tree' => TRUE,
+      );
+      $form['widget']['widget_settings']['ranges'][$range_data['machine_name']]['date_range_end_op'] = array(
+        '#prefix' => t('TO'),
+        '#type' => 'select',
+        '#title' => t('Date Range'),
+        '#default_value' => (isset($range_data['date_range_end_op']) ? $range_data['date_range_end_op'] : NULL),
+        '#options' => array(
+          'NOW' => t('today'),
+          '-' => t('past'),
+          '+' => t('future'),
+        ),
+        '#tree' => TRUE,
+      );
+      $form['widget']['widget_settings']['ranges'][$range_data['machine_name']]['date_range_end_amount'] = array(
+        '#type' => 'textfield',
+        '#title' => t('Date Range'),
+        '#default_value' => (isset($range_data['date_range_end_amount']) ? $range_data['date_range_end_amount'] : NULL),
+        '#size' => 5,
+        '#tree' => TRUE,
+        '#states' => array(
+          'invisible' => array(
+            ':input[name*="' . $range_data['machine_name'] . '][date_range_end_op]"]' => array('value' => 'NOW'),
+          ),
+        ),
+      );
+      $form['widget']['widget_settings']['ranges'][$range_data['machine_name']]['date_range_end_unit'] = array(
+        '#type' => 'select',
+        '#title' => t('Date Range'),
+        '#default_value' => (isset($range_data['date_range_end_unit']) ? $range_data['date_range_end_unit'] : NULL),
+        '#options' => array(
+          'HOUR' => t('hour'),
+          'DAY' => t('day'),
+          'MONTH' => t('month'),
+          'YEAR' => t('year'),
+        ),
+        '#states' => array(
+          'invisible' => array(
+            ':input[name*="' . $range_data['machine_name'] . '][date_range_end_op]"]' => array('value' => 'NOW'),
+          ),
+        ),
+        '#tree' => TRUE,
+      );
+      $form['widget']['widget_settings']['ranges'][$range_data['machine_name']]['weight'] = array(
+        '#type' => 'weight',
+        '#title' => t('Weight'),
+        '#default_value' => (isset($range_data['weight']) ? $range_data['weight'] : NULL),
+        '#delta' => 10,
+        '#attributes' => array('class' => array('date-range-weight')),
+        '#tree' => TRUE,
+      );
+      $form['widget']['widget_settings']['ranges'][$range_data['machine_name']]['delete'] = array(
+        '#type' => 'checkbox',
+        '#title' => t('Delete'),
+        '#tree' => TRUE,
+      );
+    }
+    $form['widget']['widget_settings']['date_ranges'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Configured Date Ranges'),
+      '#tree' => TRUE,
+      '#attributes' => array('class' => array('clearfix')),
+    );
+    if (isset($form_state['add_new_range']) && $form_state['add_new_range']) {
+      $form_state['add_new_range'] = FALSE;
+      $form['widget']['widget_settings']['ranges']['temp']['label'] = array(
+        '#type' => 'textfield',
+        '#title' => t('Label'),
+        '#size' => 40,
+        '#tree' => TRUE,
+      );
+      $form['widget']['widget_settings']['ranges']['temp']['machine_name'] = array(
+        '#type' => 'machine_name',
+        '#maxlength' => 20,
+        '#machine_name' => array(
+          'exists' => 'date_facets_date_range_exists',
+          'source' => array('widget', 'widget_settings', 'ranges', 'temp', 'label'),
+        ),
+        '#tree' => TRUE,
+      );
+      $form['widget']['widget_settings']['ranges']['temp']['date_range_start_op'] = array(
+        '#type' => 'select',
+        '#title' => t('Date Range'),
+        '#options' => array(
+          'NOW' => t('today'),
+          '-' => t('past'),
+          '+' => t('future'),
+        ),
+        '#tree' => TRUE,
+      );
+      $form['widget']['widget_settings']['ranges']['temp']['date_range_start_amount'] = array(
+        '#type' => 'textfield',
+        '#title' => t('Date Range'),
+        '#size' => 5,
+        '#tree' => TRUE,
+        '#states' => array(
+          'invisible' => array(
+            ':input[name*="temp][date_range_start_op]"]' => array('value' => 'NOW'),
+          ),
+        ),
+      );
+      $form['widget']['widget_settings']['ranges']['temp']['date_range_start_unit'] = array(
+        '#type' => 'select',
+        '#title' => t('Date Range'),
+        '#options' => array(
+          'HOUR' => t('hour'),
+          'DAY' => t('day'),
+          'MONTH' => t('month'),
+          'YEAR' => t('year'),
+        ),
+        '#states' => array(
+          'invisible' => array(
+            ':input[name*="temp][date_range_start_op]"]' => array('value' => 'NOW'),
+          ),
+        ),
+        '#tree' => TRUE,
+      );
+      $form['widget']['widget_settings']['ranges']['temp']['date_range_end_op'] = array(
+        '#type' => 'select',
+        '#title' => t('Date Range'),
+        '#options' => array(
+          'NOW' => t('today'),
+          '-' => t('past'),
+          '+' => t('future'),
+        ),
+        '#tree' => TRUE,
+      );
+      $form['widget']['widget_settings']['ranges']['temp']['date_range_end_amount'] = array(
+        '#type' => 'textfield',
+        '#title' => t('Date Range'),
+        '#size' => 5,
+        '#tree' => TRUE,
+        '#states' => array(
+          'invisible' => array(
+            ':input[name*="temp][date_range_end_op]"]' => array('value' => 'NOW'),
+          ),
+        ),
+      );
+      $form['widget']['widget_settings']['ranges']['temp']['date_range_end_unit'] = array(
+        '#type' => 'select',
+        '#title' => t('Date Range'),
+        '#options' => array(
+          'HOUR' => t('hour'),
+          'DAY' => t('day'),
+          'MONTH' => t('month'),
+          'YEAR' => t('year'),
+        ),
+        '#states' => array(
+          'invisible' => array(
+            ':input[name*="temp][date_range_end_op]"]' => array('value' => 'NOW'),
+          ),
+        ),
+        '#tree' => TRUE,
+      );
+      $form['widget']['widget_settings']['ranges']['temp']['weight'] = array(
+        '#type' => 'weight',
+        '#title' => t('Weight'),
+        '#delta' => 10,
+        '#attributes' => array('class' => array('date-range-weight')),
+        '#tree' => TRUE,
+      );
+      $form['widget']['widget_settings']['ranges']['temp']['delete'] = array(
+        '#type' => 'checkbox',
+        '#title' => t('Delete'),
+        '#tree' => TRUE,
+        '#states' => array(
+          'checked' => array(
+            ':input[name*="temp][label]"]' => array('value' => ''),
+          ),
+        ),
+      );
+    }
+    else {
+      $form['widget']['widget_settings']['date_ranges']['add_range'] = array(
+        '#type' => 'button',
+        '#executes_submit_callback' => FALSE,
+        '#value' => t('Add a new date range'),
+        '#limit_validation_errors' => array(),
+        '#ajax' => array(
+          'callback' => 'date_facets_tabledrag_form_new_range',
+          'wrapper' => 'date_facets_facet_config_form',
+          'method' => 'replace',
+          'effect' => 'fade',
+        ),
+        '#weight' => 10,
+      );
+    }
+    $form['#validate'] = array('date_facets_tabledrag_form_validate');
+    $form['#theme'] = 'date_facets_tabledrag_form';
+    $form['#prefix'] = '<div id="date_facets_facet_config_form">';
+    $form['#suffix'] = '</div>';
   }
 
   /**
diff --git a/lib/Drupal/Search/Facetapi/QueryType/DateRangeQueryType.php b/lib/Drupal/Search/Facetapi/QueryType/DateRangeQueryType.php
index 9236ea8..f5a2d04 100644
--- a/lib/Drupal/Search/Facetapi/QueryType/DateRangeQueryType.php
+++ b/lib/Drupal/Search/Facetapi/QueryType/DateRangeQueryType.php
@@ -16,6 +16,43 @@ class Drupal_Search_Facetapi_QueryType_DateRangeQueryType extends FacetapiQueryT
   static public function getType() {
     return 'date_range';
   }
+  
+  protected function generateRange($range = array()) {
+    if (empty($range)) {
+      $start = REQUEST_TIME;
+      $end = REQUEST_TIME + DATE_RANGE_UNIT_DAY;
+    }
+    else {
+      foreach (array('start', 'end') as $item) {
+        $$item = REQUEST_TIME;
+        $unit = $range['date_range_' . $item . '_unit'];
+        $amount = (int) $range['date_range_' . $item . '_amount'];
+        switch ($unit) {
+          case 'HOUR':
+            $unit = (int) DATE_RANGE_UNIT_HOUR;
+            break;
+          case 'DAY':
+            $unit = (int) DATE_RANGE_UNIT_DAY;
+            break;
+          case 'MONTH':
+            $unit = (int) DATE_RANGE_UNIT_MONTH;
+            break;
+          case 'YEAR':
+            $unit = (int) DATE_RANGE_UNIT_YEAR;
+            break;
+        }
+        switch ($range['date_range_' . $item . '_op']) {
+          case '-':
+            $$item -= ($amount * $unit);
+            break;
+          case '+':
+            $$item += ($amount * $unit);
+            break;
+        }
+      }
+    }
+    return array($start, $end);
+  }
 
   /**
    * Implements FacetapiQueryTypeInterface::execute().
@@ -28,38 +65,11 @@ class Drupal_Search_Facetapi_QueryType_DateRangeQueryType extends FacetapiQueryT
       $facet_query = $this->adapter->getFacetQueryExtender();
       $query_info = $this->adapter->getQueryInfo($this->facet);
       $tables_joined = array();
-
-      // Check the first value since only one is allowed.
-      // @todo Make the start time less dynamic to make use of the query cache.
-      // Leverage the same technique as Solr where the times are reounded.
-      switch (key($active)) {
-        case 'past_hour':
-          $start = REQUEST_TIME - (60 * 60);
-          break;
-
-        case 'past_24_hours':
-          $start = REQUEST_TIME - (60 * 60 * 24);
-          break;
-
-        case 'past_week':
-          $start = REQUEST_TIME - (60 * 60 * 24 * 7);
-          break;
-
-        case 'past_month':
-          $start = REQUEST_TIME - (60 * 60 * 24 * 30);
-          break;
-
-        case 'past_year':
-          $start = REQUEST_TIME - (60 * 60 * 24 * 365);
-          break;
-
-        default:
-          return;
-      }
-
-      // @todo Make the end time less dynamic to make use of the query cache.
-      // Leverage the same technique as Solr where the times are reounded.
-      $end = REQUEST_TIME;
+      
+      $settings = $this->adapter->getFacetSettings($this->facet, facetapi_realm_load('block'));
+      $ranges = (isset($settings->settings['ranges']) ? $settings->settings['ranges'] : date_facets_default_ranges());
+      $range = $ranges[key($active)];
+      list($start, $end) = $this->generateRange($range);
 
       // Iterate over the facet's fields and adds SQL clauses.
       foreach ($query_info['fields'] as $field_info) {
@@ -88,10 +98,40 @@ class Drupal_Search_Facetapi_QueryType_DateRangeQueryType extends FacetapiQueryT
 
   /**
    * Implements FacetapiQueryTypeInterface::build().
-   *
-   * Unlike normal facets, we provide a static list of options.
    */
   public function build() {
-    return date_facets_get_ranges();
+    $realm = facetapi_realm_load('block');
+    $settings = $this->adapter->getFacetSettings($this->facet, $realm);
+    $ranges = (isset($settings->settings['ranges']) && !empty($settings->settings['ranges']) ? $settings->settings['ranges'] : date_facets_default_ranges());
+    $build = date_facets_get_ranges($ranges);
+    if ($this->adapter->searchExecuted()) {
+      $facet_global_settings = $this->adapter->getFacet($this->facet)->getSettings();
+      // Iterate over each date range to get a count of results for that item.
+      foreach ($ranges as $range) {
+        list($start, $end) = $this->generateRange($range);
+        $facet_query = clone $this->adapter->getFacetQueryExtender();
+        $query_info = $this->adapter->getQueryInfo($this->facet);
+        $facet_query->addFacetField($query_info);
+        foreach ($query_info['fields'] as $field_info) {
+          $facet_query->addFacetJoin($query_info, $field_info['table_alias']);
+          $field = $field_info['table_alias'] . '.' . $this->facet['field'];
+          $facet_query->condition($field, $start, '>=');
+          $facet_query->condition($field, $end, '<');
+        }
+        // Executes query, iterates over results.
+        $result = $facet_query->execute()->fetchAll();
+        // If the result is 0, and the mincount is set to more than 0, remove
+        // the facet option.
+        if (empty($result)
+          && $facet_global_settings->settings['facet_mincount'] > 0) {
+          unset($build[$range['machine_name']]);
+        }
+        // Add the facet option counts to the build array.
+        foreach ($result as $record) {
+          $build[$range['machine_name']]['#count'] = $record->count;
+        }
+      }
+    }
+    return $build;
   }
 }
