diff --git a/core/lib/Drupal/Component/Plugin/ConfigurableTrait.php b/core/lib/Drupal/Component/Plugin/ConfigurableTrait.php
new file mode 100644
index 0000000000..5e3e8ebee8
--- /dev/null
+++ b/core/lib/Drupal/Component/Plugin/ConfigurableTrait.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace Drupal\Component\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 ConfigurableTrait {
+
+  /**
+   * Configuration information passed into the plugin.
+   *
+   * @var array
+   */
+  protected $configuration;
+
+  /**
+   * 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/lib/Drupal/Component/Plugin/PluginBase.php b/core/lib/Drupal/Component/Plugin/PluginBase.php
index e7e980ade4..3be5c7c3ce 100644
--- a/core/lib/Drupal/Component/Plugin/PluginBase.php
+++ b/core/lib/Drupal/Component/Plugin/PluginBase.php
@@ -51,7 +51,12 @@
    *   The plugin implementation definition.
    */
   public function __construct(array $configuration, $plugin_id, $plugin_definition) {
-    $this->configuration = $configuration;
+    if ($this->isConfigurable()) {
+      $this->setConfiguration($configuration);
+    }
+    else {
+      $this->configuration = $configuration;
+    }
     $this->pluginId = $plugin_id;
     $this->pluginDefinition = $plugin_definition;
 
diff --git a/core/lib/Drupal/Core/Action/ConfigurableActionBase.php b/core/lib/Drupal/Core/Action/ConfigurableActionBase.php
index 49c40800c2..32d4ab71f8 100644
--- a/core/lib/Drupal/Core/Action/ConfigurableActionBase.php
+++ b/core/lib/Drupal/Core/Action/ConfigurableActionBase.php
@@ -6,6 +6,7 @@
 use Drupal\Component\Plugin\ConfigurablePluginInterface;
 use Drupal\Component\Plugin\DependentPluginInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Component\Plugin\ConfigurableTrait;
 use Drupal\Core\Plugin\PluginFormInterface;
 
 /**
@@ -13,35 +14,7 @@
  */
 abstract class ConfigurableActionBase extends ActionBase implements ConfigurableInterface, DependentPluginInterface, ConfigurablePluginInterface, PluginFormInterface {
 
-  /**
-   * {@inheritdoc}
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
-    parent::__construct($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();
-  }
+  use ConfigurableTrait;
 
   /**
    * {@inheritdoc}
diff --git a/core/lib/Drupal/Core/Block/BlockBase.php b/core/lib/Drupal/Core/Block/BlockBase.php
index bebdf09bd4..a5ab09701b 100644
--- a/core/lib/Drupal/Core/Block/BlockBase.php
+++ b/core/lib/Drupal/Core/Block/BlockBase.php
@@ -5,6 +5,7 @@
 use Drupal\Core\Access\AccessResult;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Messenger\MessengerTrait;
+use Drupal\Component\Plugin\ConfigurableTrait;
 use Drupal\Core\Plugin\ContextAwarePluginAssignmentTrait;
 use Drupal\Core\Plugin\ContextAwarePluginBase;
 use Drupal\Component\Utility\NestedArray;
@@ -26,6 +27,7 @@
  */
 abstract class BlockBase extends ContextAwarePluginBase implements BlockPluginInterface, PluginWithFormsInterface, PreviewFallbackInterface {
 
+  use ConfigurableTrait;
   use ContextAwarePluginAssignmentTrait;
   use MessengerTrait;
   use PluginWithFormsTrait;
@@ -51,21 +53,6 @@ public function label() {
     return (string) $definition['admin_label'];
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
-    $this->setConfiguration($configuration);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getConfiguration() {
-    return $this->configuration;
-  }
-
   /**
    * {@inheritdoc}
    */
@@ -92,13 +79,6 @@ protected function baseConfigurationDefaults() {
     ];
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function defaultConfiguration() {
-    return [];
-  }
-
   /**
    * {@inheritdoc}
    */
@@ -264,6 +244,7 @@ public function getPreviewFallbackString() {
    * 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..b0eaa085db 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\Component\Plugin\ConfigurableTrait;
 use Drupal\Core\Plugin\ContextAwarePluginAssignmentTrait;
 
 /**
@@ -19,6 +20,7 @@
  */
 abstract class ConditionPluginBase extends ExecutablePluginBase implements ConditionInterface {
 
+  use ConfigurableTrait;
   use ContextAwarePluginAssignmentTrait;
 
   /**
@@ -28,15 +30,6 @@
    */
   protected $executableManager;
 
-  /**
-   * {@inheritdoc}
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
-
-    $this->setConfiguration($configuration);
-  }
-
   /**
    * {@inheritdoc}
    */
@@ -93,14 +86,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..2cc8c485f4 100644
--- a/core/lib/Drupal/Core/Display/VariantBase.php
+++ b/core/lib/Drupal/Core/Display/VariantBase.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Core\Display;
 
+use Drupal\Component\Plugin\ConfigurableTrait;
 use Drupal\Core\Cache\RefinableCacheableDependencyTrait;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\PluginBase;
@@ -18,18 +19,10 @@
  */
 abstract class VariantBase extends PluginBase implements VariantInterface {
 
+  use ConfigurableTrait;
   use PluginDependencyTrait;
   use RefinableCacheableDependencyTrait;
 
-  /**
-   * {@inheritdoc}
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
-
-    $this->setConfiguration($configuration);
-  }
-
   /**
    * {@inheritdoc}
    */
@@ -74,14 +67,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..427f7010c6 100644
--- a/core/lib/Drupal/Core/Layout/LayoutDefault.php
+++ b/core/lib/Drupal/Core/Layout/LayoutDefault.php
@@ -2,7 +2,6 @@
 
 namespace Drupal\Core\Layout;
 
-use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Plugin\PluginBase;
 
 /**
@@ -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/modules/block/tests/src/Kernel/Migrate/d6/MigrateBlockTest.php b/core/modules/block/tests/src/Kernel/Migrate/d6/MigrateBlockTest.php
index feecea04c6..3b93f75e5d 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..3a3fc7d3d5 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\ContainerFactoryPluginInterface;
 use Drupal\Core\Plugin\PluginBase;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -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..25c374c749 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\Component\Plugin\ConfigurableTrait;
 
 /**
  * Provides a base implementation for a configurable Search plugin.
  */
 abstract class ConfigurableSearchPluginBase extends SearchPluginBase implements ConfigurableSearchPluginInterface {
 
+  use ConfigurableTrait;
+
   /**
    * The unique ID for the search page using this plugin.
    *
@@ -17,36 +19,6 @@
    */
   protected $searchPageId;
 
-  /**
-   * {@inheritdoc}
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
-    parent::__construct($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 959df2ebb5..2f0ba1ffb0 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\Component\Plugin\ConfigurableTrait;
 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 ConfigurableTrait;
   use PluginWithFormsTrait;
 
   /**
@@ -25,14 +27,6 @@
    */
   const VALID_ID_REGEX = '/[^a-z0-9_]+/';
 
-  /**
-   * {@inheritdoc}
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
-    $this->setConfiguration($configuration);
-  }
-
   /**
    * {@inheritdoc}
    */
@@ -57,13 +51,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 cd8b384614..ae7015ccfa 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\ConfigurableInterface;
 use Drupal\Component\Plugin\PluginBase;
+use Drupal\Component\Plugin\ConfigurableTrait;
 use Drupal\Core\Plugin\DefaultSingleLazyPluginCollection;
 
 /**
@@ -73,22 +74,6 @@ public function testGetInstanceIds() {
 
 class ConfigurablePlugin extends PluginBase implements ConfigurableInterface {
 
-  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;
-  }
+  use ConfigurableTrait;
 
 }
diff --git a/core/tests/Drupal/Tests/Core/Plugin/Fixtures/TestConfigurablePlugin.php b/core/tests/Drupal/Tests/Core/Plugin/Fixtures/TestConfigurablePlugin.php
index e31fba7b59..50252ba70c 100644
--- a/core/tests/Drupal/Tests/Core/Plugin/Fixtures/TestConfigurablePlugin.php
+++ b/core/tests/Drupal/Tests/Core/Plugin/Fixtures/TestConfigurablePlugin.php
@@ -5,29 +5,15 @@
 use Drupal\Component\Plugin\ConfigurableInterface;
 use Drupal\Component\Plugin\DependentPluginInterface;
 use Drupal\Component\Plugin\PluginBase;
+use Drupal\Component\Plugin\ConfigurableTrait;
 
+/**
+ * A fixture to test Configurable Plugins.
+ */
 class TestConfigurablePlugin extends PluginBase implements ConfigurableInterface, DependentPluginInterface {
 
-  /**
-   * {@inheritdoc}
-   */
-  public function getConfiguration() {
-    return $this->configuration;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setConfiguration(array $configuration) {
-    $this->configuration = $configuration;
-  }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function defaultConfiguration() {
-    return [];
-  }
+  use ConfigurableTrait;
 
   /**
    * {@inheritdoc}
