diff --git a/facets.services.yml b/facets.services.yml
index ba34b70..bb29dbc 100644
--- a/facets.services.yml
+++ b/facets.services.yml
@@ -39,10 +39,6 @@ services:
     arguments: ['@plugin.manager.block']
     tags:
       - { name: event_subscriber }
-  facets.route_alter:
-    class: \Drupal\facets\EventSubscriber\RouteAlterSubscriber
-    tags:
-      - { name: event_subscriber }
   facets.search_api_subscriber:
     class: Drupal\facets\EventSubscriber\SearchApiSubscriber
     arguments: ['@facets.manager']
diff --git a/js/base-widget.js b/js/base-widget.js
index de99c03..3a868d7 100644
--- a/js/base-widget.js
+++ b/js/base-widget.js
@@ -14,8 +14,7 @@
    * class: "js-facets-widget".
    *
    * Events are doing following:
-   * "facets_filter" - widget should trigger this event. The facets module will
-   *   handle it accordingly in case of AJAX and Non-AJAX views.
+   * "facets_filter" - widget should trigger this event.
    * "facets_filtering" - The facets module will trigger this event before
    *   filter is executed.
    *
diff --git a/js/checkbox-widget.js b/js/checkbox-widget.js
index 6dbb652..397e686 100644
--- a/js/checkbox-widget.js
+++ b/js/checkbox-widget.js
@@ -88,21 +88,13 @@
     var label = $('<label for="' + id + '">' + description + '</label>');
 
     checkbox.on('change.facets', function (e) {
-      if ($link.data('drupal-facet-ajax') == 0) {
-        e.preventDefault();
+      e.preventDefault();
 
-        var $widget = $(this).closest('.js-facets-widget');
+      var $widget = $(this).closest('.js-facets-widget');
+
+      Drupal.facets.disableFacet($widget);
+      $widget.trigger('facets_filter', [href]);
 
-        Drupal.facets.disableFacet($widget);
-        $widget.trigger('facets_filter', [href]);
-      }
-      else {
-        var current = $(this);
-        if (current.is(':checked') && current.hasClass(single_selection_group)) {
-          var $widget = current.closest('.js-facets-widget');
-          $widget.find('input.' + single_selection_group + ':not(#' + current.attr('id') + ')').prop('checked', false);
-        }
-      }
     });
 
     if (active) {
diff --git a/js/dropdown-widget.js b/js/dropdown-widget.js
index ecc0588..7e7af99 100644
--- a/js/dropdown-widget.js
+++ b/js/dropdown-widget.js
@@ -53,7 +53,7 @@
         .text(default_option_label);
       $dropdown.append($default_option);
 
-      $ul.prepend('<li class="default-option"><a href="' + window.location.href.split('?')[0] + '" data-drupal-facet-ajax="' + $ul.data('drupal-facet-ajax') +'">' + Drupal.checkPlain(default_option_label) + '</a></li>');
+      $ul.prepend('<li class="default-option"><a href="' + window.location.href.split('?')[0] + '">' + Drupal.checkPlain(default_option_label) + '</a></li>');
 
       var has_active = false;
       $links.each(function () {
@@ -89,10 +89,9 @@
       $dropdown.on('change.facets', function () {
         var anchor = $($ul).find("[data-drupal-facet-item-id='" + $(this).find(':selected').data('drupalFacetItemId') + "']");
         var $linkElement = (anchor.length > 0) ? $(anchor) : $ul.find('.default-option a');
-        if ($linkElement.data('drupal-facet-ajax') == 0) {
-          var url = $linkElement.attr('href');
-          $(this).trigger('facets_filter', [ url ]);
-        }
+        var url = $linkElement.attr('href');
+        $(this).trigger('facets_filter', [ url ]);
+
       });
 
       // Append empty text option.
diff --git a/src/Cache/Context/FacetsFilterCacheContext.php b/src/Cache/Context/FacetsFilterCacheContext.php
index 4fc20f5..7100047 100644
--- a/src/Cache/Context/FacetsFilterCacheContext.php
+++ b/src/Cache/Context/FacetsFilterCacheContext.php
@@ -7,7 +7,7 @@ use Drupal\Core\Cache\Context\CalculatedCacheContextInterface;
 use Drupal\Core\Cache\Context\RequestStackCacheContextBase;
 
 /**
- * Defines the FacetsAjaxArgsCacheContext service, for per facets args caching.
+ * Defines the FacetsFilterCacheContext service, for per facets args caching.
  *
  * Cache context ID: 'facets_filter' (to vary by all request arguments).
  * Calculated cache context ID: 'facets_filter:%key', e.g.'facets_filter:f'
diff --git a/src/Controller/FacetsViewsAjaxController.php b/src/Controller/FacetsViewsAjaxController.php
deleted file mode 100644
index 157a81e..0000000
--- a/src/Controller/FacetsViewsAjaxController.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-
-namespace Drupal\facets\Controller;
-
-use Drupal\Core\Ajax\ReplaceCommand;
-use Drupal\Core\Cache\CacheableMetadata;
-use Drupal\Core\Cache\CacheableResponseInterface;
-use Drupal\Core\Render\BubbleableMetadata;
-use Drupal\Core\Render\RenderContext;
-use Drupal\views\Ajax\ViewAjaxResponse;
-use Drupal\views\Controller\ViewAjaxController;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Controller that allows for to replace exposed forms in blocks.
- */
-class FacetsViewsAjaxController extends ViewAjaxController {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function ajaxView(Request $request) {
-    $this->facetsRemoveQueryParams($request);
-    $response = parent::ajaxView($request);
-
-    $view = $response->getView();
-    $display = $view->getDisplay();
-    if ($display->getOption('exposed_block') && $display->usesExposedFormInBlock()) {
-      $metadata = $this->addExposedBlockToResponse($response);
-      if ($response instanceof CacheableResponseInterface) {
-        $response->addCacheableDependency($metadata);
-      }
-    }
-
-    return $response;
-  }
-
-  /**
-   * If there's an AJAX request, remove the 'f' and 'page' key.
-   *
-   * ... in case they are in the current browser URL.
-   *
-   * This only applies when the method is POST.
-   *
-   * @param \Symfony\Component\HttpFoundation\Request $request
-   *   The request object to process.
-   */
-  protected function facetsRemoveQueryParams(Request $request) {
-    if ($request->isXmlHttpRequest()) {
-      // @todo replace hardcoded 'f' by facet setting.
-      foreach (['f', 'page', 'fulltext'] as $key) {
-        if ($request->query->has($key)) {
-          $request->query->remove($key);
-        }
-      }
-    }
-  }
-
-  /**
-   * Adds the exposed form to the response if necessary.
-   */
-  protected function addExposedBlockToResponse(ViewAjaxResponse $response): CacheableMetadata {
-    $view = $response->getView();
-    $context = new RenderContext();
-    $exposed_block = $this->renderer->executeInRenderContext($context, function () use ($view) {
-      $output = $view->display_handler->viewExposedFormBlocks();
-      if (is_array($output) && !empty($output)) {
-        return $output;
-      }
-
-      return [];
-    });
-
-    if (!$context->isEmpty() && !empty($exposed_block)) {
-      $bubbleable_metadata = $context->pop();
-      BubbleableMetadata::createFromRenderArray($exposed_block)
-        ->merge($bubbleable_metadata)
-        ->applyTo($exposed_block);
-    }
-
-    // Replace exposed block.
-    $selector = 'views-exposed-form-' . strtr($view->id(), '_', '-') . '-' . strtr($view->current_display, '_', '-');
-    $response->addCommand(new ReplaceCommand("#" . $selector, $exposed_block));
-
-    return CacheableMetadata::createFromRenderArray($exposed_block);
-  }
-
-}
diff --git a/src/EventSubscriber/RouteAlterSubscriber.php b/src/EventSubscriber/RouteAlterSubscriber.php
deleted file mode 100644
index 4d8fc9b..0000000
--- a/src/EventSubscriber/RouteAlterSubscriber.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-namespace Drupal\facets\EventSubscriber;
-
-use Drupal\Core\Routing\RouteBuildEvent;
-use Drupal\Core\Routing\RoutingEvents;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
-
-/**
- * Modify certain routes.
- */
-class RouteAlterSubscriber implements EventSubscriberInterface {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function onRouteAlter(RouteBuildEvent $event) {
-    $collection = $event->getRouteCollection();
-    if ($route = $collection->get('views.ajax')) {
-      $route->setDefault('_controller', '\Drupal\facets\Controller\FacetsViewsAjaxController::ajaxView');
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function getSubscribedEvents() {
-    $events[RoutingEvents::ALTER][] = ['onRouteAlter', -100];
-    return $events;
-  }
-
-}
diff --git a/src/FacetManager/DefaultFacetManager.php b/src/FacetManager/DefaultFacetManager.php
index 4282368..e07eefa 100644
--- a/src/FacetManager/DefaultFacetManager.php
+++ b/src/FacetManager/DefaultFacetManager.php
@@ -448,21 +448,6 @@ class DefaultFacetManager {
           ],
         ];
       }
-      else {
-        // If the facet has no results, but it is being rendered trough AJAX it
-        // should render an empty container. This is because the JavaScript
-        // needs to be able to find a div to replace with the new content.
-        return [
-          [
-            0 => $build,
-            '#type' => 'container',
-            '#attributes' => [
-              'data-drupal-facet-id' => $built_facet->id(),
-              'class' => ['facet-empty', 'facet-hidden'],
-            ],
-          ],
-        ];
-      }
     }
 
     return [$build];
diff --git a/src/Plugin/Block/FacetBlock.php b/src/Plugin/Block/FacetBlock.php
index 63c1c8e..5f561a2 100644
--- a/src/Plugin/Block/FacetBlock.php
+++ b/src/Plugin/Block/FacetBlock.php
@@ -93,11 +93,6 @@ class FacetBlock extends BlockBase implements ContainerFactoryPluginInterface {
     if (!empty($build)) {
       CacheableMetadata::createFromObject($this)->applyTo($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();
-
       // Add contextual links only when we have results.
       $build['#contextual_links']['facets_facet'] = [
         'route_parameters' => ['facets_facet' => $facet->id()],
diff --git a/src/Plugin/better_exposed_filters/filter/Facets.php b/src/Plugin/better_exposed_filters/filter/Facets.php
deleted file mode 100644
index 0f059e6..0000000
--- a/src/Plugin/better_exposed_filters/filter/Facets.php
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-
-namespace Drupal\facets\Plugin\better_exposed_filters\filter;
-
-use Drupal\better_exposed_filters\Plugin\better_exposed_filters\filter\FilterWidgetBase;
-use Drupal\Core\Cache\CacheableMetadata;
-use Drupal\Core\Form\FormStateInterface;
-
-/**
- * Default widget implementation.
- *
- * @BetterExposedFiltersFilterWidget(
- *   id = "facets",
- *   label = @Translation("Facets"),
- * )
- */
-class Facets extends FilterWidgetBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function exposedFormAlter(array &$form, FormStateInterface $form_state) {
-    if ($form_state->facets_not_built ?? FALSE) {
-      return;
-    }
-
-    $field_id = $this->getExposedFilterFieldId();
-    if (!empty($form[$field_id]) && !empty($form[$field_id]['#content'])) {
-      $metadata = new CacheableMetadata();
-      if (isset($form['#cache'])) {
-        $metadata = CacheableMetadata::createFromRenderArray($form);
-      }
-
-      foreach ($form[$field_id]['#content'] as &$facet_content) {
-        /** @var \Drupal\facets\FacetInterface $facet */
-        $facet = $facet_content['content'][0]['#facet'] ?? NULL;
-        if (!$facet) {
-          continue;
-        }
-
-        switch ($facet->getWidgetInstance()->getPluginId()) {
-          case 'array':
-            // Not supported here.
-            break;
-
-          case 'checkbox':
-          case 'dropdown':
-          case 'links':
-          default:
-            parent::exposedFormAlter($form, $form_state);
-
-            /** @var \Drupal\views\Plugin\views\filter\FilterPluginBase $filter */
-            $filter = $this->handler;
-
-            if ($filter->view->ajaxEnabled() || $filter->view->display_handler->ajaxEnabled()) {
-              array_walk_recursive( $facet_content, function(&$value, $key) {
-                if ($key === 'data-drupal-facet-ajax') {
-                  $value = '1';
-                }
-              });
-            }
-
-            $metadata = $metadata->merge(CacheableMetadata::createFromRenderArray($facet_content));
-
-            break;
-        }
-      }
-      unset($facet_content);
-
-      $metadata->applyTo($form);
-    }
-  }
-
-  public static function isApplicable($filter = NULL, array $filter_options = []) {
-    $is_applicable = parent::isApplicable($filter, $filter_options);
-    if (is_a($filter, 'Drupal\facets\Plugin\views\filter\FacetsFilter')) {
-      $is_applicable = TRUE;
-    }
-    return $is_applicable;
-  }
-}
diff --git a/src/Widget/WidgetPluginBase.php b/src/Widget/WidgetPluginBase.php
index 1dc23b9..0d1a9d5 100644
--- a/src/Widget/WidgetPluginBase.php
+++ b/src/Widget/WidgetPluginBase.php
@@ -67,7 +67,6 @@ abstract class WidgetPluginBase extends PluginBase implements WidgetPluginInterf
         'data-drupal-facet-filter-key' => $url_processor->getFilterKey(),
         'data-drupal-facet-id' => $facet->id(),
         'data-drupal-facet-alias' => $facet->getUrlAlias(),
-        'data-drupal-facet-ajax' => '0',
         'class' => [$facet->getActiveItems() ? 'facet-active' : 'facet-inactive'],
       ],
       '#context' => !empty($widget['type']) ? ['list_style' => $widget['type']] : [],
@@ -197,7 +196,6 @@ abstract class WidgetPluginBase extends PluginBase implements WidgetPluginInterf
     $items['#attributes']['data-drupal-facet-item-value'] = $result->getRawValue();
     $items['#attributes']['data-drupal-facet-item-count'] = $result->getCount();
     $items['#attributes']['data-drupal-facet-filter-value'] = $facet->getUrlAlias() . $url_processor->getSeparator() . $result->getRawValue();
-    $items['#attributes']['data-drupal-facet-ajax'] = '0';
 
     if ($facet->getShowOnlyOneResult()) {
       $items['#attributes']['data-drupal-facet-single-selection-group'] = Html::getClass($facet->getUrlAlias());
diff --git a/tests/src/FunctionalJavascript/AjaxBehaviorTest.php b/tests/src/FunctionalJavascript/AjaxBehaviorTest.php
index 3a638c1..cd5a53a 100644
--- a/tests/src/FunctionalJavascript/AjaxBehaviorTest.php
+++ b/tests/src/FunctionalJavascript/AjaxBehaviorTest.php
@@ -24,163 +24,6 @@ class AjaxBehaviorTest extends JsBase {
     $view->save();
   }
 
-  /**
-   * Tests ajax links.
-   */
-  public function testAjaxLinks() {
-    // Create facets.
-    $this->createFacet('owl');
-    $this->createFacet('duck', 'keywords');
-
-    // Go to the views page.
-    $this->drupalGet('search-api-test-fulltext');
-
-    // Make sure the blocks are shown on the page.
-    $page = $this->getSession()->getPage();
-    $block_owl = $page->findById('block-owl-block');
-    $block_owl->isVisible();
-    $block_duck = $page->findById('block-duck-block');
-    $block_duck->isVisible();
-    $this->assertSession()->pageTextContains('Displaying 5 search results');
-
-    // Check that the article link exists (and is formatted like a facet) link.
-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
-    $this->assertNotEmpty($links);
-
-    // Click the item facets.
-    $owl_link = $this->assertSession()->elementExists("xpath", "//label[@for='owl-item']/span[1]");
-    $owl_link->click();
-
-    $this->assertSession()->assertWaitOnAjaxRequest();
-    $this->assertSession()->pageTextContains('Displaying 3 search results');
-
-    // Check that the article facet is now gone.
-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
-    $this->assertEmpty($links);
-
-    // Click the item facet again, and check that the article facet is back.
-    $owl_link->click();
-    $this->assertSession()->assertWaitOnAjaxRequest();
-    $this->assertSession()->pageTextContains('Displaying 5 search results');
-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
-    $this->assertNotEmpty($links);
-
-    // Check that the strawberry link disappears when filtering on items.
-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'strawberry']);
-    $this->assertNotEmpty($links);
-
-    $owl_link->click();
-    $this->assertSession()->assertWaitOnAjaxRequest();
-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'strawberry']);
-    $this->assertEmpty($links);
-  }
-
-  /**
-   * Tests ajax dropdown.
-   */
-  public function testAjaxDropdown() {
-    // Create facets.
-    $this->createFacet('owl');
-    $this->createFacet('duck', 'category', 'dropdown', []);
-
-    // Go to the views page.
-    $this->drupalGet('search-api-test-fulltext');
-
-    // Make sure the blocks are shown on the page.
-    $page = $this->getSession()->getPage();
-    $block_owl = $page->findById('block-owl-block');
-    $block_owl->isVisible();
-    $block_duck = $page->findById('block-duck-block');
-    $block_duck->isVisible();
-    $this->assertSession()->pageTextContains('Displaying 5 search results');
-
-    // Check that the article_category option disappears when filtering on item.
-    $dropdown_entry = $this->xpath('//*[@id="block-duck-block"]/div/select/option[normalize-space(text())=:label]', [':label' => 'article_category']);
-    $this->assertNotEmpty($dropdown_entry);
-    $owl_link = $this->assertSession()->elementExists("xpath", "//label[@for='owl-item']/span[1]");
-    $owl_link->click();
-    $this->assertSession()->assertWaitOnAjaxRequest();
-    $dropdown_entry = $this->xpath('//*[@id="block-duck-block"]/div/select/option[normalize-space(text())=:label]', [':label' => 'article_category']);
-    $this->assertEmpty($dropdown_entry);
-
-    // Click the item facet again.
-    $owl_link->click();
-    $this->assertSession()->assertWaitOnAjaxRequest();
-
-    // Select the article_category in the dropdown.
-    $dropdown = $this->xpath('//*[@id="block-duck-block"]/div/select');
-    $dropdown[0]->selectOption('article_category');
-    $this->assertSession()->assertWaitOnAjaxRequest();
-
-    $this->assertSession()->pageTextContains('Displaying 2 search results');
-
-    // Check that the article link exists (and is formatted like a facet) link.
-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
-    $this->assertNotEmpty($links);
-    // Check that the item link didn't exists.
-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'item']);
-    $this->assertEmpty($links);
-  }
-
-  /**
-   * Tests ajax checkbox.
-   */
-  public function testAjaxCheckbox() {
-    // Create facets.
-    $this->createFacet('owl');
-    $this->createFacet('duck', 'keywords', 'checkbox');
-
-    // Go to the views page.
-    $this->drupalGet('search-api-test-fulltext');
-
-    // Make sure the blocks are shown on the page.
-    $page = $this->getSession()->getPage();
-    $block_owl = $page->findById('block-owl-block');
-    $block_owl->isVisible();
-    $block_duck = $page->findById('block-duck-block');
-    $block_duck->isVisible();
-    $this->assertSession()->pageTextContains('Displaying 5 search results');
-
-    // Check that the article link exists (and is formatted like a facet) link.
-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
-    $this->assertNotEmpty($links);
-
-    // Click the item facet.
-    $owl_link = $this->assertSession()->elementExists("xpath", "//label[@for='owl-item']/span[1]");
-    $owl_link->click();
-
-    $this->assertSession()->assertWaitOnAjaxRequest();
-    $this->assertSession()->pageTextContains('Displaying 3 search results');
-
-    // Check that the article facet is now gone.
-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
-    $this->assertEmpty($links);
-
-    // Click the item facet again, and check that the article facet is back.
-    $owl_link->click();
-    $this->assertSession()->assertWaitOnAjaxRequest();
-    $this->assertSession()->pageTextContains('Displaying 5 search results');
-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
-    $this->assertNotEmpty($links);
-
-    // Check that the strawberry link disappears when filtering on items.
-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'strawberry']);
-    $this->assertNotEmpty($links);
-    $owl_link->click();
-    $this->assertSession()->assertWaitOnAjaxRequest();
-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'strawberry']);
-    $this->assertEmpty($links);
-    $owl_link->click();
-
-    $this->getSession()->getPage()->checkField('strawberry');
-    // Check that the article link exists (and is formatted like a facet) link.
-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'article']);
-    $this->assertNotEmpty($links);
-    // Check that the item link didn't exists.
-    $links = $this->xpath('//a//span[normalize-space(text())=:label]', [':label' => 'item']);
-    $this->assertEmpty($links);
-  }
-
   /**
    * Tests links with exposed filters.
    */
