diff --git a/core/modules/system/src/Tests/Entity/EntityDefinitionTestTrait.php b/core/modules/system/src/Tests/Entity/EntityDefinitionTestTrait.php
index 87efdca..bdbbc59 100644
--- a/core/modules/system/src/Tests/Entity/EntityDefinitionTestTrait.php
+++ b/core/modules/system/src/Tests/Entity/EntityDefinitionTestTrait.php
@@ -37,6 +37,7 @@ protected function updateEntityTypeToRevisionable() {
     $keys = $entity_type->getKeys();
     $keys['revision'] = 'revision_id';
     $entity_type->set('entity_keys', $keys);
+    $entity_type->set('revision_table', 'entity_test_update_revision');
 
     $this->state->set('entity_test_update.entity_type', $entity_type);
   }
@@ -201,7 +202,7 @@ protected function removeBundleField() {
    */
   protected function addEntityIndex() {
     $indexes = array(
-      'entity_test_update__new_index' => array('name', 'user_id'),
+      'entity_test_update__new_index' => array('test_single_property', 'test_non_rev_field'),
     );
     $this->state->set('entity_test_update.additional_entity_indexes', $indexes);
   }
diff --git a/core/modules/system/tests/modules/entity_test/entity_test.module b/core/modules/system/tests/modules/entity_test/entity_test.module
index cf1a63c..9308784 100644
--- a/core/modules/system/tests/modules/entity_test/entity_test.module
+++ b/core/modules/system/tests/modules/entity_test/entity_test.module
@@ -93,9 +93,6 @@ function entity_test_entity_type_alter(array &$entity_types) {
     }
   }
 
