diff --git a/facets.install b/facets.install
index df87d28..938470d 100644
--- a/facets.install
+++ b/facets.install
@@ -126,3 +126,20 @@ function facets_update_8004() {
     }
   }
 }
+
+/**
+ * Update facet blocks configuration with a block id used for AJAX support
+ */
+function facets_update_8005() {
+  $query = \Drupal::entityQuery('block')
+    ->condition('plugin', 'facet_block', 'STARTS_WITH')
+    ->execute();
+
+  foreach ($query as $block_id) {
+    $block = \Drupal\block\Entity\Block::load($block_id);
+    $block->get('settings', $configuration);
+    $configuration['block_id'] = $block_id;
+    $block->set('settings', $configuration);
+    $block->save();
+  }
+}
diff --git a/facets.libraries.yml b/facets.libraries.yml
index 2ebbf32..a77986d 100644
--- a/facets.libraries.yml
+++ b/facets.libraries.yml
@@ -53,3 +53,12 @@ soft-limit:
     - core/jquery.once
     - core/drupal
     - core/drupalSettings
+drupal.facets.views-ajax:
+  js:
+    js/facets-views-ajax.js: {}
+  dependencies:
+    - core/jquery
+    - core/jquery.once
+    - core/drupal
+    - core/drupalSettings
+    - core/drupal.ajax
diff --git a/facets.routing.yml b/facets.routing.yml
index 1e897e7..9c08b77 100644
--- a/facets.routing.yml
+++ b/facets.routing.yml
@@ -48,3 +48,9 @@ entity.facets_facet_source.edit_form:
     _title: 'Edit facet source configuration'
   requirements:
     _entity_create_access: 'facets_facet'
+facets.block.ajax:
+  path: '/facets-block/ajax'
+  defaults:
+    _controller: '\Drupal\facets\Controller\FacetBlockAjaxController::ajaxFacetBlockView'
+  requirements:
+    _access: 'TRUE'
diff --git a/js/checkbox-widget.js b/js/checkbox-widget.js
index 154c54b..47744de 100644
--- a/js/checkbox-widget.js
+++ b/js/checkbox-widget.js
@@ -43,7 +43,7 @@
 
     checkbox.on('change.facets', function (e) {
       Drupal.facets.disableFacet($link.parents('.js-facets-checkbox-links'));
-      window.location.href = $(this).data('facetsredir');
+      $(this).siblings('a').trigger('click');
     });
 
     if (active) {
@@ -51,7 +51,7 @@
       label.find('.js-facet-deactivate').remove();
     }
 
-    $link.before(checkbox).before(label).remove();
+    $link.before(checkbox).before(label).hide();
 
   };
 
diff --git a/js/dropdown-widget.js b/js/dropdown-widget.js
index e87b929..cc56c8d 100644
--- a/js/dropdown-widget.js
+++ b/js/dropdown-widget.js
@@ -77,7 +77,7 @@
       }
 
       // Replace links with dropdown.
-      $ul.after($dropdown).remove();
+      $ul.after($dropdown).hide();
       Drupal.attachBehaviors($dropdown.parent()[0], Drupal.settings);
     });
   };
