diff --git a/config/schema/facets.processor.schema.yml b/config/schema/facets.processor.schema.yml
index ebdd249..b380515 100644
--- a/config/schema/facets.processor.schema.yml
+++ b/config/schema/facets.processor.schema.yml
@@ -112,3 +112,11 @@ plugin.plugin_configuration.facets_processor.date_item:
     date_format:
       type: string
       label: 'Date format'
+
+plugin.plugin_configuration.facets_processor.granularity_item:
+  type: mapping
+  label: 'Granular item processor'
+  mapping:
+    granularity:
+      type: integer
+      label: 'Granularity'
diff --git a/facets.install b/facets.install
index df87d28..82a9f6b 100644
--- a/facets.install
+++ b/facets.install
@@ -126,3 +126,26 @@ function facets_update_8004() {
     }
   }
 }
+
+/**
+ * Migrate facets with granular widget to use date processors + links widget.
+ */
+function facets_update_8005() {
+  foreach (Facet::loadMultiple() as $facet) {
+    $widget = $facet->getWidget();
+    if ($widget['type'] === 'numericgranular') {
+      // Set widget to use links instead.
+      $facet->setWidget('links', ['show_numbers' => $widget['config']['show_numbers']]);
+      // Migrate widget to processor settings and enable date_item processor.
+      $settings = [
+        'granularity' => $widget['config']['granularity'],
+      ];
+      $facet->addProcessor([
+        'processor_id' => 'granularity_item',
+        'weights' => ['build' => 35],
+        'settings' => $settings,
+      ]);
+      $facet->save();
+    }
+  }
+}
diff --git a/src/Plugin/facets/widget/NumericGranularWidget.php b/src/Plugin/facets/processor/GranularItemProcessor.php
similarity index 59%
rename from src/Plugin/facets/widget/NumericGranularWidget.php
rename to src/Plugin/facets/processor/GranularItemProcessor.php
index 9490a73..2f2a539 100644
--- a/src/Plugin/facets/widget/NumericGranularWidget.php
+++ b/src/Plugin/facets/processor/GranularItemProcessor.php
@@ -1,28 +1,41 @@
 <?php
 
-namespace Drupal\facets\Plugin\facets\widget;
+
+namespace Drupal\facets\Plugin\facets\processor;
 
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\facets\FacetInterface;
+use Drupal\facets\Processor\BuildProcessorInterface;
+use Drupal\facets\Processor\ProcessorPluginBase;
 
 /**
- * Basic granular widget.
+ * Provides a processor for granularity.
  *
- * @FacetsWidget(
- *   id = "numericgranular",
- *   label = @Translation("Granular numeric list"),
+ * @FacetsProcessor(
+ *   id = "granularity_item",
+ *   label = @Translation("Granularity item processor"),
  *   description = @Translation("List of numbers grouped in steps."),
+ *   stages = {
+ *     "build" = 35
+ *   }
  * )
  */
-class NumericGranularWidget extends LinksWidget {
+class GranularItemProcessor extends ProcessorPluginBase implements BuildProcessorInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function build(FacetInterface $facet, array $results) {
+    return $results;
+  }
 
   /**
    * {@inheritdoc}
    */
   public function defaultConfiguration() {
     return [
-      'granularity' => 0,
-    ] + parent::defaultConfiguration();
+        'granularity' => 0,
+      ] + parent::defaultConfiguration();
   }
 
   /**
diff --git a/tests/facets_custom_widget/src/Plugin/facets/widget/WidgetDateQT.php b/tests/facets_custom_widget/src/Plugin/facets/widget/WidgetDateQT.php
new file mode 100644
index 0000000..c9e50a4
--- /dev/null
+++ b/tests/facets_custom_widget/src/Plugin/facets/widget/WidgetDateQT.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Drupal\facets_custom_widget\Plugin\facets\widget;
+
+use Drupal\facets\Widget\WidgetPluginBase;
+
+/**
+ * Test widget.
+ *
+ * @FacetsWidget(
+ *   id = "widget_date_qt",
+ *   label = @Translation("Widget with date query type"),
+ *   description = @Translation("Widget with date query type"),
+ * )
+ */
+class WidgetDateQT extends WidgetPluginBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getQueryType() {
+    return 'date';
+  }
+
+}
diff --git a/tests/src/Kernel/Entity/FacetFacetSourceTest.php b/tests/src/Kernel/Entity/FacetFacetSourceTest.php
index d3a1a9d..9d6e81e 100644
--- a/tests/src/Kernel/Entity/FacetFacetSourceTest.php
+++ b/tests/src/Kernel/Entity/FacetFacetSourceTest.php
@@ -178,7 +178,7 @@ public function testQueryTypeJugglingInvalidProcessor() {
    */
   public function testQueryTypeJugglingInvalidCombo() {
     $entity = new Facet([], 'facets_facet');
-    $entity->setWidget('numericgranular');
+    $entity->setWidget('widget_date_qt');
     $entity->setFacetSourceId('search_api:views_page__search_api_test_view__page_1');
     $entity->setFieldIdentifier('name');
     $processor = [
diff --git a/tests/src/Unit/Plugin/widget/NumericGranularWidgetTest.php b/tests/src/Unit/Plugin/widget/NumericGranularWidgetTest.php
deleted file mode 100644
index 03b4fe0..0000000
--- a/tests/src/Unit/Plugin/widget/NumericGranularWidgetTest.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
-namespace Drupal\Tests\facets\Unit\Plugin\widget;
-
-use Drupal\facets\Plugin\facets\widget\NumericGranularWidget;
-
-/**
- * Unit test for widget.
- *
- * @group facets
- */
-class NumericGranularWidgetTest extends WidgetTestBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setUp() {
-    parent::setUp();
-    $this->widget = new NumericGranularWidget();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function testGetQueryType() {
-    $result = $this->widget->getQueryType($this->queryTypes);
-    $this->assertEquals('numeric', $result);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function testDefaultConfiguration() {
-    $default_config = $this->widget->defaultConfiguration();
-    $expected = [
-      'show_numbers' => FALSE,
-      'soft_limit' => 0,
-      'granularity' => 0,
-      'soft_limit_settings' => [
-        'show_less_label' => 'Show less',
-        'show_more_label' => 'Show more',
-      ],
-    ];
-    $this->assertEquals($expected, $default_config);
-  }
-
-}
