diff --git a/core/modules/menu_link_content/menu_link_content.install b/core/modules/menu_link_content/menu_link_content.install
index 43c75ec..8ff4e85 100644
--- a/core/modules/menu_link_content/menu_link_content.install
+++ b/core/modules/menu_link_content/menu_link_content.install
@@ -5,6 +5,8 @@
  * Install, update and uninstall functions for the menu_link_content module.
  */
 
+use Drupal\Core\Field\BaseFieldDefinition;
+
 /**
  * Implements hook_install().
  */
@@ -16,3 +18,57 @@ function menu_link_content_install() {
   //   https://www.drupal.org/node/1965074
   module_set_weight('menu_link_content', 1);
 }
+
+/**
+ * Add the revisionable metadata fields to custom menu links.
+ */
+function menu_link_content_update_8400() {
+  $definition_update_manager = \Drupal::entityDefinitionUpdateManager();
+
+  // Add the published entity key and revisionable metadata fields to the
+  // menu_link_content entity type.
+  $entity_type = $definition_update_manager->getEntityType('menu_link_content');
+
+  $entity_keys = $entity_type->getKeys();
+  $entity_keys['published'] = 'enabled';
+  $entity_type->set('entity_keys', $entity_keys);
+
+  $revision_metadata_keys = [
+    'revision_user' => 'revision_user',
+    'revision_created' => 'revision_created',
+    'revision_log_message' => 'revision_log_message'
+  ];
+  $entity_type->set('revision_metadata_keys', $revision_metadata_keys);
+
+  $definition_update_manager->updateEntityType($entity_type);
+
+  // Add the revision metadata fields.
+  $revision_created = BaseFieldDefinition::create('created')
+    ->setLabel(t('Revision create time'))
+    ->setDescription(t('The time that the current revision was created.'))
+    ->setRevisionable(TRUE);
+  $definition_update_manager->installFieldStorageDefinition('revision_created', 'menu_link_content', 'menu_link_content', $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);
+  $definition_update_manager->installFieldStorageDefinition('revision_user', 'menu_link_content', 'menu_link_content', $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,
+      ],
+    ]);
+  $definition_update_manager->installFieldStorageDefinition('revision_log_message', 'menu_link_content', 'menu_link_content', $revision_log_message);
+
+  return t('Custom menu links have been converted to revisionable.');
+}
diff --git a/core/modules/menu_link_content/menu_link_content.post_update.php b/core/modules/menu_link_content/menu_link_content.post_update.php
new file mode 100644
index 0000000..b1217ef
--- /dev/null
+++ b/core/modules/menu_link_content/menu_link_content.post_update.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @file
+ * Post update functions for the Menu link content module.
+ */
+
+use \Drupal\Core\Entity\Sql\SqlContentEntityStorageSchemaConverter;
+
+/**
+ * Update custom menu links to be revisionable.
+ */
+function menu_link_content_post_update_make_menu_link_content_revisionable(&$sandbox) {
+  $schema_converter = new SqlContentEntityStorageSchemaConverter(
+    'menu_link_content',
+    \Drupal::entityTypeManager(),
+    \Drupal::entityDefinitionUpdateManager(),
+    \Drupal::service('entity.last_installed_schema.repository'),
+    \Drupal::keyValue('entity.storage_schema.sql'),
+    \Drupal::database()
+  );
+
+  $schema_converter->convertToRevisionable(
+    $sandbox,
+    [
+      'title',
+      'description',
+      'link',
+      'external',
+      'enabled',
+      'changed',
+    ]
+  );
+}
diff --git a/core/modules/menu_link_content/src/Entity/MenuLinkContent.php b/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
index d53ba49..74621e3 100644
--- a/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
+++ b/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
@@ -2,8 +2,7 @@
 
 namespace Drupal\menu_link_content\Entity;
 
-use Drupal\Core\Entity\ContentEntityBase;
-use Drupal\Core\Entity\EntityChangedTrait;
+use Drupal\Core\Entity\EditorialContentEntityBase;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Field\BaseFieldDefinition;
@@ -31,13 +30,22 @@
  *   admin_permission = "administer menu",
  *   base_table = "menu_link_content",
  *   data_table = "menu_link_content_data",
