diff --git a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/BundleConstraint.php b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/BundleConstraint.php
index 3bee330..022a345 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/BundleConstraint.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/BundleConstraint.php
@@ -12,7 +12,7 @@
 /**
  * Checks if a value is a valid entity type.
  *
- * @Plugin(
+ * @Constraint(
  *   id = "Bundle",
  *   label = @Translation("Bundle", context = "Validation"),
  *   type = { "entity", "entity_reference" }
diff --git a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraint.php b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraint.php
index 8a5f319..2a73455 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraint.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityChangedConstraint.php
@@ -12,7 +12,7 @@
 /**
  * Validation constraint for the entity changed timestamp.
  *
- * @Plugin(
+ * @Constraint(
  *   id = "EntityChanged",
  *   label = @Translation("Entity changed", context = "Validation"),
  *   type = {"entity"}
diff --git a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityTypeConstraint.php b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityTypeConstraint.php
index df25b6c..62194c4 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityTypeConstraint.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/EntityTypeConstraint.php
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Contains \Drupal\Core\Entity\Constraint\EntityTypeConstraint.
+ * Contains \Drupal\Core\Entity\Plugin\Validation\Constraint\EntityTypeConstraint.
  */
 
 namespace Drupal\Core\Entity\Plugin\Validation\Constraint;
