diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index 40da4b8..c94ae30 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -329,7 +329,7 @@ public function bundle() {
   }
 
   /**
-   * {inheritdoc}
+   * {@inheritdoc}
    */
   public function uuid() {
     return $this->getEntityKey('uuid');
@@ -338,6 +338,24 @@ public function uuid() {
   /**
    * {@inheritdoc}
    */
+  public function initUuid() {
+    $uuid = $this->getEntityKey('uuid');
+    if (empty($uuid) && $this->getEntityType()->hasKey('uuid')) {
+      // Generate a UUID.
+      $uuid_service = \Drupal::service('uuid');
+      $uuid = $uuid_service->generate();
+
+      // Set the value.
+      $this->set($this->getEntityType()->getKey('uuid'), $uuid);
+
+      // Update the ::getEntityKey() static cache.
+      $this->entityKeys['uuid'] = $uuid;
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function hasField($field_name) {
     return (bool) $this->getFieldDefinition($field_name);
   }
@@ -971,6 +989,16 @@ public function label() {
   /**
    * {@inheritdoc}
    */
+  public function preSave(EntityStorageInterface $storage) {
+    parent::preSave($storage);
+
+    // Ensure that a uuid is generated.
+    $this->initUuid();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function referencedEntities() {
     $referenced_entities = array();
 
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityInterface.php b/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
index 657a599..bfb83d2 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
@@ -38,4 +38,9 @@
    */
   public function initTranslation($langcode);
 
+  /**
+   * Initializes the UUID.
+   */
+  public function initUuid();
+
 }
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php
index 84d1ec5..d1c2e23 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php
@@ -37,9 +37,8 @@ public static function defaultStorageSettings() {
    * {@inheritdoc}
    */
   public function applyDefaultValue($notify = TRUE) {
-    // Default to one field item with a generated UUID.
-    $uuid = \Drupal::service('uuid');
-    $this->setValue(array('value' => $uuid->generate()), $notify);
+    // Default to one field item without a generated UUID.
+    $this->setValue(array('value' => ''), $notify);
     return $this;
   }
 
diff --git a/core/modules/comment/tests/src/Unit/Entity/CommentLockTest.php b/core/modules/comment/tests/src/Unit/Entity/CommentLockTest.php
index e02934d..ebc0246 100644
--- a/core/modules/comment/tests/src/Unit/Entity/CommentLockTest.php
+++ b/core/modules/comment/tests/src/Unit/Entity/CommentLockTest.php
@@ -74,7 +74,7 @@ public function testLocks() {
     $comment->expects($this->any())
       ->method('getEntityType')
       ->will($this->returnValue($entity_type));
-    $comment->expects($this->at(1))
+    $comment->expects($this->at(2))
       ->method('get')
       ->with('status')
       ->will($this->returnValue((object) array('value' => NULL)));
diff --git a/core/modules/rest/src/Tests/CreateTest.php b/core/modules/rest/src/Tests/CreateTest.php
index 98b944a..9b6d8af 100644
--- a/core/modules/rest/src/Tests/CreateTest.php
+++ b/core/modules/rest/src/Tests/CreateTest.php
@@ -116,6 +116,8 @@ public function testCreateEntityTest() {
       // Populate some entity properties before create the entity.
       $entity_values = $this->entityValues($entity_type);
       $entity = EntityTest::create($entity_values);
+      // Make sure we get a uuid.
+      $entity->initUuid();
 
       // Serialize the entity before the POST request.
       $serialized = $this->serializer->serialize($entity, $this->defaultFormat, ['account' => $account]);
@@ -198,6 +200,7 @@ public function testCreateNode() {
         unset($entity->changed);
         unset($entity->revision_timestamp);
       }
+      $entity->initUuid();
 
       $serialized = $this->serializer->serialize($entity, $this->defaultFormat, ['account' => $account]);
 
@@ -250,6 +253,7 @@ public function testCreateUser() {
 
       // Changed field can never be added.
       unset($entity->changed);
+      $entity->initUuid();
 
       $serialized = $this->serializer->serialize($entity, $this->defaultFormat, ['account' => $account]);
 
diff --git a/core/modules/system/src/Tests/Entity/EntityFieldDefaultValueTest.php b/core/modules/system/src/Tests/Entity/EntityFieldDefaultValueTest.php
index e8453ff..6c171cc 100644
--- a/core/modules/system/src/Tests/Entity/EntityFieldDefaultValueTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityFieldDefaultValueTest.php
@@ -18,19 +18,6 @@
 class EntityFieldDefaultValueTest extends EntityUnitTestBase  {
 
   /**
-   * The UUID object to be used for generating UUIDs.
-   *
-   * @var \Drupal\Component\Uuid\UuidInterface
-   */
-  protected $uuid;
-
-  protected function setUp() {
-    parent::setUp();
-    // Initiate the generator object.
-    $this->uuid = $this->container->get('uuid');
-  }
-
-  /**
    * Tests default values on entities and fields.
    */
   public function testDefaultValues() {
@@ -51,7 +38,6 @@ protected function assertDefaultValues($entity_type_id) {
     $definition = $this->entityManager->getDefinition($entity_type_id);
     $langcode_key = $definition->getKey('langcode');
     $this->assertEqual($entity->{$langcode_key}->value, 'en', SafeMarkup::format('%entity_type: Default language', array('%entity_type' => $entity_type_id)));
-    $this->assertTrue(Uuid::isValid($entity->uuid->value), SafeMarkup::format('%entity_type: Default UUID', array('%entity_type' => $entity_type_id)));
     $this->assertEqual($entity->name->getValue(), array(), 'Field has one empty value by default.');
   }
 
diff --git a/core/modules/system/src/Tests/Entity/EntityUUIDTest.php b/core/modules/system/src/Tests/Entity/EntityUUIDTest.php
index 9108256..556da16 100644
--- a/core/modules/system/src/Tests/Entity/EntityUUIDTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityUUIDTest.php
@@ -53,7 +53,7 @@ protected function assertCRUD($entity_type) {
     // Save this entity, so we have more than one later.
     $custom_entity->save();
 
-    // Verify that a new UUID is generated upon creating an entity.
+    // Verify that a new UUID is generated for a new entity.
     $entity = entity_create($entity_type, array('name' => $this->randomMachineName()));
     $uuid = $entity->uuid();
     $this->assertTrue($uuid);
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestDefaultAccess.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestDefaultAccess.php
index 239250f..9539b9f 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestDefaultAccess.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestDefaultAccess.php
@@ -16,6 +16,7 @@
  *   base_table = "entity_test",
  *   entity_keys = {
  *     "id" = "id",
+ *     "uuid" = "uuid",
  *     "bundle" = "type"
  *   }
  * )
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestLabel.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestLabel.php
index 1ff0264..4758295 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestLabel.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestLabel.php
@@ -21,6 +21,7 @@
  *   render_cache = FALSE,
  *   entity_keys = {
  *     "id" = "id",
+ *     "uuid" = "uuid",
  *     "label" = "name",
  *     "bundle" = "type"
  *   }
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestLabelCallback.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestLabelCallback.php
index 1088114..fe26563 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestLabelCallback.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestLabelCallback.php
@@ -18,6 +18,7 @@
  *   label_callback = "entity_test_label_callback",
  *   entity_keys = {
  *     "id" = "id",
+ *     "uuid" = "uuid",
  *     "bundle" = "type"
  *   }
  * )
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestNoId.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestNoId.php
index a29c1e2..78ef588 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestNoId.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestNoId.php
@@ -17,6 +17,7 @@
  *     "storage" = "Drupal\Core\Entity\ContentEntityNullStorage",
  *   },
  *   entity_keys = {
+ *     "uuid" = "uuid",
  *     "bundle" = "type",
  *   },
  *   field_ui_base_route = "entity.entity_test_no_id.admin_form",
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestNoLabel.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestNoLabel.php
index 5ad3ba7..b4220b6 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestNoLabel.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestNoLabel.php
@@ -17,6 +17,7 @@
  *   base_table = "entity_test",
  *   entity_keys = {
  *     "id" = "id",
+ *     "uuid" = "uuid",
  *     "bundle" = "type"
  *   }
  * )
diff --git a/core/modules/user/src/Tests/UserRegistrationTest.php b/core/modules/user/src/Tests/UserRegistrationTest.php
index ff3fa30..4b9bca7 100644
--- a/core/modules/user/src/Tests/UserRegistrationTest.php
+++ b/core/modules/user/src/Tests/UserRegistrationTest.php
@@ -150,6 +150,31 @@ function testRegistrationEmailDuplicates() {
     $this->assertText(t('The email address @email is already taken.', array('@email' => $duplicate_user->getEmail())), 'Supplying a duplicate email address with added whitespace displays an error message');
   }
 
+  /**
+   * Tests that UUID isn't cached in form state on register form.
+   */
+  public function testUuidFormState() {
+    // Don't require email verification and allow registration by site visitors
+    // without administrator approval.
+    $this->config('user.settings')
+      ->set('verify_mail', FALSE)
+      ->set('register', USER_REGISTER_VISITORS)
+      ->save();
+
+    $edit = array();
+    $edit['name'] = $this->randomMachineName();
+    $edit['mail'] = $edit['name'] . '@example.com';
+
+    // Create one account.
+    $this->drupalPostForm('user/register', $edit, t('Create new account'));
+    $this->assertResponse(200);
+    // Create a second account.
+    $edit['name'] = $this->randomMachineName();
+    $edit['mail'] = $edit['name'] . '@example.com';
+    $this->drupalPostForm('user/register', $edit, t('Create new account'));
+    $this->assertResponse(200);
+  }
+
   function testRegistrationDefaultValues() {
     // Don't require email verification and allow registration by site visitors
     // without administrator approval.
diff --git a/core/modules/user/user.routing.yml b/core/modules/user/user.routing.yml
index 6dc4fdb..6eb709f 100644
--- a/core/modules/user/user.routing.yml
+++ b/core/modules/user/user.routing.yml
@@ -5,9 +5,6 @@ user.register:
     _title: 'Create new account'
   requirements:
     _access_user_register: 'TRUE'
-  # @todo Remove when https://www.drupal.org/node/2465053 lands.
-  options:
-    no_cache: TRUE
 
 user.logout:
   path: '/user/logout'
