diff --git a/core/modules/views/config/schema/views.data_types.schema.yml b/core/modules/views/config/schema/views.data_types.schema.yml
index c2c2ffc..b929695 100644
--- a/core/modules/views/config/schema/views.data_types.schema.yml
+++ b/core/modules/views/config/schema/views.data_types.schema.yml
@@ -272,6 +272,11 @@ views_display:
     exposed_block:
       type: boolean
       label: 'Put the exposed form in a block'
+    display_extenders:
+      type: sequence
+      label: 'Display extenders'
+      sequence:
+       - type: views.display_extender.[%key]
 
 views_sort:
   type: views_handler
@@ -859,3 +864,7 @@ views_cache:
     type:
       type: string
       label: 'Cache type'
+
+views_display_extender:
+  type: mapping
+  label: 'Display extender settings'
diff --git a/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php b/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
index 7386c00..ab0cba9 100644
--- a/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
+++ b/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php
@@ -10,6 +10,7 @@
 use Drupal\Component\Utility\String;
 use Drupal\Component\Utility\Unicode;
 use Drupal\Core\Cache\Cache;
+use Drupal\Core\Config\Entity\ThirdPartySettingsTrait;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Session\AccountInterface;
@@ -50,6 +51,8 @@
  */
 abstract class DisplayPluginBase extends PluginBase {
 
+  use ThirdPartySettingsTrait;
+
   /**
    * The top object of a view.
    *
@@ -73,8 +76,10 @@
 
   /**
    * Stores all available display extenders.
+   *
+   * @var \Drupal\views\Plugin\views\display_extender\DisplayExtenderPluginBase[]
    */
-  var $extender = array();
+  protected $extender = [];
 
   /**
    * Overrides Drupal\views\Plugin\Plugin::$usesOptions.
@@ -164,6 +169,7 @@ public function initDisplay(ViewExecutable $view, array &$display, array &$optio
     if ($extenders = Views::getEnabledDisplayExtenders()) {
       $manager = Views::pluginManager('display_extender');
       foreach ($extenders as $extender) {
+        /** @var \Drupal\views\Plugin\views\display_extender\DisplayExtenderPluginBase $plugin */
         if ($plugin = $manager->createInstance($extender)) {
           $plugin->init($this->view, $this);
           $this->extender[$extender] = $plugin;
@@ -220,6 +226,23 @@ public function initDisplay(ViewExecutable $view, array &$display, array &$optio
     if ($changed) {
       $this->view->changed = TRUE;
     }
+
+    $this->third_party_settings = $this->getOption('display_extenders');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setThirdPartySetting($module, $key, $value) {
+    $display_extenders = $this->getOption('display_extenders');
+    $display_extenders[$module][$key] = $value;
+    $this->setOption('display_extenders', $display_extenders);
+  }
+
+  public function unsetThirdPartySetting($module, $key) {
+    $display_extenders = $this->getOption('display_extenders');
+    unset($display_extenders[$module][$key]);
+    $this->setOption('display_extenders', $display_extenders);
   }
 
   public function destroy() {
@@ -706,6 +729,14 @@ protected function defineOptions() {
       unset($options['defaults']);
     }
 
+    $options['display_extenders'] = ['default' => []];
+
+    // First allow display extenders to provide new options.
+    foreach ($this->extender as $extender_id => $extender) {
+      $options['display_extenders']['contains'][$extender_id] = $extender->defineOptions();
+    }
+
+    // Then allow display extenders to alter existing default values.
     foreach ($this->extender as $extender) {
       $extender->defineOptionsAlter($options);
     }
@@ -2647,6 +2678,15 @@ protected function mergeHandler($type) {
     $this->setOption($types[$type]['plural'], $options);
   }
 
+  /**
+   * Gets the display extenders.
+   *
+   * @return \Drupal\views\Plugin\views\display_extender\DisplayExtenderPluginBase[]
+   */
+  public function getExtender() {
+    return $this->extender;
+  }
+
 }
 
 /**
diff --git a/core/modules/views/src/Tests/Plugin/DisplayExtenderTest.php b/core/modules/views/src/Tests/Plugin/DisplayExtenderTest.php
index d84d355..b283157 100644
--- a/core/modules/views/src/Tests/Plugin/DisplayExtenderTest.php
+++ b/core/modules/views/src/Tests/Plugin/DisplayExtenderTest.php
@@ -41,9 +41,9 @@ public function testDisplayExtenders() {
     $view = Views::getView('test_view');
     $view->initDisplay();
 
-    $this->assertEqual(count($view->display_handler->extender), 1, 'Make sure that only one extender is initialized.');
+    $this->assertEqual(count($view->display_handler->getExtender()), 1, 'Make sure that only one extender is initialized.');
 
-    $display_extender = $view->display_handler->extender['display_extender_test'];
+    $display_extender = $view->display_handler->getExtender()['display_extender_test'];
     $this->assertTrue($display_extender instanceof \Drupal\views_test_data\Plugin\views\display_extender\DisplayExtenderTest, 'Make sure the right class got initialized.');
 
     $view->preExecute();
diff --git a/core/modules/views/tests/modules/views_test_data/config/schema/views_test_data.views.schema.yml b/core/modules/views/tests/modules/views_test_data/config/schema/views_test_data.views.schema.yml
index 4b51a2b..92e94ef 100644
--- a/core/modules/views/tests/modules/views_test_data/config/schema/views_test_data.views.schema.yml
+++ b/core/modules/views/tests/modules/views_test_data/config/schema/views_test_data.views.schema.yml
@@ -26,3 +26,13 @@ views.style.mapping_test:
         toggle_title_field:
           type: boolean
           label: 'Toggle title field'
+
+views.display_extender.display_extender_test:
+  type: views_display_extender
+  mapping:
+    test_extender_test_option:
+      type: string
+      label: 'Test option'
+
+views.display_extender.display_extender_test2:
+  type: views.display_extender.display_extender_test
diff --git a/core/modules/views/tests/modules/views_test_data/src/Plugin/views/display_extender/DisplayExtenderTest.php b/core/modules/views/tests/modules/views_test_data/src/Plugin/views/display_extender/DisplayExtenderTest.php
index 853dc6b..cf201a4 100644
--- a/core/modules/views/tests/modules/views_test_data/src/Plugin/views/display_extender/DisplayExtenderTest.php
+++ b/core/modules/views/tests/modules/views_test_data/src/Plugin/views/display_extender/DisplayExtenderTest.php
@@ -28,10 +28,12 @@ class DisplayExtenderTest extends DisplayExtenderPluginBase {
   public $testState;
 
   /**
-   * Overrides Drupal\views\Plugin\views\display_extender\DisplayExtenderPluginBase::defineOptionsAlter().
+   * {@inheritdoc}
    */
-  public function defineOptionsAlter(&$options) {
-    $options['test_extender_test_option'] = array('default' => '');
+  protected function defineOptions() {
+    $options = parent::defineOptions();
+
+    $options['test_extender_test_option'] = ['default' => ''];
 
     return $options;
   }
@@ -50,7 +52,7 @@ public function optionsSummary(&$categories, &$options) {
       ),
     );
 
-    $test_option = $this->displayHandler->getOption('test_extender_test_option') ?: $this->t('Empty');
+    $test_option = $this->displayHandler->getThirdPartySetting('display_extender_test', 'test_extender_test_option') ?: $this->t('Empty');
 
     $options['test_extender_test_option'] = array(
       'category' => 'display_extender_test',
@@ -70,7 +72,7 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
           '#title' => $this->t('Test option'),
           '#type' => 'textfield',
           '#description' => $this->t('This is a textfield for test_option.'),
-          '#default_value' => $this->displayHandler->getOption('test_extender_test_option'),
+          '#default_value' => $this->displayHandler->getThirdPartySetting('display_extender_test', 'test_extender_test_option'),
         );
     }
   }
@@ -82,7 +84,7 @@ public function submitOptionsForm(&$form, FormStateInterface $form_state) {
     parent::submitOptionsForm($form, $form_state);
     switch ($form_state->get('section')) {
       case 'test_extender_test_option':
-        $this->displayHandler->setOption('test_extender_test_option', $form_state->getValue('test_extender_test_option'));
+        $this->displayHandler->setThirdPartySetting('display_extender_test', 'test_extender_test_option', $form_state->getValue('test_extender_test_option'));
         break;
     }
   }
diff --git a/core/modules/views_ui/src/Tests/DisplayExtenderUITest.php b/core/modules/views_ui/src/Tests/DisplayExtenderUITest.php
index 8978539..c3ea8de 100644
--- a/core/modules/views_ui/src/Tests/DisplayExtenderUITest.php
+++ b/core/modules/views_ui/src/Tests/DisplayExtenderUITest.php
@@ -42,7 +42,9 @@ public function testDisplayExtenderUI() {
     $this->drupalPostForm(NULL, array(), t('Save'));
     $view = Views::getView($view->storage->id());
     $view->initDisplay();
-    $this->assertEqual($view->display_handler->getOption('test_extender_test_option'), $random_text, 'Make sure that the display extender option got saved.');
+    $display_extender_options = $view->display_handler->getOption('display_extenders');
+    debug($display_extender_options);
+    $this->assertEqual($display_extender_options['display_extender_test']['test_extender_test_option'], $random_text, 'Make sure that the display extender option got saved.');
   }
 
 }
