diff --git a/search_api.plugin_type.yml b/search_api.plugin_type.yml
index c1b49c7..e2607e9 100644
--- a/search_api.plugin_type.yml
+++ b/search_api.plugin_type.yml
@@ -17,3 +17,8 @@ search_api_tracker:
   label: Search API tracker
   plugin_manager_service_id: plugin.manager.search_api.tracker
   plugin_definition_decorator_class: \Drupal\plugin\PluginDefinition\ArrayPluginDefinitionDecorator
+
+search_api_display:
+  label: Search API display
+  plugin_manager_service_id: plugin.manager.search_api.display
+  plugin_definition_decorator_class: \Drupal\plugin\PluginDefinition\ArrayPluginDefinitionDecorator
diff --git a/search_api.services.yml b/search_api.services.yml
index 6c1207a..9a42b1c 100644
--- a/search_api.services.yml
+++ b/search_api.services.yml
@@ -26,6 +26,10 @@ services:
     class: Drupal\search_api\Tracker\TrackerPluginManager
     parent: default_plugin_manager
 
+  plugin.manager.search_api.display:
+    class: Drupal\search_api\Display\DisplayPluginManager
+    parent: default_plugin_manager
+
   search_api.index_task_manager:
     class: Drupal\search_api\Task\IndexTaskManager
     arguments: ['@state', '@entity_type.manager']