diff --git a/js/facets-views-ajax.js b/js/facets-views-ajax.js
new file mode 100644
index 0000000..18a7116
--- /dev/null
+++ b/js/facets-views-ajax.js
@@ -0,0 +1,214 @@
+/**
+ * @file
+ * Facets Views AJAX handling.
+ */
+
+/**
+ * @name FacetsViewsAjaxSettings
+ * @property {String} view_id
+ * @property {String} current_display_id
+ * @property {String} view_base_path
+ */
+
+/**
+ * @property {FacetsViewsAjaxSettings[]} drupalSettings.facets_views_ajax
+ */
+
+
+(function ($, Drupal) {
+  'use strict';
+
+  /**
+   * Keep the original beforeSend method to use it later.
+   */
+  var beforeSend = Drupal.Ajax.prototype.beforeSend;
+
+  /**
+   * Trigger views AJAX refresh on click.
+   */
+  Drupal.behaviors.facetsViewsAjax = {
+    attach: function (context, settings) {
+
+      // Loop through all facets
+      $.each(settings.facets_views_ajax, function (facetId, facetSettings) {
+
+        // Get the View for the current facet.
+        var view = $('.view-id-' + facetSettings.view_id + '.view-display-id-' + facetSettings.current_display_id).first();
+        var dom_id_start = 'js-view-dom-id-';
+        var current_dom_id = $.map(view.attr('class').split(' '), function (v, i) {
+          if (v.indexOf(dom_id_start) > -1) {
+            return v.slice(dom_id_start.length, v.length);
+          }
+        });
+
+        if (typeof Drupal.views.instances['views_dom_id:' + current_dom_id] === 'undefined') {
+          return;
+        }
+
+        // Update view on summary block click
+        if (updateFacetsSummaryBlock() && (facetId === 'facets_summary_ajax')) {
+          $('[data-drupal-facets-summary-id=' + facetSettings.facets_summary_id +']').children('ul').children('li').once().click(function (e) {
+            e.preventDefault();
+            var facetLink = $(this).find('a');
+            updateFacetsView(facetLink, current_dom_id);
+          });
+        }
+        // Update view on facet item click
+        else {
+          $('[data-drupal-facet-id=' + facetId + ']').children('.facet-item').once().click(function (e) {
+            e.preventDefault();
+            updateFacetsView($(this), current_dom_id);
+          });
+        }
+      });
+    }
+  };
+
+  // Helper function to update views output & Ajax facets.
+  var updateFacetsView = function(facetLink, current_dom_id) {
+    // Get href from facet link
+    var href = facetLink.attr('href');
+    if (href == undefined) {
+      href = $(facetLink).find('a').attr('href');
+    }
+
+    // Refresh view
+    var views_parameters = Drupal.Views.parseQueryString(href);
+    var views_arguments = Drupal.Views.parseViewArgs(href, 'search');
+    var views_settings = $.extend(
+      {},
+      Drupal.views.instances['views_dom_id:' + current_dom_id].settings,
+      views_arguments,
+      views_parameters
+    );
+
+    // Update View.
+    var views_ajax_settings = Drupal.views.instances['views_dom_id:' + current_dom_id].element_settings;
+    views_ajax_settings.submit = views_settings;
+    views_ajax_settings.url = '/views/ajax?q=' + href;
+
+    Drupal.ajax(views_ajax_settings).execute();
+
+    // Update url
+    window.historyInitiated = true;
+    window.history.pushState(null, document.title, href);
+
+    // ToDo: Update views+facets with ajax on history back
+    // For now we will reload the full page
+    window.addEventListener("popstate", function(e) {
+      if (window.historyInitiated) {
+        window.location.reload();
+      }
+    });
+
+    // Refresh facets blocks
+    updateFacetsBlocks(href);
+  }
+
+  // Helper function, updates facet blocks
+  var updateFacetsBlocks = function(href) {
+    var settings = drupalSettings;
+    var facets_blocks = facetsBlocks();
+
+    // Update facet blocks.
+    var facet_settings = {
+      url: Drupal.url('facets-block/ajax'),
+      submit: {
+        facet_link: href,
+        facets_blocks: facets_blocks
+      }
+    };
+
+    // Update facets summary block
+    if (updateFacetsSummaryBlock()) {
+      var facet_summary_wrapper_id = $('[data-drupal-facets-summary-id=' + settings.facets_views_ajax.facets_summary_ajax.facets_summary_id + ']').attr('id');
+      var facet_summary_block_id = '';
+      if (facet_summary_wrapper_id.indexOf('--') !== -1) {
+        facet_summary_block_id = facet_summary_wrapper_id.substring(0, facet_summary_wrapper_id.indexOf('--')).replace('block-', '');
+      }
+      else {
+        facet_summary_block_id = facet_summary_wrapper_id.replace('block-', '');
+      }
+      facet_settings.submit.update_summary_block =  true;
+      facet_settings.submit.facet_summary_block_id = facet_summary_block_id;
+      facet_settings.submit.facet_summary_wrapper_id = settings.facets_views_ajax.facets_summary_ajax.facets_summary_id;
+    }
+
+    Drupal.ajax(facet_settings).execute();
+  };
+
+  // Helper function to determine if we should update the summary block
+  // Returns true or false
+  var updateFacetsSummaryBlock = function() {
+    var settings = drupalSettings;
+    var update_summary = false;
+
+    if (settings.facets_views_ajax.facets_summary_ajax) {
+      update_summary = true;
+    }
+
+    return update_summary;
+  }
+
+  // Helper function, return facet blocks
+  var facetsBlocks = function() {
+    // Get all ajax facets blocks from the current page.
+    var facets_blocks = {};
+
+    $('.block-facets-ajax').each(function (index) {
+      var block_id_start = 'js-facet-block-id-';
+      var block_id = $.map($(this).attr('class').split(' '), function (v, i) {
+        if (v.indexOf(block_id_start) > -1) {
+          return v.slice(block_id_start.length, v.length);
+        }
+      }).join();
+      var block_selector = '#' + $(this).attr('id');
+      facets_blocks[block_id] = block_selector;
+    });
+
+    return facets_blocks;
+  }
+
+  $.fn.replaceFacets = function(data) {
+    if (data.replaceWith === '') {
+      $(data.selector).html('');
+    }
+    else {
+      $(data.selector).replaceWith(data.replaceWith);
+    }
+  };
+
+  /**
+   * Override beforeSend to trigger facetblocks update on exposed filter change
+   *
+   * @param {XMLHttpRequest} xmlhttprequest
+   *   Native Ajax object.
+   * @param {object} options
+   *   jQuery.ajax options.
+   */
+  Drupal.Ajax.prototype.beforeSend = function (xmlhttprequest, options) {
+
+    // Update facet blocks as well
+    // Get view from options
+    if (typeof options.extraData !== 'undefined' && typeof options.extraData.view_name !== 'undefined') {
+      var href = window.location.href;
+      var settings = drupalSettings;
+
+      // TODO: Maybe we should limit facet block reloads by view?
+      var reload = false;
+      $.each(settings.facets_views_ajax, function (facetId, facetSettings) {
+        if (facetSettings.view_id == options.extraData.view_name && facetSettings.current_display_id == options.extraData.view_display_id) {
+          reload = true;
+        }
+      });
+
+      if (reload) {
+        updateFacetsBlocks(href);
+      }
+    }
+
+    // Call the original Drupal method with the right context.
+    beforeSend.apply(this, arguments);
+  }
+
+})(jQuery, Drupal);
diff --git a/modules/facets_summary/src/Plugin/Block/FacetsSummaryBlock.php b/modules/facets_summary/src/Plugin/Block/FacetsSummaryBlock.php
index 93ccd99..f544f6d 100644
--- a/modules/facets_summary/src/Plugin/Block/FacetsSummaryBlock.php
+++ b/modules/facets_summary/src/Plugin/Block/FacetsSummaryBlock.php
@@ -96,6 +96,17 @@ class FacetsSummaryBlock extends BlockBase implements FacetsSummaryBlockInterfac
       ];
     }
 
