diff --git a/core/lib/Drupal/Core/Config/ConfigImporter.php b/core/lib/Drupal/Core/Config/ConfigImporter.php
index 5e11697..f52080f 100644
--- a/core/lib/Drupal/Core/Config/ConfigImporter.php
+++ b/core/lib/Drupal/Core/Config/ConfigImporter.php
@@ -9,6 +9,7 @@
 
 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;
@@ -146,7 +147,7 @@ public function reset() {
    * @return bool
    *   TRUE if there are changes to process and FALSE if not.
    */
-  public function hasUnprocessedChanges($ops = array('delete', 'create', 'update')) {
+  public function hasUnprocessedChanges($ops = array('delete', 'create', 'update', 'rename')) {
     foreach ($ops as $op) {
       if (count($this->getUnprocessed($op))) {
         return TRUE;
@@ -212,7 +213,7 @@ public function import() {
       // to handle dependencies correctly.
       // @todo Implement proper dependency ordering using
       //   https://drupal.org/node/2080823
-      foreach (array('delete', 'create', 'update') as $op) {
+      foreach (array('delete', 'create', 'update', 'rename') as $op) {
         foreach ($this->getUnprocessed($op) as $name) {
           $this->process($op, $name);
         }
@@ -239,6 +240,22 @@ public function validate() {
       if (!$this->storageComparer->validateSiteUuid()) {
         throw new ConfigImporterException('Site UUID in source storage does not match the target storage.');
       }
+      // Validate renames.
+      foreach ($this->getUnprocessed('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) {
+          throw new ConfigImporterException(String::format('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) {
+          throw new ConfigImporterException(String::format('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));
       $this->validated = TRUE;
     }
@@ -303,6 +320,10 @@ protected function importConfig($op, $name) {
    *   otherwise.
    */
   protected function importInvokeOwner($op, $name) {
+    // Special case renames because they are hard.
+    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)) {
@@ -332,6 +353,37 @@ protected function importInvokeOwner($op, $name) {
   }
 
   /**
+   * @param string $name
+   * @return bool
+   */
+  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->setProcessed('rename', $name);
+    return TRUE;
+  }
+
+  /**
    * Determines if a import is already running.
    *
    * @return bool
diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorage.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorage.php
index 0ab9a60..cae4f4f 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorage.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorage.php
@@ -412,4 +412,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 6aca4df..cc0ae75 100644
--- a/core/lib/Drupal/Core/Config/Entity/ImportableEntityStorageInterface.php
+++ b/core/lib/Drupal/Core/Config/Entity/ImportableEntityStorageInterface.php
@@ -53,4 +53,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 ac89537..ce6f609 100644
--- a/core/lib/Drupal/Core/Config/StorageComparer.php
+++ b/core/lib/Drupal/Core/Config/StorageComparer.php
@@ -98,6 +98,7 @@ public function getEmptyChangelist() {
       'create' => array(),
       'update' => array(),
       'delete' => array(),
+      'rename' => array()
     );
   }
 
@@ -133,6 +134,7 @@ public function createChangelist() {
     $this->addChangelistCreate();
     $this->addChangelistUpdate();
     $this->addChangelistDelete();
+    $this->addChangelistRename();
     $this->sourceData = NULL;
     $this->targetData = NULL;
     return $this;
@@ -194,6 +196,53 @@ 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. For example, renamed content types should be not removed, but
+   * updated with the related nodes.
+   */
+  protected function addChangelistRename() {
+    // Renames will be present in both create and delete lists.
+    if (empty($this->getChangelist('create')) || empty($this->getChangelist('delete'))) {
+      return;
+    }
+
+    $create_uuids = array();
+    foreach ($this->getSourceStorage()->readMultiple($this->getChangelist('create')) as $id => $data) {
+      if (isset($data['uuid'])) {
+        $create_uuids[$data['uuid']] = $id;
+      }
+    }
+    if (empty($create_uuids)) {
+      return;
+    }
+
+    $renames = array();
+    foreach ($this->getTargetStorage()->readMultiple($this->getChangelist('delete')) as $id => $data) {
+      if (isset($data['uuid']) && isset($create_uuids[$data['uuid']])) {
+        $renames[] = $id . '::' . $create_uuids[$data['uuid']];
+        $this->removeFromChangelistsByUuid($data['uuid']);
+      }
+    }
+    // Reverse the array until we can manage dependencies.
+    $this->addChangeList('rename', array_reverse($renames));
+  }
+
+  /**
+   * Removes changes from all lists for the given UUID.
+   */
+  protected function removeFromChangelistsByUuid($uuid) {
+    foreach ($this->getChangelist() as $op => $data) {
+      $key = array_search($uuid, $data);
+      if ($key !== FALSE) {
+        unset($this->changelist[$op][$key]);
+      }
+    }
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function reset() {
@@ -205,7 +254,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/modules/config/lib/Drupal/config/Tests/ConfigImportRenameTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigImportRenameTest.php
new file mode 100644
index 0000000..ddc19cc
--- /dev/null
+++ b/core/modules/config/lib/Drupal/config/Tests/ConfigImportRenameTest.php
@@ -0,0 +1,106 @@
+<?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->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, 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->getUnprocessed('create')), 'There are no configuration items to create.');
+    $this->assertEqual(0, count($this->configImporter->getUnprocessed('delete')), 'There are no configuration items to delete.');
+    $this->assertEqual(0, count($this->configImporter->getUnprocessed('update')), 'There are no configuration items to update.');
+    debug($this->configImporter->getUnprocessed('rename'));
+    $this->assertEqual(5, count($this->configImporter->getUnprocessed('rename')), 'There are 5 configuration items to rename.');
+
+    // If we try to do this then we fail badly because of secondary writes and
+    // deletes.
+    //$this->configImporter->import();
+  }
+
+}
+
diff --git a/core/tests/Drupal/Tests/Core/Config/StorageComparerTest.php b/core/tests/Drupal/Tests/Core/Config/StorageComparerTest.php
index 500c06f..e3c2585 100644
--- a/core/tests/Drupal/Tests/Core/Config/StorageComparerTest.php
+++ b/core/tests/Drupal/Tests/Core/Config/StorageComparerTest.php
@@ -117,10 +117,10 @@ public function testCreateChangelistNoChange() {
     $this->targetStorage->expects($this->once())
       ->method('listAll')
       ->will($this->returnValue($config_files));
-    $this->sourceStorage->expects($this->once())
+    $this->sourceStorage->expects($this->atLeastOnce())
       ->method('readMultiple')
       ->will($this->returnValue($config_data));
-    $this->targetStorage->expects($this->once())
+    $this->targetStorage->expects($this->atLeastOnce())
       ->method('readMultiple')
       ->will($this->returnValue($config_data));
 
@@ -145,10 +145,10 @@ public function testCreateChangelistCreate() {
     $this->targetStorage->expects($this->once())
       ->method('listAll')
       ->will($this->returnValue(array_keys($target_data)));
-    $this->sourceStorage->expects($this->once())
+    $this->sourceStorage->expects($this->atLeastOnce())
       ->method('readMultiple')
       ->will($this->returnValue($source_data));
-    $this->targetStorage->expects($this->once())
+    $this->targetStorage->expects($this->atLeastOnce())
       ->method('readMultiple')
       ->will($this->returnValue($target_data));
 
@@ -178,10 +178,10 @@ public function testCreateChangelistDelete() {
     $this->targetStorage->expects($this->once())
       ->method('listAll')
       ->will($this->returnValue(array_keys($target_data)));
-    $this->sourceStorage->expects($this->once())
+    $this->sourceStorage->expects($this->atLeastOnce())
       ->method('readMultiple')
       ->will($this->returnValue($source_data));
-    $this->targetStorage->expects($this->once())
+    $this->targetStorage->expects($this->atLeastOnce())
       ->method('readMultiple')
       ->will($this->returnValue($target_data));
 
@@ -211,10 +211,10 @@ public function testCreateChangelistUpdate() {
     $this->targetStorage->expects($this->once())
       ->method('listAll')
       ->will($this->returnValue(array_keys($target_data)));
-    $this->sourceStorage->expects($this->once())
+    $this->sourceStorage->expects($this->atLeastOnce())
       ->method('readMultiple')
       ->will($this->returnValue($source_data));
-    $this->targetStorage->expects($this->once())
+    $this->targetStorage->expects($this->atLeastOnce())
       ->method('readMultiple')
       ->will($this->returnValue($target_data));
 
