diff --git a/core/core.services.yml b/core/core.services.yml
index b5a8c18..2e4ba28 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -198,6 +198,7 @@ services:
     arguments: [slave]
   typed_data:
     class: Drupal\Core\TypedData\TypedDataManager
+    arguments: ['@service_container']
     calls:
       - [setValidationConstraintManager, ['@validation.constraint']]
   validation.constraint:
diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php
index 54051a6..ac456a4 100644
--- a/core/lib/Drupal/Core/Entity/Entity.php
+++ b/core/lib/Drupal/Core/Entity/Entity.php
@@ -13,6 +13,7 @@
 use Drupal\user\UserInterface;
 use IteratorAggregate;
 use Drupal\Core\Session\AccountInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Defines a base entity class.
@@ -77,6 +78,19 @@ public function __construct(array $values, $entity_type) {
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public static function load($id, array $definition, ContainerInterface $container) {
+    if (!isset($definition['constraints']['EntityType'])) {
+      throw new \InvalidArgumentException('Missing entity type in the given typed data definition.');
+    }
+    if ($entity = $container->get('plugin.manager.entity')->getStorageController($definition['constraints']['EntityType'])->load(array($id))) {
+      return reset($entity);
+    }
+    return NULL;
+  }
+
+  /**
    * Implements \Drupal\Core\Entity\EntityInterface::id().
    */
   public function id() {
diff --git a/core/lib/Drupal/Core/Entity/EntityBCDecorator.php b/core/lib/Drupal/Core/Entity/EntityBCDecorator.php
index e51f121..3342597 100644
--- a/core/lib/Drupal/Core/Entity/EntityBCDecorator.php
+++ b/core/lib/Drupal/Core/Entity/EntityBCDecorator.php
@@ -12,6 +12,7 @@
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\TypedData\TypedDataInterface;
 use Drupal\Core\Session\AccountInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Provides backwards compatible (BC) access to entity fields.
@@ -68,6 +69,13 @@ function __construct(EntityNG $decorated, array &$definitions) {
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public static function load($id, array $definition, ContainerInterface $container) {
+    return Entity::load($id, $definition, $container);
+  }
+
+  /**
    * Overrides Entity::getNGEntity().
    */
   public function getNGEntity() {
diff --git a/core/lib/Drupal/Core/Entity/EntityInterface.php b/core/lib/Drupal/Core/Entity/EntityInterface.php
index b8fe82b..2a8a4fe 100644
--- a/core/lib/Drupal/Core/Entity/EntityInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityInterface.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\TypedData\AccessibleInterface;
 use Drupal\Core\TypedData\ComplexDataInterface;
+use Drupal\Core\TypedData\LoadableInterface;
 use Drupal\Core\TypedData\TranslatableInterface;
 
 /**
@@ -27,7 +28,7 @@
  * @see \Drupal\Core\TypedData\TypedDataManager
  * @see \Drupal\Core\Field\FieldInterface
  */
-interface EntityInterface extends ComplexDataInterface, AccessibleInterface, TranslatableInterface {
+interface EntityInterface extends ComplexDataInterface, AccessibleInterface, TranslatableInterface, LoadableInterface {
 
   /**
    * Returns the entity identifier (the entity's machine name or numeric ID).
diff --git a/core/lib/Drupal/Core/Entity/Field/Type/EntityWrapper.php b/core/lib/Drupal/Core/Entity/Field/Type/EntityWrapper.php
index 2b2b54a..671e507 100644
--- a/core/lib/Drupal/Core/Entity/Field/Type/EntityWrapper.php
+++ b/core/lib/Drupal/Core/Entity/Field/Type/EntityWrapper.php
@@ -7,13 +7,16 @@
 
 namespace Drupal\Core\Entity\Field\Type;
 
+use Drupal\Core\Entity\Entity;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\TypedData\ComplexDataInterface;
+use Drupal\Core\TypedData\LoadableInterface;
 use Drupal\Core\TypedData\TypedData;
 use Drupal\Core\TypedData\TypedDataInterface;
 use ArrayIterator;
 use IteratorAggregate;
 use InvalidArgumentException;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Defines an 'entity' data type, e.g. the computed 'entity' property of entity references.
@@ -35,7 +38,7 @@
  *  - id source: If used as computed property, the ID property used to load
  *    the entity object.
  */
-class EntityWrapper extends TypedData implements IteratorAggregate, ComplexDataInterface {
+class EntityWrapper extends TypedData implements IteratorAggregate, ComplexDataInterface, LoadableInterface {
 
   /**
    * The referenced entity type.
@@ -67,6 +70,13 @@ public function __construct(array $definition, $name = NULL, TypedDataInterface
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public static function load($id, array $definition, ContainerInterface $container) {
+    return Entity::load($id, $definition, $container);
+  }
+
+  /**
    * Overrides \Drupal\Core\TypedData\TypedData::getValue().
    */
   public function getValue() {
diff --git a/core/lib/Drupal/Core/TypedData/LoadableInterface.php b/core/lib/Drupal/Core/TypedData/LoadableInterface.php
new file mode 100644
index 0000000..0405256
--- /dev/null
+++ b/core/lib/Drupal/Core/TypedData/LoadableInterface.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * @file
+ * Contains LoadableInterface.
+ */
+
+namespace Drupal\Core\TypedData;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Interface for loadable typed data objects.
+ */
+interface LoadableInterface {
+
+  /**
+   * Loads a typed data object.
+   *
+   * @param mixed $id
+   *   The unique identifier of the typed data object to be loaded.
+   * @param array $definition
+   *   The typed data definition.
+   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
+   *   The service container this object should use.
+   *
+   * @return \Drupal\Core\TypedData\TypedDataInterface|null
+   *   The loaded typed data object or NULL if it could not be loaded.
+   */
+  public static function load($id, array $definition, ContainerInterface $container);
+
+}
diff --git a/core/lib/Drupal/Core/TypedData/TypedDataManager.php b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
index c0f81b9..e49ee6c 100644
--- a/core/lib/Drupal/Core/TypedData/TypedDataManager.php
+++ b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
@@ -7,22 +7,33 @@
 
 namespace Drupal\Core\TypedData;
 
+use Drupal\Component\Plugin\Exception\PluginException;
 use InvalidArgumentException;
 use Drupal\Component\Plugin\Discovery\ProcessDecorator;
 use Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator;
 use Drupal\Component\Plugin\PluginManagerBase;
+use Drupal\Component\Utility\String;
 use Drupal\Core\Plugin\Discovery\CacheDecorator;
 use Drupal\Core\Plugin\Discovery\HookDiscovery;
 use Drupal\Core\TypedData\Validation\MetadataFactory;
 use Drupal\Core\Validation\ConstraintManager;
 use Drupal\Core\Validation\DrupalTranslator;
+use Symfony\Component\DependencyInjection\ContainerAwareInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\Validator\ValidatorInterface;
 use Symfony\Component\Validator\Validation;
 
 /**
  * Manages data type plugins.
  */
-class TypedDataManager extends PluginManagerBase {
+class TypedDataManager extends PluginManagerBase implements ContainerAwareInterface {
+
+  /**
+   * The container.
+   *
+   * @var \Symfony\Component\DependencyInjection\ContainerInterface
+   */
+  protected $container;
 
   /**
    * The validator used for validating typed data.
@@ -56,13 +67,27 @@ class TypedDataManager extends PluginManagerBase {
    */
   protected $prototypes = array();
 
-  public function __construct() {
+  /**
+   * Constructs a TypedDataManager objcet.
+   *
+   * @param ContainerInterface $container
+   *   The container to use.
+   */
+  public function __construct(ContainerInterface $container) {
     $this->discovery = new HookDiscovery('data_type_info');
     $this->discovery = new DerivativeDiscoveryDecorator($this->discovery);
     $this->discovery = new ProcessDecorator($this->discovery, array($this, 'processDefinition'));
     $this->discovery = new CacheDecorator($this->discovery, 'typed_data:types');
 
     $this->factory = new TypedDataFactory($this->discovery);
+    $this->container = $container;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContainer(ContainerInterface $container = NULL) {
+    $this->container = $container;
   }
 
   /**
@@ -153,6 +178,51 @@ public function create(array $definition, $value = NULL, $name = NULL, $parent =
   }
 
   /**
+   * Loads a typed data object by its id.
+   *
+   * @param $id
+   *   The unique identifier of the typed data object to be loaded.
+   * @param array $definition
+   *   The data definition array.
+   *
+   * @throws \Drupal\Component\Plugin\Exception\PluginException
+   *   If no instance class was given.
+   * @throws \InvalidArgumentException
+   *   If the given instance class does not implement the LoadableInterface.
+   *
+   * @return \Drupal\Core\TypedData\TypedDataInterface|null
+   *   The loaded typed data object or NULL if it could not be loaded.
+   */
+  public function load($id, array $definition) {
+    $original_definition = $this->discovery->getDefinition($definition['type']);
+
+    if (!isset($original_definition)) {
+      throw new \InvalidArgumentException(String::format('Invalid data type (%plugin) has been given.', array('%plugin' => $definition['type'])));
+    }
+
+    // Allow per-data definition overrides of the used classes, i.e. take over
+    // classes specified in the data definition.
+    $key = empty($definition['list']) ? 'class' : 'list class';
+    if (isset($definition[$key])) {
+      $class = $definition[$key];
+    }
+    elseif (isset($original_definition[$key])) {
+      $class = $original_definition[$key];
+    }
+
+    if (!isset($class)) {
+      throw new PluginException(String::format('The plugin %plugin did not specify an instance class.', array('%plugin' => $definition['type'])));
+    }
+
+    // The instance class has to implement the LoadableInterface.
+    if (!in_array('Drupal\Core\TypedData\LoadableInterface', class_implements($class))) {
+      throw new \InvalidArgumentException('The given class has to implement the LoadableInterface.');
+    }
+
+    return $class::load($id, $definition, $this->container);
+  }
+
+  /**
    * Implements \Drupal\Component\Plugin\PluginManagerInterface::getInstance().
    *
    * @param array $options
diff --git a/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php b/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php
index 83f5f4e..d37338c 100644
--- a/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php
@@ -564,4 +564,24 @@ public function testTypedDataValidation() {
     $this->assertEqual($violations[0]->getInvalidValue(), 'string');
     $this->assertIdentical($violations[0]->getPropertyPath(), '0.value');
   }
+
+  /**
+   * Tests loading of typed data objects that implement LoadableInterface.
+   */
+  public function testTypedDataLoading() {
+    // Generate a file for testing typed data loading.
+    file_unmanaged_copy(DRUPAL_ROOT . '/core/misc/druplicon.png', 'public://example.png');
+    $image = entity_create('file', array('uri' => 'public://example.png'));
+    $image->save();
+
+    $loaded = \Drupal::typedData()->load($image->id(), array(
+      'type' => 'entity',
+      'constraints' => array(
+        'EntityType' => 'file',
+      ),
+    ));
+
+    $this->assertNotIdentical(FALSE, $loaded, 'Successfully loaded the image entity.');
+    $this->assertIdentical($image->uuid(), $loaded->uuid(), 'Successfully loaded the right image entity..');
+  }
 }
diff --git a/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php b/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php
index c83e5f7..93ef98b 100644
--- a/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php
+++ b/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\views_ui;
 
+use Drupal\Core\Entity\Entity;
 use Drupal\views\Views;
 use Drupal\Core\Entity\EntityStorageControllerInterface;
 use Drupal\views\ViewExecutable;
@@ -16,6 +17,7 @@
 use Drupal\views\Plugin\views\query\Sql;
 use Drupal\views\Plugin\Core\Entity\View;
 use Drupal\views\ViewStorageInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Stores UI related temporary settings.
@@ -1209,4 +1211,11 @@ public function mergeDefaultDisplaysOptions() {
   public function uriRelationships() {
     return $this->storage->uriRelationships();
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function load($id, array $definition, ContainerInterface $container) {
+    return Entity::load($id, $definition, $container);
+  }
 }
