diff --git a/core/lib/Drupal/Core/Entity/Field/FieldItemBase.php b/core/lib/Drupal/Core/Entity/Field/FieldItemBase.php
index 0ac0a5d..d831060 100644
--- a/core/lib/Drupal/Core/Entity/Field/FieldItemBase.php
+++ b/core/lib/Drupal/Core/Entity/Field/FieldItemBase.php
@@ -10,6 +10,8 @@
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\TypedData\Plugin\DataType\Map;
 use Drupal\Core\TypedData\TypedDataInterface;
+use Drupal\Core\TypedData\TypedDataInjectionInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 use Drupal\user;
 
 /**
@@ -20,18 +22,38 @@
  *
  * @see \Drupal\Core\Entity\Field\FieldItemInterface
  */
-abstract class FieldItemBase extends Map implements FieldItemInterface {
+abstract class FieldItemBase extends Map implements FieldItemInterface, TypedDataInjectionInterface {
 
   /**
-   * Overrides \Drupal\Core\TypedData\TypedData::__construct().
+   * The typed data manager for FieldItem object.
+   *
+   * @var TypedDataManager
+   */
+  protected $TypedDataManager;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(array $configuration, $name = NULL, $parent = NULL, ContainerInterface $container) {
+    $TypedDataManager = $container->get('typed_data');
+    return new static(
+      $configuration,
+      $name,
+      $parent,
+      $TypedDataManager
+    );
+  }
+  /**
+   * {@inheritdoc}
    */
-  public function __construct(array $definition, $name = NULL, TypedDataInterface $parent = NULL) {
+  public function __construct(array $definition, $name = NULL, TypedDataInterface $parent = NULL, $TypedDataManager) {
+    $this->TypedDataManager = $TypedDataManager;
     parent::__construct($definition, $name, $parent);
     // Initialize computed properties by default, such that they get cloned
     // with the whole item.
     foreach ($this->getPropertyDefinitions() as $name => $definition) {
       if (!empty($definition['computed'])) {
-        $this->properties[$name] = \Drupal::typedData()->getPropertyInstance($this, $name);
+        $this->properties[$name] = $this->TypedDataManager->getPropertyInstance($this, $name);
       }
     }
   }
@@ -186,7 +208,7 @@ public function getConstraints() {
     // If property constraints are present add in a ComplexData constraint for
     // applying them.
     if (!empty($this->definition['property_constraints'])) {
-      $constraints[] = \Drupal::typedData()->getValidationConstraintManager()
+      $constraints[] = $this->TypedDataManager->getValidationConstraintManager()
         ->create('ComplexData', $this->definition['property_constraints']);
     }
     return $constraints;
diff --git a/core/lib/Drupal/Core/TypedData/TypedDataInjectionInterface.php b/core/lib/Drupal/Core/TypedData/TypedDataInjectionInterface.php
new file mode 100644
index 0000000..27de272
--- /dev/null
+++ b/core/lib/Drupal/Core/TypedData/TypedDataInjectionInterface.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\TypedData\TypedDataInjectionInterface.
+ */
+
+namespace Drupal\Core\TypedData;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Defines an interface allowing dependency injection for typed data.
+ */
+interface TypedDataInjectionInterface {
+
+  /**
+   * Instantiates a new instance of typed data.
+   *
+   * This is a factory method that returns a new instance of this object. The
+   * factory should pass any needed dependencies into the constructor of this
+   * object, but not the container itself. Every call to this method must return
+   * a new instance of this object; that is, it may not implement a singleton.
+   *
+   * The first three parameters are the same as defined at
+   * TypedDataManager::create.
+   *
+   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
+   *   The service container this object should use.
+   *
+   * @see \Drupal\Core\TypedData\TypedDataManager::create()
+   */
+  public static function create(array $configuration, $name = NULL, $parent = NULL, ContainerInterface $container);
+}
diff --git a/core/lib/Drupal/Core/TypedData/TypedDataManager.php b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
index 6f85867..7b4be69 100644
--- a/core/lib/Drupal/Core/TypedData/TypedDataManager.php
+++ b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
@@ -93,7 +93,14 @@ public function createInstance($plugin_id, array $configuration, $name = NULL, $
     if (!isset($class)) {
       throw new PluginException(sprintf('The plugin (%s) did not specify an instance class.', $plugin_id));
     }
-    return new $class($configuration, $name, $parent);
+
+    if (in_array('Drupal\Core\TypedData\TypedDataInjectionInterface', class_implements($class))) {
+      $container = \Drupal::getContainer();
+      return $class::create($configuration, $name, $parent, $container);
+    }
+    else {
+      return new $class($configuration, $name, $parent);
+    }
   }
 
   /**
diff --git a/core/modules/email/lib/Drupal/email/Plugin/field/field_type/ConfigurableEmailItem.php b/core/modules/email/lib/Drupal/email/Plugin/field/field_type/ConfigurableEmailItem.php
index b346c4b..8b5835c 100644
--- a/core/modules/email/lib/Drupal/email/Plugin/field/field_type/ConfigurableEmailItem.php
+++ b/core/modules/email/lib/Drupal/email/Plugin/field/field_type/ConfigurableEmailItem.php
@@ -56,7 +56,7 @@ public static function schema(FieldInterface $field) {
    * {@inheritdoc}
    */
   public function getConstraints() {
-    $constraint_manager = \Drupal::typedData()->getValidationConstraintManager();
+    $constraint_manager = $this->TypedDataManager->getValidationConstraintManager();
     $constraints = parent::getConstraints();
 
     $constraints[] = $constraint_manager->create('ComplexData', array(
diff --git a/core/modules/number/lib/Drupal/number/Plugin/field/field_type/NumberItemBase.php b/core/modules/number/lib/Drupal/number/Plugin/field/field_type/NumberItemBase.php
index 1d83bb7..7506edd 100644
--- a/core/modules/number/lib/Drupal/number/Plugin/field/field_type/NumberItemBase.php
+++ b/core/modules/number/lib/Drupal/number/Plugin/field/field_type/NumberItemBase.php
@@ -74,7 +74,7 @@ public function isEmpty() {
    * {@inheritdoc}
    */
   public function getConstraints() {
-    $constraint_manager = \Drupal::typedData()->getValidationConstraintManager();
+    $constraint_manager = $this->TypedDataManager->getValidationConstraintManager();
     $constraints = parent::getConstraints();
 
     $settings = $this->getFieldSettings();
diff --git a/core/modules/telephone/lib/Drupal/telephone/Plugin/field/field_type/TelephoneItem.php b/core/modules/telephone/lib/Drupal/telephone/Plugin/field/field_type/TelephoneItem.php
index efe2bcf..68d1a33 100644
--- a/core/modules/telephone/lib/Drupal/telephone/Plugin/field/field_type/TelephoneItem.php
+++ b/core/modules/telephone/lib/Drupal/telephone/Plugin/field/field_type/TelephoneItem.php
@@ -72,7 +72,7 @@ public function isEmpty() {
    * {@inheritdoc}
    */
   public function getConstraints() {
-    $constraint_manager = \Drupal::typedData()->getValidationConstraintManager();
+    $constraint_manager = $this->TypedDataManager->getValidationConstraintManager();
     $constraints = parent::getConstraints();
 
     $max_length = 256;
diff --git a/core/modules/text/lib/Drupal/text/Plugin/field/field_type/TextItem.php b/core/modules/text/lib/Drupal/text/Plugin/field/field_type/TextItem.php
index 644a2a9..2a1359c 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/field/field_type/TextItem.php
+++ b/core/modules/text/lib/Drupal/text/Plugin/field/field_type/TextItem.php
@@ -63,7 +63,7 @@ public static function schema(FieldInterface $field) {
    * {@inheritdoc}
    */
   public function getConstraints() {
-    $constraint_manager = \Drupal::typedData()->getValidationConstraintManager();
+    $constraint_manager = $this->TypedDataManager->getValidationConstraintManager();
     $constraints = parent::getConstraints();
 
     if ($max_length = $this->getFieldSetting('max_length')) {
