diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index 40da4b8..1e17e66 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -332,7 +332,19 @@ public function bundle() {
    * {inheritdoc}
    */
   public function uuid() {
-    return $this->getEntityKey('uuid');
+    $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;
+    }
+    return $uuid;
   }
 
   /**
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..b058439 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,23 @@ 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. Actually generate a
+    // UUID in ::preSave().
+    $this->setValue(array('value' => ''), $notify);
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function preSave() {
+    parent::preSave();
+
+    if ($this->value === '') {
+      $uuid = \Drupal::service('uuid');
+      $this->value = $uuid->generate();
+    }
+
     return $this;
   }
 
diff --git a/core/modules/rest/src/Tests/CreateTest.php b/core/modules/rest/src/Tests/CreateTest.php
index d125f1b..4cf60bf 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->get('uuid')->get(0)->preSave();
 
       // Serialize the entity before the POST request.
       $serialized = $this->serializer->serialize($entity, $this->defaultFormat, ['account' => $account]);
@@ -194,6 +196,7 @@ public function testCreateNode() {
         unset($entity->changed);
         unset($entity->revision_timestamp);
       }
+      $entity->get('uuid')->get(0)->preSave();
 
       $serialized = $this->serializer->serialize($entity, $this->defaultFormat, ['account' => $account]);
 
@@ -245,6 +248,7 @@ public function testCreateUser() {
 
       // Changed field can never be added.
       unset($entity->changed);
+      $entity->get('uuid')->get(0)->preSave();
 
       $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..a419660 100644
--- a/core/modules/system/src/Tests/Entity/EntityFieldDefaultValueTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityFieldDefaultValueTest.php
@@ -17,17 +17,8 @@
  */
 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');
   }
 
   /**
@@ -51,7 +42,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/user/src/Tests/UserRegistrationTest.php b/core/modules/user/src/Tests/UserRegistrationTest.php
index ff3fa30..9a4f4d4 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'
