diff --git a/core/lib/Drupal/Core/Config/ConfigImporter.php b/core/lib/Drupal/Core/Config/ConfigImporter.php
index 2ccbf94..7729302 100644
--- a/core/lib/Drupal/Core/Config/ConfigImporter.php
+++ b/core/lib/Drupal/Core/Config/ConfigImporter.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Extension\ThemeHandlerInterface;
 use Drupal\Component\Utility\String;
 use Drupal\Core\Config\Entity\ImportableEntityStorageInterface;
+use Drupal\Core\Config\ConfigEvents;
 use Drupal\Core\DependencyInjection\DependencySerialization;
 use Drupal\Core\Entity\EntityStorageException;
 use Drupal\Core\Lock\LockBackendInterface;
@@ -263,12 +264,12 @@ protected function getEmptyExtensionsProcessedList() {
    *
    * @param array $ops
    *   The operations to check for changes. Defaults to all operations, i.e.
-   *   array('delete', 'create', 'update').
+   *   array('delete', 'create', 'update', 'rename').
    *
    * @return bool
    *   TRUE if there are changes to process and FALSE if not.
    */
-  public function hasUnprocessedConfigurationChanges($ops = array('delete', 'create', 'update')) {
+  public function hasUnprocessedConfigurationChanges($ops = array('delete', 'create', 'rename', 'update')) {
     foreach ($ops as $op) {
       if (count($this->getUnprocessedConfiguration($op))) {
         return TRUE;
@@ -291,7 +292,7 @@ public function getProcessedConfiguration() {
    * Sets a change as processed.
    *
    * @param string $op
-   *   The change operation performed, either delete, create or update.
+   *   The change operation performed, either delete, create, rename or update.
    * @param string $name
    *   The name of the configuration processed.
    */
@@ -304,7 +305,7 @@ protected function setProcessedConfiguration($op, $name) {
    *
    * @param string $op
    *   The change operation to get the unprocessed list for, either delete,
-   *   create or update.
+   *   create, rename or update.
    *
    * @return array
    *   An array of configuration names.
@@ -569,7 +570,7 @@ public function processConfigurations(array &$context) {
     // into account.
     if ($this->totalConfigurationToProcess == 0) {
       $this->storageComparer->reset();
-      foreach (array('delete', 'create', 'update') as $op) {
+      foreach (array('delete', 'create', 'rename', 'update') as $op) {
         foreach ($this->getUnprocessedConfiguration($op) as $name) {
           $this->totalConfigurationToProcess += count($this->getUnprocessedConfiguration($op));
         }
@@ -645,7 +646,7 @@ protected function getNextExtensionOperation() {
   protected function getNextConfigurationOperation() {
     // The order configuration operations is processed is important. Deletes
     // have to come first so that recreates can work.
-    foreach (array('delete', 'create', 'update') as $op) {
+    foreach (array('delete', 'create', 'rename', 'update') as $op) {
       $config_names = $this->getUnprocessedConfiguration($op);
       if (!empty($config_names)) {
         return array(
@@ -668,6 +669,21 @@ protected function getNextConfigurationOperation() {
    */
   public function validate() {
     if (!$this->validated) {
+      // Validate renames.
+      foreach ($this->getUnprocessedConfiguration('rename') as $name) {
+        $names = explode('::', $name);
+        $old_name = $names[0];
+        $new_name = $names[1];
+        $old_entity_type_id = $this->configManager->getEntityTypeIdByName($old_name);
+        $new_entity_type_id = $this->configManager->getEntityTypeIdByName($new_name);
+        if ($old_entity_type_id != $new_entity_type_id) {
+          $this->logError($this->t('Entity type mismatch on rename. !old_type not equal to !new_type for existing configuration !old_name and staged configuration !new_name.', array('old_type' => $old_entity_type_id, 'new_type' => $new_entity_type_id, 'old_name' => $old_name, 'new_name' => $new_name)));
+        }
+        // Has to be a configuration entity.
+        if (!$old_entity_type_id) {
+          $this->logError($this->t('Rename operation for simple configuration. Existing configuration !old_name and staged configuration !new_name.', array('old_name' => $old_name, 'new_name' => $new_name)));
+        }
+      }
       $this->eventDispatcher->dispatch(ConfigEvents::IMPORT_VALIDATE, new ConfigImporterEvent($this));
       if (count($this->getErrors())) {
         throw new ConfigImporterException('There were errors validating the config synchronization.');
@@ -770,6 +786,21 @@ protected function processExtension($type, $op, $name) {
    *   TRUE is to continue processing, FALSE otherwise.
    */
   protected function checkOp($op, $name) {
+    if ($op == 'rename') {
+      $names = explode('::', $name);
+      $new_name = $names[1];
+      $target_exists = $this->storageComparer->getTargetStorage()->exists($new_name);
+      if ($target_exists) {
+        // The rename has already occurred as the result of a secondary
+        // configuration write. Change the operation into an update. This is the
+        // desired since renames often have to occur together. For example,
+        // renaming a node type has to rename field instances and entity
+        // displays.
+        $this->storageComparer->moveRenameToUpdate($name);
+        return FALSE;
+      }
+      return TRUE;
+    }
     $target_exists = $this->storageComparer->getTargetStorage()->exists($name);
     switch ($op) {
       case 'delete':
@@ -845,7 +876,7 @@ protected function importConfig($op, $name) {
    *
    * @param string $op
    *   The change operation to get the unprocessed list for, either delete,
-   *   create or update.
+   *   create, rename or update.
    * @param string $name
    *   The name of the configuration to process.
    *
@@ -858,6 +889,10 @@ protected function importConfig($op, $name) {
    *   otherwise.
    */
   protected function importInvokeOwner($op, $name) {
+    // Renames are handled separately.
+    if ($op == 'rename') {
+      return $this->importInvokeRename($name);
+    }
     // Validate the configuration object name before importing it.
     // Config::validateName($name);
     if ($entity_type = $this->configManager->getEntityTypeIdByName($name)) {
@@ -883,6 +918,46 @@ protected function importInvokeOwner($op, $name) {
       $this->setProcessedConfiguration($op, $name);
       return TRUE;
     }
+    return FALSE;
+  }
+
+  /**
+   * Imports a configuration entity rename.
+   *
+   * @param string $name
+   *   The rename configuration name. A special case because both the old name
+   *   and new name are required to perform a rename. The string $name is the
+   *   old name and new name concatenated with '::'.
+   *
+   * @return bool
+   *   TRUE if the configuration was imported as a configuration entity. FALSE
+   *   otherwise.
+   */
+  protected function importInvokeRename($name) {
+    $names = explode('::', $name);
+    $old_name = $names[0];
+    $new_name = $names[1];
+    $entity_type_id = $this->configManager->getEntityTypeIdByName($old_name);
+    $old_config = new Config($old_name, $this->storageComparer->getTargetStorage(), $this->eventDispatcher, $this->typedConfigManager);
+    if ($old_data = $this->storageComparer->getTargetStorage()->read($old_name)) {
+      $old_config->initWithData($old_data);
+    }
+
+    $data = $this->storageComparer->getSourceStorage()->read($new_name);
+    $new_config = new Config($new_name, $this->storageComparer->getTargetStorage(), $this->eventDispatcher, $this->typedConfigManager);
+    if ($data !== FALSE) {
+      $new_config->setData($data);
+    }
+
+    $entity_storage = $this->configManager->getEntityManager()->getStorage($entity_type_id);
+    // Call to the configuration entity's storage to handle the configuration
+    // change.
+    if (!($entity_storage instanceof ImportableEntityStorageInterface)) {
+      throw new EntityStorageException(String::format('The entity storage "@storage" for the "@entity_type" entity type does not support imports', array('@storage' => get_class($entity_storage), '@entity_type' => $entity_type)));
+    }
+    $entity_storage->importRename($old_name, $new_config, $old_config);
+    $this->setProcessedConfiguration('rename', $name);
+    return TRUE;
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorage.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorage.php
index 126275a..1fd73e7 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorage.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorage.php
@@ -455,4 +455,19 @@ public function importDelete($name, Config $new_config, Config $old_config) {
     return TRUE;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function importRename($old_name, Config $new_config, Config $old_config) {
+    $id = static::getIDFromConfigName($old_name, $this->entityType->getConfigPrefix());
+    $entity = $this->load($id);
+    $entity->setSyncing(TRUE);
+    $data = $new_config->get();
+    foreach ($data as $key => $value) {
+      $entity->set($key, $value);
+    }
+    $entity->save();
+    return TRUE;
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Config/Entity/ImportableEntityStorageInterface.php b/core/lib/Drupal/Core/Config/Entity/ImportableEntityStorageInterface.php
index 4eae41e..c09fd2a 100644
--- a/core/lib/Drupal/Core/Config/Entity/ImportableEntityStorageInterface.php
+++ b/core/lib/Drupal/Core/Config/Entity/ImportableEntityStorageInterface.php
@@ -56,4 +56,16 @@ public function importUpdate($name, Config $new_config, Config $old_config);
    */
   public function importDelete($name, Config $new_config, Config $old_config);
 
+  /**
+   * Rename entities upon synchronizing configuration changes.
+   *
+   * @param string $old_name
+   *   The original name of the configuration object.
+   * @param \Drupal\Core\Config\Config $new_config
+   *   A configuration object containing the new configuration data.
+   * @param \Drupal\Core\Config\Config $old_config
+   *   A configuration object containing the old configuration data.
+   */
+  public function importRename($old_name, Config $new_config, Config $old_config);
+
 }
diff --git a/core/lib/Drupal/Core/Config/StorageComparer.php b/core/lib/Drupal/Core/Config/StorageComparer.php
index b30db17..604c880 100644
--- a/core/lib/Drupal/Core/Config/StorageComparer.php
+++ b/core/lib/Drupal/Core/Config/StorageComparer.php
@@ -100,6 +100,7 @@ public function getEmptyChangelist() {
       'create' => array(),
       'update' => array(),
       'delete' => array(),
+      'rename' => array()
     );
   }
 
@@ -117,7 +118,7 @@ public function getChangelist($op = NULL) {
    * Adds changes to the changelist.
    *
    * @param string $op
-   *   The change operation performed. Either delete, create or update.
+   *   The change operation performed. Either delete, create, rename or update.
    * @param array $changes
    *   Array of changes to add to the changelist.
    * @param array $sort_order
@@ -147,6 +148,7 @@ public function createChangelist() {
     $this->addChangelistCreate();
     $this->addChangelistUpdate();
     $this->addChangelistDelete();
+    $this->addChangelistRename();
     $this->sourceData = NULL;
     $this->targetData = NULL;
     return $this;
@@ -209,6 +211,71 @@ protected function addChangelistUpdate() {
   }
 
   /**
+   * Creates the rename changelist.
+   *
+   * The list of renames is created from the different source and target names
+   * with same uuid, these changes will be removed from the create and delete
+   * lists.
+   */
+  protected function addChangelistRename() {
+    // Renames will be present in both create and delete lists.
+    $create_list = $this->getChangelist('create');
+    $delete_list = $this->getChangelist('delete');
+    if (empty($create_list) || empty($delete_list)) {
+      return;
+    }
+
+    $create_uuids = array();
+    foreach ($this->sourceData as $id => $data) {
+      if (isset($data['uuid']) && in_array($id, $create_list)) {
+        $create_uuids[$data['uuid']] = $id;
+      }
+    }
+    if (empty($create_uuids)) {
+      return;
+    }
+
+    $renames = array();
+    foreach ($this->targetData as $id => $data) {
+      if (isset($data['uuid']) && isset($create_uuids[$data['uuid']])) {
+        // Remove from create list.
+        $this->removeFromChangelist('create', $create_uuids[$data['uuid']]);
+        // Remove from delete list.
+        $this->removeFromChangelist('delete', $id);
+        // Create rename operation.
+        $renames[] = $id . '::' . $create_uuids[$data['uuid']];
+      }
+    }
+
+    // Import in the order that will do content types before fields.
+    $this->addChangeList('rename', array_reverse($renames));
+  }
+
+  /**
+   * Removes the entry from the given operation changelist for the given name.
+   *
+   * @param string $op
+   *   The changelist to act on. Either delete, create, rename or update.
+   * @param string $name
+   *   The name of the configuration to remove.
+   */
+  protected function removeFromChangelist($op, $name) {
+    $key = array_search($name, $this->changelist[$op]);
+    if ($key !== FALSE) {
+      unset($this->changelist[$op][$key]);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function moveRenameToUpdate($rename) {
+    $names = explode('::', $rename);
+    $this->removeFromChangelist('rename', $rename);
+    $this->addChangeList('update', array($names[1]), $this->sourceNames);
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function reset() {
@@ -220,7 +287,7 @@ public function reset() {
   /**
    * {@inheritdoc}
    */
-  public function hasChanges($ops = array('delete', 'create', 'update')) {
+  public function hasChanges($ops = array('delete', 'create', 'update', 'rename')) {
     foreach ($ops as $op) {
       if (!empty($this->changelist[$op])) {
         return TRUE;
diff --git a/core/lib/Drupal/Core/Config/StorageComparerInterface.php b/core/lib/Drupal/Core/Config/StorageComparerInterface.php
index e8c597d..c96fe8d 100644
--- a/core/lib/Drupal/Core/Config/StorageComparerInterface.php
+++ b/core/lib/Drupal/Core/Config/StorageComparerInterface.php
@@ -80,4 +80,12 @@ public function hasChanges($ops = array('delete', 'create', 'update'));
    */
   public function validateSiteUuid();
 
+  /**
+   * Move a rename operation to an update.
+   *
+   * @param string $rename
+   *   The rename old_config_name::new_config_name
+   */
+  public function moveRenameToUpdate($rename);
+
 }
diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigImportRenameTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigImportRenameTest.php
new file mode 100644
index 0000000..2f17916
--- /dev/null
+++ b/core/modules/config/lib/Drupal/config/Tests/ConfigImportRenameTest.php
@@ -0,0 +1,107 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\config\Tests\ConfigImportRenameTest.
+ */
+
+namespace Drupal\config\Tests;
+
+use Drupal\Component\Utility\Unicode;
+use Drupal\Core\Config\ConfigImporter;
+use Drupal\Core\Config\StorageComparer;
+use Drupal\simpletest\DrupalUnitTestBase;
+
+/**
+ * Tests importing renamed configuration from files into active configuration.
+ */
+class ConfigImportRenameTest extends DrupalUnitTestBase {
+
+  /**
+   * Config Importer object used for testing.
+   *
+   * @var \Drupal\Core\Config\ConfigImporter
+   */
+  protected $configImporter;
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('system', 'node', 'field', 'text', 'entity');
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'Import renamed configuration',
+      'description' => 'Tests importing renamed configuration.',
+      'group' => 'Configuration',
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp() {
+    parent::setUp();
+
+    $this->installSchema('system', 'config_snapshot');
+    $this->installSchema('node', 'node');
+
+    // Set up the ConfigImporter object for testing.
+    $storage_comparer = new StorageComparer(
+      $this->container->get('config.storage.staging'),
+      $this->container->get('config.storage')
+    );
+    $this->configImporter = new ConfigImporter(
+      $storage_comparer->createChangelist(),
+      $this->container->get('event_dispatcher'),
+      $this->container->get('config.manager'),
+      $this->container->get('lock'),
+      $this->container->get('config.typed'),
+      $this->container->get('module_handler'),
+      $this->container->get('theme_handler'),
+      $this->container->get('string_translation')
+    );
+    $this->copyConfig($this->container->get('config.storage'), $this->container->get('config.storage.staging'));
+  }
+
+  /**
+   * Tests configuration renaming.
+   */
+  public function testRenamed() {
+    $content_type = entity_create('node_type', array(
+      'type' => Unicode::strtolower($this->randomName(16)),
+      'name' => $this->randomName(),
+    ));
+    $content_type->save();
+    $active = $this->container->get('config.storage');
+    $staging = $this->container->get('config.storage.staging');
+
+    $config_name = $content_type->getEntityType()->getConfigPrefix() . '.' . $content_type->id();
+    $this->copyConfig($active, $staging);
+
+    // Change the machine name of the content type. This wil rename 5
+    // configuration entities: the node type, the body field instance, the
+    // entity form display and the entity view display.
+    $content_type->type = Unicode::strtolower($this->randomName(8));
+    $content_type->save();
+    $renamed_config_name = $content_type->getEntityType()->getConfigPrefix() . '.' . $content_type->id();
+    $this->assertTrue($active->exists($renamed_config_name), 'Content type has new name in active store.');
+    $this->assertFalse($active->exists($config_name), 'Content type\'s old name does not exist active store.');
+
+    $this->configImporter->reset();
+    $this->assertEqual(0, count($this->configImporter->getUnprocessedConfiguration('create')), 'There are no configuration items to create.');
+    $this->assertEqual(0, count($this->configImporter->getUnprocessedConfiguration('delete')), 'There are no configuration items to delete.');
+    $this->assertEqual(0, count($this->configImporter->getUnprocessedConfiguration('update')), 'There are no configuration items to update.');
+    $this->assertEqual(4, count($this->configImporter->getUnprocessedConfiguration('rename')), 'There are 4 configuration items to rename.');
+
+    // If we try to do this then we fail badly because of secondary writes and
+    // deletes.
+    $this->configImporter->import();
+  }
+
+}
