diff --git a/core/lib/Drupal/Core/Field/EntityReferenceFieldItemList.php b/core/lib/Drupal/Core/Field/EntityReferenceFieldItemList.php
new file mode 100644
index 0000000..de57c9b
--- /dev/null
+++ b/core/lib/Drupal/Core/Field/EntityReferenceFieldItemList.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Field\EntityReferenceFieldItemList.
+ */
+
+namespace Drupal\Core\Field;
+
+/**
+ * Defines a item list class for entity reference fields.
+ */
+class EntityReferenceFieldItemList extends FieldItemList implements EntityReferenceFieldItemListInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function referencedEntities() {
+    if (!isset($this->list)) {
+      return array();
+    }
+
+    // Get a list of items having non-empty target ids.
+    $list = array_filter($this->list, function($item) {
+      return (bool) $item->target_id;
+    });
+
+    $ids = array();
+    foreach ($list as $delta => $item) {
+      $ids[$delta] = $item->target_id;
+    }
+    if (empty($ids)) {
+      return array();
+    }
+
+    $target_type = $this->getFieldDefinition()->getSetting('target_type');
+    $entities = \Drupal::entityManager()->getStorage($target_type)->loadMultiple($ids);
+
+    $target_entities = array();
+    foreach ($ids as $delta => $target_id) {
+      if (isset($entities[$target_id])) {
+        $target_entities[$delta] = $entities[$target_id];
+      }
+    }
+
+    return $target_entities;
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Field/EntityReferenceFieldItemListInterface.php b/core/lib/Drupal/Core/Field/EntityReferenceFieldItemListInterface.php
new file mode 100644
index 0000000..5c6985e
--- /dev/null
+++ b/core/lib/Drupal/Core/Field/EntityReferenceFieldItemListInterface.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Field\EntityReferenceFieldItemListInterface.
+ */
+
+namespace Drupal\Core\Field;
+
+/**
+ * Interface for entity reference lists of field items.
+ */
+interface EntityReferenceFieldItemListInterface extends FieldItemListInterface {
+
+  /**
+   * Returns all the entities referenced by this field, preserving field item
+   * deltas.
+   *
+   * @return \Drupal\Core\Entity\EntityInterface[]
+   *   An array of entity objects keyed by field item deltas.
+   */
+  public function referencedEntities();
+
+}
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php
index 1697c16..76b4d96 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php
@@ -27,6 +27,7 @@
  *   label = @Translation("Entity reference"),
  *   description = @Translation("An entity field containing an entity reference."),
  *   no_ui = TRUE,
+ *   list_class = "\Drupal\Core\Field\EntityReferenceFieldItemList",
  *   constraints = {"ValidReference" = {}}
  * )
  */
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldType/ConfigurableEntityReferenceFieldItemList.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldType/ConfigurableEntityReferenceFieldItemList.php
index 93a724a..bf9e38b 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldType/ConfigurableEntityReferenceFieldItemList.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldType/ConfigurableEntityReferenceFieldItemList.php
@@ -7,12 +7,12 @@
 
 namespace Drupal\entity_reference\Plugin\Field\FieldType;
 
-use Drupal\Core\Field\FieldItemList;
+use Drupal\Core\Field\EntityReferenceFieldItemList;
 
 /**
  * Represents a configurable entity_reference entity field.
  */
