diff --git a/core/modules/rest/lib/Drupal/rest/Plugin/views/style/Serializer.php b/core/modules/rest/lib/Drupal/rest/Plugin/views/style/Serializer.php
index 605006a..d06ff15 100644
--- a/core/modules/rest/lib/Drupal/rest/Plugin/views/style/Serializer.php
+++ b/core/modules/rest/lib/Drupal/rest/Plugin/views/style/Serializer.php
@@ -72,7 +72,6 @@ public static function create(ContainerInterface $container, array $configuratio
   public function __construct(array $configuration, $plugin_id, array $plugin_definition, SerializerInterface $serializer, array $serializer_formats) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
 
-    $this->definition = $plugin_definition + $configuration;
     $this->serializer = $serializer;
     $this->formats = $serializer_formats;
   }
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/PluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/PluginBase.php
index a626c3b..7b99965 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/PluginBase.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/PluginBase.php
@@ -84,7 +84,7 @@
   public function __construct(array $configuration, $plugin_id, array $plugin_definition) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
 
-    $this->definition = $plugin_definition + $configuration;
+    $this->definition = array_merge(array('options' => array()), $plugin_definition, $configuration);
   }
 
   /**
@@ -106,7 +106,7 @@ public static function create(ContainerInterface $container, array $configuratio
    */
   public function init(ViewExecutable $view, DisplayPluginBase $display, array &$options = NULL) {
     $this->view = $view;
-    $this->setOptionDefaults($this->options, $this->defineOptions());
+    $this->setOptionDefaults($this->options, array_merge($this->defineOptions(), $this->definition['options']));
     $this->displayHandler = $display;
 
     $this->unpackOptions($this->options, $options);
diff --git a/core/modules/views/tests/Drupal/views/Tests/PluginBaseTest.php b/core/modules/views/tests/Drupal/views/Tests/PluginBaseTest.php
index ca4e106..d275d51 100644
--- a/core/modules/views/tests/Drupal/views/Tests/PluginBaseTest.php
+++ b/core/modules/views/tests/Drupal/views/Tests/PluginBaseTest.php
@@ -294,4 +294,32 @@ public function providerTestSetOptionDefault() {
     return $test_parameters;
   }
 
+  /**
+   * Tests default options set in the handler definition.
+   */
+  public function testDefaultOptionsWithHandlerDefinition() {
+    $args = array(array('options' => array('key' => array('default' => 'value'), 'key2' => array('default' => 'value2'))), 'default', array());
+    $test_plugin = $this->getMock('Drupal\views\Plugin\views\PluginBase', array('defineOptions'), $args);
+    $test_plugin->expects($this->any())
+      ->method('defineOptions')
+      ->will($this->returnValue(array(
+        'key' => array('default' => 'value2'),
+        'key3' => array('default' => 'value3')
+      )));
+
+    $executable = $this->getMockBuilder('Drupal\views\ViewExecutable')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $display = $this->getMockBuilder('Drupal\views\Plugin\views\display\DisplayPluginBase')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $options = array('key2' => 'overridden-value');
+
+    $test_plugin->init($executable, $display, $options);
+
+    $this->assertEquals('value', $test_plugin->options['key']);
+    $this->assertEquals('overridden-value', $test_plugin->options['key2']);
+    $this->assertEquals('value3', $test_plugin->options['key3']);
+  }
+
 }
