diff --git a/panels.services.yml b/panels.services.yml
new file mode 100644
index 0000000..6b5d35c
--- /dev/null
+++ b/panels.services.yml
@@ -0,0 +1,4 @@
+services:
+  plugin.manager.panels.display_renderer:
+    class: Drupal\panels\Plugin\DisplayRenderer\DisplayRendererManager
+    arguments: ['@container.namespaces', '@cache.discovery', '@module_handler']
diff --git a/src/Annotation/DisplayRenderer.php b/src/Annotation/DisplayRenderer.php
new file mode 100644
index 0000000..12101f6
--- /dev/null
+++ b/src/Annotation/DisplayRenderer.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\panels\Annotation\DisplayRenderer.php.
+ */
+
+namespace Drupal\panels\Annotation;
+
+use Drupal\Component\Annotation\Plugin;
+
+/**
+ * Defines a Renderer annotation object.
+ *
+ * @Annotation
+ */
+class DisplayRenderer extends Plugin {
+
+  /**
+   * The human readable title.
+   *
+   * @var string
+   */
+  public $title = '';
+
+  /**
+   * The human readable description.
+   *
+   * @var string
+   */
+  public $description = '';
+
+}
diff --git a/src/Plugin/DisplayRenderer/DisplayRendererBase.php b/src/Plugin/DisplayRenderer/DisplayRendererBase.php
new file mode 100644
index 0000000..ab229da
--- /dev/null
+++ b/src/Plugin/DisplayRenderer/DisplayRendererBase.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\panels\Plugin\DisplayRenderer\DisplayRendererBase.
+ */
+
+namespace Drupal\panels\Plugin\DisplayRenderer;
+
+use Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant;
+
+/**
+ * Provides base class for Display Renderer plugins.
+ */
+abstract class DisplayRendererBase implements DisplayRendererInterface {
+
+  /**
+   * Render the Panels display.
+   *
+   * This is the outermost method in the Panels render pipeline. It calls the
+   * inner methods, which return a content array, which is in turn passed to the
+   * theme function specified in the layout plugin.
+   *
+   * @return string
+   *   Themed & rendered HTML output.
+   */
+  public function build(array $regions) {
+    return $regions;
+  }
+
+}
diff --git a/src/Plugin/DisplayRenderer/DisplayRendererInterface.php b/src/Plugin/DisplayRenderer/DisplayRendererInterface.php
new file mode 100644
index 0000000..708461d
--- /dev/null
+++ b/src/Plugin/DisplayRenderer/DisplayRendererInterface.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\panels\Plugin\Renderer\RendererInterface.
+ */
+
+namespace Drupal\panels\Plugin\DisplayRenderer;
+
+use Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant;
+
+/**
+ * Interface DisplayRendererInterface.
+ */
+interface DisplayRendererInterface {
+
+  /**
+   * Render the Panels display.
+   *
+   * This is the outermost method in the Panels render pipeline. It calls the
+   * inner methods, which return a content array, which is in turn passed to the
+   * theme function specified in the layout plugin.
+   *
+   * @param array $regions
+   *   The render array representing regions.
+   *
+   * @return array
+   *   Render array modified by the Display renderer.
+   */
+  public function build(array $regions);
+}
diff --git a/src/Plugin/DisplayRenderer/DisplayRendererManager.php b/src/Plugin/DisplayRenderer/DisplayRendererManager.php
new file mode 100644
index 0000000..1a7f25e
--- /dev/null
+++ b/src/Plugin/DisplayRenderer/DisplayRendererManager.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\panels\Plugin\DisplayRenderer\DisplayRendererManager.
+ */
+
+namespace Drupal\panels\Plugin\DisplayRenderer;
+
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Plugin\DefaultPluginManager;
+
+/**
+ * Class DisplayRendererManager.
+ */
+class DisplayRendererManager extends DefaultPluginManager implements DisplayRendererManagerInterface {
+
+  /**
+   * Constructs a DisplayRendererManager 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 to invoke the alter hook with.
+   */
+  public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) {
+    $plugin_interface = 'Drupal\panels\Plugin\DisplayRenderer\DisplayRendererInterface';
+    $plugin_definition_annotation_name = 'Drupal\panels\Annotation\DisplayRenderer';
+    parent::__construct('Plugin/DisplayRenderer', $namespaces, $module_handler, $plugin_interface, $plugin_definition_annotation_name);
+
+    $this->setCacheBackend($cache_backend, 'display_renderer');
+    $this->alterInfo('display_renderer');
+  }
+
+}
diff --git a/src/Plugin/DisplayRenderer/DisplayRendererManagerInterface.php b/src/Plugin/DisplayRenderer/DisplayRendererManagerInterface.php
new file mode 100644
index 0000000..f65bbcd
--- /dev/null
+++ b/src/Plugin/DisplayRenderer/DisplayRendererManagerInterface.php
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\panels\Plugin\DisplayRenderer\DisplayRendererManagerInterface.
+ */
+
+namespace Drupal\panels\Plugin\DisplayRenderer;
+
+use Drupal\Component\Plugin\PluginManagerInterface;
+
+/**
+ * Interface DisplayRendererManagerInterface.
+ */
+interface DisplayRendererManagerInterface extends PluginManagerInterface {
+
+}
diff --git a/src/Plugin/DisplayRenderer/Editor.php b/src/Plugin/DisplayRenderer/Editor.php
new file mode 100644
index 0000000..5931455
--- /dev/null
+++ b/src/Plugin/DisplayRenderer/Editor.php
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\panels\Plugin\DisplayRenderer\Editor.
+ */
+
+namespace Drupal\panels\Plugin\DisplayRenderer;
+
+/**
+ * The editor render pipeline for a Panels display object.
+ *
+ * @DisplayRenderer(
+ *   id = "editor",
+ *   title = @Translation("Editor")
+ * )
+ */
+class Editor extends DisplayRendererBase {
+
+}
diff --git a/src/Plugin/DisplayRenderer/Simple.php b/src/Plugin/DisplayRenderer/Simple.php
new file mode 100644
index 0000000..2dcc88b
--- /dev/null
+++ b/src/Plugin/DisplayRenderer/Simple.php
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\panels\Plugin\DisplayRenderer\Simple.
+ */
+
+namespace Drupal\panels\Plugin\DisplayRenderer;
+
+/**
+ * The standard render pipeline for a Panels display object.
+ *
+ * @DisplayRenderer(
+ *   id = "simple",
+ *   title = @Translation("Simple")
+ * )
+ */
+class Simple extends DisplayRendererBase {
+  // @todo: Should "standard" be the base, like in D7 - or simple?
+}
diff --git a/src/Plugin/DisplayRenderer/Standard.php b/src/Plugin/DisplayRenderer/Standard.php
new file mode 100644
index 0000000..b375323
--- /dev/null
+++ b/src/Plugin/DisplayRenderer/Standard.php
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\panels\Plugin\DisplayRenderer\Standard.
+ */
+
+namespace Drupal\panels\Plugin\DisplayRenderer;
+
+/**
+ * The standard render pipeline for a Panels display object.
+ *
+ * @DisplayRenderer(
+ *   id = "standard",
+ *   title = @Translation("Standard")
+ * )
+ */
+class Standard extends DisplayRendererBase {
+  // @todo: Should "standard" be the base, like in D7 - or simple?
+}
diff --git a/src/Plugin/DisplayVariant/PanelsDisplayVariant.php b/src/Plugin/DisplayVariant/PanelsDisplayVariant.php
index e8a9e6f..27addea 100644
--- a/src/Plugin/DisplayVariant/PanelsDisplayVariant.php
+++ b/src/Plugin/DisplayVariant/PanelsDisplayVariant.php
@@ -47,6 +47,13 @@ class PanelsDisplayVariant extends VariantBase implements ContextAwareVariantInt
   use ConditionVariantTrait;
 
   /**
+   * The Display Renderer handler.
+   *
+   * @var \Drupal\panels\Plugin\DisplayRenderer\DisplayRendererInterface
+   */
+  protected $renderer;
+
+  /**
    * The layout handler.
    *
    * @var \Drupal\layout_plugin\Plugin\Layout\LayoutInterface
@@ -131,6 +138,20 @@ class PanelsDisplayVariant extends VariantBase implements ContextAwareVariantInt
   }
 
   /**
+   * Returns the renderer assigned to this display variant.
+   *
+   * @ return \Drupal\panels\Plugin\DisplayRenderer\DisplayRendererInterface
+   *   Display renderer instance
+   */
+  public function getRenderer() {
+    if (!isset($this->renderer)) {
+      $manager = \Drupal::service('plugin.manager.panels.display_renderer');
+      $this->renderer = $manager->createInstance($this->configuration['renderer'], []);
+    }
+    return $this->renderer;
+  }
+
+  /**
    * Returns instance of the layout plugin used by this page variant.
    *
    * @return \Drupal\layout_plugin\Plugin\Layout\LayoutInterface
@@ -203,8 +224,9 @@ class PanelsDisplayVariant extends VariantBase implements ContextAwareVariantInt
    */
   public function build() {
     $regions = $this->buildRegions();
+    $regions = $this->getRenderer()->build($regions);
     if ($layout = $this->getLayout()) {
-      return $layout->build($regions);
+      $regions = $layout->build($regions);
     }
     return $regions;
   }
