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 b661b3e..f4b5082 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/ChangedItem.php
@@ -16,7 +16,7 @@
  *   description = @Translation("An entity field containing a UNIX timestamp of when the entity has been last updated."),
  *   no_ui = TRUE,
  *   constraints = {
- *     "ComplexData" = {"value" = {"EntityChanged" = {}}}
+ *     "EntityChanged" = {}
  *   }
  * )
  */
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..f5e8755
--- /dev/null
+++ b/core/modules/system/src/Tests/Entity/EntityChangedConstraintValidatorTest.php
@@ -0,0 +1,67 @@
+<?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.
+ */
+class EntityChangedConstraintValidatorTest extends EntityUnitTestBase {
+
+  /**
+   * The typed data manager to use.
+   *
+   * @var \Drupal\Core\TypedData\TypedDataManager
+   */
+  protected $typedData;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Entity changed constraint',
+      'description' => 'Tests validation constraints for EntityChangedConstraintValidator.',
+      'group' => 'Validation',
+    );
+  }
+
+  public function setUp() {
+    parent::setUp();
+
+    $this->installEntitySchema('entity_test_changed');
+    $this->typedData = $this->container->get('typed_data_manager');
+  }
+
+  /**
+   * Tests the EntityChangedConstraintValidator.
+   */
+  public function testValidation() {
+    // Test the validation.
+    $user1 = $this->createUser();
+    $entity_test = entity_create('entity_test_changed', array('user_id' => $user1->id()));
+
+    $entity_test->save();
+    $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/entity_test.install b/core/modules/system/tests/modules/entity_test/entity_test.install
index 4d2e0f3..efa5698 100644
--- a/core/modules/system/tests/modules/entity_test/entity_test.install
+++ b/core/modules/system/tests/modules/entity_test/entity_test.install
@@ -14,6 +14,7 @@ function entity_test_install() {
     'entity_test_rev',
     'entity_test_mul',
     'entity_test_mulrev',
+    'entity_test_changed',
   );
   foreach ($entity_types as $entity_type) {
     // Auto-create fields for testing.
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestChanged.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestChanged.php
new file mode 100644
index 0000000..adcb6e2
--- /dev/null
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestChanged.php
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\entity_test\Entity\EntityTestChanged.
+ */
+
+namespace Drupal\entity_test\Entity;
+
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Field\BaseFieldDefinition;
+use Drupal\entity_test\Entity\EntityTest;
+use Drupal\Core\Entity\EntityChangedInterface;
+
+/**
+ * Defines the test entity class.
+ *
+ * @ContentEntityType(
+ *   id = "entity_test_changed",
+ *   label = @Translation("Test entity - data table"),
+ *   handlers = {
+ *     "access" = "Drupal\entity_test\EntityTestAccessControlHandler",
+ *     "form" = {
+ *       "default" = "Drupal\entity_test\EntityTestForm",
+ *       "delete" = "Drupal\entity_test\EntityTestDeleteForm"
+ *     },
+ *     "translation" = "Drupal\content_translation\ContentTranslationHandler",
+ *     "views_data" = "Drupal\views\EntityViewsData"
+ *   },
+ *   base_table = "entity_test_changed",
+ *   data_table = "entity_test_changed_property_data",
+ *   fieldable = TRUE,
+ *   entity_keys = {
+ *     "id" = "id",
+ *     "uuid" = "uuid",
+ *     "bundle" = "type"
+ *   },
+ *   links = {
+ *     "canonical" = "entity_test.edit_entity_test_changed",
+ *     "edit-form" = "entity_test.edit_entity_test_changed",
+ *   }
+ * )
+ */
+class EntityTestChanged extends EntityTest implements EntityChangedInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
+    $fields = parent::baseFieldDefinitions($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;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getChangedTime() {
+    return $this->get('changed')->value;
+  }
+}