+    /** @var \Drupal\views\Entity\View $view */
+    $view = $facets_summary->getFacetSource()->getView();
+
+    $build['#attached']['drupalSettings']['facets_views_ajax'] = [
+      'facets_summary_ajax' => [
+        'facets_summary_id' => $build['#attributes']['data-drupal-facets-summary-id'],
+        'view_id' => $view->id(),
+        'current_display_id' => $view->current_display
+      ]
+    ];
+
     return $build;
 
   }
diff --git a/src/Controller/FacetBlockAjaxController.php b/src/Controller/FacetBlockAjaxController.php
new file mode 100644
index 0000000..d380dcb
--- /dev/null
+++ b/src/Controller/FacetBlockAjaxController.php
@@ -0,0 +1,200 @@
+<?php
+
+namespace Drupal\facets\Controller;
+
+use Drupal\Core\Ajax\AjaxResponse;
+use Drupal\Core\Ajax\InvokeCommand;
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Drupal\Core\Entity\EntityManager;
+use Drupal\Core\Logger\LoggerChannelFactoryInterface;
+use Drupal\Core\Path\CurrentPathStack;
+use Drupal\Core\PathProcessor\PathProcessorManager;
+use Drupal\Core\Render\Markup;
+use Drupal\Core\Render\RendererInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+use Symfony\Component\Routing\RouterInterface;
+
+/**
+ * Defines a controller to load a view via AJAX.
+ */
+class FacetBlockAjaxController implements ContainerInjectionInterface {
+
+  /**
+   * The container
+   *
+   * @var \Symfony\Component\DependencyInjection\ContainerInterface
+   */
+  protected $container;
+
+  /**
+   * The entity storage for block.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $storage;
+
+  /**
+   * The renderer.
+   *
+   * @var \Drupal\Core\Render\RendererInterface
+   */
+  protected $renderer;
+
+  /**
+   * The current path.
+   *
+   * @var \Drupal\Core\Path\CurrentPathStack
+   */
+  protected $currentPath;
+
+  /**
+   * The dynamic router service.
+   *
+   * @var \Symfony\Component\Routing\Matcher\RequestMatcherInterface
+   */
+  protected $router;
+
+  /**
+   * The path processor service.
+   *
+   * @var \Drupal\Core\PathProcessor\InboundPathProcessorInterface
+   */
+  protected $pathProcessor;
+
+  /**
+   * The logger service.
+   *
+   * @var
+   */
+  protected $logger;
+
+  /**
+   * @var \Drupal\Core\Entity\EntityManager
+   */
+  protected $entityManager;
+
+
+  /**
+   * Constructs a FacetBlockAjaxController object.
+   *
+   * @param \Drupal\Core\Entity\EntityManager $entityManager
+   * @param \Drupal\Core\Render\RendererInterface $renderer
+   * @param \Drupal\Core\Path\CurrentPathStack $currentPath
+   * @param \Symfony\Component\Routing\RouterInterface $router
+   * @param \Drupal\Core\PathProcessor\PathProcessorManager $pathProcessor
+   * @param \Drupal\Core\Logger\LoggerChannelFactoryInterface $logger
+   */
+  public function __construct(EntityManager $entityManager, RendererInterface $renderer,
+                              CurrentPathStack $currentPath,
+                              RouterInterface $router,
+                              PathProcessorManager $pathProcessor,
+                              LoggerChannelFactoryInterface $logger) {
+    $this->entityManager = $entityManager;
+    $this->storage = $entityManager->getStorage('block');
+    $this->renderer = $renderer;
+    $this->currentPath = $currentPath;
+    $this->router = $router;
+    $this->pathProcessor = $pathProcessor;
+    $this->logger = $logger;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('entity.manager'),
+      $container->get('renderer'),
+      $container->get('path.current'),
+      $container->get('router'),
+      $container->get('path_processor_manager'),
+      $container->get('logger.factory')
+    );
+  }
+
+  /**
+   * Loads and renders the facet blocks via AJAX.
+   *
+   * @param \Symfony\Component\HttpFoundation\Request $request
+   *   The current request object.
+   *
+   * @return \Drupal\Core\Ajax\AjaxResponse
+   *   The ajax response.
+   *
+   * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
+   *   Thrown when the view was not found.
+   */
+  public function ajaxFacetBlockView(Request $request) {
+    $response = new AjaxResponse();
+
+    // Rebuild the request and the current path, needed for facets.
+    $path = $request->request->get('facet_link');
+    $facets_blocks = $request->request->get('facets_blocks');
+
+    // Make sure we are not updating blocks multiple times
+    $facets_blocks = array_unique($facets_blocks);
+
+    if (empty($path) || empty($facets_blocks)) {
+      throw new NotFoundHttpException();
+    }
+    $new_request = Request::create($path);
+    $requestStack = new RequestStack();
+    $processed = $this->pathProcessor->processInbound($path, $new_request);
+    if (empty($processed)) {
+      throw new NotFoundHttpException();
+    }
+    $this->currentPath->setPath($processed, $new_request);
+    $request->attributes->add($this->router->matchRequest($new_request));
+    $requestStack->push($new_request);
+    $container = \Drupal::getContainer();
+    $container->set('request_stack', $requestStack);
+    $activeFacet = $request->request->get('active_facet');
+
+    // Build the facets blocks found for the current request and update.
+    foreach ($facets_blocks as $block_id => $block_selector) {
+      // $facets_block_id = str_replace('_', '', $facets_block);
+      $block_entity = $this->storage->load($block_id);
+      if ($block_entity) {
+        $block_view = $this->entityManager->getViewBuilder('block')
+          ->view($block_entity);
+        /** @var \Drupal\Core\Render\Markup $block_view */
+        $block_view = (string) $this->renderer->renderPlain($block_view);
+
+        // @Todo: Replace with ReplaceCommand once https://www.drupal.org/node/736066 gets fixed.
+        $data['selector'] = $block_selector;
+        $data['replaceWith'] = $block_view;
+
+        $response->addCommand(new InvokeCommand(NULL, 'replaceFacets', [$data]));
+      }
+    }
+
+    $response->addCommand(new InvokeCommand('[data-block-plugin-id="' . $activeFacet . '"]', 'addClass', ['facet-active']));
+
+    $update_summary_block = $request->request->get('update_summary_block');
+
+    if ($update_summary_block) {
+      $facet_summary_block_id = $request->request->get('facet_summary_block_id');
+      $facet_summary_wrapper_id = $request->request->get('facet_summary_wrapper_id');
+      $facet_summary_block_id = str_replace('-', '_', $facet_summary_block_id);
+      // Update filter summary block.
+      if ($facet_summary_block_id) {
+        $block_entity = $this->storage->load($facet_summary_block_id);
+        $block_view = $this->entityManager->getViewBuilder('block')
+          ->view($block_entity);
+        /** @var \Drupal\Core\Render\Markup $block_view */
+        $block_view = (string) $this->renderer->renderPlain($block_view);
+
+        // @Todo: Replace with ReplaceCommand once https://www.drupal.org/node/736066 gets fixed.
+        $data['selector'] = '[data-drupal-facets-summary-id=' . $facet_summary_wrapper_id . ']';
+        $data['replaceWith'] = $block_view;
+        $response->addCommand(new InvokeCommand(NULL, 'replaceFacets', [$data]));
+      }
+    }
+
+    return $response;
+  }
+
+}
diff --git a/src/FacetSource/FacetSourcePluginBase.php b/src/FacetSource/FacetSourcePluginBase.php
index 14317fb..9a470f8 100644
--- a/src/FacetSource/FacetSourcePluginBase.php
+++ b/src/FacetSource/FacetSourcePluginBase.php
@@ -119,6 +119,13 @@ abstract class FacetSourcePluginBase extends PluginBase implements FacetSourcePl
   /**
    * {@inheritdoc}
    */
