diff --git a/facets.module b/facets.module
index d174774..8a7ac4f 100644
--- a/facets.module
+++ b/facets.module
@@ -59,10 +59,18 @@ function facets_search_api_query_alter(QueryInterface &$query) {
     /** @var \Drupal\facets\FacetManager\DefaultFacetManager $facet_manager */
     $facet_manager = \Drupal::service('facets.manager');
 
-    $search_id = $query->getSearchId();
+    /** @var \Drupal\facets\FacetSource\FacetSourcePluginManager $facet_source_manager */
+    $facet_source_manager = \Drupal::service('plugin.manager.facets.facet_source');
+
+    $facet_source_id = $query->getSearchId(FALSE);
+    foreach ($facet_source_manager->getDefinitions() as $definition) {
+      if ($definition['display_id'] == $query->getSearchId()) {
+        $facet_source_id = $definition['id'];
+      }
+    }
 
     // Add the active filters.
-    $facet_manager->alterQuery($query, $search_id);
+    $facet_manager->alterQuery($query, $facet_source_id);
   }
 }
 
@@ -88,7 +96,7 @@ function facets_entity_presave(EntityInterface $entity) {
         // Check if the current display is also a facet source plugin and that
         // is removed from the view. We use the double underscore here to make
         // sure that we use core convention of "plugin:derived_plugin".
-        $facets_source_plugin_id = 'views_page:' . $entity->id() . '__' . $display['id'];
+        $facets_source_plugin_id = 'search_api:' . $entity->id() . '__' . $display['id'];
         if (array_key_exists($facets_source_plugin_id, $definitions) && !array_key_exists($k, $entity->get('display'))) {
           $entity_id = str_replace(':', '__', $facets_source_plugin_id);
           $source_entity = FacetSource::load($entity_id);
@@ -150,7 +158,7 @@ function facets_entity_predelete(EntityInterface $entity) {
     }
 
     foreach ($definitions as $plugin_id => $definition) {
-      if (strpos($plugin_id, 'views_page:' . $entity->id() . '__') !== FALSE) {
+      if (strpos($plugin_id, 'search_api:' . $entity->id() . '__') !== FALSE) {
         try {
           $facetManager = \Drupal::getContainer()->get('facets.manager');
         } catch (ServiceNotFoundException $e) {
diff --git a/modules/rest_facets/src/Plugin/views/style/FacetsSerializer.php b/modules/rest_facets/src/Plugin/views/style/FacetsSerializer.php
index 5c4a1d3..759fb16 100644
--- a/modules/rest_facets/src/Plugin/views/style/FacetsSerializer.php
+++ b/modules/rest_facets/src/Plugin/views/style/FacetsSerializer.php
@@ -80,7 +80,7 @@ class FacetsSerializer extends Serializer {
     }
 
     // Processing facets.
-    $facetsource_id = "views_page:{$this->view->id()}__{$this->view->getDisplay()->display['id']}";
+    $facetsource_id = "search_api:{$this->view->id()}__{$this->view->getDisplay()->display['id']}";
     $facets = $this->facetsManager->getFacetsByFacetSourceId($facetsource_id);
     $this->facetsManager->updateResults($facetsource_id);
 
diff --git a/src/FacetManager/DefaultFacetManager.php b/src/FacetManager/DefaultFacetManager.php
index c59d19a..253656c 100644
--- a/src/FacetManager/DefaultFacetManager.php
+++ b/src/FacetManager/DefaultFacetManager.php
@@ -138,6 +138,10 @@ class DefaultFacetManager {
    *   The facet source ID to process.
    */
   public function alterQuery(&$query, $facetsource_id) {
+    if ($this->getFacetsByFacetSourceId($facetsource_id) === []) {
+      return;
+    }
+
     /** @var \Drupal\facets\FacetInterface[] $facets */
     foreach ($this->getFacetsByFacetSourceId($facetsource_id) as $facet) {
       /** @var \Drupal\facets\QueryType\QueryTypeInterface $query_type_plugin */
diff --git a/src/FacetSource/FacetSourcePluginManager.php b/src/FacetSource/FacetSourcePluginManager.php
index 4f4146a..960f86a 100644
--- a/src/FacetSource/FacetSourcePluginManager.php
+++ b/src/FacetSource/FacetSourcePluginManager.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\facets\FacetSource;
 
+use Drupal\Component\Plugin\Exception\PluginException;
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Plugin\DefaultPluginManager;
@@ -22,4 +23,17 @@ class FacetSourcePluginManager extends DefaultPluginManager {
     parent::__construct('Plugin/facets/facet_source', $namespaces, $module_handler, 'Drupal\facets\FacetSource\FacetSourcePluginInterface', 'Drupal\facets\Annotation\FacetsFacetSource');
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function processDefinition(&$definition, $plugin_id) {
+    parent::processDefinition($definition, $plugin_id);
+
+    foreach (['id', 'label', 'description','display_id'] as $required_property) {
+      if (empty($definition[$required_property])) {
+        throw new PluginException(sprintf('The facet source plugin %s must define the %s property.', $plugin_id, $required_property));
+      }
+    }
+  }
+
 }
diff --git a/src/Plugin/facets/facet_source/SearchApiBaseFacetSource.php b/src/Plugin/facets/facet_source/SearchApiBaseFacetSource.php
index f5930ff..1608b8b 100644
--- a/src/Plugin/facets/facet_source/SearchApiBaseFacetSource.php
+++ b/src/Plugin/facets/facet_source/SearchApiBaseFacetSource.php
@@ -2,29 +2,65 @@
 
 namespace Drupal\facets\Plugin\facets\facet_source;
 
+use Drupal\Component\Plugin\DependentPluginInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\facets\Exception\InvalidQueryTypeException;
 use Drupal\facets\FacetInterface;
-use Drupal\search_api\Backend\BackendInterface;
 use Drupal\facets\FacetSource\FacetSourcePluginBase;
+use Drupal\facets\QueryType\QueryTypePluginManager;
+use Drupal\search_api\Backend\BackendInterface;
+use Drupal\search_api\Display\DisplayPluginManager;
 use Drupal\search_api\FacetsQueryTypeMappingInterface;
+use Drupal\search_api\Query\ResultSetInterface;
 use Drupal\search_api\Utility\QueryHelper;
-use Drupal\facets\QueryType\QueryTypePluginManager;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
- * A base class for Search API facet sources.
+ * Provides a facet source based on a Search API display.
+ *
+ * @FacetsFacetSource(
+ *   id = "search_api",
+ *   deriver = "Drupal\facets\Plugin\facets\facet_source\SearchApiDisplayDeriver"
+ * )
  */
-abstract class SearchApiBaseFacetSource extends FacetSourcePluginBase {
+class SearchApiBaseFacetSource extends FacetSourcePluginBase {
+
+  /**
+   * The entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManager|null
+   */
+  protected $entityTypeManager;
+
+  /**
+   * The typed data manager.
+   *
+   * @var \Drupal\Core\TypedData\TypedDataManager|null
+   */
+  protected $typedDataManager;
+
+  /**
+   * The config factory.
+   *
+   * @var \Drupal\Core\Config\ConfigFactoryInterface|null
+   */
+  protected $configFactory;
 
   /**
-   * The search index.
+   * The search index the query should is executed on.
    *
    * @var \Drupal\search_api\IndexInterface
    */
   protected $index;
 
   /**
+   * The display plugin manager.
+   *
+   * @var \Drupal\search_api\Display\DisplayPluginManager
+   */
+  protected $displayPluginManager;
+
+  /**
    * The search result cache.
    *
    * @var \Drupal\search_api\Utility\QueryHelper
@@ -44,16 +80,14 @@ abstract class SearchApiBaseFacetSource extends FacetSourcePluginBase {
    *   The query type plugin manager.
    * @param \Drupal\search_api\Utility\QueryHelper $search_results_cache
    *   The query type plugin manager.
+   * @param \Drupal\search_api\Display\DisplayPluginManager $display_plugin_manager
+   *   The display plugin manager.
    */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, QueryTypePluginManager $query_type_plugin_manager, QueryHelper $search_results_cache) {
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, QueryTypePluginManager $query_type_plugin_manager, QueryHelper $search_results_cache, DisplayPluginManager $display_plugin_manager) {
     parent::__construct($configuration, $plugin_id, $plugin_definition, $query_type_plugin_manager);
-    // Since defaultConfiguration() depends on the plugin definition, we need to
-    // override the constructor and set the definition property before calling
-    // that method.
-    $this->pluginDefinition = $plugin_definition;
-    $this->pluginId = $plugin_id;
-    $this->configuration = $configuration;
+
     $this->searchApiQueryHelper = $search_results_cache;
+    $this->displayPluginManager = $display_plugin_manager;
   }
 
   /**
@@ -65,15 +99,81 @@ abstract class SearchApiBaseFacetSource extends FacetSourcePluginBase {
       $plugin_id,
       $plugin_definition,
       $container->get('plugin.manager.facets.query_type'),
-      $container->get('search_api.query_helper')
+      $container->get('search_api.query_helper'),
+      $container->get('plugin.manager.search_api.display')
     );
   }
 
   /**
+   * Retrieves the Search API index for this facet source.
+   *
+   * @return \Drupal\search_api\IndexInterface
+   *   The search index.
+   */
+  public function getIndex() {
+    if ($this->index === NULL) {
+      $this->index = $this->getDisplay()->getIndex();
+    }
+
+    return $this->index;
+  }
+
+  /**
    * {@inheritdoc}
    */
-  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+  public function getPath() {
+    $url = $this->getDisplay()->getUrl();
+    if ($url === NULL) {
+      // @todo Return the current page URL instead?
+      return NULL;
+    }
+    return '/' . $url->toString();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fillFacetsWithResults($facets) {
+    // Check if there are results in the static cache.
+    $search_id = $this->getDisplay()->getPluginId();
+    $results = $this->searchApiQueryHelper->getResults($search_id);
+
+    // Get the results from the cache. It is possible it still errored out.
+    if ($results instanceof ResultSetInterface) {
+      // Get our facet data.
+      $facet_results = $results->getExtraData('search_api_facets');
+      if ($facet_results === []) {
+        return;
+      }
+
+      // Loop over each facet and execute the build method from the given
+      // query type.
+      foreach ($facets as $facet) {
+        $configuration = array(
+          'query' => NULL,
+          'facet' => $facet,
+          'results' => isset($facet_results[$facet->getFieldIdentifier()]) ? $facet_results[$facet->getFieldIdentifier()] : [],
+        );
+
+        // Get the Facet Specific Query Type so we can process the results
+        // using the build() function of the query type.
+        $query_type = $this->queryTypePluginManager->createInstance($facet->getQueryType(), $configuration);
+        $query_type->build();
+      }
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isRenderedInCurrentRequest() {
+    return $this->getDisplay()->isRenderedInCurrentRequest();
+  }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
     $form['field_identifier'] = [
       '#type' => 'select',
       '#options' => $this->getFields(),
@@ -91,13 +191,17 @@ abstract class SearchApiBaseFacetSource extends FacetSourcePluginBase {
    */
   public function getFields() {
     $indexed_fields = [];
-    $fields = $this->index->getFields();
+    /** @var \Drupal\search_api\IndexInterface $index */
+    $index = $this->getIndex();
+
+    $fields = $index->getFields();
     // Get the Search API Server.
-    $server = $this->index->getServerInstance();
+    $server = $index->getServerInstance();
     // Get the Search API Backend.
     $backend = $server->getBackend();
     foreach ($fields as $field) {
-      $query_types = $this->getQueryTypesForDataType($backend, $field->getDataTypePlugin()->getPluginId());
+      $query_types = $this->getQueryTypesForDataType($backend, $field->getDataTypePlugin()
+        ->getPluginId());
       if (!empty($query_types)) {
         $indexed_fields[$field->getFieldIdentifier()] = $field->getLabel() . ' (' . $field->getPropertyPath() . ')';
       }
@@ -105,7 +209,6 @@ abstract class SearchApiBaseFacetSource extends FacetSourcePluginBase {
     return $indexed_fields;
   }
 
-
   /**
    * {@inheritdoc}
    */
@@ -113,12 +216,14 @@ abstract class SearchApiBaseFacetSource extends FacetSourcePluginBase {
     // Get our Facets Field Identifier, which is equal to the Search API Field
     // identifier.
     $field_id = $facet->getFieldIdentifier();
+    /** @var \Drupal\search_api\IndexInterface $index */
+    $index = $this->getIndex();
     // Get the Search API Server.
-    $server = $this->index->getServerInstance();
+    $server = $index->getServerInstance();
     // Get the Search API Backend.
     $backend = $server->getBackend();
 
-    $fields = $this->index->getFields();
+    $fields = $index->getFields();
     foreach ($fields as $field) {
       if ($field->getFieldIdentifier() == $field_id) {
         return $this->getQueryTypesForDataType($backend, $field->getType());
@@ -162,20 +267,42 @@ abstract class SearchApiBaseFacetSource extends FacetSourcePluginBase {
     // Find out if the backend implemented the Interface to retrieve specific
     // query types for the supported data_types.
     if ($backend instanceof FacetsQueryTypeMappingInterface) {
-      // If the input arrays have the same string keys, then the later value
-      // for that key will overwrite the previous one. If, however, the arrays
-      // contain numeric keys, the later value will not overwrite the original
-      // value, but will be appended.
-      $query_types = array_merge($query_types, $backend->getQueryTypesForDataType($data_type_plugin_id));
+      $mapping = [
+        $data_type_plugin_id => &$query_types,
+      ];
+      $backend->alterFacetQueryTypeMapping($mapping);
     }
     // Add it to a variable so we can pass it by reference. Alter hook complains
     // due to the property of the backend object is not passable by reference.
     $backend_plugin_id = $backend->getPluginId();
 
     // Let modules alter this mapping.
-    \Drupal::moduleHandler()->alter('facets_search_api_query_type_mapping', $backend_plugin_id, $query_types);
+    \Drupal::moduleHandler()
+      ->alter('facets_search_api_query_type_mapping', $backend_plugin_id, $query_types);
 
     return $query_types;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function calculateDependencies() {
+    $display = $this->getDisplay();
+    if ($display instanceof DependentPluginInterface) {
+      return $display->calculateDependencies();
+    }
+    return [];
+  }
+
+  /**
+   * Retrieves the Search API display plugin associated with this facet source.
+   *
+   * @return \Drupal\search_api\Display\DisplayInterface
+   *   The Search API display plugin associated with this facet source.
+   */
+  protected function getDisplay() {
+    return $this->displayPluginManager
+      ->createInstance($this->pluginDefinition['display_id']);
+  }
+
 }
diff --git a/src/Plugin/facets/facet_source/SearchApiDisplayDeriver.php b/src/Plugin/facets/facet_source/SearchApiDisplayDeriver.php
new file mode 100644
index 0000000..0c4cdb9
--- /dev/null
+++ b/src/Plugin/facets/facet_source/SearchApiDisplayDeriver.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace Drupal\facets\Plugin\facets\facet_source;
+
+use Drupal\Component\Plugin\PluginBase;
+use Drupal\facets\FacetSource\FacetSourceDeriverBase;
+
+/**
+ * Derives a facet source plugin definition for every Search API display plugin.
+ *
+ * This facet source supports all search api display sources.
+ *
+ * @see \Drupal\facets\Plugin\facets\facet_source\SearchApi
+ */
+class SearchApiDisplayDeriver extends FacetSourceDeriverBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDerivativeDefinitions($base_plugin_definition) {
+    $base_plugin_id = $base_plugin_definition['id'];
+    $plugin_derivatives = array();
+
+    $display_plugin_manager = $this->getSearchApiDisplayPluginManager();
+    foreach ($display_plugin_manager->getInstances() as $display_id => $display) {
+      $machine_name = $display->getDerivativeId();
+
+      $supports_facets = $display->getIndex()
+        ->getServerInstance()
+        ->supportsFeature('search_api_facets');
+
+      // If facets are not supported by the server, don't actually add this to
+      // the list of plugins.
+      if (!$supports_facets) {
+        continue;
+      }
+
+      $plugin_derivatives[$machine_name] = [
+        'id' => $base_plugin_id . PluginBase::DERIVATIVE_SEPARATOR . $machine_name,
+        'display_id' => $display_id,
+        'label' => $display->label(),
+        'description' => $display->getDescription(),
+      ] + $base_plugin_definition;
+    }
+
+    uasort($plugin_derivatives, array($this, 'compareDerivatives'));
+
+    $this->derivatives[$base_plugin_id] = $plugin_derivatives;
+    return $this->derivatives[$base_plugin_id];
+  }
+
+}
diff --git a/src/Plugin/facets/facet_source/SearchApiViews.php b/src/Plugin/facets/facet_source/SearchApiViews.php
deleted file mode 100644
index 6cc7367..0000000
--- a/src/Plugin/facets/facet_source/SearchApiViews.php
+++ /dev/null
@@ -1,184 +0,0 @@
-<?php
-
-namespace Drupal\facets\Plugin\facets\facet_source;
-
-use Drupal\facets\FacetSource\SearchApiFacetSourceInterface;
-use Drupal\search_api\Plugin\views\query\SearchApiQuery;
-use Drupal\search_api\Query\ResultSetInterface;
-use Drupal\views\Entity\View;
-use Drupal\views\Views;
-
-/**
- * A facet source to support search api views trough display plugins.
- *
- * @FacetsFacetSource(
- *   id = "views_page",
- *   deriver = "Drupal\facets\Plugin\facets\facet_source\SearchApiViewsDeriver"
- * )
- */
-class SearchApiViews extends SearchApiBaseFacetSource implements SearchApiFacetSourceInterface {
-
-  /**
-   * The entity manager.
-   *
-   * @var \Drupal\Core\Entity\EntityTypeManager|null
-   */
-  protected $entityTypeManager;
-
-  /**
-   * The typed data manager.
-   *
-   * @var \Drupal\Core\TypedData\TypedDataManager|null
-   */
-  protected $typedDataManager;
-
-  /**
-   * The config factory.
-   *
-   * @var \Drupal\Core\Config\ConfigFactoryInterface|null
-   */
-  protected $configFactory;
-
-  /**
-   * The search index the query should is executed on.
-   *
-   * @var \Drupal\search_api\IndexInterface
-   */
-  protected $index;
-
-  /**
-   * {@inheritdoc}
-   */
-  public function __construct(array $configuration, $plugin_id, array $plugin_definition, $query_type_plugin_manager, $search_results_cache) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition, $query_type_plugin_manager, $search_results_cache);
-
-    // Load facet plugin definition and depending on those settings; load the
-    // corresponding view with the correct view with the correct display set.
-    // Get that display's query so we can check if this is a Search API based
-    // view.
-    $view = Views::getView($plugin_definition['view_id']);
-    if (!empty($view)) {
-      $view->setDisplay($plugin_definition['view_display']);
-      $query = $view->getQuery();
-
-      // Only add the index if the $query is a Search API Query.
-      if ($query instanceof SearchApiQuery) {
-        // Set the Search API Index.
-        $this->index = $query->getIndex();
-      }
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getPath() {
-    $display = View::load($this->pluginDefinition['view_id'])->getDisplay($this->pluginDefinition['view_display']);
-    switch ($display['display_plugin']) {
-      case 'page':
-        $view = Views::getView($this->pluginDefinition['view_id']);
-        $view->setDisplay($this->pluginDefinition['view_display']);
-        return '/' . $view->getDisplay()->getPath();
-
-      case 'block':
-      default:
-        $current_path = \Drupal::service('path.current')->getPath();
-        if (\Drupal::moduleHandler()->moduleExists('path')) {
-          return \Drupal::service('path.alias_manager')->getAliasByPath($current_path);
-        }
-        else {
-          return $current_path;
-        }
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function fillFacetsWithResults($facets) {
-    // Check if there are results in the static cache.
-    $results = $this->searchApiQueryHelper->getResults($this->pluginId);
-
-    // If our results are not there, execute the view to get the results.
-    if ($results === NULL) {
-      // If there are no results, execute the view. and check for results again!
-      $view = Views::getView($this->pluginDefinition['view_id']);
-      $view->setDisplay($this->pluginDefinition['view_display']);
-      $view->execute();
-      $results = $this->searchApiQueryHelper->getResults($this->pluginId);
-    }
-
-    // Get the results from the cache. It is possible it still errored out.
-    if ($results instanceof ResultSetInterface) {
-      // Get our facet data.
-      $facet_results = $results->getExtraData('search_api_facets');
-      if ($facet_results === []) {
-        return;
-      }
-
-      // Loop over each facet and execute the build method from the given
-      // query type.
-      foreach ($facets as $facet) {
-        $configuration = array(
-          'query' => NULL,
-          'facet' => $facet,
-          'results' => isset($facet_results[$facet->getFieldIdentifier()]) ? $facet_results[$facet->getFieldIdentifier()] : [],
-        );
-
-        // Get the Facet Specific Query Type so we can process the results
-        // using the build() function of the query type.
-        $query_type = $this->queryTypePluginManager->createInstance($facet->getQueryType(), $configuration);
-        $query_type->build();
-      }
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function isRenderedInCurrentRequest() {
-    $display = View::load($this->pluginDefinition['view_id'])->getDisplay($this->pluginDefinition['view_display']);
-    switch ($display['display_plugin']) {
-      case 'rest_export':
-      case 'page':
-        $request = \Drupal::requestStack()->getMasterRequest();
-        if ($request->attributes->get('_controller') === 'Drupal\views\Routing\ViewPageController::handle') {
-          list(, $view) = explode(':', $this->getPluginId());
-          list($search_api_view_id, $search_api_view_display) = explode('__', $view);
-
-          if ($request->attributes->get('view_id') == $search_api_view_id && $request->attributes->get('display_id') == $search_api_view_display) {
-            return TRUE;
-          }
-        }
-        return FALSE;
-
-      case 'block':
-        // There is no way to know if a block is embedded on a page, because
-        // blocks can be rendered in isolation (see big_pipe, esi, ...). To be
-        // sure we're not disclosing information we're not sure about, we always
-        // return false.
-        return FALSE;
-    }
-    return FALSE;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getIndex() {
-    return $this->index;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function calculateDependencies() {
-    $plugin_id_array = explode(':', $this->pluginId);
-    list($view_id, ) = explode('__', $plugin_id_array[1]);
-    return [
-      'config' => ['views.view.' . $view_id],
-      'module' => ['views'],
-    ];
-  }
-
-}
diff --git a/src/Plugin/facets/facet_source/SearchApiViewsDeriver.php b/src/Plugin/facets/facet_source/SearchApiViewsDeriver.php
deleted file mode 100644
index b6b6632..0000000
--- a/src/Plugin/facets/facet_source/SearchApiViewsDeriver.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-namespace Drupal\facets\Plugin\facets\facet_source;
-
-use Drupal\facets\FacetSource\FacetSourceDeriverBase;
-
-/**
- * Derives a facet source plugin definition for every Search API display plugin.
- *
- * This facet source supports all search api display sources.
- *
- * @see \Drupal\facets\Plugin\facets\facet_source\SearchApi
- */
-class SearchApiViewsDeriver extends FacetSourceDeriverBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getDerivativeDefinitions($base_plugin_definition) {
-    $base_plugin_id = $base_plugin_definition['id'];
-
-    $search_api_displays = $this->getSearchApiDisplayPluginManager();
-
-    $plugin_derivatives = array();
-    foreach ($search_api_displays->getDefinitions() as $display) {
-      // Avoid providing corrupted displays.
-      if (isset($display['view_id']) && isset($display['view_display']) && isset($display['label'])) {
-        $machine_name = $display['view_id'] . '__' . $display['view_display'];
-
-        $plugin_derivatives[$machine_name] = [
-          'id' => $base_plugin_id . ':' . $machine_name,
-          'label' => $display['label'],
-          'description' => $this->t('Provides a facet source.'),
-          'view_id' => $display['view_id'],
-          'view_display' => $display['view_display'],
-        ] + $base_plugin_definition;
-
-        $arguments = [
-          '%view' => $display['label'],
-          '%display' => $display['view_display'],
-        ];
-        $sources[] = $this->t('Search API view: %view, display: %display', $arguments);
-      }
-    }
-
-    uasort($plugin_derivatives, array($this, 'compareDerivatives'));
-
-    $this->derivatives[$base_plugin_id] = $plugin_derivatives;
-    return $this->derivatives[$base_plugin_id];
-  }
-
-}
diff --git a/src/Plugin/facets/url_processor/QueryString.php b/src/Plugin/facets/url_processor/QueryString.php
index bfd828a..ab3fe67 100644
--- a/src/Plugin/facets/url_processor/QueryString.php
+++ b/src/Plugin/facets/url_processor/QueryString.php
@@ -68,11 +68,12 @@ class QueryString extends UrlProcessorPluginBase {
     // Set the url alias from the the facet object.
     $this->urlAlias = $facet->getUrlAlias();
 
-    $request = $this->request;
     if ($facet->getFacetSource()->getPath()) {
-      $request = Request::create($facet->getFacetSource()->getPath());
+      $url = Url::fromUserInput($facet->getFacetSource()->getPath());
+    }
+    else {
+      $url = Url::createFromRequest($this->request);
     }
-    $url = Url::createFromRequest($request);
     $url->setOption('attributes', ['rel' => 'nofollow']);
 
     /** @var \Drupal\facets\Result\ResultInterface[] $results */
diff --git a/src/Tests/BlockTestTrait.php b/src/Tests/BlockTestTrait.php
index 1dd33ae..af5b220 100644
--- a/src/Tests/BlockTestTrait.php
+++ b/src/Tests/BlockTestTrait.php
@@ -33,12 +33,12 @@ trait BlockTestTrait {
 
     $this->drupalGet($facet_add_page);
 
-    $facet_source = "views_page:{$source}__{$display_id}";
+    $facet_source = "search_api:{$source}__{$display_id}";
     $form_values = [
       'id' => $id,
       'name' => $name,
       'facet_source_id' => $facet_source,
-      "facet_source_configs[views_page:{$source}__{$display_id}][field_identifier]" => $field,
+      "facet_source_configs[search_api:{$source}__{$display_id}][field_identifier]" => $field,
     ];
     $this->drupalPostForm(NULL, ['facet_source_id' => $facet_source], $this->t('Configure facet source'));
     $this->drupalPostForm(NULL, $form_values, $this->t('Save'));
diff --git a/src/Tests/FacetSourceTest.php b/src/Tests/FacetSourceTest.php
index 8591d34..91d058f 100644
--- a/src/Tests/FacetSourceTest.php
+++ b/src/Tests/FacetSourceTest.php
@@ -49,7 +49,7 @@ class FacetSourceTest extends WebTestBase {
     $this->assertResponse(200);
 
     $this->assertUrl('admin/config/search/facets');
-    $this->assertText('Facet source views_page:search_api_test_view__block_1 has been saved.');
+    $this->assertText('Facet source search_api:search_api_test_view__block_1 has been saved.');
     $this->clickLink($this->t('Configure'));
 
     // Test that saving worked filter_key has the new value.
@@ -72,7 +72,7 @@ class FacetSourceTest extends WebTestBase {
     $this->assertResponse(200);
 
     $this->assertUrl('admin/config/search/facets');
-    $this->assertText('Facet source views_page:search_api_test_view__block_1 has been saved.');
+    $this->assertText('Facet source search_api:search_api_test_view__block_1 has been saved.');
     $this->clickLink($this->t('Configure'));
 
     // Test that saving worked and that the url processor has the new value.
diff --git a/src/Tests/IntegrationTest.php b/src/Tests/IntegrationTest.php
index 43db423..b79cc1d 100644
--- a/src/Tests/IntegrationTest.php
+++ b/src/Tests/IntegrationTest.php
@@ -348,13 +348,13 @@ class IntegrationTest extends WebTestBase {
 
     // Configure the facet source by selecting one of the Search API views.
     $this->drupalGet($facet_add_page);
-    $this->drupalPostForm(NULL, ['facet_source_id' => 'views_page:search_api_test_view__page_1'], $this->t('Configure facet source'));
+    $this->drupalPostForm(NULL, ['facet_source_id' => 'search_api:search_api_test_view__page_1'], $this->t('Configure facet source'));
 
     // Fill in all fields and make sure the 'field is required' message is no
     // longer shown.
     $facet_source_form = [
-      'facet_source_id' => 'views_page:search_api_test_view__page_1',
-      'facet_source_configs[views_page:search_api_test_view__page_1][field_identifier]' => 'type',
+      'facet_source_id' => 'search_api:search_api_test_view__page_1',
+      'facet_source_configs[search_api:search_api_test_view__page_1][field_identifier]' => 'type',
     ];
     $this->drupalPostForm(NULL, $facet_source_form, $this->t('Save'));
 
@@ -542,8 +542,8 @@ class IntegrationTest extends WebTestBase {
     $this->assertResponse(200);
 
     // Check that the expected facet sources and the owl facet are shown.
-    $this->assertText('views_page:search_api_test_view__block_1');
-    $this->assertText('views_page:search_api_test_view__page_1');
+    $this->assertText('search_api:search_api_test_view__block_1');
+    $this->assertText('search_api:search_api_test_view__page_1');
     $this->assertText($name);
 
     // Delete the view on which both facet sources are based.
@@ -554,8 +554,8 @@ class IntegrationTest extends WebTestBase {
     // and the facet/facet source are deleted.
     $this->drupalGet('/admin/config/search/facets');
     $this->assertResponse(200);
-    $this->assertNoText('views_page:search_api_test_view__page_1');
-    $this->assertNoText('views_page:search_api_test_view__block_1');
+    $this->assertNoText('search_api:search_api_test_view__page_1');
+    $this->assertNoText('search_api:search_api_test_view__block_1');
     $this->assertNoText($name);
   }
 
@@ -582,8 +582,8 @@ class IntegrationTest extends WebTestBase {
     $this->assertResponse(200);
 
     // Check that the expected facet sources and the owl facet are shown.
-    $this->assertText('views_page:search_api_test_view__block_1');
-    $this->assertText('views_page:search_api_test_view__page_1');
+    $this->assertText('search_api:search_api_test_view__block_1');
+    $this->assertText('search_api:search_api_test_view__page_1');
     $this->assertText($name);
 
     // Delete the view display for the page.
@@ -595,8 +595,8 @@ class IntegrationTest extends WebTestBase {
     // and the facet/facet source are deleted.
     $this->drupalGet('/admin/config/search/facets');
     $this->assertResponse(200);
-    $this->assertNoText('views_page:search_api_test_view__page_1');
-    $this->assertText('views_page:search_api_test_view__block_1');
+    $this->assertNoText('search_api:search_api_test_view__page_1');
+    $this->assertText('search_api:search_api_test_view__block_1');
     $this->assertNoText($name);
   }
 
@@ -658,8 +658,8 @@ class IntegrationTest extends WebTestBase {
     $this->assertNoText('Field:');
 
     // Check that the expected facet sources are shown.
-    $this->assertText('views_page:search_api_test_view__block_1');
-    $this->assertText('views_page:search_api_test_view__page_1');
+    $this->assertText('search_api:search_api_test_view__block_1');
+    $this->assertText('search_api:search_api_test_view__page_1');
   }
 
   /**
@@ -694,7 +694,7 @@ class IntegrationTest extends WebTestBase {
 
     // Configure the facet source by selecting one of the Search API views.
     $this->drupalGet($facet_add_page);
-    $this->drupalPostForm(NULL, ['facet_source_id' => 'views_page:search_api_test_view__page_1'], $this->t('Configure facet source'));
+    $this->drupalPostForm(NULL, ['facet_source_id' => 'search_api:search_api_test_view__page_1'], $this->t('Configure facet source'));
 
     // The field is still required.
     $this->drupalPostForm(NULL, $form_values, $this->t('Save'));
@@ -703,8 +703,8 @@ class IntegrationTest extends WebTestBase {
     // Fill in all fields and make sure the 'field is required' message is no
     // longer shown.
     $facet_source_form = [
-      'facet_source_id' => 'views_page:search_api_test_view__page_1',
-      'facet_source_configs[views_page:search_api_test_view__page_1][field_identifier]' => $facet_type,
+      'facet_source_id' => 'search_api:search_api_test_view__page_1',
+      'facet_source_configs[search_api:search_api_test_view__page_1][field_identifier]' => $facet_type,
     ];
     $this->drupalPostForm(NULL, $form_values + $facet_source_form, $this->t('Save'));
     $this->assertNoText('field is required.');
@@ -731,10 +731,10 @@ class IntegrationTest extends WebTestBase {
     $form_values = [
       'name' => $facet_name,
       'id' => $facet_id,
-      'facet_source_id' => 'views_page:search_api_test_view__page_1',
+      'facet_source_id' => 'search_api:search_api_test_view__page_1',
     ];
 
-    $facet_source_configs['facet_source_configs[views_page:search_api_test_view__page_1][field_identifier]'] = $facet_type;
+    $facet_source_configs['facet_source_configs[search_api:search_api_test_view__page_1][field_identifier]'] = $facet_type;
 
     // Try to submit a facet with a duplicate machine name after form rebuilding
     // via facet source submit.
diff --git a/tests/src/FunctionalJavascript/WidgetJSTest.php b/tests/src/FunctionalJavascript/WidgetJSTest.php
index e085958..b63abed 100644
--- a/tests/src/FunctionalJavascript/WidgetJSTest.php
+++ b/tests/src/FunctionalJavascript/WidgetJSTest.php
@@ -52,10 +52,10 @@ class WidgetJSTest extends JavascriptTestBase {
 
     // Select one of the options from the facet source dropdown and wait for the
     // result to show.
-    $page->selectFieldOption('edit-facet-source-id', 'views_page:search_api_test_view__page_1');
+    $page->selectFieldOption('edit-facet-source-id', 'search_api:search_api_test_view__page_1');
     $this->getSession()->wait(6000, "jQuery('.facet-source-field-wrapper').length > 0");
 
-    $page->selectFieldOption('facet_source_configs[views_page:search_api_test_view__page_1][field_identifier]', 'type');
+    $page->selectFieldOption('facet_source_configs[search_api:search_api_test_view__page_1][field_identifier]', 'type');
 
     // Check that after choosing the field, the name is already filled in.
     $field_value = $this->getSession()->getPage()->findField('edit-name')->getValue();
@@ -74,7 +74,7 @@ class WidgetJSTest extends JavascriptTestBase {
       'id' => $id,
       'name' => strtoupper($id),
       'url_alias' => $id,
-      'facet_source_id' => 'views_page:search_api_test_view__page_1',
+      'facet_source_id' => 'search_api:search_api_test_view__page_1',
       'field_identifier' => 'type',
       'empty_behavior' => ['behavior' => 'none'],
       'widget' => [
