diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index afddb22..92826ab 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -486,7 +486,7 @@ public function hasField($field_name) {
    * {@inheritdoc}
    */
   public function get($field_name) {
-    if (!isset($this->fields[$field_name][$this->activeLangcode])) {
+    if (!isset($this->fields[$field_name][$this->activeLangcode]) || $this->fields[$field_name][$this->activeLangcode]->isComputed()) {
       return $this->getTranslatedField($field_name, $this->activeLangcode);
     }
     return $this->fields[$field_name][$this->activeLangcode];
@@ -503,7 +503,9 @@ protected function getTranslatedField($name, $langcode) {
     }
     // Populate $this->fields to speed-up further look-ups and to keep track of
     // fields objects, possibly holding changes to field values.
-    if (!isset($this->fields[$name][$langcode])) {
+    // Computed fields are always computed as their value might be subject to changes
+    // in the entities' lifecycle.
+    if (!isset($this->fields[$name][$langcode]) || $this->fields[$name][$langcode]->isComputed()) {
       $definition = $this->getFieldDefinition($name);
       if (!$definition) {
         throw new \InvalidArgumentException("Field $name is unknown.");
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
index 9d6b8d6..2596cf3 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
@@ -108,7 +108,7 @@ protected function initFieldValues(ContentEntityInterface $entity, array $values
         if (isset($values[$name])) {
           $entity->$name = $values[$name];
         }
-        elseif (!array_key_exists($name, $values)) {
+        elseif (!array_key_exists($name, $values) && !$field->isComputed()) {
           $entity->get($name)->applyDefaultValue();
         }
       }
diff --git a/core/lib/Drupal/Core/Field/FieldItemList.php b/core/lib/Drupal/Core/Field/FieldItemList.php
index a1a1ebd..b6ffef7 100644
--- a/core/lib/Drupal/Core/Field/FieldItemList.php
+++ b/core/lib/Drupal/Core/Field/FieldItemList.php
@@ -7,7 +7,9 @@
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\TypedData\DataDefinitionInterface;
 use Drupal\Core\TypedData\Plugin\DataType\ItemList;
+use Drupal\Core\TypedData\TypedDataInterface;
 
 /**
  * Represents an entity field; that is, a list of field item objects.
@@ -160,6 +162,31 @@ public function __unset($property_name) {
   /**
    * {@inheritdoc}
    */
+  public function isComputed(){
+    return $this instanceof FieldItemListComputedInterface;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(DataDefinitionInterface $definition, $name = NULL, TypedDataInterface $parent = NULL) {
+    parent::__construct($definition, $name, $parent);
+  }
+
+  /**
+   * {@inheritdoc
+   */
+  public function getComputedValues(){
+    $this->list = $this->computeValues();
+    $errors = $this->validate()->getIterator();
+    if($errors->current()){
+      throw new FieldException($errors->current()->getMessage());
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function access($operation = 'view', AccountInterface $account = NULL, $return_as_object = FALSE) {
     $access_control_handler = \Drupal::entityManager()->getAccessControlHandler($this->getEntity()->getEntityTypeId());
     return $access_control_handler->fieldAccess($operation, $this->getFieldDefinition(), $account, $this, $return_as_object);
diff --git a/core/lib/Drupal/Core/Field/FieldItemListComputedInterface.php b/core/lib/Drupal/Core/Field/FieldItemListComputedInterface.php
new file mode 100644
index 0000000..98b364a
--- /dev/null
+++ b/core/lib/Drupal/Core/Field/FieldItemListComputedInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Drupal\Core\Field;
+
+/**
+ * Interface for computed fields, being lists of field items.
+ *
+ * @see \Drupal\Core\Field\FieldItemInterface
+ */
+interface FieldItemListComputedInterface {
+
+  /**
+   * This will populate the field item list with computed values.
+   *
+   * @return \Drupal\Core\TypedData\TypedDataInterface[]
+   */
+  public function computeValues();
+
+  /**
+   * Determines if the field item List is computed.
+   *
+   * @return boolean
+   *   TRUE if the field item list is computed.
+   */
+  public function isComputed();
+
+}
diff --git a/core/lib/Drupal/Core/TypedData/Plugin/DataType/ItemList.php b/core/lib/Drupal/Core/TypedData/Plugin/DataType/ItemList.php
index 4f756da..4691ea8 100644
--- a/core/lib/Drupal/Core/TypedData/Plugin/DataType/ItemList.php
+++ b/core/lib/Drupal/Core/TypedData/Plugin/DataType/ItemList.php
@@ -97,10 +97,7 @@ public function get($index) {
     if (!is_numeric($index)) {
       throw new \InvalidArgumentException('Unable to get a value with a non-numeric delta in a list.');
     }
-    // Automatically create the first item for computed fields.
-    if ($index == 0 && !isset($this->list[0]) && $this->definition->isComputed()) {
-      $this->list[0] = $this->createItem(0);
-    }
+
     return isset($this->list[$index]) ? $this->list[$index] : NULL;
   }
 
diff --git a/core/lib/Drupal/Core/TypedData/TypedDataManager.php b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
index dbf0d5f..80b5d4a 100644
--- a/core/lib/Drupal/Core/TypedData/TypedDataManager.php
+++ b/core/lib/Drupal/Core/TypedData/TypedDataManager.php
@@ -7,6 +7,7 @@
 use Drupal\Core\DependencyInjection\ClassResolverInterface;
 use Drupal\Core\DependencyInjection\DependencySerializationTrait;
 use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Field\FieldItemListComputedInterface;
 use Drupal\Core\Plugin\DefaultPluginManager;
 use Drupal\Core\TypedData\Validation\ExecutionContextFactory;
 use Drupal\Core\TypedData\Validation\RecursiveValidator;
@@ -200,6 +201,11 @@ public function getPropertyInstance(TypedDataInterface $object, $property_name,
     if (isset($value)) {
       $property->setValue($value, FALSE);
     }
+    elseif ($property instanceof FieldItemListComputedInterface) {
+      // populate the computed list with values as there are no initial values
+      // to set.
+      $property->getComputedValues();
+    }
     return $property;
   }
 
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..13b47e6
--- /dev/null
+++ b/core/modules/field/tests/modules/field_computed_test/field_computed_test.module
@@ -0,0 +1,57 @@
+<?php
+
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Field\BaseFieldDefinition;
+use Drupal\field_computed_test\Plugin\Field\FieldType\ComputedValuesItemList;
+
+
+
+
+/**
+ * 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'));
+      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_valid_computed_timestamp':
+        $fields['non_valid_computed_timestamp'] = BaseFieldDefinition::create('timestamp')
+          ->setComputed(TRUE)
+          ->setClass(ComputedValuesItemList::class)
+          ->setSetting('field', 'non_valid_computed_timestamp')
+          ->setLabel(t('Non valid computed integer'));
+        break;
+      case 'non_valid_computed_entity_reference':
+        $fields['non_valid_computed_entity_reference'] = BaseFieldDefinition::create('entity_reference')
+          ->setComputed(TRUE)
+          ->setSetting('target_type', 'entity_test')
+          ->setClass(ComputedValuesItemList::class)
+          ->setSetting('field', 'non_valid_computed_entity_reference')
+          ->setLabel(t('Valid Computed Entity Reference'));
+        break;
+    }
+  }
+  return $fields;
+}
\ No newline at end of file
diff --git a/core/modules/field/tests/modules/field_computed_test/src/Plugin/Field/FieldType/ComputedValuesItemList.php b/core/modules/field/tests/modules/field_computed_test/src/Plugin/Field/FieldType/ComputedValuesItemList.php
new file mode 100644
index 0000000..1626c58
--- /dev/null
+++ b/core/modules/field/tests/modules/field_computed_test/src/Plugin/Field/FieldType/ComputedValuesItemList.php
@@ -0,0 +1,62 @@
+<?php
+
+namespace Drupal\field_computed_test\Plugin\Field\FieldType;
+
+use Drupal\Core\Field\FieldItemList;
+use Drupal\Core\Field\FieldItemListComputedInterface;
+
+/**
+ * Represents a configurable dice result.
+ */
+class ComputedValuesItemList extends FieldItemList implements FieldItemListComputedInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function computeValues() {
+    switch ($this->getSetting('field')) {
+      case 'valid_computed_timestamp':
+        $items = [];
+        $items[] = $this->createItem(0, [
+          'value' => \Drupal::time()->getRequestTime(),
+        ]);
+        return $items;
+        break;
+      case 'valid_computed_entity_reference':
+        $items = [];
+        $parent = $this->getEntity();
+        if (!$parent->isNew()) {
+          $items[] = $this->createItem(0, [
+            'target_id' => $parent->id() == 1 ? 2 : 1,
+          ]);
+        }
+        return $items;
+        break;
+      case 'non_valid_computed_entity_reference':
+        $items = [];
+        $parent = $this->getEntity();
+        if (!$parent->isNew()) {
+          $items[] = $this->createItem(0, [
+            'target_id' => '3', // Non existing entity reference.
+          ]);
+        }
+        return $items;
+        break;
+      case 'non_valid_computed_timestamp':
+        $items = [];
+        $items[] = $this->createItem(0, [
+          'value' => 'A',
+        ]);
+        return $items;
+        break;
+      case 'non_valid_computed_entity_reference':
+        $items = [];
+        $items[] = $this->createItem(0, [
+          'target_id' => 3,
+        ]);
+        break;
+    }
+  }
+
+
+}
diff --git a/core/modules/field/tests/src/Kernel/FieldComputedTest.php b/core/modules/field/tests/src/Kernel/FieldComputedTest.php
new file mode 100644
index 0000000..090f49b
--- /dev/null
+++ b/core/modules/field/tests/src/Kernel/FieldComputedTest.php
@@ -0,0 +1,150 @@
+<?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 FieldComputedTest extends KernelTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = [
+    'system',
+    'field',
+    'text',
+    'user',
+    'entity_test',
+    'field_computed_test',
+  ];
+
+  /**
+   * @var EntityTest[]
+   */
+  public $entities = [];
+
+  /**
+   * Test a valid computed 'timestamp' field.
+   */
+  public function testValidComputedTimestamp() {
+    $request_time = \Drupal::time()->getRequestTime();
+    $value = $this->entities[0]->get('valid_computed_timestamp')->getValue();
+    $this->assertEquals([0 => ['value' => $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 testNonValidComputedEntityReference(){
+    $referencedEntity = $this->entities[0]->get('non_valid_computed_entity_reference')->entity;
+    $this->assertNull($referencedEntity);
+  }
+
+  /**
+   * @expectedException \Drupal\Core\Field\FieldException
+   * @expectedExceptionMessage This value should be a valid number.
+   */
+  public function testNonValidComputedTimestamp() {
+    $data = [
+      [
+        'type' => 'non_valid_computed_timestamp',
+        'title' => 'Entity with a non valid computed timestamp',
+      ],
+    ];
+    $this->createTestEntities($data);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->installSchema('system', ['sequences', 'key_value']);
+    $this->installConfig(['field', 'system']);
+    $this->installEntitySchema('entity_test');
+    $this->installEntitySchema('user');
+
+    $data = $this->getTestDataForEntities($this->getName());
+
+    $this->createTestEntities($data);
+  }
+
+  /**
+   * Get an array of test data for the creation of entities.
+   *
+   * @param $methodName
+   *
+   * @return array Data for creation of test entities.
+   */
+  private function getTestDataForEntities($methodName){
+    $data = [];
+    switch ($methodName) {
+      case "testValidComputedTimestamp":
+        $data = [
+          [
+            'type' => 'valid_computed_timestamp',
+            'title' => 'Entity with valid computed timestamp',
+          ],
+        ];
+        break;
+      case "testNonValidComputedEntityReference":
+        $data = [
+          [
+            'type' => 'non_valid_computed_entity_reference',
+            'title' => 'Entity A',
+          ],
+          [
+            'type' => 'non_valid_computed_entity_reference',
+            'title' => 'Entity B',
+          ],
+        ];
+        break;
+      case "testValidComputedEntityReference":
+        $data = [
+          [
+            'type' => 'valid_computed_entity_reference',
+            'title' => 'Entity A',
+          ],
+          [
+            'type' => 'valid_computed_entity_reference',
+            'title' => 'Entity B',
+          ],
+        ];
+        break;
+    }
+    return $data;
+  }
+  /**
+   * Create some Test Entities based on an array of data.
+   */
+  private function createTestEntities($data) {
+    foreach ($data as $item) {
+      $entity = EntityTest::create([
+        'type' => $item['type'],
+        'title' => $item['title'],
+      ]);
+      $entity->save();
+      $this->entities[] = $entity;
+    }
+  }
+
+}
\ No newline at end of file
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/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([]);