+  public function buildFacet() {
+    return [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getCount() {
     global $pager_total_items;
     // Exposing a global here. This is pretty ugly but the only way to get the
diff --git a/src/FacetSource/FacetSourcePluginInterface.php b/src/FacetSource/FacetSourcePluginInterface.php
index d88d3e5..00a129f 100644
--- a/src/FacetSource/FacetSourcePluginInterface.php
+++ b/src/FacetSource/FacetSourcePluginInterface.php
@@ -105,4 +105,13 @@ interface FacetSourcePluginInterface extends PluginFormInterface, DependentPlugi
    */
   public function getDataDefinition($field_name);
 
+  /**
+   * Builds and returns an extra renderable array for this facet block plugin.
+   *
+   * @return array
+   *   A renderable array representing the content of the block.
+   *
+   * @see Drupal\facets\Plugin\facets\facet_source\SearchApiDisplay
+   */
+  public function buildFacet();
 }
diff --git a/src/Plugin/Block/FacetBlock.php b/src/Plugin/Block/FacetBlock.php
index b58c54d..8ea98a7 100644
--- a/src/Plugin/Block/FacetBlock.php
+++ b/src/Plugin/Block/FacetBlock.php
@@ -5,6 +5,7 @@ namespace Drupal\facets\Plugin\Block;
 use Drupal\Core\Block\BlockBase;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\PluginBase;
 use Drupal\facets\FacetManager\DefaultFacetManager;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -86,11 +87,24 @@ class FacetBlock extends BlockBase implements ContainerFactoryPluginInterface {
     // Let the facet_manager build the facets.
     $build = $this->facetManager->build($facet);
 
-    // Add contextual links only when we have results.
     if (!empty($build)) {
+      // Add extra elements from facet source.
+      // For example, ajax scripts.
+      // @see Drupal\facets\Plugin\facets\facet_source\SearchApiDisplay
+      /** @var \Drupal\facets\FacetSource\FacetSourcePluginInterface $facet_source */
+      $facet_source = $facet->getFacetSource();
+      $build += $facet_source->buildFacet();
+
+      // Add contextual links only when we have results.
       $build['#contextual_links']['facets_facet'] = [
         'route_parameters' => ['facets_facet' => $facet->id()],
       ];
+
+      // Add ajax class.
+      if (!empty($build['#use_ajax']) && isset($this->configuration['block_id'])) {
+        $build['#attributes']['class'][] = 'block-facets-ajax';
+        $build['#attributes']['class'][] = 'js-facet-block-id-' . $this->configuration['block_id'];
+      }
     }
 
     return $build;
@@ -144,4 +158,14 @@ class FacetBlock extends BlockBase implements ContainerFactoryPluginInterface {
     return ['config' => [$facet->getConfigDependencyName()]];
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function blockSubmit($form, FormStateInterface $form_state) {
+    // Save block id to configuration, we do this for loading the orignal block
+    // with ajax
+    $block_id = $form['id']['#value'];
+    $this->configuration['block_id'] = $block_id;
+  }
+
 }
diff --git a/src/Plugin/facets/facet_source/SearchApiDisplay.php b/src/Plugin/facets/facet_source/SearchApiDisplay.php
index 028d386..5c3db30 100644
--- a/src/Plugin/facets/facet_source/SearchApiDisplay.php
+++ b/src/Plugin/facets/facet_source/SearchApiDisplay.php
@@ -372,4 +372,44 @@ class SearchApiDisplay extends FacetSourcePluginBase implements SearchApiFacetSo
     throw new Exception("Field with name {$field_name} does not have a definition");
   }
 
+  /**
+   * Return the Search API display source view, if any.
+   *
+   * @return \Drupal\views\Views
+   *   Current view or FALSE.
+   */
+  public function getView() {
+    $display_definition = $this->getDisplay()->getPluginDefinition();
+    if (isset($display_definition['view_id'])) {
+      $view = Views::getView($display_definition['view_id']);
+      $view->setDisplay($display_definition['view_display']);
+      return $view;
+    }
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildFacet() {
+    $build = parent::buildFacet();
+    /** @var \Drupal\views\ViewExecutable $view */
+    if ($view = $this->getView()) {
+      // Add JS for Views with Ajax Enabled.
+      if ($view->display_handler->ajaxEnabled()) {
+        $js_settings = [
+          'view_id' => $view->id(),
+          'current_display_id' => $view->current_display,
+          'view_base_path' => ltrim($view->getPath(), '/'),
+        ];
+        $build['#attached']['library'][] = 'facets/drupal.facets.views-ajax';
+        $build['#attached']['drupalSettings']['facets_views_ajax'] = [
+          $this->facet->id() => $js_settings,
+        ];
+        $build['#use_ajax'] = TRUE;
+      }
+    }
+    return $build;
+  }
+
 }
diff --git a/src/Widget/WidgetPluginBase.php b/src/Widget/WidgetPluginBase.php
index 68cf0a7..4f724a1 100644
--- a/src/Widget/WidgetPluginBase.php
+++ b/src/Widget/WidgetPluginBase.php
@@ -6,6 +6,7 @@ use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Link;
 use Drupal\Core\Plugin\PluginBase;
+use Drupal\Core\Url;
 use Drupal\facets\FacetInterface;
 use Drupal\facets\Result\Result;
 use Drupal\facets\Result\ResultInterface;
@@ -54,6 +55,18 @@ abstract class WidgetPluginBase extends PluginBase implements WidgetPluginInterf
         return $this->buildResultItem($result);
       }
       else {
+        $url = $result->getUrl();
+        $options = $url->getOptions();
+        $request = \Drupal::request();
+        $pathinfo = $request->getPathInfo();
+        $url_object = \Drupal::service('path.validator')
+          ->getUrlIfValid($pathinfo);
+        $route_params = $url_object->getRouteParameters();
+        $route_name = $url_object->getRouteName();
+        // Additional check needed if facets are tied up with a block on the page.
+        if ($result->getUrl()->getRouteName() === 'facets.block.ajax') {
+          $result->setUrl(new Url($route_name, $route_params, $options));
+        }
         return $this->buildListItems($facet, $result);
       }
     }, $facet->getResults());
