diff --git a/core/lib/Drupal/Core/Field/ComputedFieldItemListBase.php b/core/lib/Drupal/Core/Field/ComputedFieldItemListBase.php
new file mode 100644
index 0000000..74da4e0
--- /dev/null
+++ b/core/lib/Drupal/Core/Field/ComputedFieldItemListBase.php
@@ -0,0 +1,86 @@
+<?php
+
+namespace Drupal\Core\Field;
+
+/**
+ * A base class for creating computed field item lists.
+ *
+ * This base class takes care of computing and assigning computed values to
+ * the 'list' property of the field. After extending this class for computed
+ * field lists, only the ::computeValues() method has to be implemented.
+ */
+abstract class ComputedFieldItemListBase extends FieldItemList implements FieldItemListInterface {
+
+  /**
+   * Storage for the computed values.
+   *
+   * @var array|bool
+   */
+  protected $computedValues = FALSE;
+
+  /**
+   * Return an array of calculated values.
+   *
+   * @return array|null
+   *   The sequential array of values keyed with the delta of the field item.
+   *   Return NULL or nothing if no value is computed.
+   */
+  abstract protected function computeValues();
+
+  /**
+   * {@inheritdoc}
+   *
+   * Fetches the computed values and checks them against the validators
+   * of the field type.
+   */
+  public function get($index) {
+    $this->setComputedValues();
+
+    $errors = $this->validate()->getIterator();
+    if ($errors->current()) {
+      throw new FieldException($errors->current()->getMessage());
+    }
+    return isset($this->list[$index]) ? $this->list[$index] : NULL;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIterator() {
+    $this->setComputedValues();
+    return parent::getIterator();
+  }
+
+  /**
+   * Gets the computed values.
+   *
+   * @return array
+   *   The array generated by ::computeValues.
+   */
+  protected function getComputedValues() {
+    return $this->computedValues;
+  }
+
+  /**
+   * Sets the 'list' property with computed values.
+   *
+   * @throws \Drupal\Core\Field\FieldException
+   *   If the array returned is not a sequential array of values.
+   */
+  protected function setComputedValues() {
+    if ($this->getComputedValues() === FALSE) {
+      $this->computedValues = $this->computeValues();
+      if ($this->computedValues !== NULL) {
+        if (!is_array($this->computedValues) || (array_keys($this->computedValues) !== range(0, count($this->computedValues) - 1))) {
+          throw new FieldException('A sequential array of values is excepted.');
+        }
+      }
+    }
+    if (!empty($this->computedValues)) {
+      foreach ($this->getComputedValues() as $index => $value) {
+        $this->list[$index] = $this->createItem($index, $value);
+      }
+    }
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Field/FieldItemList.php b/core/lib/Drupal/Core/Field/FieldItemList.php
index a1a1ebd..9673fb9 100644
--- a/core/lib/Drupal/Core/Field/FieldItemList.php
+++ b/core/lib/Drupal/Core/Field/FieldItemList.php
@@ -280,7 +280,8 @@ public function getConstraints() {
         ->getValidationConstraintManager()
         ->create('Count', [
           'max' => $cardinality,
-          'maxMessage' => t('%name: this field cannot hold more than @count values.', ['%name' => $this->getFieldDefinition()->getLabel(), '@count' => $cardinality]),
+          'maxMessage' => t('%name: 
+          this field cannot hold more than @count values.', ['%name' => $this->getFieldDefinition()->getLabel(), '@count' => $cardinality]),
         ]);
     }
 
diff --git a/core/modules/field/tests/modules/field_computed_test/field_computed_test.info.yml b/core/modules/field/tests/modules/field_computed_test/field_computed_test.info.yml
new file mode 100644
index 0000000..42f6216
--- /dev/null
+++ b/core/modules/field/tests/modules/field_computed_test/field_computed_test.info.yml
@@ -0,0 +1,6 @@
+name: 'Field Computed Test'
+type: module
+description: 'Support module for the computed field tests.'
+core: 8.x
+package: Testing
+version: VERSION
diff --git a/core/modules/field/tests/modules/field_computed_test/field_computed_test.module b/core/modules/field/tests/modules/field_computed_test/field_computed_test.module
new file mode 100644
index 0000000..e4f1d2b
--- /dev/null
+++ b/core/modules/field/tests/modules/field_computed_test/field_computed_test.module
@@ -0,0 +1,91 @@
+<?php
+
+/**
+ * @file
+ */
+
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Field\BaseFieldDefinition;
+use Drupal\field_computed_test\ComputedValuesItemList;
+
+/**
+ * Implements hook_field_formatter_info_alter().
+ */
+function computed_field_field_formatter_info_alter(array &$info) {
+  $info['number_integer']['field_types'][] = 'dice';
+}
+
+/**
+ * Implements hook_entity_bundle_field_info().
+ *
+ * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
+ * @param $bundle
+ * @param array $fields
+ *
+ * @return array
+ */
+function field_computed_test_entity_bundle_field_info(EntityTypeInterface $entity_type, $bundle, array $fields) {
+
+  if ($entity_type->id() === 'entity_test') {
+
+    // Add fields to separate bundles so we can test them individually.
+    switch ($bundle) {
+      case 'valid_computed_timestamp':
+        $fields['valid_computed_timestamp'] = BaseFieldDefinition::create('timestamp')
+          ->setComputed(TRUE)
+          ->setClass(ComputedValuesItemList::class)
+          ->setSetting('field', 'valid_computed_timestamp')
+          ->setLabel(t('Request Time'));
+        break;
+
+      case 'invalid_computed_timestamp':
+        $fields['invalid_computed_timestamp'] = BaseFieldDefinition::create('timestamp')
+          ->setComputed(TRUE)
+          ->setClass(ComputedValuesItemList::class)
+          ->setSetting('field', 'invalid_computed_timestamp')
+          ->setLabel(t('Non valid computed integer'));
+        break;
+
+      case 'valid_computed_entity_reference':
+        $fields['valid_computed_entity_reference'] = BaseFieldDefinition::create('entity_reference')
+          ->setComputed(TRUE)
+          ->setSetting('target_type', 'entity_test')
+          ->setClass(ComputedValuesItemList::class)
+          ->setSetting('field', 'valid_computed_entity_reference')
+          ->setLabel(t('Valid Computed Entity Reference'));
+        break;
+
+      case 'non_existing_computed_entity_reference':
+        $fields['non_existing_computed_entity_reference'] = BaseFieldDefinition::create('entity_reference')
+          ->setComputed(TRUE)
+          ->setSetting('target_type', 'entity_test')
+          ->setClass(ComputedValuesItemList::class)
+          ->setSetting('field', 'non_existing_computed_entity_reference')
+          ->setLabel(t('Non Existing Computed Entity Reference'));
+        break;
+
+      case 'invalid_cardinality':
+        $fields['invalid_cardinality'] = BaseFieldDefinition::create('integer')
+          ->setComputed(TRUE)
+          ->setSetting('field', 'invalid_cardinality')
+          ->setClass(ComputedValuesItemList::class)
+          ->setCardinality(3)
+          ->setLabel(t('Non valid cardinality'));
+        break;
+
+      case 'multiplier':
+        $fields['multiplier'] = BaseFieldDefinition::create('multiplier')
+          ->setLabel(t('Multiplied integer'))
+          ->setSetting('factor', 3);
+        break;
+
+      case 'dice':
+        $fields['dice'] = BaseFieldDefinition::create('dice')
+          ->setLabel(t('Dice'))
+          ->setSetting('min', 1)
+          ->setSetting('max', 6);
+        break;
+    }
+  }
+  return $fields;
+}
diff --git a/core/modules/field/tests/modules/field_computed_test/src/ComputedValuesItemList.php b/core/modules/field/tests/modules/field_computed_test/src/ComputedValuesItemList.php
new file mode 100644
index 0000000..2364d12
--- /dev/null
+++ b/core/modules/field/tests/modules/field_computed_test/src/ComputedValuesItemList.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Drupal\field_computed_test;
+
+use Drupal\Core\Field\ComputedFieldItemListBase;
+
+/**
+ * Class ComputedValuesItemList.
+ *
+ * @package Drupal\field_computed_test
+ */
+class ComputedValuesItemList extends ComputedFieldItemListBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function computeValues() {
+    $values = NULL;
+    switch ($this->getSetting('field')) {
+      case 'valid_computed_timestamp':
+        $values = [
+          0 => \Drupal::time()->getRequestTime(),
+        ];
+        break;
+
+      case 'invalid_computed_timestamp':
+        $values = [0 => 'A'];
+        break;
+
+      case 'valid_computed_entity_reference':
+        $parent = $this->getEntity();
+        if (!$parent->isNew()) {
+          $values = [0 => (integer) $parent->id() === 1 ? 2 : 1];
+        }
+        break;
+
+      case 'non_existing_computed_entity_reference':
+        $parent = $this->getEntity();
+        if (!$parent->isNew()) {
+          $values = [0 => 3];
+        }
+        break;
+
+      case 'invalid_cardinality':
+        $values = [1, 2, 3, 4];
+        break;
+    }
+    return $values;
+  }
+
+  /**
+   * Force the entity reference fields to be computed mutliple times.
+   *
+   * The default behaviour saves the result to a class variable and only
+   * computes it once.
+   *
+   * For the entity reference fields, since the entity we're using doesn't have
+   * an entity ID until it's actually saved, we need to repeat the computing.
+   */
+  protected function setComputedValues() {
+    $field = $this->getSetting('field');
+    if ($field == 'valid_computed_entity_reference' || $field == 'non_existing_computed_entity_reference') {
+      $this->computedValues = FALSE;
+    }
+    parent::setComputedValues();
+  }
+
+}
diff --git a/core/modules/field/tests/modules/field_computed_test/src/Plugin/Field/FieldFormatter/MultiplierFormatter.php b/core/modules/field/tests/modules/field_computed_test/src/Plugin/Field/FieldFormatter/MultiplierFormatter.php
new file mode 100644
index 0000000..87e9304
--- /dev/null
+++ b/core/modules/field/tests/modules/field_computed_test/src/Plugin/Field/FieldFormatter/MultiplierFormatter.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Drupal\field_computed_test\Plugin\Field\FieldFormatter;
+
+use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Core\Field\Plugin\Field\FieldFormatter\IntegerFormatter;
+
+/**
+ * A formatter displaying the multiplied, computed value based on the original.
+ *
+ * @FieldFormatter(
+ *   id = "multiplier",
+ *   label = @Translation("Multiplier"),
+ *   field_types = {
+ *     "multiplier"
+ *   }
+ * )
+ */
+class MultiplierFormatter extends IntegerFormatter {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function viewElements(FieldItemListInterface $items, $langcode) {
+    foreach ($items as $delta => $item) {
+      $items[$delta]->value = $item->multiplied;
+    }
+    return parent::viewElements($items, $langcode);
+  }
+
+}
diff --git a/core/modules/field/tests/modules/field_computed_test/src/Plugin/Field/FieldType/Dice.php b/core/modules/field/tests/modules/field_computed_test/src/Plugin/Field/FieldType/Dice.php
new file mode 100644
index 0000000..a21b2f0
--- /dev/null
+++ b/core/modules/field/tests/modules/field_computed_test/src/Plugin/Field/FieldType/Dice.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace Drupal\field_computed_test\Plugin\Field\FieldType;
+
+use Drupal\Core\Field\FieldStorageDefinitionInterface;
+use Drupal\Core\Field\Plugin\Field\FieldType\IntegerItem;
+use Drupal\Core\TypedData\DataDefinition;
+
+/**
+ * A fully computed field type.
+ *
+ * The table for the field will still be created and but won't hold any values.
+ *
+ * @todo Revise field storage when field type is fully computed.
+ *   Revise the fully computed field type regarding field storage on for example
+ *   admin/structure/types/manage/{entity-type}/fields/{field}/storage, which
+ *   currently throws an error with fully computed field types.
+ *
+ * @FieldType(
+ *   id = "dice",
+ *   label = @Translation("Dice"),
+ *   description = @Translation("Fully computed field type"),
+ *   category = @Translation("Number"),
+ *   default_widget = "number", default_formatter = "number_integer"
+ * )
+ */
+class Dice extends IntegerItem {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
+    $properties['value'] = DataDefinition::create('integer')
+      ->setComputed(TRUE)
+      ->setClass(DiceProcessor::class);
+    return $properties;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function schema(FieldStorageDefinitionInterface $field_definition) {
+    return [
+      'columns' => [],
+    ];
+  }
+
+}
diff --git a/core/modules/field/tests/modules/field_computed_test/src/Plugin/Field/FieldType/DiceProcessor.php b/core/modules/field/tests/modules/field_computed_test/src/Plugin/Field/FieldType/DiceProcessor.php
new file mode 100644
index 0000000..ea42b30
--- /dev/null
+++ b/core/modules/field/tests/modules/field_computed_test/src/Plugin/Field/FieldType/DiceProcessor.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace Drupal\field_computed_test\Plugin\Field\FieldType;
+
+use Drupal\Core\TypedData\TypedData;
+
+/**
+ * Gets the computed value.
+ */
+class DiceProcessor extends TypedData {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getValue() {
+    /** @var \Drupal\computed_field\Plugin\Field\FieldType\Dice $parent */
+    $parent = $this->getParent();
+    $min = $parent->getFieldDefinition()->getSetting('min');
+    $max = $parent->getFieldDefinition()->getSetting('max');
+    return rand($min, $max);
+  }
+
+}
diff --git a/core/modules/field/tests/modules/field_computed_test/src/Plugin/Field/FieldType/Multiplier.php b/core/modules/field/tests/modules/field_computed_test/src/Plugin/Field/FieldType/Multiplier.php
new file mode 100644
index 0000000..ed94e8e
--- /dev/null
+++ b/core/modules/field/tests/modules/field_computed_test/src/Plugin/Field/FieldType/Multiplier.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Drupal\field_computed_test\Plugin\Field\FieldType;
+
+use Drupal\Core\Field\FieldStorageDefinitionInterface;
+use Drupal\Core\Field\Plugin\Field\FieldType\IntegerItem;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\TypedData\DataDefinition;
+
+/**
+ * A test field type with a computed property based on the stored value.
+ *
+ * @FieldType(
+ *   id = "multiplier",
+ *   label = @Translation("Multiplier"),
+ *   description = @Translation("Computed multiplied integer based on a stored integer and a factor stored in the field configuration."),
+ *   category = @Translation("Number"),
+ *   default_widget = "number", default_formatter = "number_integer"
+ * )
+ */
+class Multiplier extends IntegerItem {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
+    $properties = parent::propertyDefinitions($field_definition);
+    $properties['multiplied'] = DataDefinition::create('integer')
+      ->setLabel(t('multiplied'))
+      ->setComputed(TRUE)
+      ->setClass(MultiplierProcessor::class);
+    return $properties;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function defaultFieldSettings() {
+    return [
+      'factor' => 1,
+    ] + parent::defaultFieldSettings();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fieldSettingsForm(array $form, FormStateInterface $form_state) {
+    $element = parent::fieldSettingsForm($form, $form_state);
+    $settings = $this->getSettings();
+    $element['factor'] = [
+      '#type' => 'number',
+      '#title' => t('Factor'),
+      '#default_value' => $settings['factor'],
+      '#description' => t('Multiply the original value with this factor.'),
+    ];
+    return $element;
+  }
+
+}
diff --git a/core/modules/field/tests/modules/field_computed_test/src/Plugin/Field/FieldType/MultiplierProcessor.php b/core/modules/field/tests/modules/field_computed_test/src/Plugin/Field/FieldType/MultiplierProcessor.php
new file mode 100644
index 0000000..64759c8
--- /dev/null
+++ b/core/modules/field/tests/modules/field_computed_test/src/Plugin/Field/FieldType/MultiplierProcessor.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Drupal\field_computed_test\Plugin\Field\FieldType;
+
+use Drupal\Core\TypedData\TypedData;
+
+/**
+ * Class that computes the 'multiplied' property of the field type 'multiplier'.
+ */
+class MultiplierProcessor extends TypedData {
+
+  /**
+   * Cached multiplied value;.
+   *
+   * @var int|null
+   */
+  protected $multipliedValue;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getValue() {
+    if ($this->multipliedValue !== NULL && $this->value !== NULL) {
+      return $this->multipliedValue;
+    }
+    $item = $this->getParent();
+    $factor = $item->getDataDefinition()->getSetting('factor');
+    $this->multipliedValue = $item->value * $factor;
+    return $this->multipliedValue;
+  }
+
+}
diff --git a/core/modules/field/tests/src/Kernel/FieldComputedFieldItemListTest.php b/core/modules/field/tests/src/Kernel/FieldComputedFieldItemListTest.php
new file mode 100644
index 0000000..1163b5e
--- /dev/null
+++ b/core/modules/field/tests/src/Kernel/FieldComputedFieldItemListTest.php
@@ -0,0 +1,185 @@
+<?php
+
+namespace Drupal\Tests\field\Kernel;
+
+use Drupal\entity_test\Entity\EntityTest;
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * Test related to computed entity fields.
+ *
+ * @group field
+ */
+class FieldComputedFieldItemListTest extends KernelTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = [
+    'system',
+    'field',
+    'text',
+    'user',
+    'entity_test',
+    'field_computed_test',
+  ];
+
+  /**
+   * @var EntityTest[]
+   */
+  public $entities = [];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->installSchema('system', ['sequences', 'key_value']);
+    $this->installConfig(['field', 'system']);
+    $this->installEntitySchema('entity_test');
+    $this->installEntitySchema('user');
+    $entitiesData = $this->getTestDataForEntities($this->getName());
+    $this->createTestEntities($entitiesData);
+  }
+
+  /**
+   * Test a valid computed 'timestamp' field.
+   */
+  public function testValidComputedTimestamp() {
+    $request_time = \Drupal::time()->getRequestTime();
+    $value = $this->entities[0]->get('valid_computed_timestamp')->value;
+    $this->assertEquals($request_time, $value);
+  }
+
+  /**
+   * Test a valid computed entityreference field.
+   */
+  public function testValidComputedEntityReference() {
+    $referencedEntity = $this->entities[0]->get('valid_computed_entity_reference')->entity;
+    $this->assertInstanceOf(EntityTest::class, $referencedEntity);
+    $this->assertEquals($this->entities[1]->id(), $referencedEntity->id());
+  }
+
+  /**
+   * Test that a non existing entity reference returns NULL.
+   */
+  public function testNonExistingComputedEntityReference() {
+    $referencedEntity = $this->entities[0]->get('non_existing_computed_entity_reference')->entity;
+    $this->assertNull($referencedEntity);
+  }
+
+  /**
+   * Test that a wrong value ('A') for a 'timestamp' field throws an exception.
+   *
+   * @expectedException \Drupal\Core\Field\FieldException
+   * @expectedExceptionMessage This value should be a valid number.
+   */
+  public function testNonValidComputedTimestamp() {
+    $entitiesData = [
+      [
+        'type' => 'invalid_computed_timestamp',
+        'title' => 'Entity with a non valid computed timestamp',
+      ],
+    ];
+    $this->createTestEntities($entitiesData);
+  }
+
+  /**
+   * Test that the computed values (4) in a field with cardinality '3' throws an exception.
+   *
+   * @expectedException \Drupal\Core\Field\FieldException
+   * @expectedExceptionMessage this field cannot hold more than 3 values
+   */
+  public function testNonValidCardinality() {
+    $entitiesData = [
+      [
+        'type' => 'invalid_cardinality',
+        'title' => 'Entity with a non valid cardinality',
+      ],
+    ];
+    $this->createTestEntities($entitiesData);
+  }
+
+  /**
+   * Get an array of test data for the creation of entities.
+   *
+   * @param $methodName
+   *   The test method for which the entities have to be created.
+   *
+   * @return array
+   *   An array of data for creation of test entities.
+   */
+  protected function getTestDataForEntities($methodName) {
+    $entitiesData = [];
+    switch ($methodName) {
+      case "testValidComputedTimestamp":
+        $entitiesData = [
+          [
+            'type' => 'valid_computed_timestamp',
+            'title' => 'Entity with valid computed timestamp',
+          ],
+        ];
+        break;
+
+      case "testInvalidComputedTimestamp":
+        $entitiesData = [
+          [
+            'type' => 'invalid_computed_timestamp',
+            'title' => 'Entity with an invalid computed timestamp',
+          ],
+        ];
+        break;
+
+      case "testValidComputedEntityReference":
+        $entitiesData = [
+          [
+            'type' => 'valid_computed_entity_reference',
+            'title' => 'Entity A',
+          ],
+          [
+            'type' => 'valid_computed_entity_reference',
+            'title' => 'Entity B',
+          ],
+        ];
+        break;
+
+      case "testNonExistingComputedEntityReference":
+        $entitiesData = [
+          [
+            'type' => 'non_existing_computed_entity_reference',
+            'title' => 'Entity A',
+          ],
+          [
+            'type' => 'non_existing_computed_entity_reference',
+            'title' => 'Entity B',
+          ],
+        ];
+        break;
+
+    }
+    return $entitiesData;
+  }
+
+  /**
+   * Create some test entities based on an array of data.
+   *
+   * @param $entitiesData
+   *   An array of data for creating entities with computed fields for specific
+   *   bundles.
+   *
+   * @see field_computed_test.module
+   */
+  protected function createTestEntities(array $entitiesData) {
+    foreach ($entitiesData as $item) {
+      $entity = EntityTest::create([
+        'type' => $item['type'],
+        'title' => $item['title'],
+      ]);
+      $entity->save();
+      $this->entities[] = $entity;
+    }
+  }
+
+}
diff --git a/core/modules/field/tests/src/Kernel/FieldComputedFieldTypeTest.php b/core/modules/field/tests/src/Kernel/FieldComputedFieldTypeTest.php
new file mode 100644
index 0000000..47fac01
--- /dev/null
+++ b/core/modules/field/tests/src/Kernel/FieldComputedFieldTypeTest.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace Drupal\Tests\field\Kernel;
+
+use Drupal\entity_test\Entity\EntityTest;
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * Test related to computed entity fields.
+ *
+ * @group field
+ */
+class FieldComputedFieldTypeTest extends KernelTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = [
+    'system',
+    'field',
+    'text',
+    'user',
+    'entity_test',
+    'field_computed_test',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->installSchema('system', ['sequences', 'key_value']);
+    $this->installConfig(['field', 'system']);
+    $this->installEntitySchema('entity_test');
+    $this->installEntitySchema('user');
+  }
+
+  /**
+   * Test that the processed Multiplier field works correctly.
+   *
+   * The factor is a setting saved in the field definition config entity.
+   */
+  public function testMultiplierFieldType() {
+    $originalValue = rand(1, 10);
+    $entity = EntityTest::create([
+      'type' => 'multiplier',
+      'title' => $this->randomString(),
+    ]);
+    $entity->set('multiplier', $originalValue);
+    $entity->save();
+    $factor = $entity->get('multiplier')->getFieldDefinition()->getSetting('factor');
+    $multipliedValue = $entity->get('multiplier')->multiplied;
+    $this->assertEquals($originalValue * $factor, $multipliedValue);
+  }
+
+  /**
+   * Test that the processed Multiplier field works correctly.
+   *
+   * The factor is a setting saved in the field definition config entity.
+   */
+  public function testDiceFieldType() {
+    $entity = EntityTest::create([
+      'type' => 'dice',
+      'title' => $this->randomString(),
+    ]);
+    $entity->save();
+    $min = $entity->get('dice')->getFieldDefinition()->getSetting('min');
+    $max = $entity->get('dice')->getFieldDefinition()->getSetting('max');
+    $value = $entity->get('dice')->value;
+    $this->assertTrue($value >= $min && $value <= $max, "The value (" . $value . ")is a random computed number between the max and min settings of the dice field.");
+  }
+
+}
diff --git a/core/modules/views/tests/src/Unit/Plugin/field/FieldTest.php b/core/modules/views/tests/src/Unit/Plugin/field/FieldTest.php
index 2b929f3..1f4bfa4 100644
--- a/core/modules/views/tests/src/Unit/Plugin/field/FieldTest.php
+++ b/core/modules/views/tests/src/Unit/Plugin/field/FieldTest.php
@@ -83,6 +83,13 @@ protected function setUp() {
       ->method('getDefaultFieldSettings')
       ->willReturn([]);
 
+    $typed_data_manager = $this->getMock('Drupal\Component\Plugin\PluginManagerInterface');
+    // @todo: maybe use a reasonable argument
+    $typed_data_manager->expects($this->any())
+      ->method('getDefinition')
+      ->with($this->anything())
+      ->will($this->returnValue(['list_class' => '\Drupal\Core\Field\FieldItemList']));
+
     $this->languageManager = $this->getMock('Drupal\Core\Language\LanguageManagerInterface');
     $this->renderer = $this->getMock('Drupal\Core\Render\RendererInterface');
 
@@ -94,6 +101,7 @@ protected function setUp() {
 
     $this->container = new ContainerBuilder();
     $this->container->set('plugin.manager.field.field_type', $this->fieldTypePluginManager);
+    $this->container->set('typed_data_manager', $typed_data_manager);
     \Drupal::setContainer($this->container);
   }
 
diff --git a/core/tests/Drupal/Tests/Core/Entity/BaseFieldDefinitionTest.php b/core/tests/Drupal/Tests/Core/Entity/BaseFieldDefinitionTest.php
index 616f6ba..1f2cab1 100644
--- a/core/tests/Drupal/Tests/Core/Entity/BaseFieldDefinitionTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/BaseFieldDefinitionTest.php
@@ -64,8 +64,16 @@ protected function setUp() {
       ->with($this->fieldType)
       ->will($this->returnValue($this->fieldTypeDefinition['field_settings']));
 
+    $typed_data_manager = $this->getMock('Drupal\Component\Plugin\PluginManagerInterface');
+    // @todo: maybe use a reasonable argument
+    $typed_data_manager->expects($this->any())
+      ->method('getDefinition')
+      ->with($this->anything())
+      ->will($this->returnValue(['list_class' => '\Drupal\Core\Field\FieldItemList']));
+
     $container = new ContainerBuilder();
     $container->set('plugin.manager.field.field_type', $field_type_manager);
+    $container->set('typed_data_manager', $typed_data_manager);
     \Drupal::setContainer($container);
   }
 
diff --git a/core/tests/Drupal/Tests/Core/Entity/ContentEntityBaseUnitTest.php b/core/tests/Drupal/Tests/Core/Entity/ContentEntityBaseUnitTest.php
index 541ec88..5a511cd 100644
--- a/core/tests/Drupal/Tests/Core/Entity/ContentEntityBaseUnitTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/ContentEntityBaseUnitTest.php
@@ -472,9 +472,12 @@ public function testLabel() {
    *   - Fields array for $fields.
    */
   public function providerGet() {
+    $items = $this->getMockBuilder('Drupal\Core\Field\FieldItemList')
+      ->disableOriginalConstructor()
+      ->getMock();
     return [
       // Populated fields array.
-      ['result', 'field_name', 'langcode', ['field_name' => ['langcode' => 'result']]],
+      [$items, 'field_name', 'langcode', ['field_name' => ['langcode' => $items]]],
       // Incomplete fields array.
       ['getTranslatedField_result', 'field_name', 'langcode', ['field_name' => 'no_langcode']],
       // Empty fields array.
diff --git a/core/tests/Drupal/Tests/Core/Entity/TypedData/EntityAdapterUnitTest.php b/core/tests/Drupal/Tests/Core/Entity/TypedData/EntityAdapterUnitTest.php
index 953daac..d5832d7 100644
--- a/core/tests/Drupal/Tests/Core/Entity/TypedData/EntityAdapterUnitTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/TypedData/EntityAdapterUnitTest.php
@@ -141,8 +141,15 @@ protected function setUp() {
     $this->typedDataManager = $this->getMock(TypedDataManagerInterface::class);
     $this->typedDataManager->expects($this->any())
       ->method('getDefinition')
-      ->with('entity')
-      ->will($this->returnValue(['class' => '\Drupal\Core\Entity\Plugin\DataType\EntityAdapter']));
+      ->will($this->returnCallback(function($plugin_id){
+        switch ($plugin_id) {
+          case 'entity':
+            return ['class' => '\Drupal\Core\Entity\Plugin\DataType\EntityAdapter'];
+          default:
+            // @todo: maybe use a reasonable argument value
+            return ['list_class' => '\Drupal\Core\Field\FieldItemList'];
+        }
+      }));
     $this->typedDataManager->expects($this->any())
       ->method('getDefaultConstraints')
       ->willReturn([]);
