diff --git a/core/lib/Drupal/Core/Entity/FieldableEntityStorageControllerBase.php b/core/lib/Drupal/Core/Entity/FieldableEntityStorageControllerBase.php
index ec468b7..5d01819 100644
--- a/core/lib/Drupal/Core/Entity/FieldableEntityStorageControllerBase.php
+++ b/core/lib/Drupal/Core/Entity/FieldableEntityStorageControllerBase.php
@@ -11,7 +11,6 @@
 use Drupal\Core\Field\PrepareCacheInterface;
 use Drupal\field\FieldConfigInterface;
 use Drupal\field\FieldInstanceConfigInterface;
-use Drupal\Core\Field\ConfigFieldItemListInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 abstract class FieldableEntityStorageControllerBase extends EntityStorageControllerBase implements FieldableEntityStorageControllerInterface {
@@ -167,7 +166,7 @@ protected function loadFieldItems(array $entities) {
           foreach ($entity->getTranslationLanguages() as $langcode => $language) {
             $translation = $entity->getTranslation($langcode);
             foreach ($translation as $field_name => $items) {
-              if ($items instanceof ConfigFieldItemListInterface && !$items->isEmpty()) {
+              if ($items->getFieldDefinition()->isConfigurable() && !$items->isEmpty()) {
                 foreach ($items as $delta => $item) {
                   // If the field item needs to prepare the cache data, call the
                   // corresponding method, otherwise use the values as cache
diff --git a/core/lib/Drupal/Core/Field/ConfigFieldItemBase.php b/core/lib/Drupal/Core/Field/ConfigFieldItemBase.php
deleted file mode 100644
index 4b65acf..0000000
--- a/core/lib/Drupal/Core/Field/ConfigFieldItemBase.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Field\ConfigFieldItemBase.
- */
-
-namespace Drupal\Core\Field;
-
-/**
- * Base class for 'configurable field type' plugin implementations.
- */
-abstract class ConfigFieldItemBase extends FieldItemBase implements ConfigFieldItemInterface {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function settingsForm(array $form, array &$form_state, $has_data) {
-    return array();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function instanceSettingsForm(array $form, array &$form_state) {
-    return array();
-  }
-
-}
diff --git a/core/lib/Drupal/Core/Field/ConfigFieldItemInterface.php b/core/lib/Drupal/Core/Field/ConfigFieldItemInterface.php
deleted file mode 100644
index 980714d..0000000
--- a/core/lib/Drupal/Core/Field/ConfigFieldItemInterface.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Field\ConfigFieldItemInterface.
- */
-
-namespace Drupal\Core\Field;
-
-/**
- * Interface definition for 'configurable field type' plugins.
- */
-interface ConfigFieldItemInterface extends FieldItemInterface {
-
-  /**
-   * Returns a form for the field-level settings.
-   *
-   * Invoked from \Drupal\field_ui\Form\FieldEditForm to allow administrators to
-   * configure field-level settings.
-   *
-   * Field storage might reject field definition changes that affect the field
-   * storage schema if the field already has data. When the $has_data parameter
-   * is TRUE, the form should not allow changing the settings that take part in
-   * the schema() method. It is recommended to set #access to FALSE on the
-   * corresponding elements.
-   *
-   * @param array $form
-   *   The form where the settings form is being included in.
-   * @param array $form_state
-   *   The form state of the (entire) configuration form.
-   * @param bool $has_data
-   *   TRUE if the field already has data, FALSE if not.
-   *
-   * @return
-   *   The form definition for the field settings.
-   */
-  public function settingsForm(array $form, array &$form_state, $has_data);
-
-  /**
-   * Returns a form for the instance-level settings.
-   *
-   * Invoked from \Drupal\field_ui\Form\FieldInstanceEditForm to allow
-   * administrators to configure instance-level settings.
-   *
-   * @param array $form
-   *   The form where the settings form is being included in.
-   * @param array $form_state
-   *   The form state of the (entire) configuration form.
-   *
-   * @return array
-   *   The form definition for the field instance settings.
-   */
-  public function instanceSettingsForm(array $form, array &$form_state);
-
-}
diff --git a/core/lib/Drupal/Core/Field/ConfigFieldItemListInterface.php b/core/lib/Drupal/Core/Field/ConfigFieldItemListInterface.php
deleted file mode 100644
index b58f9fd..0000000
--- a/core/lib/Drupal/Core/Field/ConfigFieldItemListInterface.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Field\ConfigFieldItemListInterface.
- */
-
-namespace Drupal\Core\Field;
-
-/**
- * Interface definition for "configurable fields".
- */
-interface ConfigFieldItemListInterface extends FieldItemListInterface {
-
-  /**
-   * Returns a form for the default value input.
-   *
-   * Invoked from \Drupal\field_ui\Form\FieldInstanceEditForm to allow
-   * administrators to configure instance-level default value.
-   *
-   * @param array $form
-   *   The form where the settings form is being included in.
-   * @param array $form_state
-   *   The form state of the (entire) configuration form.
-   *
-   * @return array
-   *   The form definition for the field instance default value.
-   */
-  public function defaultValuesForm(array &$form, array &$form_state);
-
-  /**
-   * Validates the submitted default value.
-   *
-   * Invoked from \Drupal\field_ui\Form\FieldInstanceEditForm to allow
-   * administrators to configure instance-level default value.
-   *
-   * @param array $element
-   *   The default value form element.
-   * @param array $form
-   *   The form where the settings form is being included in.
-   * @param array $form_state
-   *   The form state of the (entire) configuration form.
-   */
-  public function defaultValuesFormValidate(array $element, array &$form, array &$form_state);
-
-  /**
-   * Processes the submitted default value.
-   *
-   * Invoked from \Drupal\field_ui\Form\FieldInstanceEditForm to allow
-   * administrators to configure instance-level default value.
-   *
-   * @param array $element
-   *   The default value form element.
-   * @param array $form
-   *   The form where the settings form is being included in.
-   * @param array $form_state
-   *   The form state of the (entire) configuration form.
-   *
-   * @return array
-   *   The field instance default value.
-   */
-  public function defaultValuesFormSubmit(array $element, array &$form, array &$form_state);
-
-}
diff --git a/core/lib/Drupal/Core/Field/FieldDefinition.php b/core/lib/Drupal/Core/Field/FieldDefinition.php
index 7f760a7..d8a72b3 100644
--- a/core/lib/Drupal/Core/Field/FieldDefinition.php
+++ b/core/lib/Drupal/Core/Field/FieldDefinition.php
@@ -178,6 +178,22 @@ public function getCardinality() {
   }
 
   /**
+   * Sets the maximum number of items allowed for the field.
+   *
+   * Possible values are positive integers or
+   * FieldDefinitionInterface::CARDINALITY_UNLIMITED.
+   *
+   * @param int  $cardinality
+   *  The field cardinality.
+   *
+   * @return $this
+   */
+  public function setCardinality($cardinality) {
+    $this->definition['cardinality'] = $cardinality;
+    return $this;
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function isMultiple() {
diff --git a/core/lib/Drupal/Core/Field/FieldItemBase.php b/core/lib/Drupal/Core/Field/FieldItemBase.php
index 03706d2..fce6089 100644
--- a/core/lib/Drupal/Core/Field/FieldItemBase.php
+++ b/core/lib/Drupal/Core/Field/FieldItemBase.php
@@ -226,4 +226,18 @@ public function delete() { }
    */
   public function deleteRevision() { }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function settingsForm(array $form, array &$form_state, $has_data) {
+    return array();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function instanceSettingsForm(array $form, array &$form_state) {
+    return array();
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Field/FieldItemInterface.php b/core/lib/Drupal/Core/Field/FieldItemInterface.php
index 93b65ed..ae7bf6c 100644
--- a/core/lib/Drupal/Core/Field/FieldItemInterface.php
+++ b/core/lib/Drupal/Core/Field/FieldItemInterface.php
@@ -212,4 +212,44 @@ public function delete();
    */
   public function deleteRevision();
 
+  /**
+   * Returns a form for the field-level settings.
+   *
+   * Invoked from \Drupal\field_ui\Form\FieldEditForm to allow administrators to
+   * configure field-level settings.
+   *
+   * Field storage might reject field definition changes that affect the field
+   * storage schema if the field already has data. When the $has_data parameter
+   * is TRUE, the form should not allow changing the settings that take part in
+   * the schema() method. It is recommended to set #access to FALSE on the
+   * corresponding elements.
+   *
+   * @param array $form
+   *   The form where the settings form is being included in.
+   * @param array $form_state
+   *   The form state of the (entire) configuration form.
+   * @param bool $has_data
+   *   TRUE if the field already has data, FALSE if not.
+   *
+   * @return
+   *   The form definition for the field settings.
+   */
+  public function settingsForm(array $form, array &$form_state, $has_data);
+
+  /**
+   * Returns a form for the instance-level settings.
+   *
+   * Invoked from \Drupal\field_ui\Form\FieldInstanceEditForm to allow
+   * administrators to configure instance-level settings.
+   *
+   * @param array $form
+   *   The form where the settings form is being included in.
+   * @param array $form_state
+   *   The form state of the (entire) configuration form.
+   *
+   * @return array
+   *   The form definition for the field instance settings.
+   */
+  public function instanceSettingsForm(array $form, array &$form_state);
+
 }
diff --git a/core/lib/Drupal/Core/Field/FieldItemList.php b/core/lib/Drupal/Core/Field/FieldItemList.php
index 367acea..a3e64b0 100644
--- a/core/lib/Drupal/Core/Field/FieldItemList.php
+++ b/core/lib/Drupal/Core/Field/FieldItemList.php
@@ -286,4 +286,102 @@ public function view($display_options = array()) {
     return $view_builder->viewField($this, $display_options);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getConstraints() {
+    $constraints = parent::getConstraints();
+    // Check that the number of values doesn't exceed the field cardinality. For
+    // form submitted values, this can only happen with 'multiple value'
+    // widgets.
+    $cardinality = $this->getFieldDefinition()->getCardinality();
+    if ($cardinality != FieldDefinitionInterface::CARDINALITY_UNLIMITED) {
+      $constraints[] = \Drupal::typedDataManager()
+        ->getValidationConstraintManager()
+        ->create('Count', array(
+          'max' => $cardinality,
+          'maxMessage' => t('%name: this field cannot hold more than @count values.', array('%name' => $this->getFieldDefinition()->getLabel(), '@count' => $cardinality)),
+        ));
+    }
+
+    return $constraints;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultValuesForm(array &$form, array &$form_state) {
+    if (empty($this->getFieldDefinition()->default_value_function)) {
+      // Place the input in a separate place in the submitted values tree.
+      $widget = $this->defaultValueWidget($form_state);
+
+      $element = array('#parents' => array('default_value_input'));
+      $element += $widget->form($this, $element, $form_state);
+
+      return $element;
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultValuesFormValidate(array $element, array &$form, array &$form_state) {
+    // Extract the submitted value, and validate it.
+    $widget = $this->defaultValueWidget($form_state);
+    $widget->extractFormValues($this, $element, $form_state);
+    $violations = $this->validate();
+
+    if (count($violations)) {
+      // Store reported errors in $form_state.
+      $field_name = $this->getFieldDefinition()->getName();
+      $field_state = field_form_get_state($element['#parents'], $field_name, $form_state);
+      $field_state['constraint_violations'] = $violations;
+      field_form_set_state($element['#parents'], $field_name, $form_state, $field_state);
+
+      // Assign reported errors to the correct form element.
+      $widget->flagErrors($this, $element, $form_state);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultValuesFormSubmit(array $element, array &$form, array &$form_state) {
+    // Extract the submitted value, and return it as an array.
+    $widget = $this->defaultValueWidget($form_state);
+    $widget->extractFormValues($this, $element, $form_state);
+    return $this->getValue();
+  }
+
+  /**
+   * Returns the widget object used in default value form.
+   *
+   * @param array $form_state
+   *   The form state of the (entire) configuration form.
+   *
+   * @return \Drupal\Core\Field\WidgetInterface
+   *   A Widget object.
+   */
+  protected function defaultValueWidget(array &$form_state) {
+    if (!isset($form_state['default_value_widget'])) {
+      $entity = $this->getEntity();
+
+      // Force a non-required widget.
+      $this->getFieldDefinition()->required = FALSE;
+      $this->getFieldDefinition()->description = '';
+
+      // Use the widget currently configured for the 'default' form mode, or
+      // fallback to the default widget for the field type.
+      $entity_form_display = entity_get_form_display($entity->getEntityTypeId(), $entity->bundle(), 'default');
+      $widget = $entity_form_display->getRenderer($this->getFieldDefinition()->getName());
+      if (!$widget) {
+        $widget = \Drupal::service('plugin.manager.field.widget')->getInstance(array('field_definition' => $this->getFieldDefinition()));
+      }
+
+      $form_state['default_value_widget'] = $widget;
+    }
+
+    return $form_state['default_value_widget'];
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Field/FieldItemListInterface.php b/core/lib/Drupal/Core/Field/FieldItemListInterface.php
index 6be6bc3..651f1e4 100644
--- a/core/lib/Drupal/Core/Field/FieldItemListInterface.php
+++ b/core/lib/Drupal/Core/Field/FieldItemListInterface.php
@@ -179,4 +179,53 @@ public function deleteRevision();
    */
   public function view($display_options = array());
 
+  /**
+   * Returns a form for the default value input.
+   *
+   * Invoked from \Drupal\field_ui\Form\FieldInstanceEditForm to allow
+   * administrators to configure instance-level default value.
+   *
+   * @param array $form
+   *   The form where the settings form is being included in.
+   * @param array $form_state
+   *   The form state of the (entire) configuration form.
+   *
+   * @return array
+   *   The form definition for the field instance default value.
+   */
+  public function defaultValuesForm(array &$form, array &$form_state);
+
+  /**
+   * Validates the submitted default value.
+   *
+   * Invoked from \Drupal\field_ui\Form\FieldInstanceEditForm to allow
+   * administrators to configure instance-level default value.
+   *
+   * @param array $element
+   *   The default value form element.
+   * @param array $form
+   *   The form where the settings form is being included in.
+   * @param array $form_state
+   *   The form state of the (entire) configuration form.
+   */
+  public function defaultValuesFormValidate(array $element, array &$form, array &$form_state);
+
+  /**
+   * Processes the submitted default value.
+   *
+   * Invoked from \Drupal\field_ui\Form\FieldInstanceEditForm to allow
+   * administrators to configure instance-level default value.
+   *
+   * @param array $element
+   *   The default value form element.
+   * @param array $form
+   *   The form where the settings form is being included in.
+   * @param array $form_state
+   *   The form state of the (entire) configuration form.
+   *
+   * @return array
+   *   The field instance default value.
+   */
+  public function defaultValuesFormSubmit(array $element, array &$form, array &$form_state);
+
 }
diff --git a/core/lib/Drupal/Core/Field/FieldTypePluginManager.php b/core/lib/Drupal/Core/Field/FieldTypePluginManager.php
index f4bd317..3928525 100644
--- a/core/lib/Drupal/Core/Field/FieldTypePluginManager.php
+++ b/core/lib/Drupal/Core/Field/FieldTypePluginManager.php
@@ -50,12 +50,7 @@ public function __construct(\Traversable $namespaces, CacheBackendInterface $cac
   public function processDefinition(&$definition, $plugin_id) {
     parent::processDefinition($definition, $plugin_id);
     if (!isset($definition['list_class'])) {
-      if ($definition['configurable']) {
-        $definition['list_class'] = '\Drupal\Core\Field\ConfigFieldItemList';
-      }
-      else {
-        $definition['list_class'] = '\Drupal\Core\Field\FieldItemList';
-      }
+      $definition['list_class'] = '\Drupal\Core\Field\FieldItemList';
     }
   }
 
diff --git a/core/modules/comment/lib/Drupal/comment/Plugin/Field/FieldType/CommentItem.php b/core/modules/comment/lib/Drupal/comment/Plugin/Field/FieldType/CommentItem.php
index be4f79f..182d36c 100644
--- a/core/modules/comment/lib/Drupal/comment/Plugin/Field/FieldType/CommentItem.php
+++ b/core/modules/comment/lib/Drupal/comment/Plugin/Field/FieldType/CommentItem.php
@@ -9,7 +9,7 @@
 
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\TypedData\DataDefinition;
-use Drupal\Core\Field\ConfigFieldItemBase;
+use Drupal\Core\Field\FieldItemBase;
 
 /**
  * Plugin implementation of the 'comment' field type.
@@ -33,7 +33,7 @@
  *   default_formatter = "comment_default"
  * )
  */
-class CommentItem extends ConfigFieldItemBase {
+class CommentItem extends FieldItemBase {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldType/DateTimeFieldItemList.php b/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldType/DateTimeFieldItemList.php
index 46a5625..81fa6df 100644
--- a/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldType/DateTimeFieldItemList.php
+++ b/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldType/DateTimeFieldItemList.php
@@ -8,12 +8,12 @@
 namespace Drupal\datetime\Plugin\Field\FieldType;
 
 use Drupal\Core\Datetime\DrupalDateTime;
-use Drupal\Core\Field\ConfigFieldItemList;
+use Drupal\Core\Field\FieldItemList;
 
 /**
  * Represents a configurable entity datetime field.
  */
-class DateTimeFieldItemList extends ConfigFieldItemList {
+class DateTimeFieldItemList extends FieldItemList {
 
   /**
    * Defines the default value as now.
diff --git a/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldType/DateTimeItem.php b/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldType/DateTimeItem.php
index 1e15fad..6119730 100644
--- a/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldType/DateTimeItem.php
+++ b/core/modules/datetime/lib/Drupal/datetime/Plugin/Field/FieldType/DateTimeItem.php
@@ -10,7 +10,7 @@
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\PrepareCacheInterface;
 use Drupal\Core\TypedData\DataDefinition;
-use Drupal\Core\Field\ConfigFieldItemBase;
+use Drupal\Core\Field\FieldItemBase;
 
 /**
  * Plugin implementation of the 'datetime' field type.
@@ -27,7 +27,7 @@
  *   list_class = "\Drupal\datetime\Plugin\Field\FieldType\DateTimeFieldItemList"
  * )
  */
-class DateTimeItem extends ConfigFieldItemBase implements PrepareCacheInterface {
+class DateTimeItem extends FieldItemBase implements PrepareCacheInterface {
 
   /**
    * Value for the 'datetime_type' setting: store only a date.
diff --git a/core/modules/email/email.module b/core/modules/email/email.module
index 54d426a..f15d84d 100644
--- a/core/modules/email/email.module
+++ b/core/modules/email/email.module
@@ -32,8 +32,6 @@ function email_help($path, $arg) {
  */
 function email_field_info_alter(&$info) {
   $info['email']['configurable'] = TRUE;
-  $info['email']['class'] = '\Drupal\email\ConfigurableEmailItem';
-  $info['email']['list_class'] = '\Drupal\Core\Field\ConfigFieldItemList';
   $info['email']['default_widget'] = 'email_default';
   $info['email']['provider'] = 'email';
 }
diff --git a/core/modules/email/lib/Drupal/email/ConfigurableEmailItem.php b/core/modules/email/lib/Drupal/email/ConfigurableEmailItem.php
deleted file mode 100644
index 65e08da..0000000
--- a/core/modules/email/lib/Drupal/email/ConfigurableEmailItem.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\email\ConfigurableEmailItem.
- */
-
-namespace Drupal\email;
-
-use Drupal\Core\Field\FieldDefinitionInterface;
-use Drupal\Core\Field\Plugin\Field\FieldType\EmailItem;
-use Drupal\Core\Field\ConfigFieldItemInterface;
-
-/**
- * Alternative plugin implementation for the 'email' entity field type.
- *
- * Replaces the default implementation and supports configurable fields.
- */
-class ConfigurableEmailItem extends EmailItem implements ConfigFieldItemInterface {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function settingsForm(array $form, array &$form_state, $has_data) {
-    return array();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function instanceSettingsForm(array $form, array &$form_state) {
-    return array();
-  }
-
-
-}
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/ConfigurableEntityReferenceItem.php b/core/modules/entity_reference/lib/Drupal/entity_reference/ConfigurableEntityReferenceItem.php
index b801c1e..bcd52ad 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/ConfigurableEntityReferenceItem.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/ConfigurableEntityReferenceItem.php
@@ -8,7 +8,6 @@
 namespace Drupal\entity_reference;
 
 use Drupal\Component\Utility\String;
-use Drupal\Core\Field\ConfigFieldItemInterface;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
 use Drupal\Core\Session\AccountInterface;
@@ -27,7 +26,7 @@
  *
  * @see entity_reference_field_info_alter().
  */
-class ConfigurableEntityReferenceItem extends EntityReferenceItem implements ConfigFieldItemInterface, AllowedValuesInterface {
+class ConfigurableEntityReferenceItem extends EntityReferenceItem implements AllowedValuesInterface {
 
   /**
    * {@inheritdoc}
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 c4e0775..3b95917 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\ConfigFieldItemList;
+use Drupal\Core\Field\FieldItemList;
 
 /**
  * Represents a configurable entity_reference entity field.
  */
-class ConfigurableEntityReferenceFieldItemList extends ConfigFieldItemList {
+class ConfigurableEntityReferenceFieldItemList extends FieldItemList {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldType/ShapeItem.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldType/ShapeItem.php
index 63487c1..348886a 100644
--- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldType/ShapeItem.php
+++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldType/ShapeItem.php
@@ -9,7 +9,7 @@
 
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\TypedData\DataDefinition;
-use Drupal\Core\Field\ConfigFieldItemBase;
+use Drupal\Core\Field\FieldItemBase;
 
 /**
  * Defines the 'shape_field' entity field item.
@@ -25,7 +25,7 @@
  *   default_formatter = "field_test_default"
  * )
  */
-class ShapeItem extends ConfigFieldItemBase {
+class ShapeItem extends FieldItemBase {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldType/TestItem.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldType/TestItem.php
index d2d769a..6c85daa 100644
--- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldType/TestItem.php
+++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/Plugin/Field/FieldType/TestItem.php
@@ -10,7 +10,7 @@
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\PrepareCacheInterface;
 use Drupal\Core\TypedData\DataDefinition;
-use Drupal\Core\Field\ConfigFieldItemBase;
+use Drupal\Core\Field\FieldItemBase;
 
 /**
  * Defines the 'test_field' entity field item.
@@ -32,7 +32,7 @@
  *   default_formatter = "field_test_default"
  * )
  */
-class TestItem extends ConfigFieldItemBase implements PrepareCacheInterface {
+class TestItem extends FieldItemBase implements PrepareCacheInterface {
 
   /**
    * {@inheritdoc}
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 5f77d0d..a250229 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\ConfigFieldItemList;
+use Drupal\Core\Field\FieldItemList;
 
 /**
  * Represents a configurable entity file field.
  */
-class FileFieldItemList extends ConfigFieldItemList {
+class FileFieldItemList extends FieldItemList {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/file/lib/Drupal/file/Plugin/Field/FieldType/FileItem.php b/core/modules/file/lib/Drupal/file/Plugin/Field/FieldType/FileItem.php
index 81c4dff..189f45a 100644
--- a/core/modules/file/lib/Drupal/file/Plugin/Field/FieldType/FileItem.php
+++ b/core/modules/file/lib/Drupal/file/Plugin/Field/FieldType/FileItem.php
@@ -10,7 +10,6 @@
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
 use Drupal\Core\TypedData\DataDefinition;
-use Drupal\Core\Field\ConfigFieldItemInterface;
 
 /**
  * Plugin implementation of the 'file' field type.
@@ -36,7 +35,7 @@
  *   list_class = "\Drupal\file\Plugin\Field\FieldType\FileFieldItemList"
  * )
  */
-class FileItem extends EntityReferenceItem implements ConfigFieldItemInterface {
+class FileItem extends EntityReferenceItem {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/hal/lib/Drupal/hal/Normalizer/EntityNormalizer.php b/core/modules/hal/lib/Drupal/hal/Normalizer/EntityNormalizer.php
index 1f90663..8fbcffc 100644
--- a/core/modules/hal/lib/Drupal/hal/Normalizer/EntityNormalizer.php
+++ b/core/modules/hal/lib/Drupal/hal/Normalizer/EntityNormalizer.php
@@ -110,6 +110,8 @@ public function denormalize($data, $class, $format = NULL, array $context = arra
     // Figure out the language to use.
     if (isset($data['langcode'])) {
       $langcode = $data['langcode'][0]['value'];
+      // Remove the langcode so it does not get iterated over below.
+      unset($data['langcode']);
     }
     elseif (\Drupal::moduleHandler()->moduleExists('language')) {
       $langcode = language_get_default_langcode($typed_data_ids['entity_type'], $typed_data_ids['bundle']);
diff --git a/core/modules/link/lib/Drupal/link/Plugin/Field/FieldType/LinkItem.php b/core/modules/link/lib/Drupal/link/Plugin/Field/FieldType/LinkItem.php
index 17853c3..93d37ea 100644
--- a/core/modules/link/lib/Drupal/link/Plugin/Field/FieldType/LinkItem.php
+++ b/core/modules/link/lib/Drupal/link/Plugin/Field/FieldType/LinkItem.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\link\Plugin\Field\FieldType;
 
-use Drupal\Core\Field\ConfigFieldItemBase;
+use Drupal\Core\Field\FieldItemBase;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\TypedData\DataDefinition;
 use Drupal\Core\TypedData\MapDataDefinition;
@@ -26,7 +26,7 @@
  *   default_formatter = "link"
  * )
  */
-class LinkItem extends ConfigFieldItemBase {
+class LinkItem extends FieldItemBase {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/number/lib/Drupal/number/Plugin/Field/FieldType/NumberItemBase.php b/core/modules/number/lib/Drupal/number/Plugin/Field/FieldType/NumberItemBase.php
index c8f29b8..a238861 100644
--- a/core/modules/number/lib/Drupal/number/Plugin/Field/FieldType/NumberItemBase.php
+++ b/core/modules/number/lib/Drupal/number/Plugin/Field/FieldType/NumberItemBase.php
@@ -7,12 +7,12 @@
 
 namespace Drupal\number\Plugin\Field\FieldType;
 
-use Drupal\Core\Field\ConfigFieldItemBase;
+use Drupal\Core\Field\FieldItemBase;
 
 /**
  * Base class for 'number' configurable field types.
  */
-abstract class NumberItemBase extends ConfigFieldItemBase {
+abstract class NumberItemBase extends FieldItemBase {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListItemBase.php b/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListItemBase.php
index 6e7416b..de95075 100644
--- a/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListItemBase.php
+++ b/core/modules/options/lib/Drupal/options/Plugin/Field/FieldType/ListItemBase.php
@@ -8,14 +8,14 @@
 namespace Drupal\options\Plugin\Field\FieldType;
 
 use Drupal\Core\Field\FieldDefinitionInterface;
-use Drupal\Core\Field\ConfigFieldItemBase;
+use Drupal\Core\Field\FieldItemBase;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\TypedData\AllowedValuesInterface;
 
 /**
  * Plugin base class inherited by the options field types.
  */
-abstract class ListItemBase extends ConfigFieldItemBase implements AllowedValuesInterface {
+abstract class ListItemBase extends FieldItemBase implements AllowedValuesInterface {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Field/FieldType/TaxonomyTermReferenceFieldItemList.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Field/FieldType/TaxonomyTermReferenceFieldItemList.php
index 42f6ee8..e5cb463 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Field/FieldType/TaxonomyTermReferenceFieldItemList.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Field/FieldType/TaxonomyTermReferenceFieldItemList.php
@@ -7,12 +7,12 @@
 
 namespace Drupal\taxonomy\Plugin\Field\FieldType;
 
-use Drupal\Core\Field\ConfigFieldItemList;
+use Drupal\Core\Field\FieldItemList;
 
 /**
  * Represents a configurable taxonomy_term_reference entity field item list.
  */
-class TaxonomyTermReferenceFieldItemList extends ConfigFieldItemList {
+class TaxonomyTermReferenceFieldItemList extends FieldItemList {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Field/FieldType/TaxonomyTermReferenceItem.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Field/FieldType/TaxonomyTermReferenceItem.php
index db80f4b..c7e679b 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Field/FieldType/TaxonomyTermReferenceItem.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Field/FieldType/TaxonomyTermReferenceItem.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\taxonomy\Plugin\Field\FieldType;
 
-use Drupal\Core\Field\ConfigFieldItemInterface;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
 use Drupal\Core\Session\AccountInterface;
@@ -36,7 +35,7 @@
  *   list_class = "\Drupal\taxonomy\Plugin\Field\FieldType\TaxonomyTermReferenceFieldItemList"
  * )
  */
-class TaxonomyTermReferenceItem extends EntityReferenceItem implements ConfigFieldItemInterface, AllowedValuesInterface {
+class TaxonomyTermReferenceItem extends EntityReferenceItem implements AllowedValuesInterface {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/telephone/lib/Drupal/telephone/Plugin/Field/FieldType/TelephoneItem.php b/core/modules/telephone/lib/Drupal/telephone/Plugin/Field/FieldType/TelephoneItem.php
index 6a47145..6be9dff 100644
--- a/core/modules/telephone/lib/Drupal/telephone/Plugin/Field/FieldType/TelephoneItem.php
+++ b/core/modules/telephone/lib/Drupal/telephone/Plugin/Field/FieldType/TelephoneItem.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\telephone\Plugin\Field\FieldType;
 
-use Drupal\Core\Field\ConfigFieldItemBase;
+use Drupal\Core\Field\FieldItemBase;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\TypedData\DataDefinition;
 
@@ -22,7 +22,7 @@
  *   default_formatter = "string"
  * )
  */
-class TelephoneItem extends ConfigFieldItemBase {
+class TelephoneItem extends FieldItemBase {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItemBase.php b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItemBase.php
index 9cac637..0c85997 100644
--- a/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItemBase.php
+++ b/core/modules/text/lib/Drupal/text/Plugin/Field/FieldType/TextItemBase.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\text\Plugin\Field\FieldType;
 
-use Drupal\Core\Field\ConfigFieldItemBase;
+use Drupal\Core\Field\FieldItemBase;
 use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Core\Field\PrepareCacheInterface;
 use Drupal\Core\TypedData\DataDefinition;
@@ -15,7 +15,7 @@
 /**
  * Base class for 'text' configurable field types.
  */
-abstract class TextItemBase extends ConfigFieldItemBase implements PrepareCacheInterface {
+abstract class TextItemBase extends FieldItemBase implements PrepareCacheInterface {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/user/lib/Drupal/user/Entity/User.php b/core/modules/user/lib/Drupal/user/Entity/User.php
index 2ae6676..d5ecd06 100644
--- a/core/modules/user/lib/Drupal/user/Entity/User.php
+++ b/core/modules/user/lib/Drupal/user/Entity/User.php
@@ -12,6 +12,7 @@
 use Drupal\Core\Entity\EntityMalformedException;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\user\UserInterface;
 
 /**
@@ -514,6 +515,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
     // https://drupal.org/node/2044859.
     $fields['roles'] = FieldDefinition::create('string')
       ->setLabel(t('Roles'))
+      ->setCardinality(FieldDefinitionInterface::CARDINALITY_UNLIMITED)
       ->setDescription(t('The roles the user has.'));
 
     return $fields;
diff --git a/core/modules/user/lib/Drupal/user/Tests/UserValidationTest.php b/core/modules/user/lib/Drupal/user/Tests/UserValidationTest.php
index 02c8d4d..7beec6a 100644
--- a/core/modules/user/lib/Drupal/user/Tests/UserValidationTest.php
+++ b/core/modules/user/lib/Drupal/user/Tests/UserValidationTest.php
@@ -142,7 +142,14 @@ function testValidation() {
     $this->assertEqual($violations[0]->getPropertyPath(), 'init.0.value');
     $this->assertEqual($violations[0]->getMessage(), t('This value is not a valid email address.'));
 
-    // @todo Test user role validation once https://drupal.org/node/2015701 got
+    // Test cardinality of user roles.
+    $user = entity_create('user', array(
+      'name' => 'role_test',
+      'roles' => array('role1', 'role2'),
+    ));
+    $violations = $user->validate();
+    $this->assertEqual(count($violations), 0);
+    // @todo Test user role validation once https://drupal.org/node/2044859 got
     // committed.
   }
 
diff --git a/core/tests/Drupal/Tests/Core/Entity/FieldDefinitionTest.php b/core/tests/Drupal/Tests/Core/Entity/FieldDefinitionTest.php
index c90ed93..309d99a 100644
--- a/core/tests/Drupal/Tests/Core/Entity/FieldDefinitionTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/FieldDefinitionTest.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Core\Field\FieldDefinition;
+use Drupal\Core\Field\FieldDefinitionInterface;
 use Drupal\Tests\UnitTestCase;
 
 /**
@@ -175,7 +176,10 @@ public function testFieldTranslatable() {
   public function testFieldCardinality() {
     $definition = FieldDefinition::create($this->fieldType);
     $this->assertEquals(1, $definition->getCardinality());
-    // @todo: Add more tests when this can be controlled.
+    $definition->setCardinality(2);
+    $this->assertEquals(2, $definition->getCardinality());
+    $definition->setCardinality(FieldDefinitionInterface::CARDINALITY_UNLIMITED);
+    $this->assertEquals(FieldDefinitionInterface::CARDINALITY_UNLIMITED, $definition->getCardinality());
   }
 
   /**
