diff --git a/src/Plugin/facets/facet_source/SearchApiDisplay.php b/src/Plugin/facets/facet_source/SearchApiDisplay.php
index f236f30..8419859 100644
--- a/src/Plugin/facets/facet_source/SearchApiDisplay.php
+++ b/src/Plugin/facets/facet_source/SearchApiDisplay.php
@@ -270,6 +270,7 @@ class SearchApiDisplay extends FacetSourcePluginBase {
     // Add additional query types for specific data types.
     switch ($data_type_plugin_id) {
       case 'date':
+      case 'date_range':
         $query_types['date'] = 'search_api_date';
         break;
 
diff --git a/src/Plugin/facets/query_type/SearchApiDate.php b/src/Plugin/facets/query_type/SearchApiDate.php
index cf86935..a4fae5e 100644
--- a/src/Plugin/facets/query_type/SearchApiDate.php
+++ b/src/Plugin/facets/query_type/SearchApiDate.php
@@ -54,10 +54,42 @@ class SearchApiDate extends QueryTypeRangeBase {
   const FACETAPI_DATE_SECOND = 1;
 
   /**
+   * Constant for grouping on year.
+   */
+  const FACETAPI_LAST_YEAR = 'last_year';
+
+  /**
+   * Constant for grouping on month.
+   */
+  const FACETAPI_LAST_MONTH = 'last_month';
+
+  /**
+   * Constant for grouping on day.
+   */
+  const FACETAPI_LAST_DAY = 'last_day';
+
+  /**
+   * Constant for grouping on hour.
+   */
+  const FACETAPI_CUSTOM = 'custom';
+
+  /**
    * {@inheritdoc}
    */
   public function calculateRange($value) {
-    if ($this->getDisplayRelative()) {
+    if ($value == static::FACETAPI_LAST_DAY) {
+      $dateTime = new DrupalDateTime('-1 day');
+      return $this->calculateRangeRelativeToNow($dateTime->format('U'));
+    }
+    elseif ($value == static::FACETAPI_LAST_MONTH) {
+      $dateTime = new DrupalDateTime('-1 month');
+      return $this->calculateRangeRelativeToNow($dateTime->format('U'));
+    }
+    elseif ($value == static::FACETAPI_LAST_YEAR) {
+      $dateTime = new DrupalDateTime('-1 year');
+      return $this->calculateRangeRelativeToNow($dateTime->format('U'));
+    }
+    elseif ($this->getDisplayRelative()) {
       return $this->calculateRangeRelative($value);
     }
     else {
@@ -190,6 +222,33 @@ class SearchApiDate extends QueryTypeRangeBase {
   }
 
   /**
+   * Returns a start and end date based on a unix timestamp.
+   *
+   * This method returns a start and end date with an relative interval, based
+   * on the granularity set in the widget.
+   *
+   * @param int $value
+   *   Unix timestamp.
+   *
+   * @return array
+   *   An array with a start and end date as unix timestamps.
+   *
+   * @throws \Exception
+   *   Thrown when creating a date fails.
+   */
+  protected function calculateRangeRelativeToNow($value) {
+    $dateTime = new DrupalDateTime();
+    $startDate = $dateTime::createFromTimestamp($value);
+    $stopDate = clone $startDate;
+    $stopDate->add(new \DateInterval('P1Y'));
+    $stopDate->sub(new \DateInterval('PT1S'));
+    return [
+      'start' => $startDate->format('U'),
+      'stop' => $stopDate->format('U'),
+    ];
+  }
+
+  /**
    * Calculates the result of the filter.
    *
    * @param int $value
@@ -199,7 +258,19 @@ class SearchApiDate extends QueryTypeRangeBase {
    *   An array with a start and end date as unix timestamps.
    */
   public function calculateResultFilter($value) {
-    if ($this->getDisplayRelative()) {
+    if ($value == static::FACETAPI_LAST_DAY) {
+      $dateTime = new DrupalDateTime('-1 day');
+      return $this->calculateResultFilterRelative($dateTime->format('U'));
+    }
+    elseif ($value == static::FACETAPI_LAST_MONTH) {
+      $dateTime = new DrupalDateTime('-1 month');
+      return $this->calculateResultFilterRelative($dateTime->format('U'));
+    }
+    elseif ($value == static::FACETAPI_LAST_YEAR) {
+      $dateTime = new DrupalDateTime('-1 year');
+      return $this->calculateResultFilterRelative($dateTime->format('U'));
+    }
+    elseif ($this->getDisplayRelative()) {
       return $this->calculateResultFilterRelative($value);
     }
     else {
@@ -264,7 +335,6 @@ class SearchApiDate extends QueryTypeRangeBase {
     $now->setTimestamp(REQUEST_TIME);
     $interval = $date->diff($now);
     $future = $date > $now;
-
     switch ($this->getGranularity()) {
       case static::FACETAPI_DATE_YEAR:
         $rounded = new \DateInterval('P' . $interval->y . 'Y');
diff --git a/src/Plugin/facets/widget/DateRangeWidget.php b/src/Plugin/facets/widget/DateRangeWidget.php
new file mode 100644
index 0000000..c4144b7
--- /dev/null
+++ b/src/Plugin/facets/widget/DateRangeWidget.php
@@ -0,0 +1,135 @@
+<?php
+
+namespace Drupal\facets\Plugin\facets\widget;
+
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Drupal\facets\FacetInterface;
+use Drupal\facets\Plugin\facets\query_type\SearchApiDate;
+use Drupal\Core\Link;
+use Drupal\Core\Datetime\DrupalDateTime;
+
+/**
+ * Date range widget.
+ *
+ * @FacetsWidget(
+ *   id = "date_range",
+ *   label = @Translation("Date range widget"),
+ *   description = @Translation("Date range wiget"),
+ * )
+ */
+class DateRangeWidget extends DateBasicWidget {
+
+
+  use StringTranslationTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return [
+      'display_relative' => FALSE,
+      'granularity' => SearchApiDate::FACETAPI_DATE_SECOND,
+      'date_display' => '',
+      'relative_granularity' => 1,
+      'relative_text' => TRUE,
+    ] + parent::defaultConfiguration();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function execute() {
+    // Execute all the things.
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function build(FacetInterface $facet) {
+    // Set facet for later.
+    $this->facet = $facet;
+    // Get the range sorting items.
+    $rangeOptions = $this->getDateRangeOptions();
+    // Get facet url alias.
+    $alias = $facet->getUrlAlias();
+    // Get first result to extract url.
+    $firstItem = current($facet->getResults());
+    // Build list items.
+    $items = [];
+    foreach ($rangeOptions as $key => $text) {
+      $url = $this->getUrl($alias, $key, $firstItem);
+      $classes = ['facet-item'];
+      $item = (new Link($text, $url))->toRenderable();
+      $item['#wrapper_attributes'] = ['class' => $classes];
+      $item['#attributes']['data-drupal-facet-item-id'] = $alias . '-' . $key;
+      $items[] = $item;
+    }
+    $format = 'Y-m-d H:i';
+    $dateTime = new DrupalDateTime();
+    $return = [
+      'list' => [
+        '#theme' => 'item_list',
+        '#items' => $items,
+        '#attributes' => ['data-drupal-facet-id' => $facet->id()],
+        '#cache' => [
+          'contexts' => [
+            'url.path',
+            'url.query_args',
+          ],
+        ],
+      ],
+      'form' => [
+        '#type' => 'form',
+        'custom_start' => [
+          '#title' => $this->t('Start'),
+          '#type' => 'date_select',
+          '#default_value' => $dateTime->format($format),
+          '#date_format' => $format,
+          '#date_label_position' => 'within',
+          '#date_timezone' => 'America/Chicago',
+          '#date_increment' => 15,
+          '#date_year_range' => '-3:+3',
+        ],
+        'custom_end' => [
+          '#theme' => 'date_select',
+          '#title' => $this->t('End'),
+        ],
+      ],
+    ];
+    // Add custom selection.
+    return $return;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getUrl($alias, $value, $result) {
+    $url = clone $result->getUrl();
+    $alias_value = $alias . ':' . $value;
+    $options = $url->getOptions();
+    foreach ($options['query']['f'] as $key => $fragment) {
+      if (strpos($fragment, $alias) !== FALSE) {
+        unset($options['query']['f'][$key]);
+      }
+    }
+    $options['query']['f'][] = $alias_value;
+    $options['query']['f'] = array_values($options['query']['f']);
+    $url->setOptions($options);
+    return $url;
+  }
+
+  /**
+   * Get the date range options.
+   *
+   * @return array
+   *   The available options.
+   */
+  public function getDateRangeOptions() {
+    return [
+      SearchApiDate::FACETAPI_LAST_DAY => $this->t('Last day'),
+      SearchApiDate::FACETAPI_LAST_MONTH => $this->t('Last month'),
+      SearchApiDate::FACETAPI_LAST_YEAR => $this->t('Last year'),
+    ];
+  }
+
+}
diff --git a/tests/src/Unit/Plugin/widget/DateRangeWidgetTest.php b/tests/src/Unit/Plugin/widget/DateRangeWidgetTest.php
new file mode 100644
index 0000000..4b96f34
--- /dev/null
+++ b/tests/src/Unit/Plugin/widget/DateRangeWidgetTest.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace Drupal\Tests\facets\Unit\Plugin\widget;
+
+use Drupal\facets\Plugin\facets\query_type\SearchApiDate;
+use Drupal\facets\Plugin\facets\widget\DateRangeWidget;
+
+/**
+ * Unit test for widget.
+ *
+ * @group facets
+ */
+class DateRangeWidgetTest extends WidgetTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp() {
+    parent::setUp();
+    $this->widget = new DateRangeWidget();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function testGetQueryType() {
+    $result = $this->widget->getQueryType($this->queryTypes);
+    $this->assertEquals('date', $result);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function testDefaultConfiguration() {
+    $default_config = $this->widget->defaultConfiguration();
+    $expected = [
+      'display_relative' => FALSE,
+      'granularity' => SearchApiDate::FACETAPI_DATE_SECOND,
+      'date_display' => '',
+      'relative_granularity' => 1,
+      'relative_text' => TRUE,
+      'show_numbers' => FALSE,
+    ];
+    $this->assertEquals($expected, $default_config);
+  }
+
+}