@@ -226,6 +248,20 @@ class PanelsDisplayVariant extends VariantBase implements ContextAwareVariantInt
 
     // Do not allow blocks to be added until the display variant has been saved.
     if (!$this->id()) {
+
+      $manager = \Drupal::service('plugin.manager.panels.display_renderer');
+      $plugins = $manager->getDefinitions();
+      $options = array();
+      foreach ($plugins as $id => $plugin) {
+        $options[$id] = $plugin['title'];
+      }
+      $form['renderer'] = [
+        '#title' => $this->t('Renderer'),
+        '#type' => 'select',
+        '#options' => $options,
+        '#default_value' => 'standard',
+      ];
+
       $form['layout'] = [
         '#title' => $this->t('Layout'),
         '#type' => 'select',
@@ -407,6 +443,10 @@ class PanelsDisplayVariant extends VariantBase implements ContextAwareVariantInt
       $this->configuration['layout'] = $form_state->getValue('layout');
     }
 
+    if ($form_state->hasValue('renderer')) {
+      $this->configuration['renderer'] = $form_state->getValue('renderer');
+    }
+
     if ($form_state->hasValue('page_title')) {
       $this->configuration['page_title'] = $form_state->getValue('page_title');
     }
@@ -558,5 +598,4 @@ class PanelsDisplayVariant extends VariantBase implements ContextAwareVariantInt
   protected function uuidGenerator() {
     return $this->uuidGenerator;
   }
-
 }
