diff --git a/core/lib/Drupal/Core/Entity/Field/Type/EntityWrapperDeriver.php b/core/lib/Drupal/Core/Entity/Field/Type/EntityWrapperDeriver.php
new file mode 100644
index 0000000..b8d6c7f
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/Field/Type/EntityWrapperDeriver.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Entity\Field\Type\EntityWrapperDeriver.
+ */
+
+namespace Drupal\Core\Entity\Field\Type;
+
+use Drupal\Component\Plugin\Derivative\DerivativeInterface;
+
+/**
+ * Provides data types for each entity definition.
+ *
+ * @see \Drupal\Core\Entity\Field\Type\EntityWrapper
+ */
+class EntityWrapperDeriver implements DerivativeInterface {
+
+  /**
+   * List of derivative definitions.
+   *
+   * @var array
+   */
+  protected $derivatives = array();
+
+  /**
+   * Implements \Drupal\Component\Plugin\Derivative\DerivativeInterface::getDerivativeDefinition().
+   */
+  public function getDerivativeDefinition($derivative_id, array $base_plugin_definition) {
+    if (!empty($this->derivatives) && !empty($this->derivatives[$derivative_id])) {
+      return $this->derivatives[$derivative_id];
+    }
+    $this->getDerivativeDefinitions($base_plugin_definition);
+    return $this->derivatives[$derivative_id];
+  }
+
+  /**
+   * Implements \Drupal\Component\Plugin\Derivative\DerivativeInterface::getDerivativeDefinitions().
+   */
+  public function getDerivativeDefinitions(array $base_plugin_definition) {
+    $this->derivatives['entity'] = $base_plugin_definition;
+    foreach (entity_get_info() as $entity_type => $info) {
+      $this->derivatives[$entity_type] = $base_plugin_definition;
+      $this->derivatives[$entity_type]['label'] = $info['label'];
+      $this->derivatives[$entity_type]['constraints'] = array('EntityType' => $entity_type);
+    }
+    return $this->derivatives;
+  }
+
+}
diff --git a/core/lib/Drupal/Core/TypedData/TypedDataFactory.php b/core/lib/Drupal/Core/TypedData/TypedDataFactory.php
index ef67cf2..cdc17b1 100644
--- a/core/lib/Drupal/Core/TypedData/TypedDataFactory.php
+++ b/core/lib/Drupal/Core/TypedData/TypedDataFactory.php
@@ -38,6 +38,14 @@ class TypedDataFactory extends DefaultFactory {
    *   The instantiated typed data object.
    */
   public function createInstance($plugin_id, array $configuration, $name = NULL, $parent = NULL) {
+    // @Todo: Remove this check once we're not calling generic entity typed
+    // data plugins any more.
+    if ($plugin_id == 'entity') {
+      $plugin_id = 'entity:entity';
+    }
+    if (empty($configuration['constraints'])) {
+      $configuration['constraints'] = array();
+    }
     $type_definition = $this->discovery->getDefinition($plugin_id);
 
     if (!isset($type_definition)) {
@@ -57,6 +65,11 @@ 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));
     }
+    // If constraints exist in the definition, pass them to the configuration.
+    if (isset($type_definition['constraints']) && !empty($type_definition['constraints'])) {
+      $configuration['constraints'] += $type_definition['constraints'];
+    }
+
     return new $class($configuration, $name, $parent);
   }
 }
diff --git a/core/lib/Drupal/Core/TypedData/TypedDataManager.php b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
index 8b5306d..dd3fbe4 100644
--- a/core/lib/Drupal/Core/TypedData/TypedDataManager.php
+++ b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
@@ -9,6 +9,7 @@
 
 use InvalidArgumentException;
 use Drupal\Component\Plugin\PluginManagerBase;
+use Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator;
 use Drupal\Core\Plugin\Discovery\CacheDecorator;
 use Drupal\Core\Plugin\Discovery\HookDiscovery;
 use Drupal\Core\TypedData\Validation\MetadataFactory;
@@ -44,7 +45,7 @@ class TypedDataManager extends PluginManagerBase {
   protected $prototypes = array();
 
   public function __construct() {
-    $this->discovery = new CacheDecorator(new HookDiscovery('data_type_info'), 'typed_data:types');
+    $this->discovery = new CacheDecorator(new DerivativeDiscoveryDecorator(new HookDiscovery('data_type_info')), 'typed_data:types');
     $this->factory = new TypedDataFactory($this->discovery);
   }
 
