diff --git a/core/lib/Drupal/Core/Entity/Field/FieldItemList.php b/core/lib/Drupal/Core/Entity/Field/FieldItemList.php
index 4b4e1eb..8dca7b1 100644
--- a/core/lib/Drupal/Core/Entity/Field/FieldItemList.php
+++ b/core/lib/Drupal/Core/Entity/Field/FieldItemList.php
@@ -149,49 +149,49 @@ public function setValue($values, $notify = TRUE) {
    * Implements \Drupal\Core\Entity\Field\FieldItemListInterface::getPropertyDefinition().
    */
   public function getPropertyDefinition($name) {
-    return $this->offsetGet(0)->getPropertyDefinition($name);
+    return $this->first()->getPropertyDefinition($name);
   }
 
   /**
    * Implements \Drupal\Core\Entity\Field\FieldItemListInterface::getPropertyDefinitions().
    */
   public function getPropertyDefinitions() {
-    return $this->offsetGet(0)->getPropertyDefinitions();
+    return $this->first()->getPropertyDefinitions();
   }
 
   /**
    * Implements \Drupal\Core\Entity\Field\FieldItemListInterface::__get().
    */
   public function __get($property_name) {
-    return $this->offsetGet(0)->__get($property_name);
+    return $this->first()->__get($property_name);
   }
 
   /**
    * Implements \Drupal\Core\Entity\Field\FieldItemListInterface::get().
    */
   public function get($property_name) {
-    return $this->offsetGet(0)->get($property_name);
+    return $this->first()->get($property_name);
   }
 
   /**
    * Implements \Drupal\Core\Entity\Field\FieldItemListInterface::__set().
    */
   public function __set($property_name, $value) {
-    $this->offsetGet(0)->__set($property_name, $value);
+    $this->first()->__set($property_name, $value);
   }
 
   /**
    * Implements \Drupal\Core\Entity\Field\FieldItemListInterface::__isset().
    */
   public function __isset($property_name) {
-    return $this->offsetGet(0)->__isset($property_name);
+    return $this->first()->__isset($property_name);
   }
 
   /**
    * Implements \Drupal\Core\Entity\Field\FieldItemListInterface::__unset().
    */
   public function __unset($property_name) {
-    return $this->offsetGet(0)->__unset($property_name);
+    return $this->first()->__unset($property_name);
   }
 
   /**
@@ -222,7 +222,7 @@ public function applyDefaultValue($notify = TRUE) {
     // are valid default values.
     if (!isset($value) || (is_array($value) && empty($value))) {
       // Create one field item and apply defaults.
-      $this->offsetGet(0)->applyDefaultValue(FALSE);
+      $this->first()->applyDefaultValue(FALSE);
     }
     else {
       $this->setValue($value, $notify);
diff --git a/core/lib/Drupal/Core/TypedData/ItemList.php b/core/lib/Drupal/Core/TypedData/ItemList.php
index 9b39e83..33481da 100644
--- a/core/lib/Drupal/Core/TypedData/ItemList.php
+++ b/core/lib/Drupal/Core/TypedData/ItemList.php
@@ -97,10 +97,48 @@ public function getConstraints() {
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function get($index) {
+    if (!is_numeric($index)) {
+      throw new \InvalidArgumentException('Unable to get a value with a non-numeric delta in a list.');
+    }
+    // Allow getting not yet existing items as well.
+    // @todo: Maybe add a public createItem() method in addition?
+    elseif (!isset($this->list[$index])) {
+      $this->list[$index] = $this->createItem($index);
+    }
+    return $this->list[$index];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function set($index, $item) {
+    if (is_numeric($item)) {
+      // Support setting values via typed data objects.
+      if ($item instanceof TypedDataInterface) {
+        $item = $item->getValue();
+      }
+      $this->get($item)->setValue($item);
+    }
+    else {
+      throw new \InvalidArgumentException('Unable to set a value with a non-numeric delta in a list.');
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function first() {
+    return $this->get(0);
+  }
+
+  /**
    * Implements \ArrayAccess::offsetExists().
    */
   public function offsetExists($offset) {
-    return isset($this->list) && array_key_exists($offset, $this->list) && $this->offsetGet($offset)->getValue() !== NULL;
+    return isset($this->list) && array_key_exists($offset, $this->list) && $this->get($offset)->getValue() !== NULL;
   }
 
   /**
@@ -113,18 +151,10 @@ public function offsetUnset($offset) {
   }
 
   /**
-   * Implements \ArrayAccess::offsetGet().
+   * {@inheritdoc}
    */
   public function offsetGet($offset) {
-    if (!is_numeric($offset)) {
-      throw new \InvalidArgumentException('Unable to get a value with a non-numeric delta in a list.');
-    }
-    // Allow getting not yet existing items as well.
-    // @todo: Maybe add a public createItem() method in addition?
-    elseif (!isset($this->list[$offset])) {
-      $this->list[$offset] = $this->createItem($offset);
-    }
-    return $this->list[$offset];
+    return $this->get($offset);
   }
 
   /**
@@ -151,16 +181,7 @@ public function offsetSet($offset, $value) {
       // The [] operator has been used so point at a new entry.
       $offset = $this->list ? max(array_keys($this->list)) + 1 : 0;
     }
-    if (is_numeric($offset)) {
-      // Support setting values via typed data objects.
-      if ($value instanceof TypedDataInterface) {
-        $value = $value->getValue();
-      }
-      $this->offsetGet($offset)->setValue($value);
-    }
-    else {
-      throw new \InvalidArgumentException('Unable to set a value with a non-numeric delta in a list.');
-    }
+    $this->set($offset, $value);
   }
 
   /**
diff --git a/core/lib/Drupal/Core/TypedData/ListInterface.php b/core/lib/Drupal/Core/TypedData/ListInterface.php
index 2088c2d..8334d6e 100644
--- a/core/lib/Drupal/Core/TypedData/ListInterface.php
+++ b/core/lib/Drupal/Core/TypedData/ListInterface.php
@@ -43,4 +43,34 @@ public function getItemDefinition();
    *   The delta of the item which is changed.
    */
   public function onChange($delta);
+
+  /**
+   * Returns the item at the specified position in this list.
+   *
+   * @param int $index
+   *   Index of the item to return.
+   *
+   * @return
+   *   The item at the specified position in this list.
+   */
+  public function get($index);
+
+  /**
+   * Replaces the item at the specified position in this list.
+   *
+   * @param int $index
+   *   Index of the item to replace.
+   * @param mixed
+   *   Item to be stored at the specified position.
+   */
+  public function set($index, $item);
+
+  /**
+   * Returns the first item in this list.
+   *
+   * @return
+   *   The first item in this list.
+   */
+  public function first();
+
 }