-  // Allow entity_test_update tests to override the entity type definition.
-  $entity_types['entity_test_update'] = $state->get('entity_test_update.entity_type', $entity_types['entity_test_update']);
-
   // Allow entity_test_with_bundle tests to override the entity type definition.
   $entity_types['entity_test_with_bundle'] = $state->get('entity_test_with_bundle.entity_type', $entity_types['entity_test_with_bundle']);
 
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestUpdate.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestUpdate.php
deleted file mode 100644
index 6cf0d5c..0000000
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestUpdate.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-
-namespace Drupal\entity_test\Entity;
-
-use Drupal\Core\Entity\EntityTypeInterface;
-
-/**
- * Defines the test entity class for testing definition updates.
- *
- * This entity type starts out non-revisionable by lacking a "revision_id" key,
- * but during an update test, can be made revisionable by adding that key.
- *
- * @ContentEntityType(
- *   id = "entity_test_update",
- *   label = @Translation("Test entity update"),
- *   handlers = {
- *     "storage_schema" = "Drupal\entity_test\EntityTestStorageSchema"
- *   },
- *   base_table = "entity_test_update",
- *   revision_table = "entity_test_update_revision",
- *   persistent_cache = FALSE,
- *   entity_keys = {
- *     "id" = "id",
- *     "uuid" = "uuid",
- *     "bundle" = "type",
- *     "label" = "name",
- *     "langcode" = "langcode",
- *   }
- * )
- */
-class EntityTestUpdate extends EntityTestRev {
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
-    $fields = parent::baseFieldDefinitions($entity_type);
-    $fields += \Drupal::state()->get('entity_test_update.additional_base_field_definitions', array());
-    return $fields;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function bundleFieldDefinitions(EntityTypeInterface $entity_type, $bundle, array $base_field_definitions) {
-    $fields = parent::bundleFieldDefinitions($entity_type, $bundle, $base_field_definitions);
-    $fields += \Drupal::state()->get('entity_test_update.additional_bundle_field_definitions.' . $bundle, array());
-    return $fields;
-  }
-
-}
diff --git a/core/modules/system/tests/modules/entity_test_update/config/install/field.field.entity_test_update.entity_test_update.field_test_configurable_field.yml b/core/modules/system/tests/modules/entity_test_update/config/install/field.field.entity_test_update.entity_test_update.field_test_configurable_field.yml
new file mode 100644
index 0000000..b1f7cc9
--- /dev/null
+++ b/core/modules/system/tests/modules/entity_test_update/config/install/field.field.entity_test_update.entity_test_update.field_test_configurable_field.yml
@@ -0,0 +1,21 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.entity_test_update.field_test_configurable_field
+  module:
+    - entity_test_update
+id: entity_test_update.entity_test_update.field_test_configurable_field
+field_name: field_test_configurable_field
+entity_type: entity_test_update
+bundle: entity_test_update
+label: 'Test configurable field'
+description: ''
+required: false
+translatable: true
+default_value:
+  -
+    value1: {  }
+default_value_callback: ''
+settings: {  }
+field_type: multi_value_test
diff --git a/core/modules/system/tests/modules/entity_test_update/config/install/field.storage.entity_test_update.field_test_configurable_field.yml b/core/modules/system/tests/modules/entity_test_update/config/install/field.storage.entity_test_update.field_test_configurable_field.yml
new file mode 100644
index 0000000..1501f89
--- /dev/null
+++ b/core/modules/system/tests/modules/entity_test_update/config/install/field.storage.entity_test_update.field_test_configurable_field.yml
@@ -0,0 +1,17 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - entity_test_update
+id: entity_test_update.field_test_configurable_field
+field_name: field_test_configurable_field
+entity_type: entity_test_update
+type: multi_value_test
+settings: {  }
+module: entity_test_update
+locked: false
+cardinality: -1
+translatable: true
+indexes: {  }
+persist_with_no_fields: false
+custom_storage: false
diff --git a/core/modules/system/tests/modules/entity_test_update/config/schema/entity_test_update.schema.yml b/core/modules/system/tests/modules/entity_test_update/config/schema/entity_test_update.schema.yml
new file mode 100644
index 0000000..5c60457
--- /dev/null
+++ b/core/modules/system/tests/modules/entity_test_update/config/schema/entity_test_update.schema.yml
@@ -0,0 +1,9 @@
+field.value.multi_value_test:
+  type: mapping
+  label: 'Default value'
+  mapping:
+    value1:
+      type: sequence
+      sequence:
+        type: string
+        label: 'First value'
diff --git a/core/modules/system/tests/modules/entity_test_update/entity_test_update.info.yml b/core/modules/system/tests/modules/entity_test_update/entity_test_update.info.yml
new file mode 100644
index 0000000..330028a
--- /dev/null
+++ b/core/modules/system/tests/modules/entity_test_update/entity_test_update.info.yml
@@ -0,0 +1,6 @@
+name: 'Entity Update Test'
+type: module
+description: 'Provides an entity type for testing definition and schema updates.'
+package: Testing
+version: VERSION
+core: 8.x
diff --git a/core/modules/system/tests/modules/entity_test_update/entity_test_update.module b/core/modules/system/tests/modules/entity_test_update/entity_test_update.module
new file mode 100644
index 0000000..9fc6114
--- /dev/null
+++ b/core/modules/system/tests/modules/entity_test_update/entity_test_update.module
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * @file
+ * Provides an entity type for testing definition and schema updates.
+ */
+
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Field\BaseFieldDefinition;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+
+/**
+ * Implements hook_entity_base_field_info().
+ */
+function entity_test_update_entity_base_field_info(\Drupal\Core\Entity\EntityTypeInterface $entity_type) {
+  // Add a base field that will be used to test that fields added through
+  // hook_entity_base_field_info() are also properly migrated to be
+  // revisionable.
+  if ($entity_type->id() == 'entity_test_update') {
+    $fields = array();
+    $fields['test_entity_base_field_info'] = BaseFieldDefinition::create('string')
+      ->setLabel(new TranslatableMarkup('Field added by hook_entity_base_field_info()'))
+      ->setTranslatable(TRUE)
+      ->setRevisionable(TRUE);
+
+    return $fields;
+  }
+}
+
+/**
+ * Implements hook_entity_type_alter().
+ */
+function entity_test_update_entity_type_alter(array &$entity_types) {
+  // Allow entity_test_update tests to override the entity type
+  // definition.
+  $entity_types['entity_test_update'] = \Drupal::state()->get('entity_test_update.entity_type', $entity_types['entity_test_update']);
+}
+
+/**
+ * Implements hook_entity_presave().
+ */
+function entity_test_update_entity_presave(EntityInterface $entity) {
+  // Simulate an error during the save process of a test entity.
+  if ($entity->getEntityTypeId() === 'entity_test_update' && \Drupal::state()->get('entity_test_update.throw_exception', FALSE)) {
+    throw new \Exception('Peekaboo!');
+  }
+}
diff --git a/core/modules/system/tests/modules/entity_test_update/src/Entity/EntityTestUpdate.php b/core/modules/system/tests/modules/entity_test_update/src/Entity/EntityTestUpdate.php
new file mode 100644
index 0000000..b7e08e1
--- /dev/null
+++ b/core/modules/system/tests/modules/entity_test_update/src/Entity/EntityTestUpdate.php
@@ -0,0 +1,109 @@
+<?php
+
+namespace Drupal\entity_test_update\Entity;
+
+use Drupal\Core\Entity\ContentEntityBase;
+use Drupal\Core\Entity\EntityStorageInterface;
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Field\BaseFieldDefinition;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+
+/**
+ * Defines the test entity class for testing definition and schema updates.
+ *
+ * This entity type starts out non-revisionable and non-translatable, but during
+ * an update test it can be made revisionable and translatable using the helper
+ * methods from \Drupal\system\Tests\Entity\EntityDefinitionTestTrait.
+ *
+ * @ContentEntityType(
+ *   id = "entity_test_update",
+ *   label = @Translation("Test entity update"),
+ *   handlers = {
+ *     "storage_schema" = "Drupal\entity_test_update\EntityTestUpdateStorageSchema",
+ *   },
+ *   base_table = "entity_test_update",
+ *   persistent_cache = FALSE,
+ *   entity_keys = {
+ *     "id" = "id",
+ *     "uuid" = "uuid",
+ *     "bundle" = "type",
+ *     "label" = "name",
+ *     "langcode" = "langcode",
+ *   }
+ * )
+ */
+class EntityTestUpdate extends ContentEntityBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function preCreate(EntityStorageInterface $storage, array &$values) {
+    parent::preCreate($storage, $values);
+    if (empty($values['type'])) {
+      $values['type'] = $storage->getEntityTypeId();
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
+    $fields = parent::baseFieldDefinitions($entity_type);
+
+    $fields['test_single_property'] = BaseFieldDefinition::create('string')
+      ->setLabel(new TranslatableMarkup('Field with a single property'))
+      ->setTranslatable(TRUE)
+      ->setRevisionable(TRUE);
+
+    $fields['test_multiple_properties'] = BaseFieldDefinition::create('multi_value_test')
+      ->setLabel(new TranslatableMarkup('Field with multiple properties'))
+      ->setTranslatable(TRUE)
+      ->setRevisionable(TRUE);
+
+    $fields['test_single_property_multiple_values'] = BaseFieldDefinition::create('string')
+      ->setLabel(new TranslatableMarkup('Field with a single property and multiple values'))
+      ->setCardinality(2)
+      ->setTranslatable(TRUE)
+      ->setRevisionable(TRUE);
+
+    $fields['test_multiple_properties_multiple_values'] = BaseFieldDefinition::create('multi_value_test')
+      ->setLabel(new TranslatableMarkup('Field with multiple properties and multiple values'))
+      ->setCardinality(2)
+      ->setTranslatable(TRUE)
+      ->setRevisionable(TRUE);
+
+    $fields['test_non_rev_field'] = BaseFieldDefinition::create('string')
+      ->setLabel(t('Non Revisionable Field'))
+      ->setDescription(t('A non-revisionable test field.'))
+      ->setCardinality(1)
+      ->setRevisionable(FALSE)
+      ->setTranslatable(TRUE);
+
+    $fields['test_non_mul_field'] = BaseFieldDefinition::create('string')
+      ->setLabel(t('Non Translatable Field'))
+      ->setDescription(t('A non-translatable test field.'))
+      ->setCardinality(1)
+      ->setRevisionable(TRUE)
+      ->setTranslatable(FALSE);
+
+    $fields['test_non_mulrev_field'] = BaseFieldDefinition::create('string')
+      ->setLabel(t('Non Revisionable and Translatable Field'))
+      ->setDescription(t('A non-revisionable and non-translatable test field.'))
+      ->setCardinality(1)
+      ->setRevisionable(FALSE)
+      ->setTranslatable(FALSE);
+
+    $fields += \Drupal::state()->get('entity_test_update.additional_base_field_definitions', array());
+    return $fields;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function bundleFieldDefinitions(EntityTypeInterface $entity_type, $bundle, array $base_field_definitions) {
+    $fields = parent::bundleFieldDefinitions($entity_type, $bundle, $base_field_definitions);
+    $fields += \Drupal::state()->get('entity_test_update.additional_bundle_field_definitions.' . $bundle, array());
+    return $fields;
+  }
+
+}
diff --git a/core/modules/system/tests/modules/entity_test/src/EntityTestStorageSchema.php b/core/modules/system/tests/modules/entity_test_update/src/EntityTestUpdateStorageSchema.php
similarity index 91%
rename from core/modules/system/tests/modules/entity_test/src/EntityTestStorageSchema.php
rename to core/modules/system/tests/modules/entity_test_update/src/EntityTestUpdateStorageSchema.php
index 67a13bd..bcf0926 100644
--- a/core/modules/system/tests/modules/entity_test/src/EntityTestStorageSchema.php
+++ b/core/modules/system/tests/modules/entity_test_update/src/EntityTestUpdateStorageSchema.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace Drupal\entity_test;
+namespace Drupal\entity_test_update;
 
 use Drupal\Core\Entity\ContentEntityTypeInterface;
 use Drupal\Core\Entity\Sql\SqlContentEntityStorageSchema;
@@ -9,7 +9,7 @@
 /**
  * Defines the entity_test_update storage_schema handler.
  */
-class EntityTestStorageSchema extends SqlContentEntityStorageSchema {
+class EntityTestUpdateStorageSchema extends SqlContentEntityStorageSchema {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/system/tests/modules/entity_test_update/src/Plugin/Field/FieldType/MultiValueTestItem.php b/core/modules/system/tests/modules/entity_test_update/src/Plugin/Field/FieldType/MultiValueTestItem.php
new file mode 100644
index 0000000..cb08818
--- /dev/null
+++ b/core/modules/system/tests/modules/entity_test_update/src/Plugin/Field/FieldType/MultiValueTestItem.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace Drupal\entity_test_update\Plugin\Field\FieldType;
+
+use Drupal\Core\Field\FieldStorageDefinitionInterface;
+use Drupal\Core\TypedData\DataDefinition;
+use Drupal\Core\Field\FieldItemBase;
+
+/**
+ * Defines the 'multi_value_test' field type.
+ *
+ * @FieldType(
+ *   id = "multi_value_test",
+ *   label = @Translation("Multiple values test"),
+ *   description = @Translation("Another dummy field type."),
+ * )
+ */
+class MultiValueTestItem extends FieldItemBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
+    $properties['value1'] = DataDefinition::create('string')
+      ->setLabel(t('First value'));
+
+    $properties['value2'] = DataDefinition::create('string')
+      ->setLabel(t('Second value'));
+
+    return $properties;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function schema(FieldStorageDefinitionInterface $field_definition) {
+    return [
+      'columns' => [
+        'value1' => [
+          'type' => 'varchar',
+          'length' => 64,
+        ],
+        'value2' => [
+          'type' => 'varchar',
+          'length' => 64,
+        ],
+      ],
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isEmpty() {
+    $item = $this->getValue();
+    return empty($item['value1']) && empty($item['value2']);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function mainPropertyName() {
+    return 'value1';
+  }
+
+}
diff --git a/core/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php b/core/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php
index d8a9fdf..127417e 100644
--- a/core/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Entity/EntityDefinitionUpdateTest.php
@@ -40,6 +40,13 @@ class EntityDefinitionUpdateTest extends EntityKernelTestBase {
   protected $database;
 
   /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['entity_test_update'];
+
+  /**
    * {@inheritdoc}
    */
   protected function setUp() {