@@ -12,7 +12,7 @@
 /**
  * Checks if a value is a valid entity type.
  *
- * @Plugin(
+ * @Constraint(
  *   id = "EntityType",
  *   label = @Translation("Entity type", context = "Validation"),
  *   type = { "entity", "entity_reference" }
diff --git a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraint.php b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraint.php
index 2a7d6a9..d982193 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraint.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraint.php
@@ -14,7 +14,7 @@
  *
  * Verifies that referenced entities are valid.
  *
- * @Plugin(
+ * @Constraint(
  *   id = "ValidReference",
  *   label = @Translation("Entity Reference valid reference", context = "Validation")
  * )
diff --git a/core/lib/Drupal/Core/Validation/Annotation/Constraint.php b/core/lib/Drupal/Core/Validation/Annotation/Constraint.php
new file mode 100644
index 0000000..4d92c9a
--- /dev/null
+++ b/core/lib/Drupal/Core/Validation/Annotation/Constraint.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Validation\Annotation\Constraint.
+ */
+
+namespace Drupal\Core\Validation\Annotation;
+
+use Drupal\Component\Annotation\Plugin;
+
+/**
+ * Defines a validation constraint annotation object.
+ *
+ * @see \Drupal\Core\Validation\ConstraintManager
+ * @see hook_validation_constraint_info_alter()
+ *
+ * @Annotation
+ */
+class Constraint extends Plugin {
+
+  /**
+   * The constraint plugin ID.
+   *
+   * @var string
+   */
+  public $id;
+
+  /**
+   * The human-readable name of the constraint plugin.
+   *
+   * @ingroup plugin_translatable
+   *
+   * @var \Drupal\Core\Annotation\Translation
+   */
+  public $label;
+
+  /**
+   * An array of data type IDs for which this constraint applies. Valid values
+   * are any types registered by the typed data API, or an array of multiple
+   * type names. For supporting all types, FALSE may be specified. The key
+   * defaults to an empty array, i.e. no types are supported.
+   *
+   * @var mixed
+   *
+   * @see \Drupal\Core\TypedData\Annotation\DataType
+   */
+  public $types;
+
+}
diff --git a/core/lib/Drupal/Core/Validation/ConstraintManager.php b/core/lib/Drupal/Core/Validation/ConstraintManager.php
index d2e84c7..da1ddc6 100644
--- a/core/lib/Drupal/Core/Validation/ConstraintManager.php
+++ b/core/lib/Drupal/Core/Validation/ConstraintManager.php
@@ -47,7 +47,7 @@ class ConstraintManager extends DefaultPluginManager {
    *   The module handler to invoke the alter hook with.
    */
   public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, LanguageManager $language_manager, ModuleHandlerInterface $module_handler) {
-    parent::__construct('Plugin/Validation/Constraint', $namespaces);
+    parent::__construct('Plugin/Validation/Constraint', $namespaces, 'Drupal\Core\Validation\Annotation\Constraint');
     $this->discovery = new StaticDiscoveryDecorator($this->discovery, array($this, 'registerDefinitions'));
     $this->alterInfo($module_handler, 'validation_constraint');
     $this->setCacheBackend($cache_backend, $language_manager, 'validation_constraint_plugins');
diff --git a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/AllowedValuesConstraint.php b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/AllowedValuesConstraint.php
index 34b652d..5bf9dc4 100644
--- a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/AllowedValuesConstraint.php
+++ b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/AllowedValuesConstraint.php
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Contains \Drupal\Core\Validation\Constraint\AllowedValuesConstraint.
+ * Contains \Drupal\Core\Validation\Plugin\Validation\Constraint\AllowedValuesConstraint.
  */
 
 namespace Drupal\Core\Validation\Plugin\Validation\Constraint;
@@ -12,7 +12,7 @@
 /**
  * Checks for the value being allowed.
  *
- * @Plugin(
+ * @Constraint(
  *   id = "AllowedValues",
  *   label = @Translation("Allowed values", context = "Validation")
  * )
diff --git a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/ComplexDataConstraint.php b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/ComplexDataConstraint.php
index c9638ae..0c7d0e0 100644
--- a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/ComplexDataConstraint.php
+++ b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/ComplexDataConstraint.php
@@ -14,7 +14,7 @@
  *
  * Validates properties of complex data structures.
  *
- * @Plugin(
+ * @Constraint(
  *   id = "ComplexData",
  *   label = @Translation("Complex data", context = "Validation")
  * )
diff --git a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/CountConstraint.php b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/CountConstraint.php
index 77836a7..270d0d7 100644
--- a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/CountConstraint.php
+++ b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/CountConstraint.php
@@ -14,7 +14,7 @@
  *
  * Overrides the symfony constraint to use Drupal-style replacement patterns.
  *
- * @Plugin(
+ * @Constraint(
  *   id = "Count",
  *   label = @Translation("Count", context = "Validation"),
  *   type = { "list" }
diff --git a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/LengthConstraint.php b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/LengthConstraint.php
index f8b34b4..308afd1 100644
--- a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/LengthConstraint.php
+++ b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/LengthConstraint.php
@@ -16,7 +16,7 @@
  *
  * @todo: Move this below the TypedData core component.
  *
- * @Plugin(
+ * @Constraint(
  *   id = "Length",
  *   label = @Translation("Length", context = "Validation"),
  *   type = { "string" }
diff --git a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/PrimitiveTypeConstraint.php b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/PrimitiveTypeConstraint.php
index 1d9ca3c..e8f1dd3 100644
--- a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/PrimitiveTypeConstraint.php
+++ b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/PrimitiveTypeConstraint.php
@@ -12,7 +12,7 @@
 /**
  * Supports validating all primitive types.
  *
- * @Plugin(
+ * @Constraint(
  *   id = "PrimitiveType",
  *   label = @Translation("Primitive type", context = "Validation")
  * )
diff --git a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/RangeConstraint.php b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/RangeConstraint.php
index c35b64f..298f59c 100644
--- a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/RangeConstraint.php
+++ b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/RangeConstraint.php
@@ -16,7 +16,7 @@
  *
  * @todo: Move this below the TypedData core component.
  *
- * @Plugin(
+ * @Constraint(
  *   id = "Range",
  *   label = @Translation("Range", context = "Validation"),
  *   type = { "integer", "float" }
diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Validation/Constraint/TestFieldConstraint.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Validation/Constraint/TestFieldConstraint.php
index 61d7b20..fc57564 100644
--- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Validation/Constraint/TestFieldConstraint.php
+++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Validation/Constraint/TestFieldConstraint.php
@@ -12,7 +12,7 @@
 /**
  * Checks if a value is not equal.
  *
- * @Plugin(
+ * @Constraint(
  *   id = "TestField",
  *   label = @Translation("Test Field", context = "Validation"),
  *   type = { "integer" }
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Validation/Constraint/TermParentConstraint.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Validation/Constraint/TermParentConstraint.php
index 2e221d2..8d58cb7 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Validation/Constraint/TermParentConstraint.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Validation/Constraint/TermParentConstraint.php
@@ -14,7 +14,7 @@
 /**
  * Checks if a value is a valid taxonomy term parent (term id or 0).
  *
- * @Plugin(
+ * @Constraint(
  *   id = "TermParent",
  *   label = @Translation("Term parent", context = "Validation")
  * )
diff --git a/core/modules/user/lib/Drupal/user/Plugin/Validation/Constraint/UserMailUnique.php b/core/modules/user/lib/Drupal/user/Plugin/Validation/Constraint/UserMailUnique.php
index e3b8b0b..6c5d72b 100644
--- a/core/modules/user/lib/Drupal/user/Plugin/Validation/Constraint/UserMailUnique.php
+++ b/core/modules/user/lib/Drupal/user/Plugin/Validation/Constraint/UserMailUnique.php
@@ -12,7 +12,7 @@
 /**
  * Checks if a user's e-mail address is unique on the site.
  *
- * @Plugin(
+ * @Constraint(
  *   id = "UserMailUnique",
  *   label = @Translation("User e-mail unique", context = "Validation")
  * )
diff --git a/core/modules/user/lib/Drupal/user/Plugin/Validation/Constraint/UserNameConstraint.php b/core/modules/user/lib/Drupal/user/Plugin/Validation/Constraint/UserNameConstraint.php
index 8aba0cf..9898a5c 100644
--- a/core/modules/user/lib/Drupal/user/Plugin/Validation/Constraint/UserNameConstraint.php
+++ b/core/modules/user/lib/Drupal/user/Plugin/Validation/Constraint/UserNameConstraint.php
@@ -12,7 +12,7 @@
 /**
  * Checks if a value is a valid user name.
  *
- * @Plugin(
+ * @Constraint(
  *   id = "UserName",
  *   label = @Translation("User name", context = "Validation")
  * )
diff --git a/core/modules/user/lib/Drupal/user/Plugin/Validation/Constraint/UserNameUnique.php b/core/modules/user/lib/Drupal/user/Plugin/Validation/Constraint/UserNameUnique.php
index d05d5a6..c369396 100644
--- a/core/modules/user/lib/Drupal/user/Plugin/Validation/Constraint/UserNameUnique.php
+++ b/core/modules/user/lib/Drupal/user/Plugin/Validation/Constraint/UserNameUnique.php
@@ -12,7 +12,7 @@
 /**
  * Checks if a user name is unique on the site.
  *
- * @Plugin(
+ * @Constraint(
  *   id = "UserNameUnique",
  *   label = @Translation("User name unique", context = "Validation")
  * )