+ *   revision_table = "menu_link_content_revision",
+ *   revision_data_table = "menu_link_content_field_revision",
  *   translatable = TRUE,
  *   entity_keys = {
  *     "id" = "id",
+ *     "revision" = "revision_id",
  *     "label" = "title",
  *     "langcode" = "langcode",
  *     "uuid" = "uuid",
- *     "bundle" = "bundle"
+ *     "bundle" = "bundle",
+ *     "published" = "enabled",
+ *   },
+ *   revision_metadata_keys = {
+ *     "revision_user" = "revision_user",
+ *     "revision_created" = "revision_created",
+ *     "revision_log_message" = "revision_log_message",
  *   },
  *   links = {
  *     "canonical" = "/admin/structure/menu/item/{menu_link_content}/edit",
@@ -46,9 +54,7 @@
  *   }
  * )
  */
-class MenuLinkContent extends ContentEntityBase implements MenuLinkContentInterface {
-
-  use EntityChangedTrait;
+class MenuLinkContent extends EditorialContentEntityBase implements MenuLinkContentInterface {
 
   /**
    * A flag for whether this entity is wrapped in a plugin instance.
@@ -255,6 +261,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setDescription(t('The text to be used for this link in the menu.'))
       ->setRequired(TRUE)
       ->setTranslatable(TRUE)
+      ->setRevisionable(TRUE)
       ->setSetting('max_length', 255)
       ->setDisplayOptions('view', [
         'label' => 'hidden',
@@ -271,6 +278,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setLabel(t('Description'))
       ->setDescription(t('Shown when hovering over the menu link.'))
       ->setTranslatable(TRUE)
+      ->setRevisionable(TRUE)
       ->setSetting('max_length', 255)
       ->setDisplayOptions('view', [
         'label' => 'hidden',
@@ -291,6 +299,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
     $fields['link'] = BaseFieldDefinition::create('link')
       ->setLabel(t('Link'))
       ->setDescription(t('The location this menu link points to.'))
+      ->setRevisionable(TRUE)
       ->setRequired(TRUE)
       ->setSettings([
         'link_type' => LinkItemInterface::LINK_GENERIC,
@@ -304,7 +313,8 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
     $fields['external'] = BaseFieldDefinition::create('boolean')
       ->setLabel(t('External'))
       ->setDescription(t('A flag to indicate if the link points to a full URL starting with a protocol, like http:// (1 = external, 0 = internal).'))
-      ->setDefaultValue(FALSE);
+      ->setDefaultValue(FALSE)
+      ->setRevisionable(TRUE);
 
     $fields['rediscover'] = BaseFieldDefinition::create('boolean')
       ->setLabel(t('Indicates whether the menu link should be rediscovered'))
@@ -338,19 +348,20 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
         'weight' => 0,
       ]);
 
-    $fields['enabled'] = BaseFieldDefinition::create('boolean')
-      ->setLabel(t('Enabled'))
-      ->setDescription(t('A flag for whether the link should be enabled in menus or hidden.'))
-      ->setDefaultValue(TRUE)
-      ->setDisplayOptions('view', [
-        'label' => 'hidden',
-        'type' => 'boolean',
-        'weight' => 0,
-      ])
-      ->setDisplayOptions('form', [
-        'settings' => ['display_label' => TRUE],
-        'weight' => -1,
-      ]);
+    // Override some properties of the published field added by
+    // \Drupal\Core\Entity\EntityPublishedTrait::publishedBaseFieldDefinitions().
+    $fields['enabled']->setLabel(t('Enabled'));
+    $fields['enabled']->setDescription(t('A flag for whether the link should be enabled in menus or hidden.'));
+    $fields['enabled']->setTranslatable(FALSE);
+    $fields['enabled']->setDisplayOptions('view', [
+      'label' => 'hidden',
+      'type' => 'boolean',
+      'weight' => 0,
+    ]);
+    $fields['enabled']->setDisplayOptions('form', [
+      'settings' => ['display_label' => TRUE],
+      'weight' => -1,
+    ]);
 
     $fields['parent'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Parent plugin ID'))
@@ -359,7 +370,8 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
     $fields['changed'] = BaseFieldDefinition::create('changed')
       ->setLabel(t('Changed'))
       ->setDescription(t('The time that the menu link was last edited.'))
-      ->setTranslatable(TRUE);
+      ->setTranslatable(TRUE)
+      ->setRevisionable(TRUE);
 
     return $fields;
   }
diff --git a/core/modules/menu_link_content/src/Tests/Update/MenuLinkContentUpdateTest.php b/core/modules/menu_link_content/src/Tests/Update/MenuLinkContentUpdateTest.php
new file mode 100644
index 0000000..922f950
--- /dev/null
+++ b/core/modules/menu_link_content/src/Tests/Update/MenuLinkContentUpdateTest.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Drupal\menu_link_content\Tests\Update;
+
+use Drupal\system\Tests\Update\UpdatePathTestBase;
+use Drupal\user\Entity\User;
+
+/**
+ * Tests the upgrade path for custom menu links.
+ *
+ * @group Update
+ */
+class MenuLinkContentUpdateTest extends UpdatePathTestBase  {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setDatabaseDumpFiles() {
+    $this->databaseDumpFiles = [
+      __DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.filled.standard.php.gz',
+    ];
+  }
+
+  /**
+   * Tests the conversion of custom menu links to be revisionable.
+   *
+   * @see menu_link_content_update_8400()
+   * @see menu_link_content_post_update_make_menu_link_content_revisionable()
+   */
+  public function testConversionToRevisionableAndPublishable() {
+    $this->runUpdates();
+
+    // Log in as user 1.
+    $account = User::load(1);
+    $account->pass_raw = 'drupal';
+    $this->drupalLogin($account);
+
+    // Make sure our custom menu link exists.
+    $this->drupalGet('admin/structure/menu/item/1/edit');
+    $this->assertFieldChecked('edit-enabled-value');
+
+    // Check that custom menu links can be created, saved and then loaded.
+    $storage = \Drupal::entityTypeManager()->getStorage('menu_link_content');
+    /** @var \Drupal\menu_link_content\Entity\MenuLinkContent $menu_link */
+    $menu_link = $storage->create([
+      'menu_name' => 'main',
+      'link' => 'route:user.page',
+      'title' => 'Pineapple'
+    ]);
+    $menu_link->save();
+
+    $storage->resetCache();
+    $menu_link = $storage->loadRevision($menu_link->getRevisionId());
+
+    $this->assertEqual('main', $menu_link->getMenuName());
+    $this->assertEqual('Pineapple', $menu_link->label());
+    $this->assertEqual('route:user.page', $menu_link->link->uri);
+    $this->assertTrue($menu_link->isPublished());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function replaceUser1() {
+    // Do not replace the user from our dump.
+  }
+
+}
diff --git a/core/modules/menu_link_content/tests/src/Kernel/MenuLinkContentDeriverTest.php b/core/modules/menu_link_content/tests/src/Kernel/MenuLinkContentDeriverTest.php
index 12d8d35..a5202f3 100644
--- a/core/modules/menu_link_content/tests/src/Kernel/MenuLinkContentDeriverTest.php
+++ b/core/modules/menu_link_content/tests/src/Kernel/MenuLinkContentDeriverTest.php
@@ -18,7 +18,7 @@ class MenuLinkContentDeriverTest extends KernelTestBase {
   /**
    * {@inheritdoc}
    */
-  public static $modules = ['menu_link_content', 'link', 'system', 'menu_link_content_dynamic_route'];
+  public static $modules = ['menu_link_content', 'link', 'system', 'menu_link_content_dynamic_route', 'user'];
 
   /**
    * {@inheritdoc}
@@ -26,6 +26,7 @@ class MenuLinkContentDeriverTest extends KernelTestBase {
   protected function setUp() {
     parent::setUp();
 
+    $this->installEntitySchema('user');
     $this->installEntitySchema('menu_link_content');
   }
 
diff --git a/core/modules/menu_link_content/tests/src/Kernel/PathAliasMenuLinkContentTest.php b/core/modules/menu_link_content/tests/src/Kernel/PathAliasMenuLinkContentTest.php
index 046deb4..fc4cfc5 100644
--- a/core/modules/menu_link_content/tests/src/Kernel/PathAliasMenuLinkContentTest.php
+++ b/core/modules/menu_link_content/tests/src/Kernel/PathAliasMenuLinkContentTest.php
@@ -18,7 +18,7 @@ class PathAliasMenuLinkContentTest extends KernelTestBase {
   /**
    * {@inheritdoc}
    */
-  public static $modules = ['menu_link_content', 'system', 'link', 'test_page_test'];
+  public static $modules = ['menu_link_content', 'system', 'link', 'test_page_test', 'user'];
 
   /**
    * {@inheritdoc}
@@ -26,6 +26,7 @@ class PathAliasMenuLinkContentTest extends KernelTestBase {
   protected function setUp() {
     parent::setUp();
 
+    $this->installEntitySchema('user');
     $this->installEntitySchema('menu_link_content');
 
     // Ensure that the weight of module_link_content is higher than system.
diff --git a/core/modules/rest/tests/src/Functional/EntityResource/MenuLinkContent/MenuLinkContentResourceTestBase.php b/core/modules/rest/tests/src/Functional/EntityResource/MenuLinkContent/MenuLinkContentResourceTestBase.php
index 0b1f967..281039c 100644
--- a/core/modules/rest/tests/src/Functional/EntityResource/MenuLinkContent/MenuLinkContentResourceTestBase.php
+++ b/core/modules/rest/tests/src/Functional/EntityResource/MenuLinkContent/MenuLinkContentResourceTestBase.php
@@ -106,6 +106,11 @@ protected function getExpectedNormalizedEntity() {
           'value' => 1,
         ],
       ],
+      'revision_id' => [
+        [
+          'value' => 1,
+        ],
+      ],
       'title' => [
         [
           'value' => 'Llama Gabilondo',
@@ -172,6 +177,11 @@ protected function getExpectedNormalizedEntity() {
         ],
       ],
       'parent' => [],
+      'revision_created' => [
+        $this->formatExpectedTimestampItemValues((int) $this->entity->getRevisionCreationTime()),
+      ],
+      'revision_user' => [],
+      'revision_log_message' => [],
     ];
   }
 
diff --git a/core/modules/simpletest/src/Tests/KernelTestBaseTest.php b/core/modules/simpletest/src/Tests/KernelTestBaseTest.php
index 1e9e75d..1964f8e 100644
--- a/core/modules/simpletest/src/Tests/KernelTestBaseTest.php
+++ b/core/modules/simpletest/src/Tests/KernelTestBaseTest.php
@@ -239,7 +239,7 @@ public function testInstallConfig() {
    */
   public function testEnableModulesFixedList() {
     // Install system module.
-    $this->container->get('module_installer')->install(['system', 'menu_link_content']);
+    $this->container->get('module_installer')->install(['system', 'user', 'menu_link_content']);
     $entity_manager = \Drupal::entityManager();
 
     // entity_test is loaded via $modules; its entity type should exist.
diff --git a/core/tests/Drupal/KernelTests/Core/Command/DbDumpTest.php b/core/tests/Drupal/KernelTests/Core/Command/DbDumpTest.php
index 8129410..e061a60 100644
--- a/core/tests/Drupal/KernelTests/Core/Command/DbDumpTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Command/DbDumpTest.php
@@ -129,6 +129,8 @@ protected function setUp() {
       'key_value_expire',
       'menu_link_content',
       'menu_link_content_data',
+      'menu_link_content_revision',
+      'menu_link_content_field_revision',
       'sequences',
       'sessions',
       'url_alias',
diff --git a/core/tests/Drupal/KernelTests/Core/Menu/MenuLinkTreeTest.php b/core/tests/Drupal/KernelTests/Core/Menu/MenuLinkTreeTest.php
index 033451ac..b0c7877 100644
--- a/core/tests/Drupal/KernelTests/Core/Menu/MenuLinkTreeTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Menu/MenuLinkTreeTest.php
@@ -41,6 +41,7 @@ class MenuLinkTreeTest extends KernelTestBase {
     'menu_link_content',
     'field',
     'link',
+    'user',
   ];
 
   /**
@@ -49,6 +50,7 @@ class MenuLinkTreeTest extends KernelTestBase {
   protected function setUp() {
     parent::setUp();
     \Drupal::service('router.builder')->rebuild();
+    $this->installEntitySchema('user');
     $this->installEntitySchema('menu_link_content');
 
     $this->linkTree = $this->container->get('menu.link_tree');
