diff --git a/core/lib/Drupal/Component/Plugin/PluginSettingsBase.php b/core/lib/Drupal/Component/Plugin/PluginSettingsBase.php
new file mode 100644
index 0000000..fc48254
--- /dev/null
+++ b/core/lib/Drupal/Component/Plugin/PluginSettingsBase.php
@@ -0,0 +1,83 @@
+<?php
+
+/**
+ * @file
+ *
+ * Definition of Drupal\Component\Plugin\PluginSettingsBase.
+ */
+
+namespace Drupal\Component\Plugin;
+
+/**
+ * Base class for plugins wishing to support settings.
+ */
+abstract class PluginSettingsBase extends PluginBase implements PluginSettingsInterface {
+
+  protected $settings = array();
+
+  protected $defaultSettingsMerged = FALSE;
+
+  /**
+   * Implements Drupal\Component\Plugin\PluginSettingsInterface::getSettings().
+   */
+  public function getSettings() {
+    // Merge defaults before returning the array.
+    if (!$this->defaultSettingsMerged) {
+      $this->mergeDefaults();
+    }
+    return $this->settings;
+  }
+
+  /**
+   * Implements Drupal\Component\Plugin\PluginSettingsInterface::getSetting().
+   */
+  public function getSetting($name) {
+    // Merge defaults if we have no value for the key.
+    if (!$this->defaultSettingsMerged && !array_key_exists($name, $this->settings)) {
+      $this->mergeDefaults();
+    }
+    return isset($this->settings[$name]) ? $this->settings[$name] : NULL;
+  }
+
+  /**
+   * Implements Drupal\Component\Plugin\PluginSettingsInterface::getSettingsDefinition().
+   */
+  public function getSettingsDefinitions() {
+    $definition = $this->getDefinition();
+    return $definition['settings'];
+  }
+
+
+  public function getSettingsMatadata($key) {
+    $result = array();
+    foreach ($this->getSettingsDefinitions() as $name => $definition) {
+      $result[$name] = isset($definition[$key]) ? $definition[$key] : NULL;
+    }
+    return $result;
+  }
+
+  /**
+   * Implements Drupal\Component\Plugin\PluginSettingsInterface::setSettings().
+   */
+  public function setSettings(array $settings) {
+    $this->settings = $settings;
+    $this->defaultSettingsMerged = FALSE;
+    return $this;
+  }
+
+  /**
+   * Implements Drupal\Component\Plugin\PluginSettingsInterface::setSetting().
+   */
+  public function setSetting($name, $setting) {
+    $this->settings[$name] = $setting;
+    return $this;
+  }
+
+  /**
+   * Merges default settings values.
+   */
+  protected function mergeDefaults() {
+    $this->settings += $this->getSettingsMatadata('default');
+    $this->defaultSettingsMerged = TRUE;
+  }
+}
diff --git a/core/lib/Drupal/Component/Plugin/PluginSettingsInterface.php b/core/lib/Drupal/Component/Plugin/PluginSettingsInterface.php
new file mode 100644
index 0000000..ae57f49
--- /dev/null
+++ b/core/lib/Drupal/Component/Plugin/PluginSettingsInterface.php
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * @file
+ *
+ * Definition of Drupal\Component\Plugin\PluginSettingsInterface.
+ */
+
+namespace Drupal\Component\Plugin;
+
+/**
+ * Plugin interface providing settings management.
+ */
+interface PluginSettingsInterface extends PluginInspectionInterface {
+
+  /**
+   * Returns the array of settings, including defaults for missing settings.
+   *
+   * @return
+   *   The array of settings.
+   */
+  public function getSettings();
+
+  /**
+   * Returns the value of a setting, or the default value if absent.
+   *
+   * @param $name
+   *   The setting name
+   *
+   * @return
+   *   The setting value.
+   */
+  public function getSetting($name);
+
+  /**
+   * Returns the default settings for the Plugin.
+   *
+   * @return
+   *   The array of default setting values, keyed by setting names.
+   */
+  public function getDefaultSettings();
+
+  /**
+   * Sets the settings for the Plugin.
+   *
+   * @param $ŝettings
+   *   The array of settings, keyed by setting names. Missing settings will be
+   *   assigned their default values.
+   *
+   * @return PluginSettingsInterface
+   *   The Plugin itself.
+   */
+  public function setSettings(array $settings);
+
+  /**
+   * Sets the value of a setting for the Plugin.
+   *
+   * @param $name
+   *   The setting name.
+   * @param $setting
+   *   The setting value.
+   *
+   * @return PluginSettingsInterface
+   *   The Plugin itself.
+   */
+  public function setSetting($name, $setting);
+
+}
