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..d8e8cff
--- /dev/null
+++ b/src/Annotation/DisplayRenderer.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\panels\Annotation\DisplayRenderer.
+ */
+
+namespace Drupal\panels\Annotation;
+
+use Drupal\Component\Annotation\Plugin;
+
+/**
+ * Defines a Renderer annotation object.
+ *
+ * @Annotation
+ */
+class DisplayRenderer extends Plugin {
+
+  /**
+   * The human readable label.
+   *
+   * @var string
+   */
+  public $label = '';
+
+  /**
+   * 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..f3477c3
--- /dev/null
+++ b/src/Plugin/DisplayRenderer/DisplayRendererBase.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\panels\Plugin\DisplayRenderer\DisplayRendererBase.
+ */
+
+namespace Drupal\panels\Plugin\DisplayRenderer;
+
+use Drupal\Core\Plugin\Context\ContextHandlerInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\layout_plugin\Plugin\Layout\LayoutInterface;
+use Drupal\panels\Plugin\DisplayVariant\PanelsDisplayVariant;
+
+/**
+ * Provides base class for Display Renderer plugins.
+ */
+abstract class DisplayRendererBase implements DisplayRendererInterface {
+
+  /*
+   * {@inheritdoc}
+   */
+  public function build(array $regions, array $context, ContextHandlerInterface $context_handler, AccountInterface $account, LayoutInterface $layout = null) {
+    return $regions;
+  }
+
+}
diff --git a/src/Plugin/DisplayRenderer/DisplayRendererInterface.php b/src/Plugin/DisplayRenderer/DisplayRendererInterface.php
new file mode 100644
index 0000000..6c8e702
--- /dev/null
+++ b/src/Plugin/DisplayRenderer/DisplayRendererInterface.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\panels\Plugin\DisplayRenderer\DisplayRendererInterface.
+ */
+
+namespace Drupal\panels\Plugin\DisplayRenderer;
+
+use Drupal\Core\Plugin\Context\ContextHandlerInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\layout_plugin\Plugin\Layout\LayoutInterface;
+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.
+   * @param array $context
+   *   The array of context objects.
+   * @param \Drupal\Component\Plugin\ContextAwarePluginInterface
+   *   The context handler.
+   * @param \Drupal\Core\Session\AccountInterface
+   *   The current user.
+   * @param \Drupal\layout_plugin\Plugin\Layout\LayoutInterface
+   *   The optional layout.
+   * @return array
+   *   Render array modified by the Display renderer.
+   */
+  public function build(array $regions, array $context, ContextHandlerInterface $context_handler, AccountInterface $account, LayoutInterface $layout = null);
+}
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..759d6d9
--- /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",
+ *   label = @Translation("Editor")
+ * )
+ */
+class Editor extends DisplayRendererBase {
+
+}
diff --git a/src/Plugin/DisplayRenderer/Standard.php b/src/Plugin/DisplayRenderer/Standard.php
new file mode 100644
index 0000000..bd8d9f2
--- /dev/null
+++ b/src/Plugin/DisplayRenderer/Standard.php
@@ -0,0 +1,77 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\panels\Plugin\DisplayRenderer\Standard.
+ */
+
+namespace Drupal\panels\Plugin\DisplayRenderer;
+use Drupal\Component\Utility\Html;
+use Drupal\Component\Utility\SafeMarkup;
+use Drupal\Core\Plugin\Context\ContextHandlerInterface;
+use Drupal\Core\Plugin\ContextAwarePluginInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\layout_plugin\Plugin\Layout\LayoutInterface;
+
+/**
+ * The standard render pipeline for a Panels display object.
+ *
+ * @DisplayRenderer(
+ *   id = "standard",
+ *   label = @Translation("Standard")
+ * )
+ */
+class Standard extends DisplayRendererBase {
+
+  /**
+   * Build render arrays for each of the regions.
+   * @return array $build
+   *   An associative array keyed by region id, containing the render array
+   *   representing the content of each region.
+   */
+  protected function buildRegions(array $regions, array $contexts, ContextHandlerInterface $context_handler, AccountInterface $account) {
+    $build = [];
+    foreach ($regions as $region => $blocks) {
+      if (!$blocks) {
+        continue;
+      }
+
+      $region_name = Html::getClass("block-region-$region");
+      $build[$region]['#prefix'] = '<div class="' . $region_name . '">';
+      $build[$region]['#suffix'] = '</div>';
+
+      /** @var $blocks \Drupal\block\BlockPluginInterface[] */
+      $weight = 0;
+      foreach ($blocks as $block_id => $block) {
+        if ($block instanceof ContextAwarePluginInterface) {
+          $context_handler->applyContextMapping($block, $contexts);
+        }
+        if ($block->access($account)) {
+          $block_render_array = [
+            '#theme' => 'block',
+            '#attributes' => [],
+            '#weight' => $weight++,
+            '#configuration' => $block->getConfiguration(),
+            '#plugin_id' => $block->getPluginId(),
+            '#base_plugin_id' => $block->getBaseId(),
+            '#derivative_plugin_id' => $block->getDerivativeId(),
+          ];
+          if (!empty($block_render_array['#configuration']['label'])) {
+            $block_render_array['#configuration']['label'] = SafeMarkup::checkPlain($block_render_array['#configuration']['label']);
+          }
+          $block_render_array['content'] = $block->build();
+
+          $build[$region][$block_id] = $block_render_array;
+        }
+      }
+    }
+    return $build;
+  }
+  public function build(array $regions, array $context, ContextHandlerInterface $context_handler, AccountInterface $account, LayoutInterface $layout = null) {
+    $regions = $this->buildRegions($regions, $context, $context_handler, $account);
+    if ($layout != null) {
+      $regions = $layout->build($regions);
+    }
+    return $regions;
+  }
+}
diff --git a/src/Plugin/DisplayVariant/PanelsDisplayVariant.php b/src/Plugin/DisplayVariant/PanelsDisplayVariant.php
index e8a9e6f..15ac9f6 100644
--- a/src/Plugin/DisplayVariant/PanelsDisplayVariant.php
+++ b/src/Plugin/DisplayVariant/PanelsDisplayVariant.php
@@ -8,19 +8,17 @@
 namespace Drupal\panels\Plugin\DisplayVariant;
 
 use Drupal\Component\Serialization\Json;
