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..5ab587e 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]);
 
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/src/Tests/Entity/EntityChangedConstraintValidatorTest.php b/core/modules/system/src/Tests/Entity/EntityChangedConstraintValidatorTest.php
new file mode 100644
index 0000000..5c7d8dc
--- /dev/null
+++ b/core/modules/system/src/Tests/Entity/EntityChangedConstraintValidatorTest.php
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\Tests\Entity\EntityChangedConstraintValidatorTest.
+ */
+
+namespace Drupal\system\Tests\Entity;
+
+use Drupal\system\Tests\Entity\EntityUnitTestBase;
+use Drupal\system\Tests\TypedData;
+use Drupal\Core\TypedData\DataDefinition;
+use Drupal\entity_test\Entity\EntityTestChanged;
+
+/**
+ * Tests validation constraints for EntityChangedConstraintValidator.
+ *
+ * @group Validation
+ */
+class EntityChangedConstraintValidatorTest extends EntityUnitTestBase {
+
+  /**
+   * The typed data manager to use.
+   *
+   * @var \Drupal\Core\TypedData\TypedDataManager
+   */
+  protected $typedData;
+
+  public function setUp() {
+    parent::setUp();
+    $this->typedData = $this->container->get('typed_data_manager');
+  }
+
+  /**
+   * Tests the EntityChangedConstraintValidator.
+   */
+  public function testValidation() {
+    // Test the validation.
+    $account = $this->createUser();
+    $entity_test = entity_create('entity_test', array('user_id' => $account->id()));
+
+    $entity_test->save();
+    $violations = $entity_test->changed->validate();
+    $this->assertEqual($violations->count(), 0, 'Validation passed for correct value.');
+    // Set a changed date in the future.
+    $entity_test->set('changed', REQUEST_TIME + 100000);
+    // Run validation on the changed field.
+    $violations = $entity_test->changed->validate();
+    $this->assertEqual($violations->count(), 0, 'Validation passed for correct value.');
+
+    // Test the validation when an invalid value is passed.
+    // Set a changed date in the past.
+    $entity_test->set('changed', 433918800);
+    // Run validation on the changed field.
+    $violations = $entity_test->changed->validate();
+    $this->assertEqual($violations->count(), 1, 'Validation failed for incorrect value.');
+
+    // Make sure the information provided by a violation is correct.
+    $violation = $violations[0];
+    // The property path is 0 as the validator is being run on the field.
+    $this->assertEqual($violation->getPropertyPath(), '0');
+    $this->assertEqual($violation->getMessage(), t('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/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;
+  }
 }
