diff --git a/core/lib/Drupal/Core/Database/Driver/mysql/Schema.php b/core/lib/Drupal/Core/Database/Driver/mysql/Schema.php
index 107495b..6caf20b 100644
--- a/core/lib/Drupal/Core/Database/Driver/mysql/Schema.php
+++ b/core/lib/Drupal/Core/Database/Driver/mysql/Schema.php
@@ -413,7 +413,10 @@ public function addField($table, $field, $spec, $keys_new = array()) {
     }
     if ($fixnull) {
       $spec['not null'] = TRUE;
-      $this->changeField($table, $field, $field, $spec);
+      $count = $this->connection->query('SELECT COUNT(*) AS count FROM {' . $table . '}')->fetchAssoc();
+      if ($count['count'] == 0) {
+        $this->changeField($table, $field, $field, $spec);
+      };
     }
   }
 
diff --git a/core/modules/shortcut/shortcut.install b/core/modules/shortcut/shortcut.install
index 8df408f..68d834c 100644
--- a/core/modules/shortcut/shortcut.install
+++ b/core/modules/shortcut/shortcut.install
@@ -67,3 +67,14 @@ function shortcut_uninstall() {
     \Drupal::configFactory()->getEditable('seven.settings')->clear('third_party_settings.shortcut')->save(TRUE);
   }
 }
+
+/**
+ * Update schema.
+ */
+function shortcut_update_8001() {
+  $entity_type = \Drupal::entityTypeManager()->getStorage('shortcut')->getEntityType();
+  \Drupal::service('system.entity_schema_updater')->updateEntityType($entity_type);
+  \Drupal::service('system.entity_schema_updater')->createTables($entity_type);
+  \Drupal::service('system.entity_schema_updater')->installFields($entity_type);
+  \Drupal::service('system.entity_schema_updater')->copyData($entity_type);
+}
diff --git a/core/modules/shortcut/src/Entity/Shortcut.php b/core/modules/shortcut/src/Entity/Shortcut.php
index 6ddaf05..9f60fe0 100644
--- a/core/modules/shortcut/src/Entity/Shortcut.php
+++ b/core/modules/shortcut/src/Entity/Shortcut.php
@@ -3,9 +3,9 @@
 namespace Drupal\shortcut\Entity;
 
 use Drupal\Core\Cache\Cache;
-use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Entity\RevisionableContentEntityBase;
 use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\link\LinkItemInterface;
 use Drupal\shortcut\ShortcutInterface;
@@ -30,9 +30,12 @@
  *   },
  *   base_table = "shortcut",
  *   data_table = "shortcut_field_data",
+ *   revision_table = "shortcut_revision",
+ *   revision_data_table = "shortcut_field_revision",
  *   translatable = TRUE,
  *   entity_keys = {
  *     "id" = "id",
+ *     "revision" = "revision_id",
  *     "uuid" = "uuid",
  *     "bundle" = "shortcut_set",
  *     "label" = "title",
@@ -47,7 +50,7 @@
  *   bundle_entity_type = "shortcut_set"
  * )
  */