-use Drupal\Component\Utility\Html;
 use Drupal\Component\Utility\NestedArray;
-use Drupal\Component\Utility\SafeMarkup;
 use Drupal\Component\Uuid\UuidInterface;
 use Drupal\Core\Display\VariantBase;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
-use Drupal\Component\Plugin\ContextAwarePluginInterface;
 use Drupal\Core\Plugin\Context\ContextHandlerInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\Url;
-use Drupal\page_manager\PageExecutableInterface;
 use Drupal\Core\Utility\Token;
+use Drupal\layout_plugin\Layout;
+use Drupal\page_manager\PageExecutableInterface;
 use Drupal\page_manager\Plugin\BlockVariantInterface;
 use Drupal\page_manager\Plugin\BlockVariantTrait;
 use Drupal\page_manager\Plugin\ConditionVariantInterface;
@@ -28,8 +26,6 @@ use Drupal\page_manager\Plugin\ConditionVariantTrait;
 use Drupal\page_manager\Plugin\ContextAwareVariantInterface;
 use Drupal\page_manager\Plugin\ContextAwareVariantTrait;
 use Drupal\page_manager\Plugin\PageAwareVariantInterface;
-use Drupal\layout_plugin\Layout;
-use Drupal\layout_plugin\Plugin\Layout\LayoutInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -47,6 +43,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 +134,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
@@ -151,49 +168,15 @@ class PanelsDisplayVariant extends VariantBase implements ContextAwareVariantInt
   }
 
   /**
-   * Build render arrays for each of the regions.
-   *
-   * @return
-   *   An associative array keyed by region id, containing the render array
-   *   representing the content of each region.
+   * {@inheritdoc}
    */
-  protected function buildRegions() {
-    $build = [];
+  public function build() {
+    $regions = $this->getRegionAssignments();
     $contexts = $this->getContexts();
-    foreach ($this->getRegionAssignments() as $region => $blocks) {
-      if (!$blocks) {
-        continue;
-      }
-
-      $region_name = Html::getClass("block-region-$region");
-      $build[$region]['#prefix'] = '<div class="' . $region_name . '">';
-      $build[$region]['#suffix'] = '</div>';
-
-      /** @var $blocks \Drupal\block\BlockPluginInterface[] */
-      $weight = 0;
-      foreach ($blocks as $block_id => $block) {
-        if ($block instanceof ContextAwarePluginInterface) {
-          $this->contextHandler()->applyContextMapping($block, $contexts);
-        }
-        if ($block->access($this->account)) {
-          $block_render_array = [
-            '#theme' => 'block',
-            '#attributes' => [],
-            '#weight' => $weight++,
-            '#configuration' => $block->getConfiguration(),
-            '#plugin_id' => $block->getPluginId(),
-            '#base_plugin_id' => $block->getBaseId(),
-            '#derivative_plugin_id' => $block->getDerivativeId(),
-          ];
-          if (!empty($block_render_array['#configuration']['label'])) {
-            $block_render_array['#configuration']['label'] = SafeMarkup::checkPlain($block_render_array['#configuration']['label']);
-          }
-          $block_render_array['content'] = $block->build();
-
-          $build[$region][$block_id] = $block_render_array;
-        }
-      }
-    }
+    $context_handler = $this->contextHandler();
+    $account = $this->account;
+    $layout = $this->getLayout();
+    $build = $this->getRenderer()->build($regions, $contexts, $context_handler, $account, $layout);
     $build['#title'] = $this->renderPageTitle($this->configuration['page_title']);
     return $build;
   }
@@ -201,17 +184,6 @@ class PanelsDisplayVariant extends VariantBase implements ContextAwareVariantInt
   /**
    * {@inheritdoc}
    */
-  public function build() {
-    $regions = $this->buildRegions();
-    if ($layout = $this->getLayout()) {
-      return $layout->build($regions);
-    }
-    return $regions;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
     $form = parent::buildConfigurationForm($form, $form_state);
 
@@ -226,6 +198,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['label'];
+      }
+      $form['renderer'] = [
+        '#title' => $this->t('Renderer'),
+        '#type' => 'select',
+        '#options' => $options,
+        '#default_value' => 'standard',
+      ];
+
       $form['layout'] = [
         '#title' => $this->t('Layout'),
         '#type' => 'select',
@@ -407,6 +393,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 +548,4 @@ class PanelsDisplayVariant extends VariantBase implements ContextAwareVariantInt
   protected function uuidGenerator() {
     return $this->uuidGenerator;
   }
-
 }
