diff --git a/core/lib/Drupal/Core/TypedData/ContextAwareTypedData.php b/core/lib/Drupal/Core/TypedData/ContextAwareTypedData.php
index 29d07cd..1ac4e99 100644
--- a/core/lib/Drupal/Core/TypedData/ContextAwareTypedData.php
+++ b/core/lib/Drupal/Core/TypedData/ContextAwareTypedData.php
@@ -48,7 +48,7 @@
    * @see Drupal\Core\TypedData\TypedDataManager::create()
    */
   public function __construct(array $definition, $name = NULL, ContextAwareInterface $parent = NULL) {
-    $this->definition = $definition;
+    parent::__construct($definition);
     $this->setContext($name, $parent);
   }
 
diff --git a/core/lib/Drupal/Core/TypedData/TypedData.php b/core/lib/Drupal/Core/TypedData/TypedData.php
index d6ad4be..2817e5e 100644
--- a/core/lib/Drupal/Core/TypedData/TypedData.php
+++ b/core/lib/Drupal/Core/TypedData/TypedData.php
@@ -23,6 +23,20 @@
   protected $definition;
 
   /**
+   * The validator instance.
+   *
+   * @var \Symfony\Component\Validator\ValidatorInterface object.
+   */
+  protected $validator;
+
+  /**
+   * The manager instance for TypedData.
+   *
+   * @var \Drupal\Core\TypedData\TypedDataManager object.
+   */
+  protected $manager;
+
+  /**
    * Constructs a TypedData object given its definition.
    *
    * @param array $definition
@@ -31,6 +45,31 @@
    * @see Drupal\Core\TypedData\TypedDataManager::create()
    */
   public function __construct(array $definition) {
+    // Check the injected validator to make sure it conforms to the needs of
+    // this plugin.
+    $class = get_class($this);
+    if (empty($definition['validator']) ){
+      throw new \InvalidArgumentException("No validator was passed to the TypedData plugin $class");
+    }
+    if (!in_array('Symfony\\Component\\Validator\\ValidatorInterface', class_implements($definition['validator']))) {
+      debug(get_class($definition['validator']));
+      throw new \InvalidArgumentException("An invalid validator class was passed to the TypedData plugin $class. The validator must implement Symfony\Component\Validator\ValidatorInterface");
+    }
+    // Unset the validator, we do not need it in the definition any further.
+    $this->validator = $definition['validator'];
+    unset($definition['validator']);
+
+    // Check the injected manager to make sure it conforms to the needs of this
+    // plugin.
+    if (empty($definition['manager']) ){
+      throw new \InvalidArgumentException("No manager was passed to the TypedData plugin $class");
+    }
+    if (get_class($definition['manager']) !== 'Drupal\\Core\\TypedData\\TypedDataManager') {
+      throw new \InvalidArgumentException("An invalid manager class was passed to the TypedData plugin $class. The validator must be Drupal\\Core\\TypedData\\TypedDataManager.");
+    }
+    $this->manager = $definition['manager'];
+    // Unset the manager, we do not need it in the definition any further.
+    unset($definition['manager']);
     $this->definition = $definition;
   }
 
@@ -73,15 +112,13 @@ public function getString() {
    * Implements \Drupal\Core\TypedData\TypedDataInterface::getConstraints().
    */
   public function getConstraints() {
-    // @todo: Add the typed data manager as proper dependency.
-    return typed_data()->getConstraints($this->definition);
+    return $this->manager->getConstraints($this->definition);
   }
 
   /**
    * Implements \Drupal\Core\TypedData\TypedDataInterface::validate().
    */
   public function validate() {
-    // @todo: Add the typed data manager as proper dependency.
-    return typed_data()->getValidator()->validate($this);
+    return $this->validator->validate($this);
   }
 }
diff --git a/core/lib/Drupal/Core/TypedData/TypedDataFactory.php b/core/lib/Drupal/Core/TypedData/TypedDataFactory.php
index ef67cf2..4816f22 100644
--- a/core/lib/Drupal/Core/TypedData/TypedDataFactory.php
+++ b/core/lib/Drupal/Core/TypedData/TypedDataFactory.php
@@ -26,10 +26,10 @@ class TypedDataFactory extends DefaultFactory {
    *   The id of a plugin, i.e. the data type.
    * @param array $configuration
    *   The plugin configuration, i.e. the data definition.
-   * @param string $name
-   *   (optional) If a property or list item is to be created, the name of the
+   *   $configuration['name']
+   *   If a property or list item is to be created, the name of the
    *   property or the delta of the list item.
-   * @param mixed $parent
+   *   $configuration['parent']
    *   (optional) If a property or list item is to be created, the parent typed
    *   data object implementing either the ListInterface or the
    *   ComplexDataInterface.
@@ -37,7 +37,13 @@ class TypedDataFactory extends DefaultFactory {
    * @return \Drupal\Core\TypedData\TypedDataInterface
    *   The instantiated typed data object.
    */
-  public function createInstance($plugin_id, array $configuration, $name = NULL, $parent = NULL) {
+  public function createInstance($plugin_id, array $configuration) {
+    // Set sane defaults for the configuration.
+    $configuration += array('name' => NULL, 'parent' => NULL);
+    $name = $configuration['name'];
+    unset($configuration['name']);
+    $parent = $configuration['parent'];
+    unset($configuration['parent']);
     $type_definition = $this->discovery->getDefinition($plugin_id);
 
     if (!isset($type_definition)) {
diff --git a/core/lib/Drupal/Core/TypedData/TypedDataManager.php b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
index bbc132f..792f949 100644
--- a/core/lib/Drupal/Core/TypedData/TypedDataManager.php
+++ b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
@@ -48,28 +48,6 @@ public function __construct() {
   }
 
   /**
-   * Implements \Drupal\Component\Plugin\PluginManagerInterface::createInstance().
-   *
-   * @param string $plugin_id
-   *   The id of a plugin, i.e. the data type.
-   * @param array $configuration
-   *   The plugin configuration, i.e. the data definition.
-   * @param string $name
-   *   (optional) If a property or list item is to be created, the name of the
-   *   property or the delta of the list item.
-   * @param mixed $parent
-   *   (optional) If a property or list item is to be created, the parent typed
-   *   data object implementing either the ListInterface or the
-   *   ComplexDataInterface.
-   *
-   * @return \Drupal\Core\TypedData\TypedDataInterface
-   *   The instantiated typed data object.
-   */
-  public function createInstance($plugin_id, array $configuration, $name = NULL, $parent = NULL) {
-    return $this->factory->createInstance($plugin_id, $configuration, $name, $parent);
-  }
-
-  /**
    * Creates a new typed data object instance.
    *
    * @param array $definition
@@ -127,7 +105,11 @@ public function createInstance($plugin_id, array $configuration, $name = NULL, $
    * @see \Drupal\Core\Entity\Field\EntityWrapper
    */
   public function create(array $definition, $value = NULL, $name = NULL, $parent = NULL) {
-    $wrapper = $this->factory->createInstance($definition['type'], $definition, $name, $parent);
+    $definition['name'] = $name;
+    $definition['parent'] = $parent;
+    $definition['validator'] = $this->getValidator();
+    $definition['manager'] = $this;
+    $wrapper = $this->createInstance($definition['type'], $definition);
     if (isset($value)) {
       $wrapper->setValue($value);
     }