diff --git a/core/modules/comment/lib/Drupal/comment/CommentFormController.php b/core/modules/comment/lib/Drupal/comment/CommentFormController.php
index ecbe5b2..ac3c25b 100644
--- a/core/modules/comment/lib/Drupal/comment/CommentFormController.php
+++ b/core/modules/comment/lib/Drupal/comment/CommentFormController.php
@@ -217,7 +217,7 @@ public function form(array $form, array &$form_state) {
     // Add internal comment properties.
     $original = $comment->getUntranslated();
     foreach (array('cid', 'pid', 'entity_id', 'entity_type', 'field_id', 'uid', 'langcode') as $key) {
-      $key_name = key($comment->$key->offsetGet(0)->getPropertyDefinitions());
+      $key_name = key($comment->$key->first()->getPropertyDefinitions());
       $form[$key] = array('#type' => 'value', '#value' => $original->$key->{$key_name});
     }
 
diff --git a/core/modules/content_translation/lib/Drupal/content_translation/Tests/ContentTranslationSyncImageTest.php b/core/modules/content_translation/lib/Drupal/content_translation/Tests/ContentTranslationSyncImageTest.php
index 9789dc5..4ceffdc 100644
--- a/core/modules/content_translation/lib/Drupal/content_translation/Tests/ContentTranslationSyncImageTest.php
+++ b/core/modules/content_translation/lib/Drupal/content_translation/Tests/ContentTranslationSyncImageTest.php
@@ -156,7 +156,7 @@ function testImageFieldSync() {
         'alt' => $default_langcode . '_' . $fid . '_' . $this->randomName(),
         'title' => $default_langcode . '_' . $fid . '_' . $this->randomName(),
       );
-      $entity->{$this->fieldName}->offsetGet($delta)->setValue($item);
+      $entity->{$this->fieldName}->get($delta)->setValue($item);
 
       // Store the generated values keying them by fid for easier lookup.
       $values[$default_langcode][$fid] = $item;
@@ -182,7 +182,7 @@ function testImageFieldSync() {
         'alt' => $langcode . '_' . $fid . '_' . $this->randomName(),
         'title' => $langcode . '_' . $fid . '_' . $this->randomName(),
       );
-      $translation->{$this->fieldName}->offsetGet($delta)->setValue($item);
+      $translation->{$this->fieldName}->get($delta)->setValue($item);
 
       // Again store the generated values keying them by fid for easier lookup.
       $values[$langcode][$fid] = $item;
@@ -202,7 +202,7 @@ function testImageFieldSync() {
     $fids = array();
     foreach ($entity->{$this->fieldName} as $delta => $item) {
       $value = $values[$default_langcode][$item->target_id];
-      $source_item = $translation->{$this->fieldName}->offsetGet($delta);
+      $source_item = $translation->{$this->fieldName}->get($delta);
       $assert = $item->target_id == $source_item->target_id && $item->alt == $value['alt'] && $item->title == $value['title'];
       $this->assertTrue($assert, format_string('Field item @fid has been successfully synchronized.', array('@fid' => $item->target_id)));
       $fids[$item->target_id] = TRUE;
@@ -234,7 +234,7 @@ function testImageFieldSync() {
       // values instead of the target one.
       $fid_langcode = $item->target_id != $removed_fid ? $default_langcode : $langcode;
       $value = $values[$fid_langcode][$item->target_id];
-      $source_item = $translation->{$this->fieldName}->offsetGet($delta);
+      $source_item = $translation->{$this->fieldName}->get($delta);
       $assert = $item->target_id == $source_item->target_id && $item->alt == $value['alt'] && $item->title == $value['title'];
       $this->assertTrue($assert, format_string('Field item @fid has been successfully synchronized.', array('@fid' => $item->target_id)));
     }
diff --git a/core/modules/datetime/lib/Drupal/datetime/Tests/DateTimeItemTest.php b/core/modules/datetime/lib/Drupal/datetime/Tests/DateTimeItemTest.php
index ba54348..828ada9 100644
--- a/core/modules/datetime/lib/Drupal/datetime/Tests/DateTimeItemTest.php
+++ b/core/modules/datetime/lib/Drupal/datetime/Tests/DateTimeItemTest.php
@@ -90,7 +90,7 @@ public function testSetValue() {
     // Test DateTimeItem::setValue() using string.
     $entity = entity_create('entity_test', array());
     $value = '2014-01-01T20:00:00Z';
-    $entity->get('field_datetime')->offsetGet(0)->setValue($value);
+    $entity->get('field_datetime')->set(0, $value);
     $entity->save();
     // Load the entity and ensure the field was saved correctly.
     $id = $entity->id();
@@ -100,7 +100,7 @@ public function testSetValue() {
     // Test DateTimeItem::setValue() using property array.
     $entity = entity_create('entity_test', array());
     $value = '2014-01-01T20:00:00Z';
-    $entity->get('field_datetime')->offsetGet(0)->setValue(array('value' => $value));
+    $entity->get('field_datetime')->set(0, (array('value' => $value));
     $entity->save();
     // Load the entity and ensure the field was saved correctly.
     $id = $entity->id();
@@ -116,7 +116,7 @@ public function testSetValueProperty() {
     $entity = entity_create('entity_test', array());
     $value = '2014-01-01T20:00:00Z';
 
-    $entity->get('field_datetime')->offsetGet(0)->get('value')->setValue($value);
+    $entity->set('field_datetime', $value);
     $entity->save();
     // Load the entity and ensure the field was saved correctly.
     $id = $entity->id();
diff --git a/core/modules/editor/lib/Drupal/editor/Tests/EditorFileUsageTest.php b/core/modules/editor/lib/Drupal/editor/Tests/EditorFileUsageTest.php
index 2358d6d..a32c411 100644
--- a/core/modules/editor/lib/Drupal/editor/Tests/EditorFileUsageTest.php
+++ b/core/modules/editor/lib/Drupal/editor/Tests/EditorFileUsageTest.php
@@ -89,7 +89,7 @@ function testEditorEntityHooks() {
 
     // Test hook_entity_update(): decrement, by modifying the last revision:
     // remove the data- attribute from the body field.
-    $body = $node->get('body')->offsetGet(0)->get('value');
+    $body = $node->get('body')->first()->get('value');
     $original_value = $body->getValue();
     $new_value = str_replace('data-editor-file-uuid', 'data-editor-file-uuid-modified', $original_value);
     $body->setValue($new_value);
@@ -98,7 +98,7 @@ function testEditorEntityHooks() {
 
     // Test hook_entity_update(): increment, by modifying the last revision:
     // readd the data- attribute to the body field.
-    $node->get('body')->offsetGet(0)->get('value')->setValue($original_value);
+    $node->get('body')->first()->get('value')->setValue($original_value);
     $node->save();
     $this->assertIdentical(array('editor' => array('node' => array(1 => '3'))), file_usage()->listUsage($image), 'The image has 3 usages.');
 
diff --git a/core/modules/field/lib/Drupal/field/Plugin/field/field_type/LegacyConfigFieldItemList.php b/core/modules/field/lib/Drupal/field/Plugin/field/field_type/LegacyConfigFieldItemList.php
index 22cd8a0..8485dc7 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/field/field_type/LegacyConfigFieldItemList.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/field/field_type/LegacyConfigFieldItemList.php
@@ -49,7 +49,7 @@ public function validate() {
           // error, so assume the first column...
           $property_names = $this->getFieldDefinition()->getFieldPropertyNames();
           $property_name = $property_names[0];
-          $violations->add(new ConstraintViolation($item_error['message'], $item_error['message'], array(), $this, $delta . '.' . $property_name, $this->offsetGet($delta)->get($property_name)->getValue(), NULL, $item_error['error']));
+          $violations->add(new ConstraintViolation($item_error['message'], $item_error['message'], array(), $this, $delta . '.' . $property_name, $this->get($delta)->$property_name, NULL, $item_error['error']));
         }
       }
     }
diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldValidationTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldValidationTest.php
index 5a740d1..fc99c49 100644
--- a/core/modules/field/lib/Drupal/field/Tests/FieldValidationTest.php
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldValidationTest.php
@@ -45,7 +45,7 @@ function testCardinalityConstraint() {
     $entity = $this->entity;
 
     for ($delta = 0; $delta < $cardinality + 1; $delta++) {
-      $entity->{$this->field_name}->offsetGet($delta)->set('value', 1);
+      $entity->{$this->field_name}->get($delta)->set('value', 1);
     }
 
     // Validate the field.
@@ -78,7 +78,7 @@ function testFieldConstraints() {
         $value = -1;
         $expected_violations[$delta . '.value'][] = t('%name does not accept the value -1.', array('%name' => $this->instance->getFieldLabel()));
       }
-      $entity->{$this->field_name}->offsetGet($delta)->set('value', $value);
+      $entity->{$this->field_name}->get($delta)->set('value', $value);
     }
 
     // Validate the field.
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldEditForm.php b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldEditForm.php
index ebbd84c..771e8b5 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldEditForm.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldEditForm.php
@@ -157,7 +157,7 @@ public function buildForm(array $form, array &$form_state, FieldInstanceInterfac
     // FieldItem.
     $ids = (object) array('entity_type' => $this->instance->entity_type, 'bundle' => $this->instance->bundle, 'entity_id' => NULL);
     $entity = _field_create_entity_from_ids($ids);
-    $form['field']['settings'] += $entity->get($field->getFieldName())->offsetGet(0)->settingsForm($form, $form_state, $field->hasData());
+    $form['field']['settings'] += $entity->get($field->getFieldName())->first()->settingsForm($form, $form_state, $field->hasData());
 
     $form['actions'] = array('#type' => 'actions');
     $form['actions']['submit'] = array('#type' => 'submit', '#value' => $this->t('Save field settings'));
diff --git a/core/modules/hal/lib/Drupal/hal/Normalizer/FieldItemNormalizer.php b/core/modules/hal/lib/Drupal/hal/Normalizer/FieldItemNormalizer.php
index fdd8156..0934270 100644
--- a/core/modules/hal/lib/Drupal/hal/Normalizer/FieldItemNormalizer.php
+++ b/core/modules/hal/lib/Drupal/hal/Normalizer/FieldItemNormalizer.php
@@ -120,7 +120,7 @@ protected function createTranslatedInstance(FieldItemInterface $field_item, $lan
 
     // Create a new instance at the end of the property path and return it.
     $count = $translation->isEmpty() ? 0 : $translation->count();
-    return $translation->offsetGet($count);
+    return $translation->get($count);
   }
 
 }
diff --git a/core/modules/hal/lib/Drupal/hal/Normalizer/FieldNormalizer.php b/core/modules/hal/lib/Drupal/hal/Normalizer/FieldNormalizer.php
index cbf8b29..d2e4139 100644
--- a/core/modules/hal/lib/Drupal/hal/Normalizer/FieldNormalizer.php
+++ b/core/modules/hal/lib/Drupal/hal/Normalizer/FieldNormalizer.php
@@ -75,7 +75,7 @@ public function denormalize($data, $class, $format = NULL, array $context = arra
       $count = $field->count();
       // Get the next field item instance. The offset will serve as the field
       // item name.
-      $field_item = $field->offsetGet($count);
+      $field_item = $field->get($count);
       $field_item_class = get_class($field_item);
       // Pass in the empty field item object as the target instance.
       $context['target_instance'] = $field_item;
diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/StandardProfileTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/StandardProfileTest.php
index 9feaa50..1c9c6e7 100644
--- a/core/modules/rdf/lib/Drupal/rdf/Tests/StandardProfileTest.php
+++ b/core/modules/rdf/lib/Drupal/rdf/Tests/StandardProfileTest.php
@@ -168,7 +168,7 @@ public function setUp() {
 
     // Set URIs.
     // Image.
-    $image_file = file_load($this->article->get('field_image')->offsetGet(0)->get('target_id')->getValue());
+    $image_file = $this->article->get('field_image')->entity;
     $this->imageUri = entity_load('image_style', 'large')->buildUrl($image_file->getFileUri());
     // Term.
     $term_uri_info = $this->term->uri();
@@ -233,7 +233,7 @@ protected function doFrontPageRdfaTests() {
 
     // @todo Once the image points to the original instead of the processed
     //   image, move this to testArticleProperties().
-    $image_file = file_load($this->article->get('field_image')->offsetGet(0)->get('target_id')->getValue());
+    $image_file = $this->article->get('field_image')->entity;
     $image_uri = entity_load('image_style', 'medium')->buildUrl($image_file->getFileUri());
     $expected_value = array(
       'type' => 'uri',
@@ -337,7 +337,7 @@ protected function doTermRdfaTests() {
     // Term name.
     $expected_value = array(
       'type' => 'literal',
-      'value' => $this->term->get('name')->offsetGet(0)->get('value')->getValue(),
+      'value' => $this->term->get('name')->value,
       'lang' => 'en',
     );
     $this->assertTrue($graph->hasProperty($this->termUri, 'http://schema.org/name', $expected_value), "Term name was found (schema:name) on term page.");
@@ -363,7 +363,7 @@ protected function assertRdfaCommonNodeProperties($graph, NodeInterface $node, $
     // Title.
     $expected_value = array(
       'type' => 'literal',
-      'value' => $node->get('title')->offsetGet(0)->get('value')->getValue(),
+      'value' => $node->get('title')->value,
       'lang' => 'en',
     );
     $this->assertTrue($graph->hasProperty($uri, 'http://schema.org/name', $expected_value), "$message_prefix title was found (schema:name).");
@@ -371,7 +371,7 @@ protected function assertRdfaCommonNodeProperties($graph, NodeInterface $node, $
     // Created date.
     $expected_value = array(
       'type' => 'literal',
-      'value' => date_iso8601($node->get('created')->offsetGet(0)->get('value')->getValue()),
+      'value' => date_iso8601($node->get('created')->value),
       'lang' => 'en',
     );
     $this->assertTrue($graph->hasProperty($uri, 'http://schema.org/dateCreated', $expected_value), "$message_prefix created date was found (schema:dateCreated) in teaser.");
@@ -379,7 +379,7 @@ protected function assertRdfaCommonNodeProperties($graph, NodeInterface $node, $
     // Body.
     $expected_value = array(
       'type' => 'literal',
-      'value' => $node->get('body')->offsetGet(0)->get('value')->getValue(),
+      'value' => $node->get('body')->value,
       'lang' => 'en',
     );
     $this->assertTrue($graph->hasProperty($uri, 'http://schema.org/text', $expected_value), "$message_prefix body was found (schema:text) in teaser.");
@@ -425,7 +425,7 @@ protected function assertRdfaArticleProperties($graph, $message_prefix) {
     // Tag name.
     $expected_value = array(
       'type' => 'literal',
-      'value' => $this->term->get('name')->offsetGet(0)->get('value')->getValue(),
+      'value' => $this->term->get('name')->value,
       'lang' => 'en',
     );
     // @todo enable with https://drupal.org/node/2072791
@@ -452,7 +452,7 @@ protected function assertRdfaNodeCommentProperties($graph) {
     // Comment title.
     $expected_value = array(
       'type' => 'literal',
-      'value' => $this->articleComment->get('subject')->offsetGet(0)->get('value')->getValue(),
+      'value' => $this->articleComment->get('subject')->value,
       'lang' => 'en',
     );
     $this->assertTrue($graph->hasProperty($this->articleCommentUri, 'http://schema.org/name', $expected_value), 'Article comment title was found (schema:name).');
@@ -460,13 +460,13 @@ protected function assertRdfaNodeCommentProperties($graph) {
     // Comment created date.
     $expected_value = array(
       'type' => 'literal',
-      'value' => date_iso8601($this->articleComment->get('created')->offsetGet(0)->get('value')->getValue()),
+      'value' => date_iso8601($this->articleComment->get('created')->value),
       'lang' => 'en',
     );
     $this->assertTrue($graph->hasProperty($this->articleCommentUri, 'http://schema.org/dateCreated', $expected_value), 'Article comment created date was found (schema:dateCreated).');
 
     // Comment body.
-    $text = $this->articleComment->get('comment_body')->offsetGet(0)->get('value')->getValue();
+    $text = $this->articleComment->get('comment_body')->value;
     $expected_value = array(
       'type' => 'literal',
       // There is an extra carriage return in the when parsing comments as
@@ -490,7 +490,7 @@ protected function assertRdfaNodeCommentProperties($graph) {
     // Comment author name.
     $expected_value = array(
       'type' => 'literal',
-      'value' => $this->webUser->get('name')->offsetGet(0)->get('value')->getValue(),
+      'value' => $this->webUser->getUsername(),
     );
     $this->assertTrue($graph->hasProperty($this->commenterUri, 'http://schema.org/name', $expected_value), 'Comment author name was found (schema:name).');
   }
