diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
index ef9d24f493..94478e808a 100644
--- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
+++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
@@ -810,6 +810,13 @@ public function save(EntityInterface $entity) {
    * {@inheritdoc}
    */
   public function countDefaultLanguageRevisions(EntityInterface $entity) {
+    $entity_type_label = $this->entityType->getLabel();
+    if (!$this->entityType->isRevisionable()) {
+      throw new EntityStorageException("Unable to count revisions for default language. Entity type $entity_type_label is not revisionable.");
+    }
+    if (!$this->entityType->isTranslatable()) {
+      throw new EntityStorageException("Unable to count revisions for default language. Entity type $entity_type_label is not translatable.");
+    }
     $query = $this->database->select($this->revisionDataTable);
     $query->addExpression('COUNT(*)');
     $query->condition($this->idKey, $entity->id());
diff --git a/core/modules/media/media.routing.yml b/core/modules/media/media.routing.yml
index c87fcad9ea..49461289c7 100644
--- a/core/modules/media/media.routing.yml
+++ b/core/modules/media/media.routing.yml
@@ -8,8 +8,13 @@ entity.media.multiple_delete_confirm:
 entity.media.revision:
   path: '/media/{media}/revisions/{media_revision}/view'
   defaults:
-    _controller: '\Drupal\media\Controller\MediaController::revisionShow'
-    _title_callback: '\Drupal\media\Controller\MediaController::revisionPageTitle'
+    _controller: '\Drupal\Core\Entity\Controller\EntityViewController::viewRevision'
+  options:
+    parameters:
+      media:
+        type: entity:media
+      media_revision:
+        type: entity_revision:media
   requirements:
     _access_media_revision: 'view'
     media: \d+
diff --git a/core/modules/media/src/Access/MediaRevisionAccessCheck.php b/core/modules/media/src/Access/MediaRevisionAccessCheck.php
index 9ccae7c6cd..f50015b73d 100644
--- a/core/modules/media/src/Access/MediaRevisionAccessCheck.php
+++ b/core/modules/media/src/Access/MediaRevisionAccessCheck.php
@@ -90,11 +90,7 @@ public function access(Route $route, AccountInterface $account, $media_revision
    *   TRUE if the operation may be performed, FALSE otherwise.
    */
   public function checkAccess(MediaInterface $media, AccountInterface $account, $op = 'view') {
-    $map = [
-      'view' => 'view all media revisions',
-    ];
-
-    if (!$media || !isset($map[$op])) {
+    if (!$media || $op !== 'view') {
       // If there was no media to check against, or the $op was not one of the
       // supported ones, we return access denied.
       return FALSE;
@@ -107,15 +103,15 @@ public function checkAccess(MediaInterface $media, AccountInterface $account, $o
 
     if (!isset($this->access[$cid])) {
       // Perform basic permission checks first.
-      if (!$account->hasPermission($map[$op]) && !$account->hasPermission('administer media')) {
+      if (!$account->hasPermission('view all media revisions') && !$account->hasPermission('administer media')) {
         $this->access[$cid] = FALSE;
         return FALSE;
       }
 
-      // There should be at least two revisions. If the vid of the given media
-      // item and the vid of the default revision differ, then we already have
-      // two different revisions so there is no need for a separate database
-      // check.
+      // There should be at least two revisions. If the revision ID of the
+      // given media item and the revision ID of the default revision differ,
+      // then we already have two different revisions so there is no need for a
+      // separate database check.
       if ($media->isDefaultRevision() && ($this->mediaStorage->countDefaultLanguageRevisions($media) == 1)) {
         $this->access[$cid] = FALSE;
       }
diff --git a/core/modules/media/src/Controller/MediaController.php b/core/modules/media/src/Controller/MediaController.php
deleted file mode 100644
index 7d500ffce0..0000000000
--- a/core/modules/media/src/Controller/MediaController.php
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-
-namespace Drupal\media\Controller;
-
-use Drupal\Core\Controller\ControllerBase;
-use Drupal\Core\Datetime\DateFormatterInterface;
-use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
-use Drupal\Core\Entity\Controller\EntityViewController;
-use Drupal\Core\Entity\EntityManagerInterface;
-use Drupal\Core\Render\RendererInterface;
-use Symfony\Component\DependencyInjection\ContainerInterface;
-
-/**
- * Returns responses for media routes.
- */
-class MediaController extends ControllerBase implements ContainerInjectionInterface {
-
-  /**
-   * The entity manager.
-   *
-   * @var \Drupal\Core\Entity\EntityManagerInterface
-   */
-  protected $entityManager;
-
-  /**
-   * The date formatter service.
-   *
-   * @var \Drupal\Core\Datetime\DateFormatterInterface
-   */
-  protected $dateFormatter;
-
-  /**
-   * The renderer service.
-   *
-   * @var \Drupal\Core\Render\RendererInterface
-   */
-  protected $renderer;
-
-  /**
-   * Constructs a MediaController object.
-   *
-   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
-   *   The entity manager.
-   * @param \Drupal\Core\Datetime\DateFormatterInterface $date_formatter
-   *   The date formatter service.
-   * @param \Drupal\Core\Render\RendererInterface $renderer
-   *   The renderer service.
-   */
-  public function __construct(EntityManagerInterface $entity_manager, DateFormatterInterface $date_formatter, RendererInterface $renderer) {
-    $this->entityManager = $entity_manager;
-    $this->dateFormatter = $date_formatter;
-    $this->renderer = $renderer;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container) {
-    return new static(
-      $container->get('entity.manager'),
-      $container->get('date.formatter'),
-      $container->get('renderer')
-    );
-  }
-
-  /**
-   * Displays a media item revision.
-   *
-   * @param int $media_revision
-   *   The media item revision ID.
-   *
-   * @return array
-   *   An array suitable for drupal_render().
-   */
-  public function revisionShow($media_revision) {
-    $media = $this->entityManager->getStorage('media')->loadRevision($media_revision);
-    $media = $this->entityManager->getTranslationFromContext($media);
-    $media_view_controller = new EntityViewController($this->entityManager, $this->renderer);
-    $page = $media_view_controller->view($media);
-    unset($page['media'][$media->id()]['#cache']);
-    return $page;
-  }
-
-  /**
-   * Page title callback for a media revision.
-   *
-   * @param int $media_revision
-   *   The media revision ID.
-   *
-   * @return string
-   *   The page title.
-   */
-  public function revisionPageTitle($media_revision) {
-    $media = $this->entityTypeManager->getStorage('media')->loadRevision($media_revision);
-    return $this->t('Revision of %title from %date', ['%title' => $media->label(), '%date' => $this->dateFormatter->format($media->getRevisionCreationTime())]);
-  }
-
-}
