diff --git a/entity.links.task.yml b/entity.links.task.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8116ae3260ec83c3d5b0eed9df15d359e614ec9d
--- /dev/null
+++ b/entity.links.task.yml
@@ -0,0 +1,3 @@
+entity.revisions_overview:
+  deriver: 'Drupal\entity\Plugin\Derivative\RevisionsOverviewDeriver'
+  weight: 100
diff --git a/src/Plugin/Derivative/RevisionsOverviewDeriver.php b/src/Plugin/Derivative/RevisionsOverviewDeriver.php
new file mode 100644
index 0000000000000000000000000000000000000000..b7e308bfc2f0e17e72709499f9feb2cfe51cd285
--- /dev/null
+++ b/src/Plugin/Derivative/RevisionsOverviewDeriver.php
@@ -0,0 +1,72 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\entity\Plugin\Derivative\RevisionsOverviewDeriver.
+ */
+
+namespace Drupal\entity\Plugin\Derivative;
+
+use Drupal\Component\Plugin\Derivative\DeriverBase;
+use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides local tasks for the revision overview.
+ */
+class RevisionsOverviewDeriver extends DeriverBase implements ContainerDeriverInterface {
+
+  /**
+   * The entity type manager.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * Creates a new RevisionsOverviewDeriver instance.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
+   *   The entity type manager.
+   */
+  public function __construct(\Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager) {
+    $this->entityTypeManager = $entityTypeManager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, $base_plugin_id) {
+    return new static(
+      $container->get('entity_type.manager')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDerivativeDefinitions($base_plugin_definition) {
+    $exclude = ['node'];
+
+    $this->derivatives = [];
+    foreach ($this->entityTypeManager->getDefinitions() as $entity_type_id => $entity_type) {
+      if (in_array($entity_type_id, $exclude)) {
+        continue;
+      }
+
+      if (!$entity_type->hasLinkTemplate('version-history')) {
+        continue;
+      }
+
+      $this->derivatives[$entity_type_id] = [
+        'route_name' => "entity.$entity_type_id.version_history",
+        'title' => 'Revisions',
+        'base_route' => "entity.$entity_type_id.edit_form",
+        'weight' => 20,
+      ] + $base_plugin_definition;
+    }
+
+    return parent::getDerivativeDefinitions($base_plugin_definition);
+  }
+
+}
diff --git a/tests/Kernel/RevisionOverviewIntegrationTest.php b/tests/Kernel/RevisionOverviewIntegrationTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..7ab784d8225594e82e9c1379801e9a6cdf67b39b
--- /dev/null
+++ b/tests/Kernel/RevisionOverviewIntegrationTest.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\entity\Kernel\RevisionOverviewIntegrationTest.
+ */
+
+namespace Drupal\Tests\entity\Kernel;
+
+use Drupal\KernelTests\KernelTestBase;
+use Symfony\Component\Routing\Route;
+
+/**
+ * Tests some integration of the revision overview:
+ *
+ * - Are the routes added properly.
+ * - Are the local tasks added properly.
+ */
+class RevisionOverviewIntegrationTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['node', 'entity_module_test', 'entity', 'user', 'system'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installSchema('system', 'router');
+
+    \Drupal::service('router.builder')->rebuild();
+  }
+
+  public function testIntegration() {
+    /** @var \Drupal\Core\Menu\LocalTaskManagerInterface $local_tasks_manager */
+    $local_tasks_manager = \Drupal::service('plugin.manager.menu.local_task');
+
+    $tasks = $local_tasks_manager->getDefinitions();
+    $this->assertArrayHasKey('entity.revisions_overview:entity_test_enhanced', $tasks);
+    $this->assertArrayNotHasKey('entity.revisions_overview:node', $tasks, 'Node should have been excluded because it provides their own');
+
+    $this->assertEquals('entity.entity_test_enhanced.version_history', $tasks['entity.revisions_overview:entity_test_enhanced']['route_name']);
+    $this->assertEquals('entity.entity_test_enhanced.edit_form', $tasks['entity.revisions_overview:entity_test_enhanced']['base_route']);
+
+    /** @var \Drupal\Core\Routing\RouteProviderInterface $route_provider */
+    $route_provider = \Drupal::service('router.route_provider');
+
+    $route = $route_provider->getRouteByName('entity.entity_test_enhanced.version_history');
+    $this->assertInstanceOf(Route::class, $route);
+    $this->assertEquals('\Drupal\entity\Controller\RevisionOverviewController::revisionOverviewController', $route->getDefault('_controller'));
+  }
+
+}