diff --git a/core/lib/Drupal/Core/Config/ConfigInstaller.php b/core/lib/Drupal/Core/Config/ConfigInstaller.php
index 6fe1afa..842e422 100644
--- a/core/lib/Drupal/Core/Config/ConfigInstaller.php
+++ b/core/lib/Drupal/Core/Config/ConfigInstaller.php
@@ -216,16 +216,12 @@ protected function createConfiguration($collection, array $config_to_install) {
         if ($this->getActiveStorage($collection)->exists($name)) {
           $id = $entity_storage->getIDFromConfigName($name, $entity_storage->getEntityType()->getConfigPrefix());
           $entity = $entity_storage->load($id);
-          foreach ($new_config->get() as $property => $value) {
-            $entity->set($property, $value);
-          }
-          $entity->save();
+          $entity = $entity_storage->updateFromStorageRecord($entity, $new_config->get());
         }
         else {
-          $entity_storage
-            ->create($new_config->get())
-            ->save();
+          $entity = $entity_storage->createFromStorageRecord($new_config->get());
         }
+        $entity->save();
       }
       else {
         $new_config->save();
diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorage.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorage.php
index 0e071b8..4cad074 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorage.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorage.php
@@ -347,7 +347,7 @@ public function getQueryServicename() {
    * {@inheritdoc}
    */
   public function importCreate($name, Config $new_config, Config $old_config) {
-    $entity = $this->create($new_config->get());
+    $entity = $this->createFromStorageRecord($new_config->get());
     $entity->setSyncing(TRUE);
     $entity->save();
     return TRUE;
@@ -363,16 +363,7 @@ public function importUpdate($name, Config $new_config, Config $old_config) {
       throw new ConfigImporterException(String::format('Attempt to update non-existing entity "@id".', array('@id' => $id)));
     }
     $entity->setSyncing(TRUE);
-    $entity->original = clone $entity;
-
-    foreach ($old_config->get() as $property => $value) {
-      $entity->original->set($property, $value);
-    }
-
-    foreach ($new_config->get() as $property => $value) {
-      $entity->set($property, $value);
-    }
-
+    $entity = $this->updateFromStorageRecord($entity, $new_config->get());
     $entity->save();
     return TRUE;
   }
@@ -392,15 +383,44 @@ public function importDelete($name, Config $new_config, Config $old_config) {
    * {@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);
+    return $this->importUpdate($old_name, $new_config, $old_config);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function createFromStorageRecord(array $values) {
+    // Assign a new UUID if there is none yet.
+    if ($this->uuidKey && $this->uuidService && !isset($values[$this->uuidKey])) {
+      $values[$this->uuidKey] = $this->uuidService->generate();
     }
-    $entity->save();
-    return TRUE;
+    $data = $this->mapFromStorageRecords(array($values));
+    $entity = current($data);
+    $entity->original = clone $entity;
+    $entity->enforceIsNew();
+    $entity->postCreate($this);
+
+    // Modules might need to add or change the data initially held by the new
+    // entity object, for instance to fill-in default values.
+    $this->invokeHook('create', $entity);
+    return $entity;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function updateFromStorageRecord(ConfigEntityInterface $entity, array $values) {
+    $entity->original = clone $entity;
+
+    $data = $this->mapFromStorageRecords(array($values));
+    $updated_entity = current($data);
+
+    foreach (array_keys($values) as $property) {
+      $value = $updated_entity->get($property);
+      $entity->set($property, $value);
+    }
+
+    return $entity;
   }
 
 }
diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorageInterface.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorageInterface.php
index c034101..62c36f9 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorageInterface.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigEntityStorageInterface.php
@@ -29,4 +29,40 @@
    */
   public static function getIDFromConfigName($config_name, $config_prefix);
 
+  /**
+   * Creates a configuration entity from storage values.
+   *
+   * Allows the configuration entity storage to massage storage values before
+   * creating an entity.
+   *
+   * @param array $values
+   *   The array of values from the configuration storage.
+   *
+   * @return ConfigEntityInterface
+   *   The configuration entity.
+   *
+   * @see \Drupal\Core\Entity\EntityStorageBase::mapFromStorageRecords()
+   * @see \Drupal\field\FieldStorageConfigStorage::mapFromStorageRecords()
+   */
+  public function createFromStorageRecord(array $values);
+
+  /**
+   * Updates a configuration entity from storage values.
+   *
+   * Allows the configuration entity storage to massage storage values before
+   * updating an entity.
+   *
+   * @param ConfigEntityInterface $entity
+   *   The configuration entity to update.
+   * @param array $values
+   *   The array of values from the configuration storage.
+   *
+   * @return ConfigEntityInterface
+   *   The configuration entity.
+   *
+   * @see \Drupal\Core\Entity\EntityStorageBase::mapFromStorageRecords()
+   * @see \Drupal\field\FieldStorageConfigStorage::mapFromStorageRecords()
+   */
+  public function updateFromStorageRecord(ConfigEntityInterface $entity, array $values);
+
 }
diff --git a/core/modules/config/src/Form/ConfigSingleImportForm.php b/core/modules/config/src/Form/ConfigSingleImportForm.php
index 5d7a541..debd1cb 100644
--- a/core/modules/config/src/Form/ConfigSingleImportForm.php
+++ b/core/modules/config/src/Form/ConfigSingleImportForm.php
@@ -246,12 +246,16 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
       $this->config($this->data['config_name'])->setData($this->data['import'])->save();
       drupal_set_message($this->t('The %name configuration was imported.', array('%name' => $this->data['config_name'])));
     }
-    // For a config entity, create a new entity and save it.
+    // For a config entity, create an entity and save it.
     else {
       try {
-        $entity = $this->entityManager
-          ->getStorage($this->data['config_type'])
-          ->create($this->data['import']);
+        $entity_storage = $this->entityManager->getStorage($this->data['config_type']);
+        if ($this->configExists) {
+          $entity = $entity_storage->updateFromStorageRecord($this->configExists, $this->data['import']);
+        }
+        else {
+          $entity = $entity_storage->createFromStorageRecord($this->data['import']);
+        }
         $entity->save();
         drupal_set_message($this->t('The @entity_type %label was imported.', array('@entity_type' => $entity->getEntityTypeId(), '%label' => $entity->label())));
       }
diff --git a/core/modules/config/src/Tests/ConfigSingleImportExportTest.php b/core/modules/config/src/Tests/ConfigSingleImportExportTest.php
index 5609f8f..7221be4 100644
--- a/core/modules/config/src/Tests/ConfigSingleImportExportTest.php
+++ b/core/modules/config/src/Tests/ConfigSingleImportExportTest.php
@@ -98,6 +98,26 @@ public function testImport() {
     $this->assertIdentical($entity->id(), 'second');
     $this->assertFalse($entity->status());
     $this->assertIdentical($entity->uuid(), $second_uuid);
+
+    // Perform an update.
+    $import = <<<EOD
+id: second
+uuid: $second_uuid
+label: 'Second updated'
+weight: 0
+style: ''
+status: '0'
+EOD;
+    $edit = array(
+      'config_type' => 'config_test',
+      'import' => $import,
+    );
+    $this->drupalPostForm('admin/config/development/configuration/single/import', $edit, t('Import'));
+    $this->assertRaw(t('Are you sure you want to update the %name @type?', array('%name' => 'second', '@type' => 'test configuration')));
+    $this->drupalPostForm(NULL, array(), t('Confirm'));
+    $entity = $storage->load('second');
+    $this->assertRaw(t('The @entity_type %label was imported.', array('@entity_type' => 'config_test', '%label' => $entity->label())));
+    $this->assertIdentical($entity->label(), 'Second updated');
   }
 
   /**
diff --git a/core/modules/field/src/Tests/FieldImportDeleteUninstallUiTest.php b/core/modules/field/src/Tests/FieldImportDeleteUninstallUiTest.php
index 67dc92d..49cb44d 100644
--- a/core/modules/field/src/Tests/FieldImportDeleteUninstallUiTest.php
+++ b/core/modules/field/src/Tests/FieldImportDeleteUninstallUiTest.php
@@ -102,6 +102,16 @@ public function testImportDeleteUninstall() {
     $staging->write('core.extension', $core_extension);
     $this->drupalGet('admin/config/development/configuration');
     $this->assertText('This synchronization will delete data from the fields: entity_test.field_tel, entity_test.field_text.');
+    // Delete all the text fields in staging, entity_test_install() adds quite
+    // a few.
+    foreach (\Drupal::entityManager()->getFieldMap() as $entity_type => $fields) {
+      foreach ($fields as $field_name => $info) {
+        if ($info['type'] == 'text') {
+          $staging->delete("field.storage.$entity_type.$field_name");
+          $staging->delete("field.instance.$entity_type.$entity_type.$field_name");
+        }
+      }
+    }
 
     // This will purge all the data, delete the field and uninstall the
     // Telephone and Text modules.
diff --git a/core/modules/options/src/Tests/OptionsFloatFieldImportTest.php b/core/modules/options/src/Tests/OptionsFloatFieldImportTest.php
new file mode 100644
index 0000000..11ce278
--- /dev/null
+++ b/core/modules/options/src/Tests/OptionsFloatFieldImportTest.php
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\options\Tests\OptionsFloatFieldImportTest.
+ */
+
+namespace Drupal\options\Tests;
+
+use Drupal\field\Entity\FieldInstanceConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\field\Tests\FieldTestBase;
+
+/**
+ * Tests option fields can be updated and created through config synchronization.
+ *
+ * @group options
+ */
+class OptionsFloatFieldImportTest extends FieldTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('node', 'options', 'field_test', 'taxonomy', 'field_ui', 'config');
+
+  protected function setUp() {
+    parent::setUp();
+
+    // Create test user.
+    $admin_user = $this->drupalCreateUser(array('synchronize configuration', 'access content', 'administer taxonomy', 'access administration pages', 'administer site configuration', 'administer content types', 'administer nodes', 'bypass node access', 'administer node fields', 'administer node display'));
+    $this->drupalLogin($admin_user);
+
+    // Create content type, with underscores.
+    $type_name = 'test_' . strtolower($this->randomMachineName());
+    $this->type_name = $type_name;
+    $type = $this->drupalCreateContentType(array('name' => $type_name, 'type' => $type_name));
+    $this->type = $type->type;
+  }
+
+  /**
+   * Tests that importing list_float fields works.
+   */
+  public function testImport() {
+    $this->field_name = 'field_options_float';
+
+    entity_create('field_storage_config', array(
+      'name' => $this->field_name,
+      'entity_type' => 'node',
+      'type' => 'list_float',
+    ))->save();
+    entity_create('field_instance_config', array(
+      'field_name' => $this->field_name,
+      'entity_type' => 'node',
+      'bundle' => $this->type,
+    ))->save();
+
+    $admin_path = 'admin/structure/types/manage/' . $this->type . '/fields/node.' . $this->type . '.' . $this->field_name . '/storage';
+
+    $edit = array('field[settings][allowed_values]' => "0|Zero\n.5|Point five");
+    $this->drupalPostForm($admin_path, $edit, t('Save field settings'));
+
+    // Export active config to staging
+    $this->copyConfig($this->container->get('config.storage'), $this->container->get('config.storage.staging'));
+
+    $edit = array('field[settings][allowed_values]' => "0|Zero\n1|One");
+    $this->drupalPostForm($admin_path, $edit, t('Save field settings'));
+
+    $field_storage = FieldStorageConfig::loadByName('node', $this->field_name);
+    $this->assertIdentical($field_storage->getSetting('allowed_values'), $array = array('0' => 'Zero', '1' => 'One'));
+
+    $this->drupalGet('admin/config/development/configuration');
+    $this->drupalPostForm(NULL, array(), t('Import all'));
+
+    $field_storage = FieldStorageConfig::loadByName('node', $this->field_name);
+    $this->assertIdentical($field_storage->getSetting('allowed_values'), $array = array('0' => 'Zero', '0.5' => 'Point five'));
+
+    // Delete field to test creation. Deleting the instance will also delete
+    // the storage.
+    FieldInstanceConfig::loadByName('node', $this->type, $this->field_name)->delete();
+
+    $this->drupalGet('admin/config/development/configuration');
+    $this->drupalPostForm(NULL, array(), t('Import all'));
+
+    $field_storage = FieldStorageConfig::loadByName('node', $this->field_name);
+    $this->assertIdentical($field_storage->getSetting('allowed_values'), $array = array('0' => 'Zero', '0.5' => 'Point five'));
+  }
+}
\ No newline at end of file