-class Shortcut extends ContentEntityBase implements ShortcutInterface {
+class Shortcut extends RevisionableContentEntityBase implements ShortcutInterface {
 
   /**
    * {@inheritdoc}
@@ -122,6 +125,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setDescription(t('The name of the shortcut.'))
       ->setRequired(TRUE)
       ->setTranslatable(TRUE)
+      ->setRevisionable(TRUE)
       ->setSetting('max_length', 255)
       ->setDisplayOptions('form', array(
         'type' => 'string_textfield',
@@ -139,6 +143,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setLabel(t('Path'))
       ->setDescription(t('The location this shortcut points to.'))
       ->setRequired(TRUE)
+      ->setRevisionable(TRUE)
       ->setSettings(array(
         'link_type' => LinkItemInterface::LINK_INTERNAL,
         'title' => DRUPAL_DISABLED,
diff --git a/core/modules/shortcut/tests/src/Kernel/ShortcutSevenIntegrationTest.php b/core/modules/shortcut/tests/src/Kernel/ShortcutSevenIntegrationTest.php
index 0d58c31..c8517ce 100644
--- a/core/modules/shortcut/tests/src/Kernel/ShortcutSevenIntegrationTest.php
+++ b/core/modules/shortcut/tests/src/Kernel/ShortcutSevenIntegrationTest.php
@@ -21,6 +21,7 @@ public function testInstallUninstall() {
     \Drupal::service('theme_installer')->install(['seven']);
     $this->assertNull($this->config('seven.settings')->get('third_party_settings.shortcut'), 'There are no shortcut settings in seven.settings.');
 
+    \Drupal::service('module_installer')->install(['user']);
     \Drupal::service('module_installer')->install(['shortcut']);
     $this->assertTrue($this->config('seven.settings')->get('third_party_settings.shortcut.module_link'), 'The shortcut module_link setting is in seven.settings.');
 
diff --git a/core/modules/system/src/EntitySchemaUpdater.php b/core/modules/system/src/EntitySchemaUpdater.php
new file mode 100644
index 0000000..292edac
--- /dev/null
+++ b/core/modules/system/src/EntitySchemaUpdater.php
@@ -0,0 +1,140 @@
+<?php
+
+namespace Drupal\system;
+
+
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Entity\RevisionLogInterface;
+use Drupal\Core\Entity\Sql\SqlContentEntityStorageSchema;
+use Drupal\Core\Entity\Sql\SqlEntityStorageInterface;
+use Drupal\Core\Field\BaseFieldDefinition;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+
+class EntitySchemaUpdater implements EntitySchemaUpdaterInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function createTables(EntityTypeInterface $entity_type) {
+    $entity_type_manager = \Drupal::entityTypeManager();
+    $storage = $entity_type_manager->getStorage($entity_type->id());
+    if ($storage instanceof SqlEntityStorageInterface) {
+      $storage->onEntityTypeCreate($entity_type);
+    }
+  }
+
+  public function installFields(EntityTypeInterface $entity_type) {
+    if ($entity_type->hasKey('revision')) {
+      $revision_id = BaseFieldDefinition::create('integer')
+        ->setLabel(new TranslatableMarkup('Revision ID'))
+        ->setReadOnly(TRUE)
+        ->setSetting('unsigned', TRUE);
+      \Drupal::entityDefinitionUpdateManager()
+        ->installFieldStorageDefinition($entity_type->getKey('revision'), $entity_type->id(), $entity_type->id(), $revision_id);
+
+    }
+
+    $revision_created = BaseFieldDefinition::create('created')
+      ->setLabel(t('Revision create time'))
+      ->setDescription(t('The time that the current revision was created.'))
+      ->setRevisionable(TRUE);
+    \Drupal::entityDefinitionUpdateManager()
+      ->installFieldStorageDefinition("revision_created", $entity_type->id(), $entity_type->id(), $revision_created);
+
+    $revision_user = BaseFieldDefinition::create('entity_reference')
+      ->setLabel(t('Revision user'))
+      ->setDescription(t('The user ID of the author of the current revision.'))
+      ->setSetting('target_type', 'user')
+      ->setRevisionable(TRUE);
+    \Drupal::entityDefinitionUpdateManager()
+      ->installFieldStorageDefinition("revision_user", $entity_type->id(), $entity_type->id(), $revision_user);
+
+    $revision_log_message = BaseFieldDefinition::create('string_long')
+      ->setLabel(t('Revision log message'))
+      ->setDescription(t('Briefly describe the changes you have made.'))
+      ->setRevisionable(TRUE)
+      ->setDefaultValue('')
+      ->setDisplayOptions('form', [
+        'type' => 'string_textarea',
+        'weight' => 25,
+        'settings' => [
+          'rows' => 4,
+        ],
+      ]);
+    \Drupal::entityDefinitionUpdateManager()
+      ->installFieldStorageDefinition("revision_log_message", $entity_type->id(), $entity_type->id(), $revision_log_message);
+
+    /** @var \Drupal\Core\Field\FieldDefinitionInterface[] $field_definitions */
+    $field_definitions = \Drupal::service('entity_field.manager')->getBaseFieldDefinitions($entity_type->id());
+    foreach ($field_definitions as $field_definition) {
+      \Drupal::entityDefinitionUpdateManager()->updateFieldStorageDefinition($field_definition);
+    }
+
+    $revision_data_table = $entity_type->getRevisionDataTable();
+    $schema = \Drupal::database()->schema();
+    $schema->dropPrimaryKey($revision_data_table);
+    $schema->addPrimaryKey($revision_data_table, [$entity_type->getKey('revision'), $entity_type->getKey('langcode')]);
+  }
+
+  public function updateEntityType(EntityTypeInterface $entity_type) {
+    /** @var \Drupal\Core\Entity\EntityLastInstalledSchemaRepositoryInterface $last_installed_schema_repository */
+    $last_installed_schema_repository = \Drupal::service('entity.last_installed_schema.repository');
+    $last_entity_type = $last_installed_schema_repository->getLastInstalledDefinition($entity_type->id());
+    $keys = $last_entity_type->getKeys();
+    $keys['revision'] = 'revision_id';
+    $last_entity_type->set('entity_keys', $keys);
+    $last_entity_type->set('revision_table', $entity_type->getRevisionTable());
+    $last_entity_type->set('revision_data_table', $entity_type->getRevisionDataTable());
+    $last_installed_schema_repository->setLastInstalledDefinition($last_entity_type);
+  }
+
+  public function copyData(EntityTypeInterface $entity_type) {
+    /** @var \Drupal\Core\Entity\Sql\TableMappingInterface $table_mapping */
+    $table_mapping = \Drupal::entityTypeManager()->getStorage($entity_type->id())->getTableMapping();
+    $table_names = $table_mapping->getTableNames();
+    $data = [];
+    foreach ($table_names as $table_name) {
+      $column_names = $table_mapping->getAllColumns($table_name);
+      $results = \Drupal::database()->select($table_name, 't')->fields('t')->execute()->fetchAll();
+      foreach ($results as $key => $result) {
+        foreach ($column_names as $column_name) {
+          if (!empty($result->{$column_name})) {
+            $data[$key][$column_name] = $result->{$column_name};
+          }
+        }
+      }
+    }
+
+    $id = $entity_type->getKey('id');
+    $revision_id = $entity_type->getKey('revision');
+    foreach ($data as $record) {
+      if (!empty($record[$id])) {
+        $record[$revision_id] = $record[$id];
+      }
+      foreach ($table_names as $table_name) {
+        $values = [];
+        $column_names = $table_mapping->getAllColumns($table_name);
+        foreach ($column_names as $column_name) {
+          if (!empty($record[$column_name])) {
+            $values[$column_name] = $record[$column_name];
+          }
+        }
+        $query = \Drupal::database()->select($table_name)->fields($table_name, [$id])->condition($id, $record[$id]);
+        $exists = $query->execute()->fetchAll();
+        if (isset($exists) && isset($exists[0]) && ($exists[0]->{$id} == $record[$id])) {
+          \Drupal::database()
+            ->update($table_name)
+            ->fields($values)
+            ->condition($id, $record[$id])
+            ->execute();
+        }
+        else {
+          \Drupal::database()
+            ->insert($table_name)
+            ->fields($values)
+            ->execute();
+        }
+      }
+    }
+  }
+}
diff --git a/core/modules/system/src/EntitySchemaUpdaterInterface.php b/core/modules/system/src/EntitySchemaUpdaterInterface.php
new file mode 100644
index 0000000..af6c6aa
--- /dev/null
+++ b/core/modules/system/src/EntitySchemaUpdaterInterface.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Drupal\system;
+
+use Drupal\Core\Entity\EntityTypeInterface;
+
+interface EntitySchemaUpdaterInterface {
+
+  /**
+   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
+   */
+  public function createTables(EntityTypeInterface $entity_type);
+
+  /**
+   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
+   */
+  public function installFields(EntityTypeInterface $entity_type);
+
+  /**
+   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
+   */
+  public function updateEntityType(EntityTypeInterface $entity_type);
+
+}
diff --git a/core/modules/system/src/Tests/Update/EntitySchemaUpdaterTest.php b/core/modules/system/src/Tests/Update/EntitySchemaUpdaterTest.php
new file mode 100644
index 0000000..4e73c95
--- /dev/null
+++ b/core/modules/system/src/Tests/Update/EntitySchemaUpdaterTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Drupal\system\Tests\Update;
+
+use Drupal\Core\Entity\ContentEntityInterface;
+
+/**
+ * Class EntitySchemaUpdaterTest
+ * @package Drupal\system\Tests\Update
+ * @group entity
+ */
+class EntitySchemaUpdaterTest extends UpdatePathTestBase {
+  /**
+   * @inheritDoc
+   */
+  protected function setDatabaseDumpFiles() {
+    $this->databaseDumpFiles = [__DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.bare.standard.php.gz'];
+  }
+
+  public function testMakeRevisionable() {
+    $entity_type = \Drupal::entityTypeManager()->getStorage('shortcut')->getEntityType();
+
+    /** @var ContentEntityInterface $last_installed */
+    $pre_last_installed = \Drupal::service('entity.last_installed_schema.repository')->getLastInstalledDefinition($entity_type->id());
+    $this->assertFalse($pre_last_installed->isRevisionable());
+
+    $this->runUpdates();
+
+    /** @var ContentEntityInterface $last_installed */
+    $post_last_installed = \Drupal::service('entity.last_installed_schema.repository')->getLastInstalledDefinition($entity_type->id());
+    $this->assertTrue($post_last_installed->isRevisionable());
+
+    $storage = \Drupal::entityTypeManager()->getStorage($entity_type->id());
+    $entities = $storage->loadMultiple();
+    $this->assertEqual(count($entities), 2, "Two Shortcut entities found");
+
+  }
+
+}
diff --git a/core/modules/system/system.services.yml b/core/modules/system/system.services.yml
index c70889d..739564b 100644
--- a/core/modules/system/system.services.yml
+++ b/core/modules/system/system.services.yml
@@ -43,3 +43,6 @@ services:
     arguments: ['@theme_handler', '@cache_tags.invalidator']
     tags:
       - { name: event_subscriber }
+  system.entity_schema_updater:
+    class: Drupal\system\EntitySchemaUpdater
+    arguments: []
