diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php
index d3b5c41..2282d15 100644
--- a/core/lib/Drupal/Core/Entity/Entity.php
+++ b/core/lib/Drupal/Core/Entity/Entity.php
@@ -75,6 +75,19 @@ public function __construct(array $values, $entity_type) {
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public static function load($id, array $definition) {
+    if (!isset($definition['constraints']['EntityType'])) {
+      throw new \InvalidArgumentException('Missing entity type in the given typed data definition.');
+    }
+    if ($entity = \Drupal::service('plugin.manager.entity')->getStorageController($definition['constraints']['EntityType'])->load(array($id))) {
+      return reset($entity);
+    }
+    return FALSE;
+  }
+
+  /**
    * 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 9697648..376b70f 100644
--- a/core/lib/Drupal/Core/Entity/EntityBCDecorator.php
+++ b/core/lib/Drupal/Core/Entity/EntityBCDecorator.php
@@ -66,6 +66,13 @@ function __construct(EntityNG $decorated, array &$definitions) {
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public static function load($id, array $definition) {
+    return Entity::load($id, $definition);
+  }
+
+  /**
    * 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 57fe186..7fd90d1 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 dad6a57..407d3dc 100644
--- a/core/lib/Drupal/Core/Entity/Field/Type/EntityWrapper.php
+++ b/core/lib/Drupal/Core/Entity/Field/Type/EntityWrapper.php
@@ -7,8 +7,10 @@
 
 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;
@@ -35,7 +37,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 +69,13 @@ public function __construct(array $definition, $name = NULL, TypedDataInterface
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public static function load($id, array $definition) {
+    return Entity::load($id, $definition);
+  }
+
+  /**
    * 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..19f5964
--- /dev/null
+++ b/core/lib/Drupal/Core/TypedData/LoadableInterface.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * @file
+ * Contains LoadableInterface.
+ */
+
+namespace Drupal\Core\TypedData;
+
+/**
+ * Interface for loadable typed data objects.
+ */
+interface LoadableInterface {
+
+  /**
+   * Loads a typed data object.
+   *
+   * @param $id
+   *   The unique identifier of the typed data object to be loaded.
+   * @param array $definition
+   *   The typed data definition.
+   *
+   * @return \Drupal\Core\TypedData\TypedDataInterface|bool
+   *   The loaded typed data object or FALSE if it could not be loaded.
+   */
+  public static function load($id, array $definition);
+
+}
diff --git a/core/lib/Drupal/Core/TypedData/TypedDataManager.php b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
index 195e32d..b60ffc2 100644
--- a/core/lib/Drupal/Core/TypedData/TypedDataManager.php
+++ b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Core\TypedData;
 
+use Drupal\Component\Plugin\Exception\PluginException;
 use InvalidArgumentException;
 use Drupal\Component\Plugin\Discovery\ProcessDecorator;
 use Drupal\Component\Plugin\PluginManagerBase;
@@ -151,6 +152,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|bool
+   *   The loaded typed data object or FALSE 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(format_string('Invalid data type %plugin_id has been given.', array('%plugin_id' => $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(sprintf('The plugin (%s) did not specify an instance class.', $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);
+  }
+
+  /**
    * 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 f23dde7..4dea349 100644
--- a/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/TypedData/TypedDataTest.php
@@ -549,4 +549,24 @@ public function testTypedDataValidation() {
     $violations = $this->typedData->create($definition, 0)->validate();
     $this->assertEqual($violations->count(), 0);
   }
+
+  /**
+   * 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 2bf7cee..74c1bd1 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\views\ViewExecutable;
 use Drupal\Core\Database\Database;
@@ -1091,4 +1092,13 @@ public function setContext($name = NULL, TypedDataInterface $parent = NULL) {
   public function onChange($property_name) {
     $this->storage->onChange($property_name);
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function load($id, array $definition) {
+    return Entity::load($id, $definition);
+  }
+
+
 }
