diff --git a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraintValidator.php b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraintValidator.php
index 9dd3628..6d4d4db 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraintValidator.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraintValidator.php
@@ -22,11 +22,10 @@ class EntityChangedConstraintValidator extends ConstraintValidator {
   public function validate($value, Constraint $constraint) {
     if (isset($value)) {
       /** @var $entity \Drupal\Core\Entity\EntityInterface */
-      $entity = $this->context->getMetadata()->getTypedData()->getEntity();
+      $entity = $value->getEntity();
       if (!$entity->isNew()) {
         $saved_entity = \Drupal::entityManager()->getStorage($entity->getEntityTypeId())->loadUnchanged($entity->id());
-
-        if ($saved_entity && ($saved_entity instanceof EntityChangedInterface) && ($saved_entity->getChangedTime() > $value)) {
+        if ($saved_entity && ($saved_entity instanceof EntityChangedInterface) && ($saved_entity->getChangedTime() > $entity->getChangedTime())) {
           $this->context->addViolation($constraint->message);
         }
       }
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php
index cafdde7..bd9caed 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php
@@ -17,7 +17,7 @@
  *   no_ui = TRUE,
  *   list_class = "\Drupal\Core\Field\ChangedFieldItemList",
  *   constraints = {
- *     "ComplexData" = {"value" = {"EntityChanged" = {}}}
+ *     "EntityChanged" = {}
  *   }
  * )
  */
diff --git a/core/modules/node/src/Tests/NodeValidationTest.php b/core/modules/node/src/Tests/NodeValidationTest.php
index ef11740..9dff272 100644
--- a/core/modules/node/src/Tests/NodeValidationTest.php
+++ b/core/modules/node/src/Tests/NodeValidationTest.php
@@ -63,7 +63,7 @@ public function testValidation() {
     $node->set('changed', 433918800);
     $violations = $node->validate();
     $this->assertEqual(count($violations), 1, 'Violation found when changed date is before the last changed date.');
-    $this->assertEqual($violations[0]->getPropertyPath(), 'changed.0.value');
+    $this->assertEqual($violations[0]->getPropertyPath(), 'changed.0');
     $this->assertEqual($violations[0]->getMessage(), 'The content has either been modified by another user, or you have already submitted modifications. As a result, your changes cannot be saved.');
   }
 }
diff --git a/core/modules/rest/src/Tests/CreateTest.php b/core/modules/rest/src/Tests/CreateTest.php
index d125f1b..f1e5173 100644
--- a/core/modules/rest/src/Tests/CreateTest.php
+++ b/core/modules/rest/src/Tests/CreateTest.php
@@ -59,6 +59,8 @@ public function testCreateResourceRestApiNotEnabled() {
     $entity_values = $this->entityValues($entity_type);
     $entity = EntityTest::create($entity_values);
 
+    // We cannot overwrite the changed time.
+    unset($entity->changed);
     // Serialize the entity before the POST request.
     $serialized = $this->serializer->serialize($entity, $this->defaultFormat, ['account' => $account]);
 
@@ -89,6 +91,8 @@ public function testCreateWithoutPermission() {
     // Populate some entity properties before create the entity.
     $entity_values = $this->entityValues($entity_type);
     $entity = EntityTest::create($entity_values);
+    // We cannot overwrite the changed time.
+    unset($entity->changed);
 
     // Serialize the entity before the POST request.
     $serialized = $this->serializer->serialize($entity, $this->defaultFormat, ['account' => $account]);
@@ -116,6 +120,8 @@ public function testCreateEntityTest() {
       // Populate some entity properties before create the entity.
       $entity_values = $this->entityValues($entity_type);
       $entity = EntityTest::create($entity_values);
+      // We cannot overwrite the changed time.
+      unset($entity->changed);
 
       // Serialize the entity before the POST request.
       $serialized = $this->serializer->serialize($entity, $this->defaultFormat, ['account' => $account]);
@@ -180,6 +186,8 @@ public function testCreateNode() {
       // Populate some entity properties before create the entity.
       $entity_values = $this->entityValues($entity_type);
       $entity = Node::create($entity_values);
+      // We cannot overwrite the changed time.
+      unset($entity->changed);
 
       // Verify that user cannot create content when trying to write to fields where it is not possible.
       if (!$account->hasPermission('administer nodes')) {
@@ -190,10 +198,11 @@ public function testCreateNode() {
         $entity = $this->removeNodeFieldsForNonAdminUsers($entity);
       }
       else {
-        // Changed and revision_timestamp fields can never be added.
-        unset($entity->changed);
+        // revision_timestamp fields can never be added.
         unset($entity->revision_timestamp);
       }
+      // We cannot overwrite the changed time.
+      unset($entity->changed);
 
       $serialized = $this->serializer->serialize($entity, $this->defaultFormat, ['account' => $account]);
 
@@ -234,6 +243,8 @@ public function testCreateUser() {
       $this->drupalLogin($account);
       $entity_values = $this->entityValues($entity_type);
       $entity = User::create($entity_values);
+      // We cannot overwrite the changed time.
+      unset($entity->changed);
 
       // Verify that only administrative users can create users.
       if (!$account->hasPermission('administer users')) {
diff --git a/core/modules/rest/src/Tests/CsrfTest.php b/core/modules/rest/src/Tests/CsrfTest.php
index a686f448..d9de1b9 100644
--- a/core/modules/rest/src/Tests/CsrfTest.php
+++ b/core/modules/rest/src/Tests/CsrfTest.php
@@ -54,6 +54,8 @@ protected function setUp() {
     $serializer = $this->container->get('serializer');
     $entity_values = $this->entityValues($this->testEntityType);
     $entity = entity_create($this->testEntityType, $entity_values);
+    // We cannot overwrite the changed time.
+    unset($entity->changed);
     $this->serialized = $serializer->serialize($entity, $this->defaultFormat);
   }
 
diff --git a/core/modules/rest/src/Tests/UpdateTest.php b/core/modules/rest/src/Tests/UpdateTest.php
index 481e33b..6e2d2a8 100644
--- a/core/modules/rest/src/Tests/UpdateTest.php
+++ b/core/modules/rest/src/Tests/UpdateTest.php
@@ -54,6 +54,8 @@ public function testPatchUpdate() {
     $patch_entity = entity_create($entity_type, $patch_values);
     // We don't want to overwrite the UUID.
     unset($patch_entity->uuid);
+    // We cannot overwrite the changed time.
+    unset($patch_entity->changed);
     $serialized = $serializer->serialize($patch_entity, $this->defaultFormat, $context);
 
     // Update the entity over the REST API.
@@ -145,6 +147,8 @@ public function testPatchUpdate() {
     // Try to send invalid data to trigger the entity validation constraints.
     // Send a UUID that is too long.
     $entity->set('uuid', $this->randomMachineName(129));
+    // We cannot overwrite the changed time.
+    unset($entity->changed);
     $invalid_serialized = $serializer->serialize($entity, $this->defaultFormat, $context);
     $response = $this->httpRequest($entity->urlInfo(), 'PATCH', $invalid_serialized, $this->defaultMimeType);
     $this->assertResponse(422);
diff --git a/core/modules/serialization/src/Tests/EntitySerializationTest.php b/core/modules/serialization/src/Tests/EntitySerializationTest.php
index bb305a7..6257dfc 100644
--- a/core/modules/serialization/src/Tests/EntitySerializationTest.php
+++ b/core/modules/serialization/src/Tests/EntitySerializationTest.php
@@ -69,6 +69,7 @@ protected function setUp() {
     );
     $this->entity = entity_create('entity_test_mulrev', $this->values);
     $this->entity->save();
+    $this->values['changed'] = $this->entity->getChangedTime();
 
     $this->serializer = $this->container->get('serializer');
 
@@ -101,6 +102,9 @@ public function testNormalize() {
       'user_id' => array(
         array('target_id' => $this->values['user_id']),
       ),
+      'changed' => array(
+        array('value' => $this->values['changed']),
+      ),
       'revision_id' => array(
         array('value' => 1),
       ),
@@ -180,6 +184,7 @@ public function testSerialize() {
       'type' => '<type><value>entity_test_mulrev</value></type>',
       'created' => '<created><value>' . $this->entity->created->value . '</value></created>',
       'user_id' => '<user_id><target_id>' . $this->values['user_id'] . '</target_id></user_id>',
+      'changed' => '<changed><value>' . $this->values['changed'] . '</value></changed>',
       'revision_id' => '<revision_id><value>' . $this->entity->getRevisionId() . '</value></revision_id>',
       'default_langcode' => '<default_langcode><value>1</value></default_langcode>',
       'field_test_text' => '<field_test_text><value>' . $this->values['field_test_text']['value'] . '</value><format>' . $this->values['field_test_text']['format'] . '</format></field_test_text>',
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTest.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTest.php
index 89b4c20..b0980d5 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTest.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTest.php
@@ -13,6 +13,7 @@
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\user\EntityOwnerInterface;
 use Drupal\user\UserInterface;
+use Drupal\Core\Entity\EntityChangedInterface;
 
 /**
  * Defines the test entity class.
@@ -49,7 +50,7 @@
  *   field_ui_base_route = "entity.entity_test.admin_form",
  * )
  */
-class EntityTest extends ContentEntityBase implements EntityOwnerInterface {
+class EntityTest extends ContentEntityBase implements EntityOwnerInterface, EntityChangedInterface {
 
   /**
    * {@inheritdoc}
@@ -126,6 +127,11 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
         ),
       ));
 
+    $fields['changed'] = BaseFieldDefinition::create('changed')
+      ->setLabel(t('Changed'))
+      ->setDescription(t('The time that the entity was last edited.'))
+      ->setRevisionable(TRUE)
+      ->setTranslatable(TRUE);
     return $fields;
   }
 
@@ -181,4 +187,10 @@ public function getName() {
     return $this->get('name')->value;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getChangedTime() {
+    return $this->get('changed')->value;
+  }
 }
