diff --git a/core/lib/Drupal/Core/Action/ConfigurableActionBase.php b/core/lib/Drupal/Core/Action/ConfigurableActionBase.php
index 3d372fe646..6d8f10b712 100644
--- a/core/lib/Drupal/Core/Action/ConfigurableActionBase.php
+++ b/core/lib/Drupal/Core/Action/ConfigurableActionBase.php
@@ -4,6 +4,7 @@
 
 use Drupal\Component\Plugin\ConfigurablePluginInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Plugin\ConfigurablePluginTrait;
 use Drupal\Core\Plugin\PluginFormInterface;
 
 /**
@@ -11,6 +12,8 @@
  */
 abstract class ConfigurableActionBase extends ActionBase implements ConfigurablePluginInterface, PluginFormInterface {
 
+  use ConfigurablePluginTrait;
+
   /**
    * {@inheritdoc}
    */
@@ -20,27 +23,6 @@ public function __construct(array $configuration, $plugin_id, $plugin_definition
     $this->setConfiguration($configuration);
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function defaultConfiguration() {
-    return [];
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getConfiguration() {
-    return $this->configuration;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setConfiguration(array $configuration) {
-    $this->configuration = $configuration + $this->defaultConfiguration();
-  }
-
   /**
    * {@inheritdoc}
    */
diff --git a/core/lib/Drupal/Core/Block/BlockBase.php b/core/lib/Drupal/Core/Block/BlockBase.php
index ee9078335b..2548a4c9e4 100644
--- a/core/lib/Drupal/Core/Block/BlockBase.php
+++ b/core/lib/Drupal/Core/Block/BlockBase.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Plugin\ConfigurablePluginTrait;
 use Drupal\Core\Plugin\ContextAwarePluginAssignmentTrait;
 use Drupal\Core\Plugin\ContextAwarePluginBase;
 use Drupal\Component\Utility\Unicode;
@@ -25,6 +26,7 @@
  */
 abstract class BlockBase extends ContextAwarePluginBase implements BlockPluginInterface, PluginWithFormsInterface {
 
+  use ConfigurablePluginTrait;
   use ContextAwarePluginAssignmentTrait;
   use PluginWithFormsTrait;
 
@@ -57,13 +59,6 @@ public function __construct(array $configuration, $plugin_id, $plugin_definition
     $this->setConfiguration($configuration);
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function getConfiguration() {
-    return $this->configuration;
-  }
-
   /**
    * {@inheritdoc}
    */
@@ -90,13 +85,6 @@ protected function baseConfigurationDefaults() {
     ];
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function defaultConfiguration() {
-    return [];
-  }
-
   /**
    * {@inheritdoc}
    */
@@ -255,6 +243,7 @@ public function getMachineNameSuggestion() {
    * Wraps the transliteration service.
    *
    * @return \Drupal\Component\Transliteration\TransliterationInterface
+   *   The transliteration service.
    */
   protected function transliteration() {
     if (!$this->transliteration) {
diff --git a/core/lib/Drupal/Core/Condition/ConditionPluginBase.php b/core/lib/Drupal/Core/Condition/ConditionPluginBase.php
index b5134fb51d..33e2b51ddd 100644
--- a/core/lib/Drupal/Core/Condition/ConditionPluginBase.php
+++ b/core/lib/Drupal/Core/Condition/ConditionPluginBase.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Executable\ExecutablePluginBase;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Form\SubformStateInterface;
+use Drupal\Core\Plugin\ConfigurablePluginTrait;
 use Drupal\Core\Plugin\ContextAwarePluginAssignmentTrait;
 
 /**
@@ -19,6 +20,7 @@
  */
 abstract class ConditionPluginBase extends ExecutablePluginBase implements ConditionInterface {
 
+  use ConfigurablePluginTrait;
   use ContextAwarePluginAssignmentTrait;
 
   /**
@@ -93,14 +95,6 @@ public function getConfiguration() {
     ] + $this->configuration;
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function setConfiguration(array $configuration) {
-    $this->configuration = $configuration + $this->defaultConfiguration();
-    return $this;
-  }
-
   /**
    * {@inheritdoc}
    */
diff --git a/core/lib/Drupal/Core/Display/VariantBase.php b/core/lib/Drupal/Core/Display/VariantBase.php
index 4f7ce9e9ff..be10780209 100644
--- a/core/lib/Drupal/Core/Display/VariantBase.php
+++ b/core/lib/Drupal/Core/Display/VariantBase.php
@@ -4,7 +4,7 @@
 
 use Drupal\Core\Cache\RefinableCacheableDependencyTrait;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Plugin\PluginBase;
+use Drupal\Core\Plugin\ConfigurablePluginBase;
 use Drupal\Core\Plugin\PluginDependencyTrait;
 use Drupal\Core\Session\AccountInterface;
 
@@ -16,7 +16,7 @@
  * @see \Drupal\Core\Display\VariantManager
  * @see plugin_api
  */
-abstract class VariantBase extends PluginBase implements VariantInterface {
+abstract class VariantBase extends ConfigurablePluginBase implements VariantInterface {
 
   use PluginDependencyTrait;
   use RefinableCacheableDependencyTrait;
@@ -74,14 +74,6 @@ public function getConfiguration() {
     ] + $this->configuration;
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function setConfiguration(array $configuration) {
-    $this->configuration = $configuration + $this->defaultConfiguration();
-    return $this;
-  }
-
   /**
    * {@inheritdoc}
    */
diff --git a/core/lib/Drupal/Core/Layout/LayoutDefault.php b/core/lib/Drupal/Core/Layout/LayoutDefault.php
index 6e53d00f44..f1682e3515 100644
--- a/core/lib/Drupal/Core/Layout/LayoutDefault.php
+++ b/core/lib/Drupal/Core/Layout/LayoutDefault.php
@@ -2,13 +2,12 @@
 
 namespace Drupal\Core\Layout;
 
-use Drupal\Component\Utility\NestedArray;
-use Drupal\Core\Plugin\PluginBase;
+use Drupal\Core\Plugin\ConfigurablePluginBase;
 
 /**
  * Provides a default class for Layout plugins.
  */
-class LayoutDefault extends PluginBase implements LayoutInterface {
+class LayoutDefault extends ConfigurablePluginBase implements LayoutInterface {
 
   /**
    * The layout definition.
@@ -45,27 +44,6 @@ public function build(array $regions) {
     return $build;
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function getConfiguration() {
-    return $this->configuration;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setConfiguration(array $configuration) {
-    $this->configuration = NestedArray::mergeDeep($this->defaultConfiguration(), $configuration);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function defaultConfiguration() {
-    return [];
-  }
-
   /**
    * {@inheritdoc}
    */
@@ -77,6 +55,7 @@ public function calculateDependencies() {
    * {@inheritdoc}
    *
    * @return \Drupal\Core\Layout\LayoutDefinition
+   *   The plugin definition.
    */
   public function getPluginDefinition() {
     return parent::getPluginDefinition();
diff --git a/core/lib/Drupal/Core/Plugin/ConfigurablePluginBase.php b/core/lib/Drupal/Core/Plugin/ConfigurablePluginBase.php
new file mode 100644
index 0000000000..44547862b5
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/ConfigurablePluginBase.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Drupal\Core\Plugin;
+
+use Drupal\Component\Plugin\ConfigurablePluginInterface;
+
+/**
+ * Base class for plugins that are configurable.
+ */
+abstract class ConfigurablePluginBase extends PluginBase implements ConfigurablePluginInterface {
+
+  use ConfigurablePluginTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->setConfiguration($configuration);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function calculateDependencies() {
+    return [];
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Plugin/ConfigurablePluginTrait.php b/core/lib/Drupal/Core/Plugin/ConfigurablePluginTrait.php
new file mode 100644
index 0000000000..e566a98bde
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/ConfigurablePluginTrait.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace Drupal\Core\Plugin;
+
+use Drupal\Component\Utility\NestedArray;
+
+/**
+ * Implements \Drupal\Component\Plugin\ConfigurablePluginInterface.
+ *
+ * In order for configurable plugins to maintain their configuration, the
+ * default configuration must be merged into any explicitly defined
+ * configuration. This trait provides the appropriate getters and setters to
+ * handle this logic, removing the need for excess boilerplate.
+ *
+ * @ingroup Plugin
+ */
+trait ConfigurablePluginTrait {
+
+  /**
+   * Implements \Drupal\Component\Plugin\ConfigurablePluginInterface::getConfiguration().
+   */
+  public function getConfiguration() {
+    return $this->configuration;
+  }
+
+  /**
+   * Implements \Drupal\Component\Plugin\ConfigurablePluginInterface::setConfiguration().
+   */
+  public function setConfiguration(array $configuration) {
+    $this->configuration = NestedArray::mergeDeep($this->defaultConfiguration(), $configuration);
+  }
+
+  /**
+   * Implements \Drupal\Component\Plugin\ConfigurablePluginInterface::defaultConfiguration().
+   */
+  public function defaultConfiguration() {
+    return [];
+  }
+
+}
diff --git a/core/modules/block/tests/src/Kernel/Migrate/d6/MigrateBlockTest.php b/core/modules/block/tests/src/Kernel/Migrate/d6/MigrateBlockTest.php
index bb59f502c3..91d3110373 100644
--- a/core/modules/block/tests/src/Kernel/Migrate/d6/MigrateBlockTest.php
+++ b/core/modules/block/tests/src/Kernel/Migrate/d6/MigrateBlockTest.php
@@ -78,7 +78,7 @@ protected function setUp() {
   public function assertEntity($id, $visibility, $region, $theme, $weight, array $settings = NULL, $status = TRUE) {
     $block = Block::load($id);
     $this->assertTrue($block instanceof Block);
-    $this->assertSame($visibility, $block->getVisibility());
+    $this->assertEquals($visibility, $block->getVisibility());
     $this->assertSame($region, $block->getRegion());
     $this->assertSame($theme, $block->getTheme());
     $this->assertSame($weight, $block->getWeight());
diff --git a/core/modules/image/src/ImageEffectBase.php b/core/modules/image/src/ImageEffectBase.php
index 58be370c1e..6ccc98bcde 100644
--- a/core/modules/image/src/ImageEffectBase.php
+++ b/core/modules/image/src/ImageEffectBase.php
@@ -2,8 +2,8 @@
 
 namespace Drupal\image;
 
+use Drupal\Core\Plugin\ConfigurablePluginBase;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
-use Drupal\Core\Plugin\PluginBase;
 use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -17,7 +17,7 @@
  * @see \Drupal\image\ImageEffectManager
  * @see plugin_api
  */
-abstract class ImageEffectBase extends PluginBase implements ImageEffectInterface, ContainerFactoryPluginInterface {
+abstract class ImageEffectBase extends ConfigurablePluginBase implements ImageEffectInterface, ContainerFactoryPluginInterface {
 
   /**
    * The image effect ID.
@@ -46,7 +46,6 @@
   public function __construct(array $configuration, $plugin_id, $plugin_definition, LoggerInterface $logger) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
 
-    $this->setConfiguration($configuration);
     $this->logger = $logger;
   }
 
@@ -151,13 +150,6 @@ public function setConfiguration(array $configuration) {
     return $this;
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function defaultConfiguration() {
-    return [];
-  }
-
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/search/src/Plugin/ConfigurableSearchPluginBase.php b/core/modules/search/src/Plugin/ConfigurableSearchPluginBase.php
index 7ad95f1682..cd5c16e7e6 100644
--- a/core/modules/search/src/Plugin/ConfigurableSearchPluginBase.php
+++ b/core/modules/search/src/Plugin/ConfigurableSearchPluginBase.php
@@ -2,14 +2,16 @@
 
 namespace Drupal\search\Plugin;
 
-use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Plugin\ConfigurablePluginTrait;
 
 /**
  * Provides a base implementation for a configurable Search plugin.
  */
 abstract class ConfigurableSearchPluginBase extends SearchPluginBase implements ConfigurableSearchPluginInterface {
 
+  use ConfigurablePluginTrait;
+
   /**
    * The unique ID for the search page using this plugin.
    *
@@ -26,27 +28,6 @@ public function __construct(array $configuration, $plugin_id, $plugin_definition
     $this->setConfiguration($configuration);
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function defaultConfiguration() {
-    return [];
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getConfiguration() {
-    return $this->configuration;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setConfiguration(array $configuration) {
-    $this->configuration = NestedArray::mergeDeep($this->defaultConfiguration(), $configuration);
-  }
-
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/workflows/src/Plugin/WorkflowTypeBase.php b/core/modules/workflows/src/Plugin/WorkflowTypeBase.php
index 6045484244..f602ef90fe 100644
--- a/core/modules/workflows/src/Plugin/WorkflowTypeBase.php
+++ b/core/modules/workflows/src/Plugin/WorkflowTypeBase.php
@@ -3,6 +3,7 @@
 namespace Drupal\workflows\Plugin;
 
 use Drupal\Component\Plugin\PluginBase;
+use Drupal\Core\Plugin\ConfigurablePluginTrait;
 use Drupal\Core\Plugin\PluginWithFormsTrait;
 use Drupal\workflows\State;
 use Drupal\workflows\StateInterface;
@@ -18,6 +19,7 @@
  */
 abstract class WorkflowTypeBase extends PluginBase implements WorkflowTypeInterface {
 
+  use ConfigurablePluginTrait;
   use PluginWithFormsTrait;
 
   /**
@@ -57,13 +59,6 @@ public function workflowStateHasData(WorkflowInterface $workflow, StateInterface
     return FALSE;
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function getConfiguration() {
-    return $this->configuration;
-  }
-
   /**
    * {@inheritdoc}
    */
diff --git a/core/tests/Drupal/Tests/Core/Plugin/DefaultSingleLazyPluginCollectionTest.php b/core/tests/Drupal/Tests/Core/Plugin/DefaultSingleLazyPluginCollectionTest.php
index 21bbde83d8..a239ff375f 100644
--- a/core/tests/Drupal/Tests/Core/Plugin/DefaultSingleLazyPluginCollectionTest.php
+++ b/core/tests/Drupal/Tests/Core/Plugin/DefaultSingleLazyPluginCollectionTest.php
@@ -4,6 +4,7 @@
 
 use Drupal\Component\Plugin\ConfigurablePluginInterface;
 use Drupal\Component\Plugin\PluginBase;
+use Drupal\Core\Plugin\ConfigurablePluginTrait;
 use Drupal\Core\Plugin\DefaultSingleLazyPluginCollection;
 
 /**
@@ -73,22 +74,12 @@ public function testGetInstanceIds() {
 
 class ConfigurablePlugin extends PluginBase implements ConfigurablePluginInterface {
 
+  use ConfigurablePluginTrait;
+
   public function __construct(array $configuration, $plugin_id, $plugin_definition) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
 
-    $this->configuration = $configuration + $this->defaultConfiguration();
-  }
-
-  public function defaultConfiguration() {
-    return [];
-  }
-
-  public function getConfiguration() {
-    return $this->configuration;
-  }
-
-  public function setConfiguration(array $configuration) {
-    $this->configuration = $configuration;
+    $this->setConfiguration($configuration);
   }
 
   public function calculateDependencies() {
diff --git a/core/tests/Drupal/Tests/Core/Plugin/Fixtures/TestConfigurablePlugin.php b/core/tests/Drupal/Tests/Core/Plugin/Fixtures/TestConfigurablePlugin.php
index 383b4d2bbf..e49319d495 100644
--- a/core/tests/Drupal/Tests/Core/Plugin/Fixtures/TestConfigurablePlugin.php
+++ b/core/tests/Drupal/Tests/Core/Plugin/Fixtures/TestConfigurablePlugin.php
@@ -4,28 +4,21 @@
 
 use Drupal\Component\Plugin\ConfigurablePluginInterface;
 use Drupal\Component\Plugin\PluginBase;
+use Drupal\Core\Plugin\ConfigurablePluginTrait;
 
+/**
+ * A fixture to test Configurable Plugins.
+ */
 class TestConfigurablePlugin extends PluginBase implements ConfigurablePluginInterface {
 
-  /**
-   * {@inheritdoc}
-   */
-  public function getConfiguration() {
-    return $this->configuration;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setConfiguration(array $configuration) {
-    $this->configuration = $configuration;
-  }
+  use ConfigurablePluginTrait;
 
   /**
    * {@inheritdoc}
    */
-  public function defaultConfiguration() {
-    return [];
+  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->setConfiguration($configuration);
   }
 
   /**
