diff --git a/core_search_facets/src/Plugin/facets/facet_source/CoreNodeSearchFacetSource.php b/core_search_facets/src/Plugin/facets/facet_source/CoreNodeSearchFacetSource.php
index 651e55e..8fb9113 100644
--- a/core_search_facets/src/Plugin/facets/facet_source/CoreNodeSearchFacetSource.php
+++ b/core_search_facets/src/Plugin/facets/facet_source/CoreNodeSearchFacetSource.php
@@ -158,6 +158,11 @@ class CoreNodeSearchFacetSource extends FacetSourcePluginBase implements CoreSea
       case 'entity_reference':
         $query_types['string'] = 'core_node_search_string';
         break;
+
+      case 'created':
+        $query_types['string'] = 'core_node_search_date';
+        break;
+
     }
 
     return $query_types;
@@ -236,6 +241,7 @@ class CoreNodeSearchFacetSource extends FacetSourcePluginBase implements CoreSea
       'type' => $this->t('Content Type'),
       'uid' => $this->t('Author'),
       'langcode' => $this->t('Language'),
+      'created' => $this->t('Post date'),
     ];
   }
 
diff --git a/core_search_facets/src/Plugin/facets/query_type/CoreNodeSearchDate.php b/core_search_facets/src/Plugin/facets/query_type/CoreNodeSearchDate.php
new file mode 100644
index 0000000..eefad40
--- /dev/null
+++ b/core_search_facets/src/Plugin/facets/query_type/CoreNodeSearchDate.php
@@ -0,0 +1,201 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\core_search_facets\Plugin\facets\query_type\CoreNodeSearchDate.
+ */
+
+namespace Drupal\core_search_facets\Plugin\facets\query_type;
+
+use Drupal\facets\QueryType\QueryTypePluginBase;
+use Drupal\facets\Result\Result;
+use Drupal\facets\Result\ResultInterface;
+
+/**
+ * A date query type for core search.
+ *
+ * @FacetsQueryType(
+ *   id = "core_node_search_date",
+ *   label = @Translation("Date"),
+ * )
+ */
+class CoreNodeSearchDate extends QueryTypePluginBase {
+
+  /**
+   * The backend's native query object.
+   *
+   * @var \Drupal\search_api\Query\QueryInterface
+   */
+  protected $query;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function execute() {
+    /** @var \Drupal\facets\Utility\FacetsDateHandler $date_handler */
+    $date_handler = \Drupal::getContainer()->get('facets.utility.date_handler');
+
+    /** @var \Drupal\core_search_facets\Plugin\CoreSearchFacetSourceInterface $facet_source */
+    $facet_source = $this->facet->getFacetSource();
+
+    // Gets the last active date, bails if there isn't one.
+    $active_items = $this->facet->getActiveItems();
+    if (!$active_item = end($active_items)) {
+      return;
+    }
+
+    // Gets facet query and this facet's query info.
+    /** @var \Drupal\core_search_facets\FacetsQuery $facet_query */
+    $facet_query = $facet_source->getFacetQueryExtender();
+    $query_info = $facet_source->getQueryInfo($this->facet);
+    $tables_joined = [];
+
+    $active_item = $date_handler->extractActiveItems($active_item);
+
+    foreach ($query_info['fields'] as $field_info) {
+
+      // Adds join to the facet query.
+      $facet_query->addFacetJoin($query_info, $field_info['table_alias']);
+
+      // Adds adds join to search query, makes sure it is only added once.
+      if (isset($query_info['joins'][$field_info['table_alias']])) {
+        if (!isset($tables_joined[$field_info['table_alias']])) {
+          $tables_joined[$field_info['table_alias']] = TRUE;
+          $join_info = $query_info['joins'][$field_info['table_alias']];
+          $this->query->join($join_info['table'], $join_info['alias'], $join_info['condition']);
+        }
+      }
+
+      // Adds field conditions to the facet and search query.
+      $field = $field_info['table_alias'] . '.' . $field_info['field'];
+      $this->query->condition($field, $active_item['start']['timestamp'], '>=');
+      $this->query->condition($field, $active_item['end']['timestamp'], '<');
+      $facet_query->condition($field, $active_item['start']['timestamp'], '>=');
+      $facet_query->condition($field, $active_item['end']['timestamp'], '<');
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function build() {
+    $parent_facet_results = [];
+    /** @var \Drupal\facets\utility\FacetsDateHandler $date_handler */
+    $date_handler = \Drupal::getContainer()->get('facets.utility.date_handler');
+
+    // Gets base facet query, adds facet field and filters.
+    /* @var \Drupal\core_search_facets\Plugin\CoreSearchFacetSourceInterface $facet_source */
+    $facet_source = $this->facet->getFacetSource();
+    $query_info = $facet_source->getQueryInfo($this->facet);
+
+    /** @var \Drupal\core_search_facets\FacetsQuery $facet_query */
+    $facet_query = $facet_source->getFacetQueryExtender();
+    $facet_query->addFacetField($query_info);
+
+    foreach ($query_info['joins'] as $table_alias => $join_info) {
+      $facet_query->addFacetJoin($query_info, $table_alias);
+    }
+
+    if ($facet_query->getSearchExpression()) {
+      // Executes query, iterates over results.
+      $result = $facet_query->execute();
+
+      foreach ($result as $record) {
+        $raw_values[$record->value] = $record->count;
+      }
+      ksort($raw_values);
+
+      // Gets active facets, starts building hierarchy.
+      $parent = NULL;
+      $gap = NULL;
+      $last_parent = NULL;
+
+      foreach ($this->facet->getActiveItems() as $value => $item) {
+        if ($active_item = $date_handler->extractActiveItems($item)) {
+          $date_gap = $date_handler->getDateGap($active_item['start']['iso'], $active_item['end']['iso']);
+          $gap = $date_handler->getNextDateGap($date_gap, $date_handler::FACETS_DATE_MINUTE);
+          $last_parent = '[' . $active_item['start']['iso'] . ' TO ' . $active_item['end']['iso'] . ']';
+          $result = new Result($last_parent, $date_handler->formatTimestamp($active_item['start']['timestamp'], $date_gap), NULL);
+          $result->setActiveState(TRUE);
+          // Sets the children for the current parent..
+          if ($parent) {
+            $parent->setChildren($result);
+          }
+          else {
+            $parent = $parent_facet_results[] = $result;
+          }
+        }
+      }
+
+      // Mind the gap! Calculates gap from min and max timestamps.
+      $timestamps = array_keys($raw_values);
+      if (is_null($parent)) {
+        if (count($raw_values) > 1) {
+          $gap = $date_handler->getTimestampGap(min($timestamps), max($timestamps));
+        }
+        else {
+          $gap = $date_handler::FACETS_DATE_HOUR;
+        }
+      }
+
+      // Converts all timestamps to dates in ISO 8601 format.
+      $dates = [];
+      foreach ($timestamps as $timestamp) {
+        $dates[$timestamp] = $date_handler->isoDate($timestamp, $gap);
+      }
+
+      // Treat each date as the range start and next date as the range end.
+      $range_end = [];
+      $previous = NULL;
+      foreach (array_unique($dates) as $date) {
+        if (!is_null($previous)) {
+          $range_end[$previous] = $date_handler->getNextDateIncrement($previous, $gap);
+        }
+        $previous = $date;
+      }
+      $range_end[$previous] = $date_handler->getNextDateIncrement($previous, $gap);
+
+      $facet_results = [];
+      foreach ($raw_values as $value => $count) {
+        $new_value = '[' . $dates[$value] . ' TO ' . $range_end[$dates[$value]] . ']';
+
+        // Avoid to repeat the last value.
+        if ($new_value === $last_parent) {
+          $this->facet->setResults($parent_facet_results);
+          return $this->facet;
+        }
+
+        // Groups dates by the range they belong to.
+        /** @var \Drupal\facets\Result\Result $last_element */
+        $last_value = end($facet_results);
+        if ($last_value) {
+          if ($new_value != $last_value->getRawValue()) {
+            $facet_results[] = new Result($new_value, $date_handler->formatTimestamp($value, $gap), $count);
+          }
+          else {
+            $last_value->setCount($last_value->getCount() + 1);
+          }
+        }
+        else {
+          $facet_results[] = new Result($new_value, $date_handler->formatTimestamp($value, $gap), $count);
+        }
+      }
+
+      // Populate the parent with children.
+      $parent = end($parent_facet_results);
+      if ($parent instanceof ResultInterface) {
+        foreach ($facet_results as $result) {
+          $parent->setChildren($result);
+          $this->facet->setResults($parent_facet_results);
+        }
+      }
+      else {
+        // Set results directly when missing parents.
+        $this->facet->setResults($facet_results);
+      }
+    }
+
+    return $this->facet;
+  }
+
+}
diff --git a/facets.services.yml b/facets.services.yml
index 1be585e..03b0025 100644
--- a/facets.services.yml
+++ b/facets.services.yml
@@ -22,3 +22,7 @@ services:
       - '@plugin.manager.facets.facet_source'
       - '@plugin.manager.facets.processor'
       - '@entity_type.manager'
+  facets.utility.date_handler:
+    class: Drupal\facets\utility\FacetsDateHandler
+    arguments:
+      - '@date.formatter'
diff --git a/src/Plugin/facets/url_processor/QueryString.php b/src/Plugin/facets/url_processor/QueryString.php
index d2ac255..ef97f40 100644
--- a/src/Plugin/facets/url_processor/QueryString.php
+++ b/src/Plugin/facets/url_processor/QueryString.php
@@ -75,6 +75,13 @@ class QueryString extends UrlProcessorPluginBase {
 
     /** @var \Drupal\facets\Result\ResultInterface[] $results */
     foreach ($results as &$result) {
+      // Flag if children filter params need to be removed.
+      $remove_children = FALSE;
+      // Sets the url for children.
+      if ($children = $result->getChildren()) {
+        $this->buildUrls($facet, $children);
+      }
+
       $filter_string = $this->urlAlias . self::SEPARATOR . $result->getRawValue();
       $result_get_params = clone $get_params;
 
@@ -83,6 +90,10 @@ class QueryString extends UrlProcessorPluginBase {
       if ($result->isActive()) {
         foreach ($filter_params as $key => $filter_param) {
           if ($filter_param == $filter_string) {
+            $remove_children = TRUE;
+            unset($filter_params[$key]);
+          }
+          elseif ($remove_children) {
             unset($filter_params[$key]);
           }
         }
@@ -147,7 +158,7 @@ class QueryString extends UrlProcessorPluginBase {
 
     // Explode the active params on the separator.
     foreach ($active_params as $param) {
-      list($key, $value) = explode(self::SEPARATOR, $param);
+      list($key, $value) = explode(self::SEPARATOR, $param, 2);
       if (!isset($this->activeFilters[$key])) {
         $this->activeFilters[$key] = [$value];
       }
diff --git a/src/Plugin/facets/widget/LinksWidget.php b/src/Plugin/facets/widget/LinksWidget.php
index 135de83..c9598d6 100644
--- a/src/Plugin/facets/widget/LinksWidget.php
+++ b/src/Plugin/facets/widget/LinksWidget.php
@@ -11,6 +11,7 @@ use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Link;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Drupal\facets\FacetInterface;
+use Drupal\facets\Result\ResultInterface;
 use Drupal\facets\Widget\WidgetInterface;
 
 /**
@@ -18,7 +19,7 @@ use Drupal\facets\Widget\WidgetInterface;
  *
  * @FacetsWidget(
  *   id = "links",
- *   label = @Translation("List of links"),
+ *   label = @Translation("Links"),
  *   description = @Translation("A simple widget that shows a list of links"),
  * )
  */
@@ -38,21 +39,7 @@ class LinksWidget implements WidgetInterface {
     $show_numbers = empty($configuration['show_numbers']) ? FALSE : (bool) $configuration['show_numbers'];
 
     foreach ($results as $result) {
-      // Get the link.
-      $text = $result->getDisplayValue();
-      if ($show_numbers) {
-        $text .= ' (' . $result->getCount() . ')';
-      }
-      if ($result->isActive()) {
-        $text = '(-) ' . $text;
-      }
-
-      if (is_null($result->getUrl())) {
-        $items[] = $text;
-      }
-      else {
-        $items[] = new Link($text, $result->getUrl());
-      }
+      $items[] = $this->buildListItems($result, $show_numbers);
     }
 
     $build = [
@@ -65,9 +52,108 @@ class LinksWidget implements WidgetInterface {
         ],
       ],
     ];
+
     return $build;
   }
 
+  /**
+   * Builds a renderable array of result items.
+   *
+   * @param \Drupal\facets\Result\ResultInterface $result
+   *   A result item.
+   * @param bool $show_numbers
+   *   A boolean that's true when the numbers should be shown.
+   *
+   * @return array|Link|string
+   *   A renderable array of the result or a link when the result has no
+   *   children.
+   */
+  protected function buildListItems(ResultInterface $result, $show_numbers) {
+    if ($children = $result->getChildren()) {
+      $link = $this->prepareLink($result, $show_numbers);
+      foreach ($children as $child) {
+        $children[] = $this->buildChildren($child, $show_numbers);
+      }
+
+      $items = [
+        '#markup' => $link->toString(),
+        '#wrapper_attributes' => [
+          'class' => ['expanded'],
+        ],
+        'children' => [$children],
+      ];
+
+    }
+    else {
+      $items = $this->prepareLink($result, $show_numbers);
+    }
+
+    return $items;
+  }
+
+  /**
+   * Returns the text or link for an item.
+   *
+   * @param \Drupal\facets\Result\ResultInterface $result
+   *   A result item.
+   * @param bool $show_numbers
+   *   A boolean that's true when the numbers should be shown.
+   *
+   * @return Link|string
+   *   The item, can be a link or just the text.
+   */
+  protected function prepareLink(ResultInterface $result, $show_numbers) {
+    $text = $result->getDisplayValue();
+
+    if ($show_numbers && $result->getCount()) {
+      $text .= ' (' . $result->getCount() . ')';
+    }
+    if ($result->isActive()) {
+      $text = '(-) ' . $text;
+    }
+
+    if (is_null($result->getUrl())) {
+      $link = $text;
+    }
+    else {
+      $link = new Link($text, $result->getUrl());
+    }
+
+    return $link;
+  }
+
+  /**
+   * Builds a renderable array of a result.
+   *
+   * @param \Drupal\facets\Result\ResultInterface $child
+   *   A result item.
+   * @param bool $show_numbers
+   *   A boolean that's true when the numbers should be shown.
+   *
+   * @return array|Link|string
+   *   A renderable array of the result.
+   */
+  protected function buildChildren(ResultInterface $child, $show_numbers) {
+    $text = $child->getDisplayValue();
+    if ($show_numbers && $child->getCount()) {
+      $text .= ' (' . $child->getCount() . ')';
+    }
+    if ($child->isActive()) {
+      $text = '(-) ' . $text;
+    }
+
+    if (!is_null($child->getUrl())) {
+      $link = new Link($text, $child->getUrl());
+      $text = $link->toString();
+    }
+
+    return [
+      '#markup' => $text,
+      '#wrapper_attributes' => [
+        'class' => ['leaf'],
+      ],
+    ];
+  }
 
   /**
    * {@inheritdoc}
diff --git a/src/Result/Result.php b/src/Result/Result.php
index b748f64..83a6807 100644
--- a/src/Result/Result.php
+++ b/src/Result/Result.php
@@ -44,6 +44,9 @@ class Result implements ResultInterface {
    */
   protected $active = FALSE;
 
+
+  protected $children = [];
+
   /**
    * Constructs a new result value object.
    *
@@ -98,6 +101,13 @@ class Result implements ResultInterface {
   /**
    * {@inheritdoc}
    */
+  public function setCount($count) {
+    $this->count = $count;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function setActiveState($active) {
     $this->active = $active;
   }
@@ -116,4 +126,18 @@ class Result implements ResultInterface {
     $this->displayValue = $display_value;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function setChildren(ResultInterface $children) {
+    $this->children[] = $children;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getChildren() {
+    return $this->children;
+  }
+
 }
diff --git a/src/Result/ResultInterface.php b/src/Result/ResultInterface.php
index bed1d87..c78de10 100644
--- a/src/Result/ResultInterface.php
+++ b/src/Result/ResultInterface.php
@@ -78,4 +78,20 @@ interface ResultInterface {
    */
   public function setDisplayValue($display_value);
 
+  /**
+   * Sets children results.
+   *
+   * @param \Drupal\facets\Result\ResultInterface $children
+   *   The children to be added.
+   */
+  public function setChildren(ResultInterface $children);
+
+  /**
+   * Returns children results.
+   *
+   * @return \Drupal\facets\Result\ResultInterface $children
+   *   The children results.
+   */
+  public function getChildren();
+
 }
