diff --git a/core/lib/Drupal/Core/TypedData/TypedDataManager.php b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
old mode 100644
new mode 100755
index 05e7f4c..a73f6c4
--- a/core/lib/Drupal/Core/TypedData/TypedDataManager.php
+++ b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
@@ -317,7 +317,7 @@ public function getValidator() {
       $this->validator = Validation::createValidatorBuilder()
         ->setMetadataFactory(new MetadataFactory())
         ->setTranslator(new DrupalTranslator())
-        ->setApiVersion(Validation::API_VERSION_2_4)
+        ->setApiVersion(Validation::API_VERSION_2_5)
         ->getValidator();
     }
     return $this->validator;
diff --git a/core/lib/Drupal/Core/TypedData/Validation/PropertyContainerMetadata.php b/core/lib/Drupal/Core/TypedData/Validation/ClassMetadata.php
old mode 100644
new mode 100755
similarity index 67%
rename from core/lib/Drupal/Core/TypedData/Validation/PropertyContainerMetadata.php
rename to core/lib/Drupal/Core/TypedData/Validation/ClassMetadata.php
index f5850eb..5bf4b2e
--- a/core/lib/Drupal/Core/TypedData/Validation/PropertyContainerMetadata.php
+++ b/core/lib/Drupal/Core/TypedData/Validation/ClassMetadata.php
@@ -2,20 +2,20 @@
 
 /**
  * @file
- * Contains \Drupal\Core\TypedData\Validation\PropertyContainerMetadata.
+ * Contains \Drupal\Core\TypedData\Validation\ClassMetadata.
  */
 
 namespace Drupal\Core\TypedData\Validation;
 
 use Drupal\Core\TypedData\ComplexDataInterface;
 use Drupal\Core\TypedData\ListInterface;
-use Symfony\Component\Validator\PropertyMetadataContainerInterface;
+use Symfony\Component\Validator\Mapping\ClassMetadataInterface;
 use Symfony\Component\Validator\ValidationVisitorInterface;
 
 /**
  * Typed data implementation of the validator MetadataInterface.
  */
-class PropertyContainerMetadata extends Metadata implements PropertyMetadataContainerInterface {
+class ClassMetadata extends Metadata implements ClassMetadataInterface {
 
   /**
    * Overrides Metadata::accept().
@@ -65,4 +65,42 @@ public function getPropertyMetadata($property_name) {
       throw new \LogicException("There are no known properties.");
     }
   }
+
+  /**
+   * Returns the names of all constrained properties.
+   *
+   * @return string[] A list of property names
+   */
+  public function getConstrainedProperties() {
+    if ($this->typedData instanceof ComplexDataInterface) {
+      return range(0, count($this->typedData) - 1);
+    }
+    elseif ($this->typedData instanceof ComplexDataInterface) {
+      return array_keys($this->typedData->getProperties());
+    }
+    else {
+      return array();
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getGroupSequence() {
+    return NULL;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function hasGroupSequence() {
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isGroupSequenceProvider() {
+    return FALSE;
+  }
 }
diff --git a/core/lib/Drupal/Core/TypedData/Validation/Metadata.php b/core/lib/Drupal/Core/TypedData/Validation/Metadata.php
old mode 100644
new mode 100755
index 73bfc8b..acb0724
--- a/core/lib/Drupal/Core/TypedData/Validation/Metadata.php
+++ b/core/lib/Drupal/Core/TypedData/Validation/Metadata.php
@@ -8,8 +8,10 @@
 namespace Drupal\Core\TypedData\Validation;
 
 use Drupal\Core\TypedData\TypedDataInterface;
+use Symfony\Component\Validator\Mapping\CascadingStrategy;
+use Symfony\Component\Validator\Mapping\TraversalStrategy;
+use Symfony\Component\Validator\Mapping\PropertyMetadataInterface;
 use Symfony\Component\Validator\ValidationVisitorInterface;
-use Symfony\Component\Validator\PropertyMetadataInterface;
 
 /**
  * Typed data implementation of the validator MetadataInterface.
@@ -101,4 +103,32 @@ public function getPropertyValue($container) {
   public function getTypedData() {
     return $this->typedData;
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getClassName() {
+    return $this->typedData->getDataDefinition()->getClass();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getConstraints() {
+    return $this->typedData->getConstraints();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCascadingStrategy() {
+    return CascadingStrategy::NONE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTraversalStrategy() {
+    return TraversalStrategy::IMPLICIT;
+  }
 }
diff --git a/core/lib/Drupal/Core/TypedData/Validation/MetadataFactory.php b/core/lib/Drupal/Core/TypedData/Validation/MetadataFactory.php
old mode 100644
new mode 100755
index 2858daf..4dbd2dc
--- a/core/lib/Drupal/Core/TypedData/Validation/MetadataFactory.php
+++ b/core/lib/Drupal/Core/TypedData/Validation/MetadataFactory.php
@@ -10,7 +10,7 @@
 use Drupal\Core\TypedData\ComplexDataInterface;
 use Drupal\Core\TypedData\ListInterface;
 use Drupal\Core\TypedData\TypedDataInterface;
-use Symfony\Component\Validator\MetadataFactoryInterface;
+use Symfony\Component\Validator\Mapping\Factory\MetadataFactoryInterface;
 
 /**
  * Typed data implementation of the validator MetadataFactoryInterface.
@@ -31,7 +31,7 @@ public function getMetadataFor($typed_data, $name = '') {
       throw new \InvalidArgumentException('The passed value must be a typed data object.');
     }
     $is_container = $typed_data instanceof ComplexDataInterface || $typed_data instanceof ListInterface;
-    $class = '\Drupal\Core\TypedData\Validation\\' . ($is_container ? 'PropertyContainerMetadata' : 'Metadata');
+    $class = '\Drupal\Core\TypedData\Validation\\' . ($is_container ? 'ClassMetadata' : 'Metadata');
     return new $class($typed_data, $name, $this);
   }
 
diff --git a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/ComplexDataConstraintValidator.php b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/ComplexDataConstraintValidator.php
old mode 100644
new mode 100755
index 31ffc5b..be1aa40
--- a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/ComplexDataConstraintValidator.php
+++ b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/ComplexDataConstraintValidator.php
@@ -38,7 +38,7 @@ public function validate($value, Constraint $constraint) {
         $property = $property->getValue();
       }
       elseif ($property->isEmpty()) {
-        // @see \Drupal\Core\TypedData\Validation\PropertyContainerMetadata::accept();
+        // @see \Drupal\Core\TypedData\Validation\ClassMetadata::accept();
         $property = NULL;
       }
       $this->context->validateValue($property, $constraints, $name, $group);