diff --git a/src/Annotation/SearchApiDisplay.php b/src/Annotation/SearchApiDisplay.php
new file mode 100644
index 0000000..af4fc24
--- /dev/null
+++ b/src/Annotation/SearchApiDisplay.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\search_api\Annotation\SearchApiDisplay.
+ */
+
+namespace Drupal\search_api\Annotation;
+
+use Drupal\Component\Annotation\Plugin;
+
+/**
+ * Defines a Search API display annotation object.
+ *
+ * @see \Drupal\search_api\Display\DisplayPluginManager
+ * @see \Drupal\search_api\Display\DisplayInterface
+ * @see \Drupal\search_api\Display\DisplayPluginBase
+ * @see plugin_api
+ *
+ * @Annotation
+ */
+class SearchApiDisplay extends Plugin {
+
+  /**
+   * The display plugin ID.
+   *
+   * @var string
+   */
+  public $id;
+
+  /**
+   * The human-readable name of the display plugin.
+   *
+   * @ingroup plugin_translatable
+   *
+   * @var \Drupal\Core\Annotation\Translation
+   */
+  public $label;
+
+  /**
+   * The description of the display.
+   *
+   * @ingroup plugin_translatable
+   *
+   * @var \Drupal\Core\Annotation\Translation
+   */
+  public $description;
+
+}
diff --git a/src/Display/DisplayDeriverBase.php b/src/Display/DisplayDeriverBase.php
new file mode 100644
index 0000000..3912bd0
--- /dev/null
+++ b/src/Display/DisplayDeriverBase.php
@@ -0,0 +1,102 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\search_api\Display\DisplayDeriverBase.
+ */
+
+namespace Drupal\search_api\Display;
+
+
+use Drupal\Core\Entity\EntityTypeManager;
+use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * A base class for display derivers.
+ */
+abstract class DisplayDeriverBase implements ContainerDeriverInterface {
+
+  use StringTranslationTrait;
+
+  /**
+   * List of derivative definitions.
+   *
+   * @var array
+   */
+  protected $derivatives = array();
+
+  /**
+   * The entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManager
+   */
+  protected $entityTypeManager;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, $base_plugin_id) {
+    $deriver = new static();
+
+    /** @var \Drupal\Core\Entity\EntityTypeManager $entity_type_manager */
+    $entity_type_manager = $container->get('entity_type.manager');
+    $deriver->setEntityTypeManager($entity_type_manager);
+
+    /** @var \Drupal\Core\StringTranslation\TranslationInterface $translation */
+    $translation = $container->get('string_translation');
+    $deriver->setStringTranslation($translation);
+
+    return $deriver;
+  }
+
+  /**
+   * Retrieves the entity manager.
+   *
+   * @return \Drupal\Core\Entity\EntityTypeManager
+   *   The entity manager.
+   */
+  public function getEntityTypeManager() {
+    return $this->entityTypeManager ?: \Drupal::service('entity_type.manager');
+  }
+
+  /**
+   * Sets the entity manager.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeManager $entity_type_manager
+   *   The entity manager.
+   *
+   * @return $this
+   */
+  public function setEntityTypeManager(EntityTypeManager $entity_type_manager) {
+    $this->entityTypeManager = $entity_type_manager;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDerivativeDefinition($derivative_id, $base_plugin_definition) {
+    $derivatives = $this->getDerivativeDefinitions($base_plugin_definition);
+    return isset($derivatives[$derivative_id]) ? $derivatives[$derivative_id] : NULL;
+  }
+
+  /**
+   * Compares two plugin definitions according to their labels.
+   *
+   * @param array $a
+   *   A plugin definition, with at least a "label" key.
+   * @param array $b
+   *   Another plugin definition.
+   *
+   * @return int
+   *   An integer less than, equal to, or greater than zero if the first
+   *   argument is considered to be respectively less than, equal to, or greater
+   *   than the second.
+   */
+  public function compareDerivatives(array $a, array $b) {
+    return strnatcasecmp($a['label'], $b['label']);
+  }
+
+}
diff --git a/src/Display/DisplayInterface.php b/src/Display/DisplayInterface.php
new file mode 100644
index 0000000..f94cfcc
--- /dev/null
+++ b/src/Display/DisplayInterface.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\search_api\Display\DisplayInterface.
+ */
+
+namespace Drupal\search_api\Display;
+
+use Drupal\Component\Plugin\DerivativeInspectionInterface;
+use Drupal\Component\Plugin\PluginInspectionInterface;
+
+/**
+ * Defines an interface for display plugins.
+ *
+ * @see \Drupal\search_api\Annotation\SearchApiDisplay
+ * @see \Drupal\search_api\Display\DisplayPluginManager
+ * @see \Drupal\search_api\Display\DisplayPluginBase
+ * @see plugin_api
+ */
+interface DisplayInterface extends PluginInspectionInterface, DerivativeInspectionInterface {
+
+  /**
+   * Returns the label for use on the administration pages.
+   *
+   * @return string
+   *   The administration label.
+   */
+  public function label();
+
+  /**
+   * Retrieves the index used by this display.
+   *
+   * @return \Drupal\search_api\IndexInterface
+   *   The search index used by this display.
+   */
+  public function getIndex();
+
+  /**
+   * Returns the path used for this Display.
+   *
+   * @return string
+   *   The path of the display.
+   */
+  public function getPath();
+
+  /**
+   * Returns true if the display is being rendered in the current request.
+   *
+   * @return bool
+   *   True when the display is rendered in the current request.
+   */
+  public function isRenderedInCurrentRequest();
+
+}
diff --git a/src/Display/DisplayPluginBase.php b/src/Display/DisplayPluginBase.php
new file mode 100644
index 0000000..01984df
--- /dev/null
+++ b/src/Display/DisplayPluginBase.php
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\search_api\Dispay\DisplayPluginBase.
+ */
+
+namespace Drupal\search_api\Display;
+
+use Drupal\search_api\Plugin\IndexPluginBase;
+
+/**
+ * Defines a base class from which other display classes may extend.
+ *
+ * Plugins extending this class need to define a plugin definition array through
+ * annotation. The definition includes the following keys:
+ * - id: The unique, system-wide identifier of the display class.
+ * - label: The human-readable name of the display class, translated.
+ * - description: The human-readable description of the display class, translated.
+ *
+ * A complete plugin definition should be written as in this example:
+ *
+ * @code
+ * @SearchApiDisplay(
+ *   id = "my_display",
+ *   label = @Translation("My display"),
+ *   description = @Translation("This is the description for my display")
+ * )
+ * @endcode
+ *
+ * @see \Drupal\search_api\Annotation\SearchApiDisplay
+ * @see \Drupal\search_api\Display\DisplayPluginManager
+ * @see \Drupal\search_api\Display\DisplayInterface
+ * @see plugin_api
+ */
+abstract class DisplayPluginBase extends IndexPluginBase implements DisplayInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function label() {
+    $plugin_definition = $this->getPluginDefinition();
+    return $plugin_definition['label'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isRenderedInCurrentRequest() {
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIndex() {
+    return $this->index;
+  }
+
+}
diff --git a/src/Display/DisplayPluginManager.php b/src/Display/DisplayPluginManager.php
new file mode 100644
index 0000000..4fd8c2e
--- /dev/null
+++ b/src/Display/DisplayPluginManager.php
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\search_api\Display\DisplayPluginManager.
+ */
+
+namespace Drupal\search_api\Display;
+
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Plugin\DefaultPluginManager;
+
+/**
+ * Manages data type plugins.
+ *
+ * @see \Drupal\search_api\Annotation\SearchApiDisplay
+ * @see \Drupal\search_api\Display\DisplayInterface
+ * @see \Drupal\search_api\Display\DisplayPluginBase
+ * @see plugin_api
+ */
+class DisplayPluginManager extends DefaultPluginManager {
+
+  /**
+   * Constructs a DisplayPluginManager object.
+   *
+   * @param \Traversable $namespaces
+   *   An object that implements \Traversable which contains the root paths
+   *   keyed by the corresponding namespace to look for plugin implementations.
+   * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
+   *   Cache backend instance to use.
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler.
+   */
+  public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) {
+    parent::__construct('Plugin/search_api/display', $namespaces, $module_handler, 'Drupal\search_api\Display\DisplayInterface', 'Drupal\search_api\Annotation\SearchApiDisplay');
+    $this->setCacheBackend($cache_backend, 'search_api_displays');
+  }
+
+}
diff --git a/src/Plugin/search_api/display/ViewsPageDisplay.php b/src/Plugin/search_api/display/ViewsPageDisplay.php
new file mode 100644
index 0000000..7f58649
--- /dev/null
+++ b/src/Plugin/search_api/display/ViewsPageDisplay.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\search_api\Plugin\search_api\display\ViewsPageDisplay.
+ */
+
+namespace Drupal\search_api\Plugin\search_api\display;
+
+use Drupal\search_api\Display\DisplayPluginBase;
+
+/**
+ * Represents a display which represents the Search API views.
+ *
+ * @SearchApiDisplay(
+ *   id = "views_page",
+ *   deriver = "Drupal\search_api\Plugin\search_api\display\ViewsPageDisplayDeriver"
+ * )
+ */
+class ViewsPageDisplay extends DisplayPluginBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getPath() {
+    $view = Views::getView($this->pluginDefinition['view_id']);
+    $view->setDisplay($this->pluginDefinition['view_display']);
+    return $view->getDisplay()->getPath();
+  }
+
+}
diff --git a/src/Plugin/search_api/display/ViewsPageDisplayDeriver.php b/src/Plugin/search_api/display/ViewsPageDisplayDeriver.php
new file mode 100644
index 0000000..6d174e7
--- /dev/null
+++ b/src/Plugin/search_api/display/ViewsPageDisplayDeriver.php
@@ -0,0 +1,71 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\search_api\Plugin\search_api\display\ViewsPageDisplayDeriver.
+ */
+
+namespace Drupal\search_api\Plugin\search_api\display;
+
+use Drupal\Component\Plugin\Exception\PluginNotFoundException;
+use Drupal\Component\Plugin\PluginBase;
+use Drupal\search_api\Display\DisplayDeriverBase;
+
+/**
+ * Derives a display plugin definition for every Search API view.
+ *
+ * @see \Drupal\search_api\Plugin\search_api\display\ViewsPageDisplay
+ */
+class ViewsPageDisplayDeriver extends DisplayDeriverBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDerivativeDefinitions($base_plugin_definition) {
+    $base_plugin_id = $base_plugin_definition['id'];
+
+    try {
+      /** @var \Drupal\Core\Entity\EntityStorageInterface $views_storage */
+      $views_storage = $this->entityTypeManager->getStorage('view');
+      $all_views = $views_storage->loadMultiple();
+    }
+    catch (PluginNotFoundException $e) {
+      return [];
+    }
+
+    if (!isset($this->derivatives[$base_plugin_id])) {
+      $plugin_derivatives = array();
+
+      /** @var \Drupal\views\Entity\View $view */
+      foreach ($all_views as $view) {
+        // Hardcoded usage of Search API views, for now.
+        if (strpos($view->get('base_table'), 'search_api_index') !== FALSE) {
+          $displays = $view->get('display');
+          foreach ($displays as $name => $display_info) {
+            if ($display_info['display_plugin'] == "page") {
+              $machine_name = $view->id() . PluginBase::DERIVATIVE_SEPARATOR . $name;
+
+              $plugin_derivatives[$machine_name] = [
+                  'id' => $base_plugin_id . PluginBase::DERIVATIVE_SEPARATOR . $machine_name,
+                  'label' => $this->t('View name: %view_name. Display: %display_title', ['%view_name' => $view->label(), '%display_title' => $display_info['display_title']]),
+                  'description' => $this->t('Provides a display.'),
+                  'view_id' => $view->id(),
+                  'view_display' => $name,
+                ] + $base_plugin_definition;
+
+              $sources[] = $this->t(
+                'View name: %view. Display: %display',
+                ['%view' => $view->label(), '%display' => $display_info['display_title']]
+              );
+            }
+          }
+        }
+      }
+      uasort($plugin_derivatives, array($this, 'compareDerivatives'));
+
+      $this->derivatives[$base_plugin_id] = $plugin_derivatives;
+    }
+    return $this->derivatives[$base_plugin_id];
+  }
+
+}
