diff --git a/core/lib/Drupal/Component/Plugin/DefaultPluginBag.php b/core/lib/Drupal/Component/Plugin/DefaultPluginBag.php
index ba87dfb..d8651e6 100644
--- a/core/lib/Drupal/Component/Plugin/DefaultPluginBag.php
+++ b/core/lib/Drupal/Component/Plugin/DefaultPluginBag.php
@@ -101,7 +101,11 @@ public function sortHelper($aID, $bID) {
   }
 
   /**
-   * {@inheritdoc}
+   * Returns the current configuration of all plugins in this bag.
+   *
+   * @return array
+   *   An associative array keyed by instance ID, whose values are up-to-date
+   *   plugin configurations.
    */
   public function getConfiguration() {
     $instances = array();
@@ -128,16 +132,6 @@ public function getConfiguration() {
   /**
    * {@inheritdoc}
    */
-  public function setConfiguration($configuration) {
-    foreach ($configuration as $instance_id => $instance_configuration) {
-      $this->setInstanceConfiguration($instance_id, $instance_configuration);
-    }
-    return $this;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function setInstanceIds(array $instance_ids) {
     parent::setInstanceIds($instance_ids);
     // Ensure the new order matches the original order.
@@ -155,7 +149,7 @@ public function setInstanceIds(array $instance_ids) {
    * @param array $configuration
    *   The plugin configuration to set.
    */
-  public function setInstanceConfiguration($instance_id, array $configuration) {
+  public function setConfiguration($instance_id, array $configuration) {
     $this->configurations[$instance_id] = $configuration;
     $instance = $this->get($instance_id);
     if ($instance instanceof ConfigurablePluginInterface) {
diff --git a/core/lib/Drupal/Component/Plugin/DefaultSinglePluginBag.php b/core/lib/Drupal/Component/Plugin/DefaultSinglePluginBag.php
index 469b567..468b803 100644
--- a/core/lib/Drupal/Component/Plugin/DefaultSinglePluginBag.php
+++ b/core/lib/Drupal/Component/Plugin/DefaultSinglePluginBag.php
@@ -7,6 +7,8 @@
 
 namespace Drupal\Component\Plugin;
 
+use Drupal\Component\Utility\MapArray;
+
 /**
  * Provides a default plugin bag for a plugin type.
  *
@@ -33,27 +35,18 @@ class DefaultSinglePluginBag extends PluginBag {
   protected $configuration;
 
   /**
-   * The instance ID used for this plugin bag.
-   *
-   * @var string
-   */
-  protected $instanceId;
-
-  /**
    * Constructs a new DefaultSinglePluginBag object.
    *
    * @param \Drupal\Component\Plugin\PluginManagerInterface $manager
    *   The manager to be used for instantiating plugins.
-   * @param string $instance_id
-   *   The ID of the plugin instance.
+   * @param array $instance_ids
+   *   The IDs of the plugin instances with which we are dealing.
    * @param array $configuration
    *   An array of configuration.
    */
-  public function __construct(PluginManagerInterface $manager, $instance_id, array $configuration) {
+  public function __construct(PluginManagerInterface $manager, array $instance_ids, array $configuration) {
     $this->manager = $manager;
-    $this->instanceId = $instance_id;
-    // This is still needed by the parent PluginBag class.
-    $this->instanceIDs = array($instance_id => $instance_id);
+    $this->instanceIDs = MapArray::copyValuesToKeys($instance_ids);
     $this->configuration = $configuration;
   }
 
@@ -64,29 +57,4 @@ protected function initializePlugin($instance_id) {
     $this->set($instance_id, $this->manager->createInstance($instance_id, $this->configuration));
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function getConfiguration() {
-    $plugin = $this->get($this->instanceId);
-    if ($plugin instanceof ConfigurablePluginInterface) {
-      return $plugin->getConfiguration();
-    }
-    else {
-      return $this->configuration;
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setConfiguration($configuration) {
-    $plugin = $this->get($this->instanceId);
-    if ($plugin instanceof ConfigurablePluginInterface) {
-      $plugin->setConfiguration($configuration);
-    }
-    $this->configuration = $configuration;
-    return $this;
-  }
-
 }
diff --git a/core/lib/Drupal/Component/Plugin/PluginBag.php b/core/lib/Drupal/Component/Plugin/PluginBag.php
index 977cab2..960eb52 100644
--- a/core/lib/Drupal/Component/Plugin/PluginBag.php
+++ b/core/lib/Drupal/Component/Plugin/PluginBag.php
@@ -35,24 +35,6 @@
   abstract protected function initializePlugin($instance_id);
 
   /**
-   * Returns the current configuration of all plugins in this bag.
-   *
-   * @return array
-   *   An array of up-to-date plugin configuration.
-   */
-  abstract public function getConfiguration();
-
-  /**
-   * Sets the configuration for all plugins in this bag.
-   *
-   * @param array $configuration
-   *   An array of up-to-date plugin configuration.
-   *
-   * @return $this
-   */
-  abstract public function setConfiguration($configuration);
-
-  /**
    * Clears all instantiated plugins.
    */
   public function clear() {
diff --git a/core/lib/Drupal/Core/Action/ActionInterface.php b/core/lib/Drupal/Core/Action/ActionInterface.php
index a53d7bb..0620416 100644
--- a/core/lib/Drupal/Core/Action/ActionInterface.php
+++ b/core/lib/Drupal/Core/Action/ActionInterface.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\Core\Action;
 
-use Drupal\Component\Plugin\PluginInspectionInterface;
 use Drupal\Core\Executable\ExecutableInterface;
 
 /**
@@ -16,7 +15,7 @@
  * @see \Drupal\Core\Annotation\Action
  * @see \Drupal\Core\Action\ActionManager
  */
-interface ActionInterface extends ExecutableInterface, PluginInspectionInterface {
+interface ActionInterface extends ExecutableInterface {
 
   /**
    * Executes the plugin for an array of objects.
diff --git a/core/lib/Drupal/Core/Config/ConfigManager.php b/core/lib/Drupal/Core/Config/ConfigManager.php
index 65a7846..b94b39f 100644
--- a/core/lib/Drupal/Core/Config/ConfigManager.php
+++ b/core/lib/Drupal/Core/Config/ConfigManager.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Core\Config;
 
+use Drupal\Core\Config\Entity\ConfigEntityTypeInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\StringTranslation\TranslationManager;
@@ -63,7 +64,7 @@ public function __construct(EntityManagerInterface $entity_manager, ConfigFactor
    */
   public function getEntityTypeIdByName($name) {
     $entities = array_filter($this->entityManager->getDefinitions(), function (EntityTypeInterface $entity_type) use ($name) {
-      return ($config_prefix = $entity_type->getConfigPrefix()) && strpos($name, $config_prefix . '.') === 0;
+      return ($entity_type instanceof ConfigEntityTypeInterface && $config_prefix = $entity_type->getConfigPrefix()) && strpos($name, $config_prefix . '.') === 0;
     });
     return key($entities);
   }
diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php
index 42ad63e..e8dcff4 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php
@@ -28,20 +28,6 @@
   protected $originalId;
 
   /**
-   * The name of the property that is used to store plugin configuration.
-   *
-   * This is needed when the entity utilizes a PluginBag, to dictate where the
-   * plugin configuration should be stored.
-   *
-   * @todo Move this to a trait along with
-   *   \Drupal\Core\Config\Entity\EntityWithPluginBagInterface, and give it a
-   *   default value of 'configuration'.
-   *
-   * @var string
-   */
-  protected $pluginConfigKey;
-
-  /**
    * The enabled/disabled status of the configuration entity.
    *
    * @var bool
@@ -115,15 +101,6 @@ public function get($property_name) {
    * {@inheritdoc}
    */
   public function set($property_name, $value) {
-    // @todo When \Drupal\Core\Config\Entity\EntityWithPluginBagInterface moves
-    //   to a trait, switch to class_uses() instead.
-    if ($this instanceof EntityWithPluginBagInterface) {
-      if ($property_name == $this->pluginConfigKey) {
-        // If external code updates the settings, pass it along to the plugin.
-        $this->getPluginBag()->setConfiguration($value);
-      }
-    }
-
     $this->{$property_name} = $value;
   }
 
@@ -215,14 +192,6 @@ public function getExportProperties() {
   public function preSave(EntityStorageControllerInterface $storage_controller) {
     parent::preSave($storage_controller);
 
-    // @todo When \Drupal\Core\Config\Entity\EntityWithPluginBagInterface moves
-    //   to a trait, switch to class_uses() instead.
-    if ($this instanceof EntityWithPluginBagInterface) {
-      // Any changes to the plugin configuration must be saved to the entity's
-      // copy as well.
-      $this->set($this->pluginConfigKey, $this->getPluginBag()->getConfiguration());
-    }
-
     // Ensure this entity's UUID does not exist with a different ID, regardless
     // of whether it's new or updated.
     $matching_entities = $storage_controller->getQuery()
diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityType.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityType.php
index e8f8088..ca021a9 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigEntityType.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigEntityType.php
@@ -12,10 +12,17 @@
 /**
  * Provides an implementation of a config entity type and its metadata.
  */
-class ConfigEntityType extends EntityType {
+class ConfigEntityType extends EntityType implements ConfigEntityTypeInterface {
 
   /**
-   * Returns the config prefix used by the configuration entity type.
+   * The config prefix set in the configuration entity type annotation.
+   *
+   * The default configuration prefix is constructed from the name of the module
+   * that provides the entity type and the ID of the entity type. If a
+   * config_prefix annotation is present it will be used in place of the entity
+   * type ID.
+   *
+   * @see \Drupal\Core\Config\Entity\ConfigEntityType::getConfigPrefix()
    *
    * @var string
    */
@@ -40,11 +47,6 @@ public function getConfigPrefix() {
     else {
       $config_prefix = $this->id();
     }
-    // Ensure that all configuration entities are prefixed by the module that
-    // provides the configuration entity type. This ensures that default
-    // configuration will be created as expected during module install and
-    // dependencies can be calculated without the modules that provide the
-    // entity types being installed.
     return $this->provider . '.' . $config_prefix;
   }
 
diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityTypeInterface.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityTypeInterface.php
new file mode 100644
index 0000000..cecd63b
--- /dev/null
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigEntityTypeInterface.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Config\Entity\ConfigEntityTypeInterface.
+ */
+
+namespace Drupal\Core\Config\Entity;
+
+/**
+ * Provides an interface for a configuration entity type and its metadata.
+ *
+ * @see \Drupal\Core\Entity\EntityTypeInterface
+ */
+interface ConfigEntityTypeInterface {
+
+  /**
+   * Gets the configuration name prefix.
+   *
+   * Ensures that all configuration entities are prefixed by the module that
+   * provides the configuration entity type. This ensures that if a
+   * configuration entity is contained in a extension's default configuration it
+   * be created during extension installation. Additionally, it allows
+   * dependencies to be calculated without the modules that provide configuration
+   * entity types being installed.
+   *
+   * @return string
+   *   The configuration entity prefix
+   */
+  public function getConfigPrefix();
+
+}
diff --git a/core/lib/Drupal/Core/Config/Entity/EntityWithPluginBagInterface.php b/core/lib/Drupal/Core/Config/Entity/EntityWithPluginBagInterface.php
deleted file mode 100644
index 44c5958..0000000
--- a/core/lib/Drupal/Core/Config/Entity/EntityWithPluginBagInterface.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Config\Entity\EntityWithPluginBagInterface.
- */
-
-namespace Drupal\Core\Config\Entity;
-
-/**
- * Provides an interface for an object utilizing a plugin bag.
- *
- * @see \Drupal\Component\Plugin\PluginBag
- *
- * @todo Turn this into a trait.
- */
-interface EntityWithPluginBagInterface extends ConfigEntityInterface {
-
-  /**
-   * Returns the plugin bag used by this entity.
-   *
-   * @return \Drupal\Component\Plugin\PluginBag
-   *
-   * @todo Make this protected.
-   */
-  public function getPluginBag();
-
-}
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityType.php b/core/lib/Drupal/Core/Entity/ContentEntityType.php
index 14f7ee2..1c2ccb2 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityType.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityType.php
@@ -21,11 +21,4 @@ public function getControllerClasses() {
     );
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function getConfigPrefix() {
-    return FALSE;
-  }
-
 }
diff --git a/core/lib/Drupal/Core/Entity/EntityFormController.php b/core/lib/Drupal/Core/Entity/EntityFormController.php
index 58d9035..440aa50 100644
--- a/core/lib/Drupal/Core/Entity/EntityFormController.php
+++ b/core/lib/Drupal/Core/Entity/EntityFormController.php
@@ -359,7 +359,15 @@ public function buildEntity(array $form, array &$form_state) {
     // controller of the current request.
     $form_state['controller'] = $this;
 
-    $this->copyFormValuesToEntity($entity, $form_state);
+    // Copy top-level form values to entity properties, without changing
+    // existing entity properties that are not being edited by
+    // this form.
+    // @todo: This relies on a method that only exists for config and content
+    //   entities, in a different way. Consider moving this logic to a config
+    //   entity specific implementation.
+    foreach ($form_state['values'] as $key => $value) {
+      $entity->set($key, $value);
+    }
 
     // Invoke all specified builders for copying form values to entity
     // properties.
@@ -373,26 +381,6 @@ public function buildEntity(array $form, array &$form_state) {
   }
 
   /**
-   * Copies top-level form values to entity properties
-   *
-   * This should not change existing entity properties that are not being edited
-   * by this form.
-   *
-   * @param \Drupal\Core\Entity\EntityInterface $entity
-   *   The entity the current form should operate upon.
-   * @param array $form_state
-   *   An associative array containing the current state of the form.
-   */
-  protected function copyFormValuesToEntity(EntityInterface $entity, array $form_state) {
-    // @todo: This relies on a method that only exists for config and content
-    //   entities, in a different way. Consider moving this logic to a config
-    //   entity specific implementation.
-    foreach ($form_state['values'] as $key => $value) {
-      $entity->set($key, $value);
-    }
-  }
-
-  /**
    * {@inheritdoc}
    */
   public function getEntity() {
diff --git a/core/lib/Drupal/Core/Entity/EntityType.php b/core/lib/Drupal/Core/Entity/EntityType.php
index 4eae0df..a2001de 100644
--- a/core/lib/Drupal/Core/Entity/EntityType.php
+++ b/core/lib/Drupal/Core/Entity/EntityType.php
@@ -533,13 +533,6 @@ public function isTranslatable() {
   /**
    * {@inheritdoc}
    */
-  public function getConfigPrefix() {
-    return FALSE;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getRevisionDataTable() {
     return isset($this->revision_data_table) ? $this->revision_data_table : FALSE;
   }
diff --git a/core/lib/Drupal/Core/Entity/EntityTypeInterface.php b/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
index 857d3e7..79b4144 100644
--- a/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
@@ -527,16 +527,6 @@ public function getBaseTable();
   public function isTranslatable();
 
   /**
-   * Returns the config prefix used by the configuration entity type.
-   *
-   * @todo Used for configuration entities only.
-   *
-   * @return string|bool
-   *   The config prefix, or FALSE if not a configuration entity type.
-   */
-  public function getConfigPrefix();
-
-  /**
    * Returns the name of the entity's revision data table.
    *
    * @todo Used by FieldableDatabaseStorageController only.
diff --git a/core/misc/batch.js b/core/misc/batch.js
index ee6cf68..62ff1ea 100644
--- a/core/misc/batch.js
+++ b/core/misc/batch.js
@@ -11,7 +11,7 @@
   Drupal.behaviors.batch = {
     attach: function (context, settings) {
       var batch = settings.batch;
-      var $progress = $('[data-drupal-progress]').once('batch');
+      var $progress = $('#progress').once('batch');
       var progressBar;
 
       // Success: redirect to the summary.
diff --git a/core/modules/block/lib/Drupal/block/BlockBase.php b/core/modules/block/lib/Drupal/block/BlockBase.php
index d278663..48e469b 100644
--- a/core/modules/block/lib/Drupal/block/BlockBase.php
+++ b/core/modules/block/lib/Drupal/block/BlockBase.php
@@ -108,10 +108,6 @@ public function buildConfigurationForm(array $form, array &$form_state) {
       '#default_value' => ($this->configuration['label_display'] === BlockInterface::BLOCK_LABEL_VISIBLE),
       '#return_value' => BlockInterface::BLOCK_LABEL_VISIBLE,
     );
-    $form['cache'] = array(
-      '#type' => 'value',
-      '#value' => $this->configuration['cache'],
-    );
 
     // Add plugin-specific settings for this block type.
     $form += $this->blockForm($form, $form_state);
diff --git a/core/modules/block/lib/Drupal/block/BlockPluginBag.php b/core/modules/block/lib/Drupal/block/BlockPluginBag.php
index 51f927a..9bd948d 100644
--- a/core/modules/block/lib/Drupal/block/BlockPluginBag.php
+++ b/core/modules/block/lib/Drupal/block/BlockPluginBag.php
@@ -25,19 +25,10 @@ class BlockPluginBag extends DefaultSinglePluginBag {
   protected $blockId;
 
   /**
-   * Constructs a new BlockPluginBag.
-   *
-   * @param \Drupal\Component\Plugin\PluginManagerInterface $manager
-   *   The manager to be used for instantiating plugins.
-   * @param string $instance_id
-   *   The ID of the plugin instance.
-   * @param array $configuration
-   *   An array of configuration.
-   * @param string $block_id
-   *   The unique ID of the block entity using this plugin.
+   * {@inheritdoc}
    */
-  public function __construct(PluginManagerInterface $manager, $instance_id, array $configuration, $block_id) {
-    parent::__construct($manager, $instance_id, $configuration);
+  public function __construct(PluginManagerInterface $manager, array $instance_ids, array $configuration, $block_id) {
+    parent::__construct($manager, $instance_ids, $configuration);
 
     $this->blockId = $block_id;
   }
diff --git a/core/modules/block/lib/Drupal/block/Entity/Block.php b/core/modules/block/lib/Drupal/block/Entity/Block.php
index d4e3039..32e3f9b 100644
--- a/core/modules/block/lib/Drupal/block/Entity/Block.php
+++ b/core/modules/block/lib/Drupal/block/Entity/Block.php
@@ -10,7 +10,7 @@
 use Drupal\Core\Config\Entity\ConfigEntityBase;
 use Drupal\block\BlockPluginBag;
 use Drupal\block\BlockInterface;
-use Drupal\Core\Config\Entity\EntityWithPluginBagInterface;
+use Drupal\Core\Entity\EntityStorageControllerInterface;
 
 /**
  * Defines a Block configuration entity class.
@@ -40,7 +40,7 @@
  *   }
  * )
  */
-class Block extends ConfigEntityBase implements BlockInterface, EntityWithPluginBagInterface {
+class Block extends ConfigEntityBase implements BlockInterface {
 
   /**
    * The ID of the block.
@@ -92,11 +92,6 @@ class Block extends ConfigEntityBase implements BlockInterface, EntityWithPlugin
   protected $pluginBag;
 
   /**
-   * {@inheritdoc}
-   */
-  protected $pluginConfigKey = 'settings';
-
-  /**
    * The visibility settings.
    *
    * @var array
@@ -104,20 +99,19 @@ class Block extends ConfigEntityBase implements BlockInterface, EntityWithPlugin
   protected $visibility;
 
   /**
-   * {@inheritdoc}
+   * Overrides \Drupal\Core\Config\Entity\ConfigEntityBase::__construct();
    */
-  public function getPlugin() {
-    return $this->getPluginBag()->get($this->plugin);
+  public function __construct(array $values, $entity_type) {
+    parent::__construct($values, $entity_type);
+
+    $this->pluginBag = new BlockPluginBag(\Drupal::service('plugin.manager.block'), array($this->plugin), $this->get('settings'), $this->id());
   }
 
   /**
    * {@inheritdoc}
    */
-  public function getPluginBag() {
-    if (!$this->pluginBag) {
-      $this->pluginBag = new BlockPluginBag(\Drupal::service('plugin.manager.block'), $this->plugin, $this->get('settings'), $this->id());
-    }
-    return $this->pluginBag;
+  public function getPlugin() {
+    return $this->pluginBag->get($this->plugin);
   }
 
   /**
@@ -154,6 +148,15 @@ public function getExportProperties() {
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function preSave(EntityStorageControllerInterface $storage_controller) {
+    parent::preSave($storage_controller);
+
+    $this->set('settings', $this->getPlugin()->getConfiguration());
+  }
+
+  /**
    * Sorts active blocks by weight; sorts inactive blocks by name.
    */
   public static function sort($a, $b) {
diff --git a/core/modules/block/lib/Drupal/block/Tests/BlockInterfaceTest.php b/core/modules/block/lib/Drupal/block/Tests/BlockInterfaceTest.php
index a694b4e..3f22caa 100644
--- a/core/modules/block/lib/Drupal/block/Tests/BlockInterfaceTest.php
+++ b/core/modules/block/lib/Drupal/block/Tests/BlockInterfaceTest.php
@@ -83,10 +83,6 @@ public function testBlockInterface() {
         '#default_value' => TRUE,
         '#return_value' => 'visible',
       ),
-      'cache' => array(
-        '#type' => 'value',
-        '#value' => DRUPAL_NO_CACHE,
-      ),
       'display_message' => array(
         '#type' => 'textfield',
         '#title' => t('Display message'),
diff --git a/core/modules/config/lib/Drupal/config/Form/ConfigSingleExportForm.php b/core/modules/config/lib/Drupal/config/Form/ConfigSingleExportForm.php
index 2f146c6..5fbc34d 100644
--- a/core/modules/config/lib/Drupal/config/Form/ConfigSingleExportForm.php
+++ b/core/modules/config/lib/Drupal/config/Form/ConfigSingleExportForm.php
@@ -8,6 +8,7 @@
 namespace Drupal\config\Form;
 
 use Drupal\Component\Utility\MapArray;
+use Drupal\Core\Config\Entity\ConfigEntityTypeInterface;
 use Drupal\Core\Config\StorageInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
@@ -75,7 +76,7 @@ public function getFormID() {
    */
   public function buildForm(array $form, array &$form_state, $config_type = NULL, $config_name = NULL) {
     foreach ($this->entityManager->getDefinitions() as $entity_type => $definition) {
-      if ($definition->getConfigPrefix() && $definition->hasKey('uuid')) {
+      if ($definition instanceof ConfigEntityTypeInterface && $definition->hasKey('uuid')) {
         $this->definitions[$entity_type] = $definition;
       }
     }
diff --git a/core/modules/config/lib/Drupal/config/Form/ConfigSingleImportForm.php b/core/modules/config/lib/Drupal/config/Form/ConfigSingleImportForm.php
index 8f0d076..95b30ed 100644
--- a/core/modules/config/lib/Drupal/config/Form/ConfigSingleImportForm.php
+++ b/core/modules/config/lib/Drupal/config/Form/ConfigSingleImportForm.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\config\Form;
 
+use Drupal\Core\Config\Entity\ConfigEntityTypeInterface;
 use Drupal\Core\Config\StorageInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Form\ConfirmFormBase;
@@ -122,7 +123,7 @@ public function buildForm(array $form, array &$form_state) {
 
     $entity_types = array();
     foreach ($this->entityManager->getDefinitions() as $entity_type => $definition) {
-      if ($definition->getConfigPrefix() && $definition->hasKey('uuid')) {
+      if ($definition instanceof ConfigEntityTypeInterface && $definition->hasKey('uuid')) {
         $entity_types[$entity_type] = $definition->getLabel();
       }
     }
diff --git a/core/modules/config_translation/tests/Drupal/config_translation/Tests/ConfigEntityMapperTest.php b/core/modules/config_translation/tests/Drupal/config_translation/Tests/ConfigEntityMapperTest.php
index b7ed1f5..0c9db6a 100644
--- a/core/modules/config_translation/tests/Drupal/config_translation/Tests/ConfigEntityMapperTest.php
+++ b/core/modules/config_translation/tests/Drupal/config_translation/Tests/ConfigEntityMapperTest.php
@@ -48,6 +48,12 @@ class ConfigEntityMapperTest extends UnitTestCase {
   protected $routeProvider;
 
   /**
+   * The entity used for testing.
+   *
+   * @var \Drupal\Core\Config\Entity\ConfigEntityType|\PHPUnit_Framework_MockObject_MockObject
+   */
+
+  /**
    * {@inheritdoc}
    */
   public static function getInfo() {
@@ -93,6 +99,10 @@ public function setUp() {
       $this->getStringTranslationStub(),
       $this->entityManager
     );
+
+    $this->entityType = $this->getMockBuilder('Drupal\Core\Config\Entity\ConfigEntityType')
+      ->disableOriginalConstructor()
+      ->getMock();
   }
 
   /**
@@ -105,12 +115,11 @@ public function testSetEntity() {
       ->with()
       ->will($this->returnValue('entity_id'));
 
-    $entity_type = $this->getMock('Drupal\Core\Entity\EntityTypeInterface');
     $this->entityManager
       ->expects($this->once())
       ->method('getDefinition')
       ->with('language_entity')
-      ->will($this->returnValue($entity_type));
+      ->will($this->returnValue($this->entityType));
 
     $result = $this->configEntityMapper->setEntity($this->entity);
     $this->assertTrue($result);
@@ -124,12 +133,11 @@ public function testSetEntity() {
    * Tests ConfigEntityMapper::getOverviewRouteParameters().
    */
   public function testGetOverviewRouteParameters() {
-    $entity_type = $this->getMock('Drupal\Core\Entity\EntityTypeInterface');
     $this->entityManager
       ->expects($this->once())
       ->method('getDefinition')
       ->with('language_entity')
-      ->will($this->returnValue($entity_type));
+      ->will($this->returnValue($this->entityType));
     $this->configEntityMapper->setEntity($this->entity);
 
     $this->entity
@@ -155,15 +163,14 @@ public function testGetType() {
    * Tests ConfigEntityMapper::getTypeName().
    */
   public function testGetTypeName() {
-    $entity_type = $this->getMock('Drupal\Core\Entity\EntityTypeInterface');
-    $entity_type->expects($this->once())
+    $this->entityType->expects($this->once())
       ->method('getLabel')
       ->will($this->returnValue('test'));
     $this->entityManager
       ->expects($this->once())
       ->method('getDefinition')
       ->with('language_entity')
-      ->will($this->returnValue($entity_type));
+      ->will($this->returnValue($this->entityType));
 
     $result = $this->configEntityMapper->getTypeName();
     $this->assertSame('test', $result);
@@ -173,15 +180,14 @@ public function testGetTypeName() {
    * Tests ConfigEntityMapper::getTypeLabel().
    */
   public function testGetTypeLabel() {
-    $entity_type = $this->getMock('Drupal\Core\Entity\EntityTypeInterface');
-    $entity_type->expects($this->once())
+    $this->entityType->expects($this->once())
       ->method('getLabel')
       ->will($this->returnValue('test'));
     $this->entityManager
       ->expects($this->once())
       ->method('getDefinition')
       ->with('language_entity')
-      ->will($this->returnValue($entity_type));
+      ->will($this->returnValue($this->entityType));
 
     $result = $this->configEntityMapper->getTypeLabel();
     $this->assertSame('test', $result);
diff --git a/core/modules/file/file.js b/core/modules/file/file.js
index d10f6e1..70241a1 100644
--- a/core/modules/file/file.js
+++ b/core/modules/file/file.js
@@ -7,7 +7,7 @@
  * prevents separate file fields from accidentally uploading files).
  */
 
-(function ($, Drupal) {
+(function ($) {
 
   "use strict";
 
@@ -17,6 +17,7 @@
   Drupal.behaviors.fileValidateAutoAttach = {
     attach: function (context, settings) {
       var $context = $(context);
+      var validateExtension = Drupal.file.validateExtension;
       var elements;
 
       function initFileValidation (selector) {
@@ -32,6 +33,7 @@
     },
     detach: function (context, settings, trigger) {
       var $context = $(context);
+      var validateExtension = Drupal.file.validateExtension;
       var elements;
 
       function removeFileValidation (selector) {
@@ -193,4 +195,4 @@
     }
   };
 
-})(jQuery, Drupal);
+})(jQuery);
diff --git a/core/modules/filter/lib/Drupal/filter/Entity/FilterFormat.php b/core/modules/filter/lib/Drupal/filter/Entity/FilterFormat.php
index 11a4675..0ed9249 100644
--- a/core/modules/filter/lib/Drupal/filter/Entity/FilterFormat.php
+++ b/core/modules/filter/lib/Drupal/filter/Entity/FilterFormat.php
@@ -9,7 +9,6 @@
 
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Config\Entity\ConfigEntityBase;
-use Drupal\Core\Config\Entity\EntityWithPluginBagInterface;
 use Drupal\Core\Entity\EntityStorageControllerInterface;
 use Drupal\filter\FilterFormatInterface;
 use Drupal\filter\FilterBag;
@@ -45,7 +44,7 @@
  *   }
  * )
  */
-class FilterFormat extends ConfigEntityBase implements FilterFormatInterface, EntityWithPluginBagInterface {
+class FilterFormat extends ConfigEntityBase implements FilterFormatInterface {
 
   /**
    * Unique machine name of the format.
@@ -137,11 +136,6 @@ class FilterFormat extends ConfigEntityBase implements FilterFormatInterface, En
   /**
    * {@inheritdoc}
    */
-  protected $pluginConfigKey = 'filters';
-
-  /**
-   * {@inheritdoc}
-   */
   public function id() {
     return $this->format;
   }
@@ -150,20 +144,12 @@ public function id() {
    * {@inheritdoc}
    */
   public function filters($instance_id = NULL) {
-    $filter_bag = $this->getPluginBag();
-    if (isset($instance_id)) {
-      return $filter_bag->get($instance_id);
-    }
-    return $filter_bag;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getPluginBag() {
     if (!isset($this->filterBag)) {
       $this->filterBag = new FilterBag(\Drupal::service('plugin.manager.filter'), $this->filters);
     }
+    if (isset($instance_id)) {
+      return $this->filterBag->get($instance_id);
+    }
     return $this->filterBag;
   }
 
@@ -173,7 +159,7 @@ public function getPluginBag() {
   public function setFilterConfig($instance_id, array $configuration) {
     $this->filters[$instance_id] = $configuration;
     if (isset($this->filterBag)) {
-      $this->filterBag->setInstanceConfiguration($instance_id, $configuration);
+      $this->filterBag->setConfiguration($instance_id, $configuration);
     }
     return $this;
   }
@@ -183,13 +169,9 @@ public function setFilterConfig($instance_id, array $configuration) {
    */
   public function getExportProperties() {
     $properties = parent::getExportProperties();
-    // @todo Make self::$weight and self::$cache protected and add them here.
-    $names = array(
-      'filters',
-    );
-    foreach ($names as $name) {
-      $properties[$name] = $this->get($name);
-    }
+    // Sort and export the configuration of all filters.
+    $properties['filters'] = $this->filters()->sort()->getConfiguration();
+
     return $properties;
   }
 
@@ -213,9 +195,6 @@ public function disable() {
    * {@inheritdoc}
    */
   public function preSave(EntityStorageControllerInterface $storage_controller) {
-    // Ensure the filters have been sorted before saving.
-    $this->filters()->sort();
-
     parent::preSave($storage_controller);
 
     $this->name = trim($this->label());
diff --git a/core/modules/filter/lib/Drupal/filter/Plugin/Filter/FilterHtml.php b/core/modules/filter/lib/Drupal/filter/Plugin/Filter/FilterHtml.php
index a7c73c4..a49f5f4 100644
--- a/core/modules/filter/lib/Drupal/filter/Plugin/Filter/FilterHtml.php
+++ b/core/modules/filter/lib/Drupal/filter/Plugin/Filter/FilterHtml.php
@@ -18,8 +18,8 @@
  *   type = Drupal\filter\Plugin\FilterInterface::TYPE_HTML_RESTRICTOR,
  *   settings = {
  *     "allowed_html" = "<a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd> <h4> <h5> <h6>",
- *     "filter_html_help" = TRUE,
- *     "filter_html_nofollow" = FALSE
+ *     "filter_html_help" = 1,
+ *     "filter_html_nofollow" = 0
  *   },
  *   weight = -10
  * )
diff --git a/core/modules/image/lib/Drupal/image/Entity/ImageStyle.php b/core/modules/image/lib/Drupal/image/Entity/ImageStyle.php
index 6e5babd..6938d38 100644
--- a/core/modules/image/lib/Drupal/image/Entity/ImageStyle.php
+++ b/core/modules/image/lib/Drupal/image/Entity/ImageStyle.php
@@ -8,7 +8,6 @@
 namespace Drupal\image\Entity;
 
 use Drupal\Core\Config\Entity\ConfigEntityBase;
-use Drupal\Core\Config\Entity\EntityWithPluginBagInterface;
 use Drupal\Core\Entity\EntityStorageControllerInterface;
 use Drupal\image\ImageEffectBag;
 use Drupal\image\ImageEffectInterface;
@@ -46,7 +45,7 @@
  *   }
  * )
  */
-class ImageStyle extends ConfigEntityBase implements ImageStyleInterface, EntityWithPluginBagInterface {
+class ImageStyle extends ConfigEntityBase implements ImageStyleInterface {
 
   /**
    * The name of the image style to use as replacement upon delete.
@@ -91,11 +90,6 @@ class ImageStyle extends ConfigEntityBase implements ImageStyleInterface, Entity
   protected $effectsBag;
 
   /**
-   * {@inheritdoc}
-   */
-  protected $pluginConfigKey = 'effects';
-
-  /**
    * Overrides Drupal\Core\Entity\Entity::id().
    */
   public function id() {
@@ -364,13 +358,6 @@ public function getEffects() {
   /**
    * {@inheritdoc}
    */
-  public function getPluginBag() {
-    return $this->getEffects();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function saveImageEffect(array $configuration) {
     $effect_id = $this->getEffects()->updateConfiguration($configuration);
     $this->save();
@@ -382,12 +369,7 @@ public function saveImageEffect(array $configuration) {
    */
   public function getExportProperties() {
     $properties = parent::getExportProperties();
-    $names = array(
-      'effects',
-    );
-    foreach ($names as $name) {
-      $properties[$name] = $this->get($name);
-    }
+    $properties['effects'] = $this->getEffects()->getConfiguration();
     return $properties;
   }
 
@@ -412,5 +394,4 @@ public function setName($name) {
     $this->set('name', $name);
     return $this;
   }
-
 }
diff --git a/core/modules/image/lib/Drupal/image/Form/ImageStyleEditForm.php b/core/modules/image/lib/Drupal/image/Form/ImageStyleEditForm.php
index a589feb..c00b009 100644
--- a/core/modules/image/lib/Drupal/image/Form/ImageStyleEditForm.php
+++ b/core/modules/image/lib/Drupal/image/Form/ImageStyleEditForm.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\image\Form;
 
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityStorageControllerInterface;
 use Drupal\image\ConfigurableImageEffectInterface;
 use Drupal\image\ImageEffectManager;
@@ -249,16 +248,4 @@ protected function updateEffectWeights(array $effects) {
     }
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  protected function copyFormValuesToEntity(EntityInterface $entity, array $form_state) {
-    foreach ($form_state['values'] as $key => $value) {
-      // Do not copy effects here, see self::updateEffectWeights().
-      if ($key != 'effects') {
-        $entity->set($key, $value);
-      }
-    }
-  }
-
 }
diff --git a/core/modules/image/lib/Drupal/image/ImageEffectBag.php b/core/modules/image/lib/Drupal/image/ImageEffectBag.php
index 97201ec..f75c7cc 100644
--- a/core/modules/image/lib/Drupal/image/ImageEffectBag.php
+++ b/core/modules/image/lib/Drupal/image/ImageEffectBag.php
@@ -42,7 +42,7 @@ public function updateConfiguration(array $configuration) {
       $configuration['uuid'] = $uuid_generator->generate();
     }
     $instance_id = $configuration['uuid'];
-    $this->setInstanceConfiguration($instance_id, $configuration);
+    $this->setConfiguration($instance_id, $configuration);
     $this->addInstanceId($instance_id);
     return $instance_id;
   }
diff --git a/core/modules/search/lib/Drupal/search/Entity/SearchPage.php b/core/modules/search/lib/Drupal/search/Entity/SearchPage.php
index 45b249d..b63fa96 100644
--- a/core/modules/search/lib/Drupal/search/Entity/SearchPage.php
+++ b/core/modules/search/lib/Drupal/search/Entity/SearchPage.php
@@ -8,7 +8,6 @@
 namespace Drupal\search\Entity;
 
 use Drupal\Core\Config\Entity\ConfigEntityBase;
-use Drupal\Core\Config\Entity\EntityWithPluginBagInterface;
 use Drupal\Core\Entity\EntityStorageControllerInterface;
 use Drupal\Component\Plugin\ConfigurablePluginInterface;
 use Drupal\search\Plugin\SearchIndexingInterface;
@@ -50,7 +49,7 @@
  *   }
  * )
  */
-class SearchPage extends ConfigEntityBase implements SearchPageInterface, EntityWithPluginBagInterface {
+class SearchPage extends ConfigEntityBase implements SearchPageInterface {
 
   /**
    * The name (plugin ID) of the search page entity.
@@ -113,23 +112,17 @@ class SearchPage extends ConfigEntityBase implements SearchPageInterface, Entity
   /**
    * {@inheritdoc}
    */
-  protected $pluginConfigKey = 'configuration';
+  public function __construct(array $values, $entity_type) {
+    parent::__construct($values, $entity_type);
 
-  /**
-   * {@inheritdoc}
-   */
-  public function getPlugin() {
-    return $this->getPluginBag()->get($this->plugin);
+    $this->pluginBag = new SearchPluginBag($this->searchPluginManager(), array($this->plugin), $this->configuration, $this->id());
   }
 
   /**
    * {@inheritdoc}
    */
-  public function getPluginBag() {
-    if (!$this->pluginBag) {
-      $this->pluginBag = new SearchPluginBag($this->searchPluginManager(), $this->plugin, $this->configuration, $this->id());
-    }
-    return $this->pluginBag;
+  public function getPlugin() {
+    return $this->pluginBag->get($this->plugin);
   }
 
   /**
@@ -137,7 +130,7 @@ public function getPluginBag() {
    */
   public function setPlugin($plugin_id) {
     $this->plugin = $plugin_id;
-    $this->getPluginBag()->addInstanceID($plugin_id);
+    $this->pluginBag->addInstanceID($plugin_id);
   }
 
   /**
@@ -201,6 +194,19 @@ public function postCreate(EntityStorageControllerInterface $storage_controller)
   /**
    * {@inheritdoc}
    */
+  public function preSave(EntityStorageControllerInterface $storage_controller) {
+    parent::preSave($storage_controller);
+
+    $plugin = $this->getPlugin();
+    // If this plugin has any configuration, ensure that it is set.
+    if ($plugin instanceof ConfigurablePluginInterface) {
+      $this->set('configuration', $plugin->getConfiguration());
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function postSave(EntityStorageControllerInterface $storage_controller, $update = TRUE) {
     parent::postSave($storage_controller, $update);
     $this->routeBuilder()->setRebuildNeeded();
diff --git a/core/modules/search/lib/Drupal/search/Plugin/SearchPluginBag.php b/core/modules/search/lib/Drupal/search/Plugin/SearchPluginBag.php
index 7bcfa5f..0f8596e 100644
--- a/core/modules/search/lib/Drupal/search/Plugin/SearchPluginBag.php
+++ b/core/modules/search/lib/Drupal/search/Plugin/SearchPluginBag.php
@@ -23,19 +23,10 @@ class SearchPluginBag extends DefaultSinglePluginBag {
   protected $searchPageId;
 
   /**
-   * Constructs a new SearchPluginBag.
-   *
-   * @param \Drupal\Component\Plugin\PluginManagerInterface $manager
-   *   The manager to be used for instantiating plugins.
-   * @param string $instance_id
-   *   The ID of the plugin instance.
-   * @param array $configuration
-   *   An array of configuration.
-   * @param string $search_page_id
-   *   The unique ID of the search page using this plugin.
+   * {@inheritdoc}
    */
-  public function __construct(PluginManagerInterface $manager, $instance_id, array $configuration, $search_page_id) {
-    parent::__construct($manager, $instance_id, $configuration);
+  public function __construct(PluginManagerInterface $manager, array $instance_ids, array $configuration, $search_page_id) {
+    parent::__construct($manager, $instance_ids, $configuration);
 
     $this->searchPageId = $search_page_id;
   }
diff --git a/core/modules/search/tests/Drupal/search/Tests/SearchPluginBagTest.php b/core/modules/search/tests/Drupal/search/Tests/SearchPluginBagTest.php
index c2cf9af..5ee70f0 100644
--- a/core/modules/search/tests/Drupal/search/Tests/SearchPluginBagTest.php
+++ b/core/modules/search/tests/Drupal/search/Tests/SearchPluginBagTest.php
@@ -56,7 +56,7 @@ public static function getInfo() {
    */
   protected function setUp() {
     $this->pluginManager = $this->getMock('Drupal\Component\Plugin\PluginManagerInterface');
-    $this->searchPluginBag = new SearchPluginBag($this->pluginManager, 'banana', array('id' => 'banana', 'color' => 'yellow'), 'fruit_stand');
+    $this->searchPluginBag = new SearchPluginBag($this->pluginManager, array('banana'), array('id' => 'banana', 'color' => 'yellow'), 'fruit_stand');
   }
 
   /**
diff --git a/core/modules/system/lib/Drupal/system/Entity/Action.php b/core/modules/system/lib/Drupal/system/Entity/Action.php
index a487433..cba85cf 100644
--- a/core/modules/system/lib/Drupal/system/Entity/Action.php
+++ b/core/modules/system/lib/Drupal/system/Entity/Action.php
@@ -8,7 +8,7 @@
 namespace Drupal\system\Entity;
 
 use Drupal\Core\Config\Entity\ConfigEntityBase;
-use Drupal\Core\Config\Entity\EntityWithPluginBagInterface;
+use Drupal\Core\Entity\EntityStorageControllerInterface;
 use Drupal\system\ActionConfigEntityInterface;
 use Drupal\Core\Action\ActionBag;
 use Drupal\Component\Plugin\ConfigurablePluginInterface;
@@ -27,7 +27,7 @@
  *   }
  * )
  */
-class Action extends ConfigEntityBase implements ActionConfigEntityInterface, EntityWithPluginBagInterface {
+class Action extends ConfigEntityBase implements ActionConfigEntityInterface {
 
   /**
    * The name (plugin ID) of the action.
@@ -81,23 +81,17 @@ class Action extends ConfigEntityBase implements ActionConfigEntityInterface, En
   /**
    * {@inheritdoc}
    */
-  protected $pluginConfigKey = 'configuration';
+  public function __construct(array $values, $entity_type) {
+    parent::__construct($values, $entity_type);
 
-  /**
-   * {@inheritdoc}
-   */
-  public function getPluginBag() {
-    if (!$this->pluginBag) {
-      $this->pluginBag = new ActionBag(\Drupal::service('plugin.manager.action'), $this->plugin, $this->configuration);
-    }
-    return $this->pluginBag;
+    $this->pluginBag = new ActionBag(\Drupal::service('plugin.manager.action'), array($this->plugin), $this->configuration);
   }
 
   /**
    * {@inheritdoc}
    */
   public function getPlugin() {
-    return $this->getPluginBag()->get($this->plugin);
+    return $this->pluginBag->get($this->plugin);
   }
 
   /**
@@ -105,7 +99,7 @@ public function getPlugin() {
    */
   public function setPlugin($plugin_id) {
     $this->plugin = $plugin_id;
-    $this->getPluginBag()->addInstanceId($plugin_id);
+    $this->pluginBag->addInstanceId($plugin_id);
   }
 
   /**
@@ -164,4 +158,17 @@ public function getExportProperties() {
     return $properties;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function preSave(EntityStorageControllerInterface $storage_controller) {
+    parent::preSave($storage_controller);
+
+    $plugin = $this->getPlugin();
+    // If this plugin has any configuration, ensure that it is set.
+    if ($plugin instanceof ConfigurablePluginInterface) {
+      $this->set('configuration', $plugin->getConfiguration());
+    }
+  }
+
 }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/ConfigEntityImportTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/ConfigEntityImportTest.php
deleted file mode 100644
index 2d3def7..0000000
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/ConfigEntityImportTest.php
+++ /dev/null
@@ -1,244 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\system\Tests\Entity\ConfigEntityImportTestBase.
- */
-
-namespace Drupal\system\Tests\Entity;
-
-use Drupal\Core\Config\Entity\EntityWithPluginBagInterface;
-use Drupal\simpletest\WebTestBase;
-
-/**
- * Tests importing config entities.
- */
-class ConfigEntityImportTest extends WebTestBase {
-
-  /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  public static $modules = array('action', 'block', 'filter', 'image', 'search', 'search_extra_type');
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function getInfo() {
-    return array(
-      'name' => 'Configuration entity import',
-      'description' => 'Tests ConfigEntity importing.',
-      'group' => 'Configuration',
-    );
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    parent::setUp();
-
-    $this->copyConfig($this->container->get('config.storage'), $this->container->get('config.storage.staging'));
-  }
-
-  /**
-   * Runs test methods for each module within a single test run.
-   */
-  public function testConfigUpdateImport() {
-    $this->doActionUpdate();
-    $this->doBlockUpdate();
-    $this->doFilterFormatUpdate();
-    $this->doImageStyleUpdate();
-    $this->doSearchPageUpdate();
-  }
-  /**
-   * Tests updating a action during import.
-   */
-  protected function doActionUpdate() {
-    // Create a test action with a known label.
-    $name = 'system.action.apple';
-    $entity = entity_create('action', array(
-      'id' => 'apple',
-      'plugin' => 'action_message_action',
-    ));
-    $entity->save();
-
-    $this->checkSinglePluginConfigSync($entity, 'configuration', 'message', '');
-
-    // Read the existing data, and prepare an altered version in staging.
-    $custom_data = $original_data = $this->container->get('config.storage')->read($name);
-    $custom_data['configuration']['message'] = 'Granny Smith';
-    $this->assertConfigUpdateImport($name, $original_data, $custom_data);
-
-  }
-
-  /**
-   * Tests updating a block during import.
-   */
-  protected function doBlockUpdate() {
-    // Create a test block with a known label.
-    $name = 'block.block.apple';
-    $block = $this->drupalPlaceBlock('system_powered_by_block', array(
-      'id' => 'apple',
-      'label' => 'Red Delicious',
-    ));
-
-    $this->checkSinglePluginConfigSync($block, 'settings', 'label', 'Red Delicious');
-
-    // Read the existing data, and prepare an altered version in staging.
-    $custom_data = $original_data = $this->container->get('config.storage')->read($name);
-    $custom_data['settings']['label'] = 'Granny Smith';
-    $this->assertConfigUpdateImport($name, $original_data, $custom_data);
-  }
-
-  /**
-   * Tests updating a filter format during import.
-   */
-  protected function doFilterFormatUpdate() {
-    // Create a test filter format with a known label.
-    $name = 'filter.format.plain_text';
-
-    /** @var $entity \Drupal\filter\Entity\FilterFormat */
-    $entity = entity_load('filter_format', 'plain_text');
-    $plugin_bag = $entity->getPluginBag();
-
-    $filters = $entity->get('filters');
-    $this->assertIdentical(72, $filters['filter_url']['settings']['filter_url_length']);
-
-    $filters['filter_url']['settings']['filter_url_length'] = 100;
-    $entity->set('filters', $filters);
-    $entity->save();
-    $this->assertIdentical($filters, $entity->get('filters'));
-    $this->assertIdentical($filters, $plugin_bag->getConfiguration());
-
-    $filters['filter_url']['settings']['filter_url_length'] = -100;
-    $entity->getPluginBag()->setConfiguration($filters);
-    $entity->save();
-    $this->assertIdentical($filters, $entity->get('filters'));
-    $this->assertIdentical($filters, $plugin_bag->getConfiguration());
-
-    // Read the existing data, and prepare an altered version in staging.
-    $custom_data = $original_data = $this->container->get('config.storage')->read($name);
-    $custom_data['filters']['filter_url']['settings']['filter_url_length'] = 100;
-    $this->assertConfigUpdateImport($name, $original_data, $custom_data);
-  }
-
-  /**
-   * Tests updating an image style during import.
-   */
-  protected function doImageStyleUpdate() {
-    // Create a test image style with a known label.
-    $name = 'image.style.thumbnail';
-
-    /** @var $entity \Drupal\image\Entity\ImageStyle */
-    $entity = entity_load('image_style', 'thumbnail');
-    $plugin_bag = $entity->getPluginBag();
-
-    $effects = $entity->get('effects');
-    $effect_id = key($effects);
-    $this->assertIdentical(100, $effects[$effect_id]['data']['height']);
-
-    $effects[$effect_id]['data']['height'] = 50;
-    $entity->set('effects', $effects);
-    $entity->save();
-    // Ensure the entity and plugin have the correct configuration.
-    $this->assertIdentical($effects, $entity->get('effects'));
-    $this->assertIdentical($effects, $plugin_bag->getConfiguration());
-
-    $effects[$effect_id]['data']['height'] = -50;
-    $entity->getPluginBag()->setConfiguration($effects);
-    $entity->save();
-    // Ensure the entity and plugin have the correct configuration.
-    $this->assertIdentical($effects, $entity->get('effects'));
-    $this->assertIdentical($effects, $plugin_bag->getConfiguration());
-
-    // Read the existing data, and prepare an altered version in staging.
-    $custom_data = $original_data = $this->container->get('config.storage')->read($name);
-    $effect_name = key($original_data['effects']);
-
-    $custom_data['effects'][$effect_name]['data']['upscale'] = FALSE;
-    $this->assertConfigUpdateImport($name, $original_data, $custom_data);
-  }
-
-  /**
-   * Tests updating a search page during import.
-   */
-  protected function doSearchPageUpdate() {
-    // Create a test search page with a known label.
-    $name = 'search.page.apple';
-    $entity = entity_create('search_page', array(
-      'id' => 'apple',
-      'plugin' => 'search_extra_type_search',
-    ));
-    $entity->save();
-
-    $this->checkSinglePluginConfigSync($entity, 'configuration', 'boost', 'bi');
-
-    // Read the existing data, and prepare an altered version in staging.
-    $custom_data = $original_data = $this->container->get('config.storage')->read($name);
-    $custom_data['configuration']['boost'] = 'asdf';
-    $this->assertConfigUpdateImport($name, $original_data, $custom_data);
-  }
-
-  /**
-   * Tests that a single set of plugin config stays in sync.
-   *
-   * @param \Drupal\Core\Config\Entity\EntityWithPluginBagInterface $entity
-   *   The entity.
-   * @param string $config_key
-   *   Where the plugin config is stored.
-   * @param string $setting_key
-   *   The setting within the plugin config to change.
-   * @param mixed $expected
-   *   The expected default value of the plugin config setting.
-   */
-  protected function checkSinglePluginConfigSync(EntityWithPluginBagInterface $entity, $config_key, $setting_key, $expected) {
-    $plugin_bag = $entity->getPluginBag();
-    $settings = $entity->get($config_key);
-
-    // Ensure the default config exists.
-    $this->assertIdentical($expected, $settings[$setting_key]);
-
-    // Change the plugin config by setting it on the entity.
-    $settings[$setting_key] = $this->randomString();
-    $entity->set($config_key, $settings);
-    $entity->save();
-    $this->assertIdentical($settings, $entity->get($config_key));
-    $this->assertIdentical($settings, $plugin_bag->getConfiguration());
-
-    // Change the plugin config by setting it on the plugin.
-    $settings[$setting_key] = $this->randomString();
-    $plugin_bag->setConfiguration($settings);
-    $entity->save();
-    $this->assertIdentical($settings, $entity->get($config_key));
-    $this->assertIdentical($settings, $plugin_bag->getConfiguration());
-  }
-
-  /**
-   * Asserts that config entities are updated during import.
-   *
-   * @param string $name
-   *   The name of the config object.
-   * @param array $original_data
-   *   The original data stored in the config object.
-   * @param array $custom_data
-   *   The new data to store in the config object.
-   */
-  public function assertConfigUpdateImport($name, $original_data, $custom_data) {
-    $this->container->get('config.storage.staging')->write($name, $custom_data);
-
-    // Verify the active configuration still returns the default values.
-    $config = $this->container->get('config.factory')->get($name);
-    $this->assertIdentical($config->get(), $original_data);
-
-    // Import.
-    $this->configImporter()->import();
-
-    // Verify the values were updated.
-    $this->container->get('config.factory')->reset($name);
-    $config = $this->container->get('config.factory')->get($name);
-    $this->assertIdentical($config->get(), $custom_data);
-  }
-
-}
diff --git a/core/modules/system/templates/progress-bar.html.twig b/core/modules/system/templates/progress-bar.html.twig
index 885a80f..0d11991 100644
--- a/core/modules/system/templates/progress-bar.html.twig
+++ b/core/modules/system/templates/progress-bar.html.twig
@@ -13,7 +13,7 @@
  * @ingroup themeable
  */
 #}
-<div class="progress" data-drupal-progress>
+<div id="progress" class="progress">
   {% if label %}
     <div class="progress__label">{{ label }}</div>
   {% endif %}
diff --git a/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/TestPluginBag.php b/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/TestPluginBag.php
index c389308..a4d06d2 100644
--- a/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/TestPluginBag.php
+++ b/core/modules/system/tests/modules/plugin_test/lib/Drupal/plugin_test/Plugin/TestPluginBag.php
@@ -42,18 +42,4 @@ protected function initializePlugin($instance_id) {
     $this->pluginInstances[$instance_id] = $this->manager->createInstance($instance_id, array());
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function getConfiguration() {
-    return array();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setConfiguration($configuration) {
-    return $this;
-  }
-
 }
diff --git a/core/tests/Drupal/Tests/Component/Plugin/ConfigurablePluginBagTest.php b/core/tests/Drupal/Tests/Component/Plugin/ConfigurablePluginBagTest.php
index 735dd7b..d970be7 100644
--- a/core/tests/Drupal/Tests/Component/Plugin/ConfigurablePluginBagTest.php
+++ b/core/tests/Drupal/Tests/Component/Plugin/ConfigurablePluginBagTest.php
@@ -61,7 +61,7 @@ public function testConfigurableGetConfiguration() {
   public function testConfigurableSetConfiguration() {
     $this->setupPluginBag($this->exactly(3));
     $this->defaultPluginBag->getConfiguration();
-    $this->defaultPluginBag->setInstanceConfiguration('apple', array('value' => 'pineapple'));
+    $this->defaultPluginBag->setConfiguration('apple', array('value' => 'pineapple'));
 
     $expected = $this->config;
     $expected['apple'] = array('value' => 'pineapple');
diff --git a/core/tests/Drupal/Tests/Component/Plugin/DefaultPluginBagTest.php b/core/tests/Drupal/Tests/Component/Plugin/DefaultPluginBagTest.php
index 1dc33d9..b38e2dc 100644
--- a/core/tests/Drupal/Tests/Component/Plugin/DefaultPluginBagTest.php
+++ b/core/tests/Drupal/Tests/Component/Plugin/DefaultPluginBagTest.php
@@ -140,18 +140,18 @@ public function testRemoveInstanceId() {
   }
 
   /**
-   * Tests the setInstanceConfiguration() method.
+   * Tests the setConfiguration() method.
    *
-   * @see \Drupal\Component\Plugin\DefaultPluginBag::setInstanceConfiguration()
+   * @see \Drupal\Component\Plugin\DefaultPluginBag::setConfiguration()
    */
-  public function testSetInstanceConfiguration() {
+  public function testSetConfiguration() {
     $this->setupPluginBag($this->exactly(3));
     $expected = array(
       'id' => 'cherry',
       'key' => 'value',
       'custom' => 'bananas',
     );
-    $this->defaultPluginBag->setInstanceConfiguration('cherry', $expected);
+    $this->defaultPluginBag->setConfiguration('cherry', $expected);
     $config = $this->defaultPluginBag->getConfiguration();
     $this->assertSame($expected, $config['cherry']);
   }
@@ -203,7 +203,7 @@ public function testSet() {
     $this->setupPluginBag($this->exactly(4));
     $instance = $this->pluginManager->createInstance('cherry', $this->config['cherry']);
     $this->defaultPluginBag->set('cherry2', $instance);
-    $this->defaultPluginBag->setInstanceConfiguration('cherry2', $this->config['cherry']);
+    $this->defaultPluginBag->setConfiguration('cherry2', $this->config['cherry']);
 
     $expected = array(
       'banana',
diff --git a/core/tests/Drupal/Tests/Component/Plugin/DefaultSinglePluginBagTest.php b/core/tests/Drupal/Tests/Component/Plugin/DefaultSinglePluginBagTest.php
index 65bba15..85718f8 100644
--- a/core/tests/Drupal/Tests/Component/Plugin/DefaultSinglePluginBagTest.php
+++ b/core/tests/Drupal/Tests/Component/Plugin/DefaultSinglePluginBagTest.php
@@ -41,7 +41,7 @@ protected function setupPluginBag(\PHPUnit_Framework_MockObject_Matcher_InvokedR
       ->method('createInstance')
       ->will($this->returnValue($this->pluginInstances['apple']));
 
-    $this->defaultPluginBag = new DefaultSinglePluginBag($this->pluginManager, 'apple', array('id' => 'apple', 'key' => 'value'));
+    $this->defaultPluginBag = new DefaultSinglePluginBag($this->pluginManager, array_keys($this->pluginInstances), array('id' => 'apple', 'key' => 'value'));
   }
 
   /**
diff --git a/core/tests/Drupal/Tests/Core/Config/ConfigEntityTypeTest.php b/core/tests/Drupal/Tests/Core/Config/ConfigEntityTypeTest.php
new file mode 100644
index 0000000..b542999
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Config/ConfigEntityTypeTest.php
@@ -0,0 +1,119 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Core\Config\ConfigEntityTypeTest.
+ */
+
+namespace Drupal\Tests\Core\Config;
+
+use Drupal\Core\Config\Entity\ConfigEntityType;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * Tests the \Drupal\Core\Entity\EntityType class.
+ *
+ * @group Drupal
+ * @group Config
+ *
+ * @coversDefaultClass \Drupal\Core\Config\Entity\ConfigEntityType
+ */
+class ConfigEntityTypeTest extends UnitTestCase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'Config entity type test',
+      'description' => 'Unit test config entity type.',
+      'group' => 'Config',
+    );
+  }
+
+  /**
+   * Sets up an ConfigEntityType object for a given set of values.
+   *
+   * @param array $definition
+   *   An array of values to use for the ConfigEntityType.
+   *
+   * @return \Drupal\Core\Config\Entity\ConfigEntityType
+   */
+  protected function setUpConfigEntityType($definition = array()) {
+    return new ConfigEntityType($definition);
+  }
+
+  /**
+   * Tests the getConfigPrefix() method.
+   *
+   * @dataProvider providerTestGetConfigPrefix
+   *
+   * @covers ::getConfigPrefix()
+   */
+  public function testGetConfigPrefix($definition, $expected) {
+    $entity_type = $this->setUpConfigEntityType($definition);
+    $this->assertSame($expected, $entity_type->getConfigPrefix());
+  }
+
+  /**
+   * Provides test data.
+   */
+  public function providerTestGetConfigPrefix() {
+    return array(
+      array(array('provider' => 'node', 'id' => 'node_type', 'config_prefix' => 'type'), 'node.type'),
+      array(array('provider' => 'views', 'id' => 'view'), 'views.view'),
+    );
+  }
+
+  /**
+   * Tests the getControllerClasses() method.
+   *
+   * @covers ::getControllerClasses()
+   */
+  public function testGetControllerClasses() {
+    $entity_type = $this->setUpConfigEntityType();
+    $controllers = $entity_type->getControllerClasses();
+    $this->assertEquals('Drupal\Core\Config\Entity\ConfigStorageController', $controllers['storage']);
+  }
+
+  /**
+   * Tests the getBaseTable() method.
+   *
+   * @covers ::getBaseTable()
+   */
+  public function testGetBaseTable() {
+    $entity_type = $this->setUpConfigEntityType();
+    $this->assertFalse($entity_type->getBaseTable());
+  }
+
+  /**
+   * Tests the getRevisionDataTable() method.
+   *
+   * @covers ::getRevisionDataTable()
+   */
+  public function testGetRevisionDataTable() {
+    $entity_type = $this->setUpConfigEntityType();
+    $this->assertFalse($entity_type->getRevisionDataTable());
+  }
+
+  /**
+   * Tests the getRevisionTable() method.
+   *
+   * @covers ::getRevisionTable()
+   */
+  public function testGetRevisionTable() {
+    $entity_type = $this->setUpConfigEntityType();
+    $this->assertFalse($entity_type->getRevisionTable());
+  }
+
+  /**
+   * Tests the getDataTable() method.
+   *
+   * @covers ::getDataTable()
+   */
+  public function testGetDataTable() {
+    $entity_type = $this->setUpConfigEntityType();
+    $this->assertFalse($entity_type->getDataTable());
+  }
+
+}