-class ConfigurableEntityReferenceFieldItemList extends FieldItemList {
+class ConfigurableEntityReferenceFieldItemList extends EntityReferenceFieldItemList {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceFieldTest.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceFieldTest.php
index bde0b2c..ef87ce5 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceFieldTest.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceFieldTest.php
@@ -10,6 +10,7 @@
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\Entity\FieldInstanceConfig;
 use Drupal\system\Tests\Entity\EntityUnitTestBase;
+use Drupal\Core\Field\FieldDefinitionInterface;
 
 /**
  * Tests for the entity reference field.
@@ -86,7 +87,8 @@ public function setUp() {
       'Field test',
       $this->referencedEntityType,
       'default',
-      array('target_bundles' => array($this->bundle))
+      array('target_bundles' => array($this->bundle)),
+      FieldDefinitionInterface::CARDINALITY_UNLIMITED
     );
 
     $this->field = FieldConfig::loadByName($this->entityType, $this->fieldName);
@@ -116,4 +118,57 @@ public function testEntityReferenceFieldValidation() {
     // https://drupal.org/node/2064191 is fixed
   }
 
+  /**
+   * Tests the multiple target entities loader.
+   */
+  public function testReferencedEntitiesMultipleLoad() {
+    // Create the parent entity.
+    $entity = entity_create($this->entityType, array('type' => $this->bundle));
+
+    // Create three target entities and attach them to parent field.
+    $target_entities = array();
+    $reference_field = array();
+    for ($i = 0; $i < 3; $i++) {
+      $target_entity = entity_create($this->referencedEntityType, array('type' => $this->bundle));
+      $target_entity->save();
+      $target_entities[] = $target_entity;
+      $reference_field[]['target_id'] = $target_entity->id();
+    }
+
+    // Also attach a non-existent entity and a NULL target id.
+    $reference_field[3]['target_id'] = 99999;
+    $target_entities[3] = NULL;
+    $reference_field[4]['target_id'] = NULL;
+    $target_entities[4] = NULL;
+
+    // Attach the first created target entity as the sixth item ($delta == 5) of
+    // the parent entity field. We want to test the case when the same target
+    // entity is referenced twice (or more times) in the same entity reference
+    // field.
+    $reference_field[5] = $reference_field[0];
+    $target_entities[5] = $target_entities[0];
+
+    // Set the field value.
+    $entity->{$this->fieldName}->setValue($reference_field);
+
+    // Load the target entities using EntityReferenceField::referencedEntities().
+    $entities = $entity->{$this->fieldName}->referencedEntities();
+
+    // Test returned entities:
+    // - Deltas must be preserved.
+    // - Non-existent entities must not be retrieved in target entities result.
+    foreach ($target_entities as $delta => $target_entity) {
+      if (!empty($target_entity)) {
+        // There must be an entity in the loaded set having the same id for the
+        // same delta.
+        $this->assertEqual($target_entity->id(), $entities[$delta]->id());
+      }
+      else {
+        // A non-existent or NULL entity target id must not return any item in
+        // the target entities set.
+        $this->assertFalse(isset($loaded_entities[$delta]));
+      }
+    }
+  }
+
 }
diff --git a/core/modules/file/config/schema/file.schema.yml b/core/modules/file/config/schema/file.schema.yml
index 0fb20de..e260667 100644
--- a/core/modules/file/config/schema/file.schema.yml
+++ b/core/modules/file/config/schema/file.schema.yml
@@ -35,6 +35,9 @@ field.file.settings:
     uri_scheme:
       type: string
       label: 'Upload destination'
+    target_type:
+      type: string
+      label: 'Type of item to reference'
 
 field.file.value:
   type: sequence
diff --git a/core/modules/file/lib/Drupal/file/Plugin/Field/FieldType/FileFieldItemList.php b/core/modules/file/lib/Drupal/file/Plugin/Field/FieldType/FileFieldItemList.php
index 7777098..43dbefa 100644
--- a/core/modules/file/lib/Drupal/file/Plugin/Field/FieldType/FileFieldItemList.php
+++ b/core/modules/file/lib/Drupal/file/Plugin/Field/FieldType/FileFieldItemList.php
@@ -7,12 +7,12 @@
 
 namespace Drupal\file\Plugin\Field\FieldType;
 
-use Drupal\Core\Field\FieldItemList;
+use Drupal\Core\Field\EntityReferenceFieldItemList;
 
 /**
  * Represents a configurable entity file field.
  */
-class FileFieldItemList extends FieldItemList {
+class FileFieldItemList extends EntityReferenceFieldItemList {
 
   /**
    * {@inheritdoc}
@@ -27,7 +27,7 @@ public function insert() {
     $entity = $this->getEntity();
 
     // Add a new usage for newly uploaded files.
-    foreach ($this->targetEntities() as $file) {
+    foreach ($this->referencedEntities() as $file) {
       \Drupal::service('file.usage')->add($file, 'file', $entity->getEntityTypeId(), $entity->id());
     }
   }
@@ -40,8 +40,12 @@ public function update() {
     $entity = $this->getEntity();
 
     // Get current target file entities and file IDs.
-    $files = $this->targetEntities();
-    $fids = array_keys($files);
+    $files = $this->referencedEntities();
+    $fids = array();
+
+    foreach ($files as $file) {
+      $fids[] = $file->id();
+    }
 
     // On new revisions, all files are considered to be a new usage and no
     // deletion of previous file usages are necessary.
@@ -68,8 +72,8 @@ public function update() {
     }
 
     // Add new usage entries for newly added files.
-    foreach ($files as $fid => $file) {
-      if (!in_array($fid, $original_fids)) {
+    foreach ($files as $file) {
+      if (!in_array($file->id(), $original_fids)) {
         \Drupal::service('file.usage')->add($file, 'file', $entity->getEntityTypeId(), $entity->id());
       }
     }
@@ -83,7 +87,7 @@ public function delete() {
     $entity = $this->getEntity();
 
     // Delete all file usages within this entity.
-    foreach ($this->targetEntities() as $file) {
+    foreach ($this->referencedEntities() as $file) {
       \Drupal::service('file.usage')->delete($file, 'file', $entity->getEntityTypeId(), $entity->id(), 0);
     }
   }
@@ -96,31 +100,9 @@ public function deleteRevision() {
     $entity = $this->getEntity();
 
     // Decrement the file usage by 1.
-    foreach ($this->targetEntities() as $file) {
+    foreach ($this->referencedEntities() as $file) {
       \Drupal::service('file.usage')->delete($file, 'file', $entity->getEntityTypeId(), $entity->id());
     }
   }
 
-  /**
-   * Collects target file entities for this field.
-   *
-   * @return array
-   *   An array with the list of target file entities keyed by file ID.
-   *
-   * @todo Drop this when https://drupal.org/node/2073661 lands.
-   */
-  protected function targetEntities() {
-    if (!isset($this->list)) {
-      return array();
-    }
-    $ids = array();
-    foreach ($this->list as $item) {
-      $ids[] = $item->target_id;
-    }
-    // Prevent NULLs as target IDs.
-    $ids = array_filter($ids);
-
-    return $ids ? \Drupal::entityManager()->getStorage('file')->loadMultiple($ids) : array();
-  }
-
 }
diff --git a/core/modules/image/config/schema/image.schema.yml b/core/modules/image/config/schema/image.schema.yml
index 5b642b3..ccaf857 100644
--- a/core/modules/image/config/schema/image.schema.yml
+++ b/core/modules/image/config/schema/image.schema.yml
@@ -90,6 +90,9 @@ field.image.settings:
     default_image:
       type: field_default_image
       label: 'Default value'
+    target_type:
+      type: string
+      label: 'Type of item to reference'
 
 field.image.instance_settings:
   type: mapping
