diff --git a/core/modules/media/media.install b/core/modules/media/media.install
index 86a95188d1f72d840da3c3f3a887b76072f990cf..90f9d99cd4dae1cd527fe62153a1de5a7869268d 100644
--- a/core/modules/media/media.install
+++ b/core/modules/media/media.install
@@ -6,6 +6,7 @@
  */
 
 use Drupal\user\RoleInterface;
+use Drupal\user\Entity\Role;
 
 /**
  * Implements hook_install().
@@ -77,3 +78,45 @@ function media_requirements($phase) {
 
   return $requirements;
 }
+
+/**
+ * Introduce per-bundle permissions.
+ */
+function media_update_8500() {
+  $media_types = \Drupal::entityQuery('media_type')->execute();
+
+  /** @var \Drupal\user\RoleInterface $role */
+  foreach (Role::loadMultiple() as $role) {
+    if ($role->hasPermission('update media')) {
+      foreach ($media_types as $media_type) {
+        $role->grantPermission("edit own $media_type media");
+      }
+    }
+
+    if ($role->hasPermission('update any media')) {
+      foreach ($media_types as $media_type) {
+        $role->grantPermission("edit any $media_type media");
+      }
+    }
+
+    if ($role->hasPermission('delete media')) {
+      foreach ($media_types as $media_type) {
+        $role->grantPermission("delete own $media_type media");
+      }
+    }
+
+    if ($role->hasPermission('delete any media')) {
+      foreach ($media_types as $media_type) {
+        $role->grantPermission("delete any $media_type media");
+      }
+    }
+
+    if ($role->hasPermission('create media')) {
+      foreach ($media_types as $media_type) {
+        $role->grantPermission("create $media_type media");
+      }
+    }
+
+    $role->save();
+  }
+}
diff --git a/core/modules/media/media.permissions.yml b/core/modules/media/media.permissions.yml
index 107882cb6af277a6316f306ea00b17a4770057d3..5c5692cdea62b13568c7940b68ec4a821827f501 100644
--- a/core/modules/media/media.permissions.yml
+++ b/core/modules/media/media.permissions.yml
@@ -9,6 +9,7 @@ administer media types:
 view media:
   title: 'View media'
 
+# @todo: Deprecate some permissions in https://www.drupal.org/project/drupal/issues/2925459
 update media:
   title: 'Update own media'
 
@@ -31,3 +32,6 @@ view all media revisions:
 access media overview:
   title: 'Access media overview'
   description: 'Users with this permission can access the media overview page.'
+
+permission_callbacks:
+  - \Drupal\media\MediaPermissions::mediaTypePermissions
diff --git a/core/modules/media/src/Entity/Media.php b/core/modules/media/src/Entity/Media.php
index 406b45127bcfd94409e68c0a34e237819b378213..6e58771938840cf3d772b54f8f08b2fd66df76a3 100644
--- a/core/modules/media/src/Entity/Media.php
+++ b/core/modules/media/src/Entity/Media.php
@@ -66,7 +66,7 @@
  *     "revision_log_message" = "revision_log_message",
  *   },
  *   bundle_entity_type = "media_type",
- *   permission_granularity = "entity_type",
+ *   permission_granularity = "bundle",
  *   admin_permission = "administer media",
  *   field_ui_base_route = "entity.media_type.edit_form",
  *   common_reference_target = TRUE,
diff --git a/core/modules/media/src/MediaAccessControlHandler.php b/core/modules/media/src/MediaAccessControlHandler.php
index 434abfe7193aed91935a84f4849d7968e7675bb7..b631da8360cd4f59a82d083c96c81e83d86c1a5c 100644
--- a/core/modules/media/src/MediaAccessControlHandler.php
+++ b/core/modules/media/src/MediaAccessControlHandler.php
@@ -20,6 +20,7 @@ protected function checkAccess(EntityInterface $entity, $operation, AccountInter
       return AccessResult::allowed()->cachePerPermissions();
     }
 
+    $type = $entity->bundle();
     $is_owner = ($account->id() && $account->id() === $entity->getOwnerId());
     switch ($operation) {
       case 'view':
@@ -32,22 +33,38 @@ protected function checkAccess(EntityInterface $entity, $operation, AccountInter
         return $access_result;
 
       case 'update':
+        if ($account->hasPermission('edit any ' . $type . ' media')) {
+          return AccessResult::allowed()->cachePerPermissions();
+        }
+        if ($account->hasPermission('edit own ' . $type . ' media') && $is_owner) {
+          return AccessResult::allowed()->cachePerPermissions()->cachePerUser()->addCacheableDependency($entity);
+        }
+        // @todo Deprecate this permission in
+        // https://www.drupal.org/project/drupal/issues/2925459.
         if ($account->hasPermission('update any media')) {
           return AccessResult::allowed()->cachePerPermissions();
         }
-        return AccessResult::allowedIf($account->hasPermission('update media') && $is_owner)
-          ->cachePerPermissions()
-          ->cachePerUser()
-          ->addCacheableDependency($entity);
+        if ($account->hasPermission('update media') && $is_owner) {
+          return AccessResult::allowed()->cachePerPermissions()->cachePerUser()->addCacheableDependency($entity);
+        }
+        return AccessResult::neutral()->cachePerPermissions();
 
       case 'delete':
+        if ($account->hasPermission('delete any ' . $type . ' media')) {
+          return AccessResult::allowed()->cachePerPermissions();
+        }
+        if ($account->hasPermission('delete own ' . $type . ' media') && $is_owner) {
+          return AccessResult::allowed()->cachePerPermissions()->cachePerUser()->addCacheableDependency($entity);
+        }
+        // @todo Deprecate this permission in
+        // https://www.drupal.org/project/drupal/issues/2925459.
         if ($account->hasPermission('delete any media')) {
           return AccessResult::allowed()->cachePerPermissions();
         }
-        return AccessResult::allowedIf($account->hasPermission('delete media') && $is_owner)
-          ->cachePerPermissions()
-          ->cachePerUser()
-          ->addCacheableDependency($entity);
+        if ($account->hasPermission('delete media') && $is_owner) {
+          return AccessResult::allowed()->cachePerPermissions()->cachePerUser()->addCacheableDependency($entity);
+        }
+        return AccessResult::neutral()->cachePerPermissions();
 
       default:
         return AccessResult::neutral()->cachePerPermissions();
@@ -58,7 +75,12 @@ protected function checkAccess(EntityInterface $entity, $operation, AccountInter
    * {@inheritdoc}
    */
   protected function checkCreateAccess(AccountInterface $account, array $context, $entity_bundle = NULL) {
-    return AccessResult::allowedIfHasPermissions($account, ['administer media', 'create media'], 'OR');
+    $permissions = [
+      'administer media',
+      'create media',
+      'create ' . $entity_bundle . ' media',
+    ];
+    return AccessResult::allowedIfHasPermissions($account, $permissions, 'OR');
   }
 
 }
diff --git a/core/modules/media/src/MediaPermissions.php b/core/modules/media/src/MediaPermissions.php
new file mode 100644
index 0000000000000000000000000000000000000000..034d84ae0bde20b69ce4fd9ce890795fbbb3b778
--- /dev/null
+++ b/core/modules/media/src/MediaPermissions.php
@@ -0,0 +1,92 @@
+<?php
+
+namespace Drupal\media;
+
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides dynamic permissions for each media type.
+ */
+class MediaPermissions implements ContainerInjectionInterface {
+
+  use StringTranslationTrait;
+
+  /**
+   * The entity type manager service.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * MediaPermissions constructor.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager service.
+   */
+  public function __construct(EntityTypeManagerInterface $entity_type_manager) {
+    $this->entityTypeManager = $entity_type_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static($container->get('entity_type.manager'));
+  }
+
+  /**
+   * Returns an array of media type permissions.
+   *
+   * @return array
+   *   The media type permissions.
+   *
+   * @see \Drupal\user\PermissionHandlerInterface::getPermissions()
+   */
+  public function mediaTypePermissions() {
+    $perms = [];
+    // Generate media permissions for all media types.
+    $media_types = $this->entityTypeManager
+      ->getStorage('media_type')->loadMultiple();
+    foreach ($media_types as $type) {
+      $perms += $this->buildPermissions($type);
+    }
+    return $perms;
+  }
+
+  /**
+   * Returns a list of media permissions for a given media type.
+   *
+   * @param \Drupal\media\MediaTypeInterface $type
+   *   The media type.
+   *
+   * @return array
+   *   An associative array of permission names and descriptions.
+   */
+  protected function buildPermissions(MediaTypeInterface $type) {
+    $type_id = $type->id();
+    $type_params = ['%type_name' => $type->label()];
+
+    return [
+      "create $type_id media" => [
+        'title' => $this->t('%type_name: Create new media', $type_params),
+      ],
+      "edit own $type_id media" => [
+        'title' => $this->t('%type_name: Edit own media', $type_params),
+      ],
+      "edit any $type_id media" => [
+        'title' => $this->t('%type_name: Edit any media', $type_params),
+      ],
+      "delete own $type_id media" => [
+        'title' => $this->t('%type_name: Delete own media', $type_params),
+      ],
+      "delete any $type_id media" => [
+        'title' => $this->t('%type_name: Delete any media', $type_params),
+      ],
+    ];
+  }
+
+}
diff --git a/core/modules/media/tests/fixtures/update/drupal-8.media-enabled.php b/core/modules/media/tests/fixtures/update/drupal-8.media-enabled.php
new file mode 100644
index 0000000000000000000000000000000000000000..7c05d32e935fa268cac157dd40c5f14027c434a4
--- /dev/null
+++ b/core/modules/media/tests/fixtures/update/drupal-8.media-enabled.php
@@ -0,0 +1,756 @@
+<?php
+
+/**
+ * @file
+ * Contains database additions to drupal-8.bare.standard.php.gz for testing the
+ * upgrade paths of media module.
+ */
+
+use Drupal\Core\Database\Database;
+use Symfony\Component\Yaml\Yaml;
+
+$connection = Database::getConnection();
+
+// Set the schema version.
+$connection->merge('key_value')
+  ->fields([
+    'value' => 'i:8000;',
+    'name' => 'media',
+    'collection' => 'system.schema',
+  ])
+  ->condition('collection', 'system.schema')
+  ->condition('name', 'media')
+  ->execute();
+
+// Update core.extension.
+$extensions = $connection->select('config')
+  ->fields('config', ['data'])
+  ->condition('collection', '')
+  ->condition('name', 'core.extension')
+  ->execute()
+  ->fetchField();
+$extensions = unserialize($extensions);
+$extensions['module']['media'] = 8000;
+$connection->update('config')
+  ->fields([
+    'data' => serialize($extensions),
+    'collection' => '',
+    'name' => 'core.extension',
+  ])
+  ->condition('collection', '')
+  ->condition('name', 'core.extension')
+  ->execute();
+
+// Find media configs.
+$config_directory = new RecursiveDirectoryIterator(__DIR__ . '/../../../../media/config/install');
+
+// Find standard profile configs.
+$profile_directory = new RecursiveDirectoryIterator(__DIR__ . '/../../../../../profiles/standard/config/optional');
+$iterator = new RecursiveIteratorIterator($profile_directory);
+$regex_iterator = new RegexIterator($iterator, '/.*media\..*/i');
+
+$append_iterator = new \AppendIterator();
+$append_iterator->append($config_directory);
+$append_iterator->append($regex_iterator);
+
+// Install media configs.
+foreach ($append_iterator as $file_info) {
+  if ($file_info->getExtension() == 'yml') {
+    $config = Yaml::parse(file_get_contents($file_info->getRealPath()));
+    $connection->merge('config')
+      ->condition('name', $file_info->getBasename('.yml'))
+      ->condition('collection', '')
+      ->fields([
+        'data' => serialize($config),
+        'name' => $file_info->getBasename('.yml'),
+        'collection' => '',
+      ])
+      ->execute();
+  }
+}
+
+// Create the tables.
+$connection->schema()->createTable('media', [
+  'fields' => [
+    'mid' => [
+      'type' => 'serial',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'vid' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'bundle' => [
+      'type' => 'varchar_ascii',
+      'not null' => TRUE,
+      'length' => '32',
+    ],
+    'uuid' => [
+      'type' => 'varchar_ascii',
+      'not null' => TRUE,
+      'length' => '128',
+    ],
+    'langcode' => [
+      'type' => 'varchar_ascii',
+      'not null' => TRUE,
+      'length' => '12',
+    ],
+  ],
+  'primary key' => [
+    'mid',
+  ],
+  'unique keys' => [
+    'media_field__uuid__value' => [
+      'uuid',
+    ],
+    'media__vid' => [
+      'vid',
+    ],
+  ],
+  'indexes' => [
+    'media_field__bundle__target_id' => [
+      'bundle',
+    ],
+  ],
+  'mysql_character_set' => 'utf8mb4',
+]);
+
+$connection->schema()->createTable('media__field_media_file', [
+  'fields' => [
+    'bundle' => [
+      'type' => 'varchar_ascii',
+      'not null' => TRUE,
+      'length' => '128',
+      'default' => '',
+    ],
+    'deleted' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'tiny',
+      'default' => '0',
+    ],
+    'entity_id' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'revision_id' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'langcode' => [
+      'type' => 'varchar_ascii',
+      'not null' => TRUE,
+      'length' => '32',
+      'default' => '',
+    ],
+    'delta' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'field_media_file_target_id' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'field_media_file_display' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'tiny',
+      'default' => '1',
+      'unsigned' => TRUE,
+    ],
+    'field_media_file_description' => [
+      'type' => 'text',
+      'not null' => FALSE,
+      'size' => 'normal',
+    ],
+  ],
+  'primary key' => [
+    'entity_id',
+    'deleted',
+    'delta',
+    'langcode',
+  ],
+  'indexes' => [
+    'bundle' => [
+      'bundle',
+    ],
+    'revision_id' => [
+      'revision_id',
+    ],
+    'field_media_file_target_id' => [
+      'field_media_file_target_id',
+    ],
+  ],
+  'mysql_character_set' => 'utf8mb4',
+]);
+
+$connection->schema()->createTable('media__field_media_image', [
+  'fields' => [
+    'bundle' => [
+      'type' => 'varchar_ascii',
+      'not null' => TRUE,
+      'length' => '128',
+      'default' => '',
+    ],
+    'deleted' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'tiny',
+      'default' => '0',
+    ],
+    'entity_id' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'revision_id' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'langcode' => [
+      'type' => 'varchar_ascii',
+      'not null' => TRUE,
+      'length' => '32',
+      'default' => '',
+    ],
+    'delta' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'field_media_image_target_id' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'field_media_image_alt' => [
+      'type' => 'varchar',
+      'not null' => FALSE,
+      'length' => '512',
+    ],
+    'field_media_image_title' => [
+      'type' => 'varchar',
+      'not null' => FALSE,
+      'length' => '1024',
+    ],
+    'field_media_image_width' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'field_media_image_height' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+  ],
+  'primary key' => [
+    'entity_id',
+    'deleted',
+    'delta',
+    'langcode',
+  ],
+  'indexes' => [
+    'bundle' => [
+      'bundle',
+    ],
+    'revision_id' => [
+      'revision_id',
+    ],
+    'field_media_image_target_id' => [
+      'field_media_image_target_id',
+    ],
+  ],
+  'mysql_character_set' => 'utf8mb4',
+]);
+
+$connection->schema()->createTable('media_field_data', [
+  'fields' => [
+    'mid' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'vid' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'bundle' => [
+      'type' => 'varchar_ascii',
+      'not null' => TRUE,
+      'length' => '32',
+    ],
+    'langcode' => [
+      'type' => 'varchar_ascii',
+      'not null' => TRUE,
+      'length' => '12',
+    ],
+    'status' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'tiny',
+    ],
+    'name' => [
+      'type' => 'varchar',
+      'not null' => FALSE,
+      'length' => '255',
+    ],
+    'thumbnail__target_id' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'thumbnail__alt' => [
+      'type' => 'varchar',
+      'not null' => FALSE,
+      'length' => '512',
+    ],
+    'thumbnail__title' => [
+      'type' => 'varchar',
+      'not null' => FALSE,
+      'length' => '1024',
+    ],
+    'thumbnail__width' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'thumbnail__height' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'uid' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'created' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'normal',
+    ],
+    'changed' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'normal',
+    ],
+    'default_langcode' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'tiny',
+    ],
+    'revision_translation_affected' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'tiny',
+    ],
+  ],
+  'primary key' => [
+    'mid',
+    'langcode',
+  ],
+  'indexes' => [
+    'media__id__default_langcode__langcode' => [
+      'mid',
+      'default_langcode',
+      'langcode',
+    ],
+    'media__vid' => [
+      'vid',
+    ],
+    'media_field__bundle__target_id' => [
+      'bundle',
+    ],
+    'media_field__thumbnail__target_id' => [
+      'thumbnail__target_id',
+    ],
+    'media_field__uid__target_id' => [
+      'uid',
+    ],
+    'media__status_bundle' => [
+      'status',
+      'bundle',
+      'mid',
+    ],
+  ],
+  'mysql_character_set' => 'utf8mb4',
+]);
+
+$connection->schema()->createTable('media_field_revision', [
+  'fields' => [
+    'mid' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'vid' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'langcode' => [
+      'type' => 'varchar_ascii',
+      'not null' => TRUE,
+      'length' => '12',
+    ],
+    'status' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'tiny',
+    ],
+    'name' => [
+      'type' => 'varchar',
+      'not null' => FALSE,
+      'length' => '255',
+    ],
+    'thumbnail__target_id' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'thumbnail__alt' => [
+      'type' => 'varchar',
+      'not null' => FALSE,
+      'length' => '512',
+    ],
+    'thumbnail__title' => [
+      'type' => 'varchar',
+      'not null' => FALSE,
+      'length' => '1024',
+    ],
+    'thumbnail__width' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'thumbnail__height' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'uid' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'created' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'normal',
+    ],
+    'changed' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'normal',
+    ],
+    'default_langcode' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'tiny',
+    ],
+    'revision_translation_affected' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'tiny',
+    ],
+  ],
+  'primary key' => [
+    'vid',
+    'langcode',
+  ],
+  'indexes' => [
+    'media__id__default_langcode__langcode' => [
+      'mid',
+      'default_langcode',
+      'langcode',
+    ],
+    'media_field__thumbnail__target_id' => [
+      'thumbnail__target_id',
+    ],
+    'media_field__uid__target_id' => [
+      'uid',
+    ],
+  ],
+  'mysql_character_set' => 'utf8mb4',
+]);
+
+$connection->schema()->createTable('media_revision', [
+  'fields' => [
+    'mid' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'vid' => [
+      'type' => 'serial',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'langcode' => [
+      'type' => 'varchar_ascii',
+      'not null' => TRUE,
+      'length' => '12',
+    ],
+    'revision_user' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'revision_created' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'normal',
+    ],
+    'revision_log_message' => [
+      'type' => 'text',
+      'not null' => FALSE,
+      'size' => 'big',
+    ],
+  ],
+  'primary key' => [
+    'vid',
+  ],
+  'indexes' => [
+    'media__mid' => [
+      'mid',
+    ],
+    'media_field__revision_user__target_id' => [
+      'revision_user',
+    ],
+  ],
+  'mysql_character_set' => 'utf8mb4',
+]);
+
+$connection->schema()->createTable('media_revision__field_media_file', [
+  'fields' => [
+    'bundle' => [
+      'type' => 'varchar_ascii',
+      'not null' => TRUE,
+      'length' => '128',
+      'default' => '',
+    ],
+    'deleted' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'tiny',
+      'default' => '0',
+    ],
+    'entity_id' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'revision_id' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'langcode' => [
+      'type' => 'varchar_ascii',
+      'not null' => TRUE,
+      'length' => '32',
+      'default' => '',
+    ],
+    'delta' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'field_media_file_target_id' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'field_media_file_display' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'tiny',
+      'default' => '1',
+      'unsigned' => TRUE,
+    ],
+    'field_media_file_description' => [
+      'type' => 'text',
+      'not null' => FALSE,
+      'size' => 'normal',
+    ],
+  ],
+  'primary key' => [
+    'entity_id',
+    'revision_id',
+    'deleted',
+    'delta',
+    'langcode',
+  ],
+  'indexes' => [
+    'bundle' => [
+      'bundle',
+    ],
+    'revision_id' => [
+      'revision_id',
+    ],
+    'field_media_file_target_id' => [
+      'field_media_file_target_id',
+    ],
+  ],
+  'mysql_character_set' => 'utf8mb4',
+]);
+
+$connection->schema()->createTable('media_revision__field_media_image', [
+  'fields' => [
+    'bundle' => [
+      'type' => 'varchar_ascii',
+      'not null' => TRUE,
+      'length' => '128',
+      'default' => '',
+    ],
+    'deleted' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'tiny',
+      'default' => '0',
+    ],
+    'entity_id' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'revision_id' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'langcode' => [
+      'type' => 'varchar_ascii',
+      'not null' => TRUE,
+      'length' => '32',
+      'default' => '',
+    ],
+    'delta' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'field_media_image_target_id' => [
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'field_media_image_alt' => [
+      'type' => 'varchar',
+      'not null' => FALSE,
+      'length' => '512',
+    ],
+    'field_media_image_title' => [
+      'type' => 'varchar',
+      'not null' => FALSE,
+      'length' => '1024',
+    ],
+    'field_media_image_width' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+    'field_media_image_height' => [
+      'type' => 'int',
+      'not null' => FALSE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ],
+  ],
+  'primary key' => [
+    'entity_id',
+    'revision_id',
+    'deleted',
+    'delta',
+    'langcode',
+  ],
+  'indexes' => [
+    'bundle' => [
+      'bundle',
+    ],
+    'revision_id' => [
+      'revision_id',
+    ],
+    'field_media_image_target_id' => [
+      'field_media_image_target_id',
+    ],
+  ],
+  'mysql_character_set' => 'utf8mb4',
+]);
+
+
+// Store the entity type definitions and field storage definitions.
+$connection->merge('key_value')
+  ->condition('collection', 'entity.definitions.installed')
+  ->condition('name', 'media.entity_type')
+  ->fields([
+    'value' => 'O:36:"Drupal\Core\Entity\ContentEntityType":38:{s:25:"�*�revision_metadata_keys";a:3:{s:13:"revision_user";s:13:"revision_user";s:16:"revision_created";s:16:"revision_created";s:20:"revision_log_message";s:20:"revision_log_message";}s:15:"�*�static_cache";b:1;s:15:"�*�render_cache";b:1;s:19:"�*�persistent_cache";b:1;s:14:"�*�entity_keys";a:9:{s:2:"id";s:3:"mid";s:8:"revision";s:3:"vid";s:6:"bundle";s:6:"bundle";s:5:"label";s:4:"name";s:8:"langcode";s:8:"langcode";s:4:"uuid";s:4:"uuid";s:9:"published";s:6:"status";s:16:"default_langcode";s:16:"default_langcode";s:29:"revision_translation_affected";s:29:"revision_translation_affected";}s:5:"�*�id";s:5:"media";s:16:"�*�originalClass";s:25:"Drupal\media\Entity\Media";s:11:"�*�handlers";a:8:{s:7:"storage";s:46:"Drupal\Core\Entity\Sql\SqlContentEntityStorage";s:12:"view_builder";s:36:"Drupal\Core\Entity\EntityViewBuilder";s:12:"list_builder";s:36:"Drupal\Core\Entity\EntityListBuilder";s:6:"access";s:38:"Drupal\media\MediaAccessControlHandler";s:4:"form";a:4:{s:7:"default";s:22:"Drupal\media\MediaForm";s:3:"add";s:22:"Drupal\media\MediaForm";s:4:"edit";s:22:"Drupal\media\MediaForm";s:6:"delete";s:42:"Drupal\Core\Entity\ContentEntityDeleteForm";}s:11:"translation";s:52:"Drupal\content_translation\ContentTranslationHandler";s:10:"views_data";s:27:"Drupal\media\MediaViewsData";s:14:"route_provider";a:1:{s:4:"html";s:49:"Drupal\Core\Entity\Routing\AdminHtmlRouteProvider";}}s:19:"�*�admin_permission";s:16:"administer media";s:25:"�*�permission_granularity";s:11:"entity_type";s:8:"�*�links";a:6:{s:8:"add-page";s:10:"/media/add";s:8:"add-form";s:23:"/media/add/{media_type}";s:9:"canonical";s:14:"/media/{media}";s:11:"delete-form";s:21:"/media/{media}/delete";s:9:"edit-form";s:19:"/media/{media}/edit";s:8:"revision";s:46:"/media/{media}/revisions/{media_revision}/view";}s:17:"�*�label_callback";N;s:21:"�*�bundle_entity_type";s:10:"media_type";s:12:"�*�bundle_of";N;s:15:"�*�bundle_label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:10:"Media type";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:13:"�*�base_table";s:5:"media";s:22:"�*�revision_data_table";s:20:"media_field_revision";s:17:"�*�revision_table";s:14:"media_revision";s:13:"�*�data_table";s:16:"media_field_data";s:15:"�*�translatable";b:1;s:19:"�*�show_revision_ui";b:1;s:8:"�*�label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:5:"Media";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:19:"�*�label_collection";s:0:"";s:17:"�*�label_singular";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:10:"media item";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:15:"�*�label_plural";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:11:"media items";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:14:"�*�label_count";a:3:{s:8:"singular";s:17:"@count media item";s:6:"plural";s:18:"@count media items";s:7:"context";N;}s:15:"�*�uri_callback";N;s:8:"�*�group";s:7:"content";s:14:"�*�group_label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:7:"Content";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:1:{s:7:"context";s:17:"Entity type group";}}s:22:"�*�field_ui_base_route";s:27:"entity.media_type.edit_form";s:26:"�*�common_reference_target";b:1;s:22:"�*�list_cache_contexts";a:0:{}s:18:"�*�list_cache_tags";a:1:{i:0;s:10:"media_list";}s:14:"�*�constraints";a:1:{s:13:"EntityChanged";N;}s:13:"�*�additional";a:0:{}s:8:"�*�class";s:25:"Drupal\media\Entity\Media";s:11:"�*�provider";s:5:"media";s:20:"�*�stringTranslation";N;}',
+    'name' => 'media.entity_type',
+    'collection' => 'entity.definitions.installed',
+  ])
+  ->execute();
+
+$connection->merge('key_value')
+  ->condition('collection', 'entity.definitions.installed')
+  ->condition('name', 'media.field_storage_definitions')
+  ->fields([
+    'value' => 'a:18:{s:3:"mid";O:37:"Drupal\Core\Field\BaseFieldDefinition":5:{s:7:"�*�type";s:7:"integer";s:9:"�*�schema";a:4:{s:7:"columns";a:1:{s:5:"value";a:3:{s:4:"type";s:3:"int";s:8:"unsigned";b:1;s:4:"size";s:6:"normal";}}s:11:"unique keys";a:0:{}s:7:"indexes";a:0:{}s:12:"foreign keys";a:0:{}}s:10:"�*�indexes";a:0:{}s:17:"�*�itemDefinition";O:51:"Drupal\Core\Field\TypedData\FieldItemDataDefinition":2:{s:18:"�*�fieldDefinition";r:2;s:13:"�*�definition";a:2:{s:4:"type";s:18:"field_item:integer";s:8:"settings";a:6:{s:8:"unsigned";b:1;s:4:"size";s:6:"normal";s:3:"min";s:0:"";s:3:"max";s:0:"";s:6:"prefix";s:0:"";s:6:"suffix";s:0:"";}}}s:13:"�*�definition";a:6:{s:5:"label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:2:"ID";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:9:"read-only";b:1;s:8:"provider";s:5:"media";s:10:"field_name";s:3:"mid";s:11:"entity_type";s:5:"media";s:6:"bundle";N;}}s:4:"uuid";O:37:"Drupal\Core\Field\BaseFieldDefinition":5:{s:7:"�*�type";s:4:"uuid";s:9:"�*�schema";a:4:{s:7:"columns";a:1:{s:5:"value";a:3:{s:4:"type";s:13:"varchar_ascii";s:6:"length";i:128;s:6:"binary";b:0;}}s:11:"unique keys";a:1:{s:5:"value";a:1:{i:0;s:5:"value";}}s:7:"indexes";a:0:{}s:12:"foreign keys";a:0:{}}s:10:"�*�indexes";a:0:{}s:17:"�*�itemDefinition";O:51:"Drupal\Core\Field\TypedData\FieldItemDataDefinition":2:{s:18:"�*�fieldDefinition";r:35;s:13:"�*�definition";a:2:{s:4:"type";s:15:"field_item:uuid";s:8:"settings";a:3:{s:10:"max_length";i:128;s:8:"is_ascii";b:1;s:14:"case_sensitive";b:0;}}}s:13:"�*�definition";a:6:{s:5:"label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:4:"UUID";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:9:"read-only";b:1;s:8:"provider";s:5:"media";s:10:"field_name";s:4:"uuid";s:11:"entity_type";s:5:"media";s:6:"bundle";N;}}s:3:"vid";O:37:"Drupal\Core\Field\BaseFieldDefinition":5:{s:7:"�*�type";s:7:"integer";s:9:"�*�schema";a:4:{s:7:"columns";a:1:{s:5:"value";a:3:{s:4:"type";s:3:"int";s:8:"unsigned";b:1;s:4:"size";s:6:"normal";}}s:11:"unique keys";a:0:{}s:7:"indexes";a:0:{}s:12:"foreign keys";a:0:{}}s:10:"�*�indexes";a:0:{}s:17:"�*�itemDefinition";O:51:"Drupal\Core\Field\TypedData\FieldItemDataDefinition":2:{s:18:"�*�fieldDefinition";r:67;s:13:"�*�definition";a:2:{s:4:"type";s:18:"field_item:integer";s:8:"settings";a:6:{s:8:"unsigned";b:1;s:4:"size";s:6:"normal";s:3:"min";s:0:"";s:3:"max";s:0:"";s:6:"prefix";s:0:"";s:6:"suffix";s:0:"";}}}s:13:"�*�definition";a:6:{s:5:"label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:11:"Revision ID";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:9:"read-only";b:1;s:8:"provider";s:5:"media";s:10:"field_name";s:3:"vid";s:11:"entity_type";s:5:"media";s:6:"bundle";N;}}s:8:"langcode";O:37:"Drupal\Core\Field\BaseFieldDefinition":5:{s:7:"�*�type";s:8:"language";s:9:"�*�schema";a:4:{s:7:"columns";a:1:{s:5:"value";a:2:{s:4:"type";s:13:"varchar_ascii";s:6:"length";i:12;}}s:11:"unique keys";a:0:{}s:7:"indexes";a:0:{}s:12:"foreign keys";a:0:{}}s:10:"�*�indexes";a:0:{}s:17:"�*�itemDefinition";O:51:"Drupal\Core\Field\TypedData\FieldItemDataDefinition":2:{s:18:"�*�fieldDefinition";r:100;s:13:"�*�definition";a:2:{s:4:"type";s:19:"field_item:language";s:8:"settings";a:0:{}}}s:13:"�*�definition";a:8:{s:5:"label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:8:"Language";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:7:"display";a:2:{s:4:"view";a:1:{s:7:"options";a:1:{s:6:"region";s:6:"hidden";}}s:4:"form";a:1:{s:7:"options";a:2:{s:4:"type";s:15:"language_select";s:6:"weight";i:2;}}}s:12:"revisionable";b:1;s:12:"translatable";b:1;s:8:"provider";s:5:"media";s:10:"field_name";s:8:"langcode";s:11:"entity_type";s:5:"media";s:6:"bundle";N;}}s:6:"bundle";O:37:"Drupal\Core\Field\BaseFieldDefinition":5:{s:7:"�*�type";s:16:"entity_reference";s:9:"�*�schema";a:4:{s:7:"columns";a:1:{s:9:"target_id";a:3:{s:11:"description";s:28:"The ID of the target entity.";s:4:"type";s:13:"varchar_ascii";s:6:"length";i:32;}}s:7:"indexes";a:1:{s:9:"target_id";a:1:{i:0;s:9:"target_id";}}s:11:"unique keys";a:0:{}s:12:"foreign keys";a:0:{}}s:10:"�*�indexes";a:0:{}s:17:"�*�itemDefinition";O:51:"Drupal\Core\Field\TypedData\FieldItemDataDefinition":2:{s:18:"�*�fieldDefinition";r:135;s:13:"�*�definition";a:2:{s:4:"type";s:27:"field_item:entity_reference";s:8:"settings";a:3:{s:11:"target_type";s:10:"media_type";s:7:"handler";s:7:"default";s:16:"handler_settings";a:0:{}}}}s:13:"�*�definition";a:7:{s:5:"label";s:10:"Media type";s:8:"required";b:1;s:9:"read-only";b:1;s:8:"provider";s:5:"media";s:10:"field_name";s:6:"bundle";s:11:"entity_type";s:5:"media";s:6:"bundle";N;}}s:16:"revision_created";O:37:"Drupal\Core\Field\BaseFieldDefinition":5:{s:7:"�*�type";s:7:"created";s:9:"�*�schema";a:4:{s:7:"columns";a:1:{s:5:"value";a:1:{s:4:"type";s:3:"int";}}s:11:"unique keys";a:0:{}s:7:"indexes";a:0:{}s:12:"foreign keys";a:0:{}}s:10:"�*�indexes";a:0:{}s:17:"�*�itemDefinition";O:51:"Drupal\Core\Field\TypedData\FieldItemDataDefinition":2:{s:18:"�*�fieldDefinition";r:165;s:13:"�*�definition";a:2:{s:4:"type";s:18:"field_item:created";s:8:"settings";a:0:{}}}s:13:"�*�definition";a:7:{s:5:"label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:20:"Revision create time";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:11:"description";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:47:"The time that the current revision was created.";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:12:"revisionable";b:1;s:8:"provider";s:5:"media";s:10:"field_name";s:16:"revision_created";s:11:"entity_type";s:5:"media";s:6:"bundle";N;}}s:13:"revision_user";O:37:"Drupal\Core\Field\BaseFieldDefinition":5:{s:7:"�*�type";s:16:"entity_reference";s:9:"�*�schema";a:4:{s:7:"columns";a:1:{s:9:"target_id";a:3:{s:11:"description";s:28:"The ID of the target entity.";s:4:"type";s:3:"int";s:8:"unsigned";b:1;}}s:7:"indexes";a:1:{s:9:"target_id";a:1:{i:0;s:9:"target_id";}}s:11:"unique keys";a:0:{}s:12:"foreign keys";a:0:{}}s:10:"�*�indexes";a:0:{}s:17:"�*�itemDefinition";O:51:"Drupal\Core\Field\TypedData\FieldItemDataDefinition":2:{s:18:"�*�fieldDefinition";r:194;s:13:"�*�definition";a:2:{s:4:"type";s:27:"field_item:entity_reference";s:8:"settings";a:3:{s:11:"target_type";s:4:"user";s:7:"handler";s:7:"default";s:16:"handler_settings";a:0:{}}}}s:13:"�*�definition";a:7:{s:5:"label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:13:"Revision user";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:11:"description";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:50:"The user ID of the author of the current revision.";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:12:"revisionable";b:1;s:8:"provider";s:5:"media";s:10:"field_name";s:13:"revision_user";s:11:"entity_type";s:5:"media";s:6:"bundle";N;}}s:20:"revision_log_message";O:37:"Drupal\Core\Field\BaseFieldDefinition":5:{s:7:"�*�type";s:11:"string_long";s:9:"�*�schema";a:4:{s:7:"columns";a:1:{s:5:"value";a:2:{s:4:"type";s:4:"text";s:4:"size";s:3:"big";}}s:11:"unique keys";a:0:{}s:7:"indexes";a:0:{}s:12:"foreign keys";a:0:{}}s:10:"�*�indexes";a:0:{}s:17:"�*�itemDefinition";O:51:"Drupal\Core\Field\TypedData\FieldItemDataDefinition":2:{s:18:"�*�fieldDefinition";r:230;s:13:"�*�definition";a:2:{s:4:"type";s:22:"field_item:string_long";s:8:"settings";a:1:{s:14:"case_sensitive";b:0;}}}s:13:"�*�definition";a:9:{s:5:"label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:20:"Revision log message";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:11:"description";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:43:"Briefly describe the changes you have made.";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:12:"revisionable";b:1;s:13:"default_value";a:1:{i:0;a:1:{s:5:"value";s:0:"";}}s:7:"display";a:1:{s:4:"form";a:1:{s:7:"options";a:3:{s:4:"type";s:15:"string_textarea";s:6:"weight";i:25;s:8:"settings";a:1:{s:4:"rows";i:4;}}}}s:8:"provider";s:5:"media";s:10:"field_name";s:20:"revision_log_message";s:11:"entity_type";s:5:"media";s:6:"bundle";N;}}s:6:"status";O:37:"Drupal\Core\Field\BaseFieldDefinition":5:{s:7:"�*�type";s:7:"boolean";s:9:"�*�schema";a:4:{s:7:"columns";a:1:{s:5:"value";a:2:{s:4:"type";s:3:"int";s:4:"size";s:4:"tiny";}}s:11:"unique keys";a:0:{}s:7:"indexes";a:0:{}s:12:"foreign keys";a:0:{}}s:10:"�*�indexes";a:0:{}s:17:"�*�itemDefinition";O:51:"Drupal\Core\Field\TypedData\FieldItemDataDefinition":2:{s:18:"�*�fieldDefinition";r:271;s:13:"�*�definition";a:2:{s:4:"type";s:18:"field_item:boolean";s:8:"settings";a:2:{s:8:"on_label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:2:"On";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:9:"off_label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:3:"Off";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}}}}s:13:"�*�definition";a:9:{s:5:"label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:9:"Published";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:12:"revisionable";b:1;s:12:"translatable";b:1;s:13:"default_value";a:1:{i:0;a:1:{s:5:"value";b:1;}}s:7:"display";a:1:{s:4:"form";a:2:{s:7:"options";a:3:{s:4:"type";s:16:"boolean_checkbox";s:8:"settings";a:1:{s:13:"display_label";b:1;}s:6:"weight";i:100;}s:12:"configurable";b:1;}}s:8:"provider";s:5:"media";s:10:"field_name";s:6:"status";s:11:"entity_type";s:5:"media";s:6:"bundle";N;}}s:4:"name";O:37:"Drupal\Core\Field\BaseFieldDefinition":5:{s:7:"�*�type";s:6:"string";s:9:"�*�schema";a:4:{s:7:"columns";a:1:{s:5:"value";a:3:{s:4:"type";s:7:"varchar";s:6:"length";i:255;s:6:"binary";b:0;}}s:11:"unique keys";a:0:{}s:7:"indexes";a:0:{}s:12:"foreign keys";a:0:{}}s:10:"�*�indexes";a:0:{}s:17:"�*�itemDefinition";O:51:"Drupal\Core\Field\TypedData\FieldItemDataDefinition":2:{s:18:"�*�fieldDefinition";r:317;s:13:"�*�definition";a:2:{s:4:"type";s:17:"field_item:string";s:8:"settings";a:3:{s:10:"max_length";i:255;s:8:"is_ascii";b:0;s:14:"case_sensitive";b:0;}}}s:13:"�*�definition";a:10:{s:5:"label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:4:"Name";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:8:"required";b:1;s:12:"translatable";b:1;s:12:"revisionable";b:1;s:13:"default_value";a:1:{i:0;a:1:{s:5:"value";s:0:"";}}s:7:"display";a:2:{s:4:"form";a:2:{s:7:"options";a:2:{s:4:"type";s:16:"string_textfield";s:6:"weight";i:-5;}s:12:"configurable";b:1;}s:4:"view";a:1:{s:7:"options";a:3:{s:5:"label";s:6:"hidden";s:4:"type";s:6:"string";s:6:"weight";i:-5;}}}s:8:"provider";s:5:"media";s:10:"field_name";s:4:"name";s:11:"entity_type";s:5:"media";s:6:"bundle";N;}}s:9:"thumbnail";O:37:"Drupal\Core\Field\BaseFieldDefinition":5:{s:7:"�*�type";s:5:"image";s:9:"�*�schema";a:4:{s:7:"columns";a:5:{s:9:"target_id";a:3:{s:11:"description";s:26:"The ID of the file entity.";s:4:"type";s:3:"int";s:8:"unsigned";b:1;}s:3:"alt";a:3:{s:11:"description";s:56:"Alternative image text, for the image\'s \'alt\' attribute.";s:4:"type";s:7:"varchar";s:6:"length";i:512;}s:5:"title";a:3:{s:11:"description";s:52:"Image title text, for the image\'s \'title\' attribute.";s:4:"type";s:7:"varchar";s:6:"length";i:1024;}s:5:"width";a:3:{s:11:"description";s:33:"The width of the image in pixels.";s:4:"type";s:3:"int";s:8:"unsigned";b:1;}s:6:"height";a:3:{s:11:"description";s:34:"The height of the image in pixels.";s:4:"type";s:3:"int";s:8:"unsigned";b:1;}}s:7:"indexes";a:1:{s:9:"target_id";a:1:{i:0;s:9:"target_id";}}s:12:"foreign keys";a:1:{s:9:"target_id";a:2:{s:5:"table";s:12:"file_managed";s:7:"columns";a:1:{s:9:"target_id";s:3:"fid";}}}s:11:"unique keys";a:0:{}}s:10:"�*�indexes";a:0:{}s:17:"�*�itemDefinition";O:51:"Drupal\Core\Field\TypedData\FieldItemDataDefinition":2:{s:18:"�*�fieldDefinition";r:363;s:13:"�*�definition";a:2:{s:4:"type";s:16:"field_item:image";s:8:"settings";a:16:{s:13:"default_image";a:5:{s:4:"uuid";N;s:3:"alt";s:0:"";s:5:"title";s:0:"";s:5:"width";N;s:6:"height";N;}s:11:"target_type";s:4:"file";s:13:"display_field";b:0;s:15:"display_default";b:0;s:10:"uri_scheme";s:6:"public";s:15:"file_extensions";s:16:"png gif jpg jpeg";s:9:"alt_field";i:1;s:18:"alt_field_required";i:1;s:11:"title_field";i:0;s:20:"title_field_required";i:0;s:14:"max_resolution";s:0:"";s:14:"min_resolution";s:0:"";s:14:"file_directory";s:31:"[date:custom:Y]-[date:custom:m]";s:12:"max_filesize";s:0:"";s:7:"handler";s:7:"default";s:16:"handler_settings";a:0:{}}}}s:13:"�*�definition";a:10:{s:5:"label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:9:"Thumbnail";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:11:"description";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:32:"The thumbnail of the media item.";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:12:"revisionable";b:1;s:12:"translatable";b:1;s:7:"display";a:1:{s:4:"view";a:2:{s:7:"options";a:4:{s:4:"type";s:5:"image";s:6:"weight";i:5;s:5:"label";s:6:"hidden";s:8:"settings";a:1:{s:11:"image_style";s:9:"thumbnail";}}s:12:"configurable";b:1;}}s:9:"read-only";b:1;s:8:"provider";s:5:"media";s:10:"field_name";s:9:"thumbnail";s:11:"entity_type";s:5:"media";s:6:"bundle";N;}}s:3:"uid";O:37:"Drupal\Core\Field\BaseFieldDefinition":5:{s:7:"�*�type";s:16:"entity_reference";s:9:"�*�schema";a:4:{s:7:"columns";a:1:{s:9:"target_id";a:3:{s:11:"description";s:28:"The ID of the target entity.";s:4:"type";s:3:"int";s:8:"unsigned";b:1;}}s:7:"indexes";a:1:{s:9:"target_id";a:1:{i:0;s:9:"target_id";}}s:11:"unique keys";a:0:{}s:12:"foreign keys";a:0:{}}s:10:"�*�indexes";a:0:{}s:17:"�*�itemDefinition";O:51:"Drupal\Core\Field\TypedData\FieldItemDataDefinition":2:{s:18:"�*�fieldDefinition";r:448;s:13:"�*�definition";a:2:{s:4:"type";s:27:"field_item:entity_reference";s:8:"settings";a:3:{s:11:"target_type";s:4:"user";s:7:"handler";s:7:"default";s:16:"handler_settings";a:0:{}}}}s:13:"�*�definition";a:10:{s:5:"label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:11:"Authored by";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:11:"description";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:26:"The user ID of the author.";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:12:"revisionable";b:1;s:22:"default_value_callback";s:43:"Drupal\media\Entity\Media::getCurrentUserId";s:12:"translatable";b:1;s:7:"display";a:2:{s:4:"form";a:2:{s:7:"options";a:3:{s:4:"type";s:29:"entity_reference_autocomplete";s:6:"weight";i:5;s:8:"settings";a:4:{s:14:"match_operator";s:8:"CONTAINS";s:4:"size";s:2:"60";s:17:"autocomplete_type";s:4:"tags";s:11:"placeholder";s:0:"";}}s:12:"configurable";b:1;}s:4:"view";a:2:{s:7:"options";a:3:{s:5:"label";s:6:"hidden";s:4:"type";s:6:"author";s:6:"weight";i:0;}s:12:"configurable";b:1;}}s:8:"provider";s:5:"media";s:10:"field_name";s:3:"uid";s:11:"entity_type";s:5:"media";s:6:"bundle";N;}}s:7:"created";O:37:"Drupal\Core\Field\BaseFieldDefinition":5:{s:7:"�*�type";s:7:"created";s:9:"�*�schema";a:4:{s:7:"columns";a:1:{s:5:"value";a:1:{s:4:"type";s:3:"int";}}s:11:"unique keys";a:0:{}s:7:"indexes";a:0:{}s:12:"foreign keys";a:0:{}}s:10:"�*�indexes";a:0:{}s:17:"�*�itemDefinition";O:51:"Drupal\Core\Field\TypedData\FieldItemDataDefinition":2:{s:18:"�*�fieldDefinition";r:503;s:13:"�*�definition";a:2:{s:4:"type";s:18:"field_item:created";s:8:"settings";a:0:{}}}s:13:"�*�definition";a:10:{s:5:"label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:11:"Authored on";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:11:"description";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:36:"The time the media item was created.";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:12:"translatable";b:1;s:12:"revisionable";b:1;s:22:"default_value_callback";s:41:"Drupal\media\Entity\Media::getRequestTime";s:7:"display";a:2:{s:4:"form";a:2:{s:7:"options";a:2:{s:4:"type";s:18:"datetime_timestamp";s:6:"weight";i:10;}s:12:"configurable";b:1;}s:4:"view";a:2:{s:7:"options";a:3:{s:5:"label";s:6:"hidden";s:4:"type";s:9:"timestamp";s:6:"weight";i:0;}s:12:"configurable";b:1;}}s:8:"provider";s:5:"media";s:10:"field_name";s:7:"created";s:11:"entity_type";s:5:"media";s:6:"bundle";N;}}s:7:"changed";O:37:"Drupal\Core\Field\BaseFieldDefinition":5:{s:7:"�*�type";s:7:"changed";s:9:"�*�schema";a:4:{s:7:"columns";a:1:{s:5:"value";a:1:{s:4:"type";s:3:"int";}}s:11:"unique keys";a:0:{}s:7:"indexes";a:0:{}s:12:"foreign keys";a:0:{}}s:10:"�*�indexes";a:0:{}s:17:"�*�itemDefinition";O:51:"Drupal\Core\Field\TypedData\FieldItemDataDefinition":2:{s:18:"�*�fieldDefinition";r:546;s:13:"�*�definition";a:2:{s:4:"type";s:18:"field_item:changed";s:8:"settings";a:0:{}}}s:13:"�*�definition";a:8:{s:5:"label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:7:"Changed";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:11:"description";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:40:"The time the media item was last edited.";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:12:"translatable";b:1;s:12:"revisionable";b:1;s:8:"provider";s:5:"media";s:10:"field_name";s:7:"changed";s:11:"entity_type";s:5:"media";s:6:"bundle";N;}}s:16:"default_langcode";O:37:"Drupal\Core\Field\BaseFieldDefinition":5:{s:7:"�*�type";s:7:"boolean";s:9:"�*�schema";a:4:{s:7:"columns";a:1:{s:5:"value";a:2:{s:4:"type";s:3:"int";s:4:"size";s:4:"tiny";}}s:11:"unique keys";a:0:{}s:7:"indexes";a:0:{}s:12:"foreign keys";a:0:{}}s:10:"�*�indexes";a:0:{}s:17:"�*�itemDefinition";O:51:"Drupal\Core\Field\TypedData\FieldItemDataDefinition":2:{s:18:"�*�fieldDefinition";r:576;s:13:"�*�definition";a:2:{s:4:"type";s:18:"field_item:boolean";s:8:"settings";a:2:{s:8:"on_label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:2:"On";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:9:"off_label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:3:"Off";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}}}}s:13:"�*�definition";a:9:{s:5:"label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:19:"Default translation";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:11:"description";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:58:"A flag indicating whether this is the default translation.";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:12:"translatable";b:1;s:12:"revisionable";b:1;s:13:"default_value";a:1:{i:0;a:1:{s:5:"value";b:1;}}s:8:"provider";s:5:"media";s:10:"field_name";s:16:"default_langcode";s:11:"entity_type";s:5:"media";s:6:"bundle";N;}}s:29:"revision_translation_affected";O:37:"Drupal\Core\Field\BaseFieldDefinition":5:{s:7:"�*�type";s:7:"boolean";s:9:"�*�schema";a:4:{s:7:"columns";a:1:{s:5:"value";a:2:{s:4:"type";s:3:"int";s:4:"size";s:4:"tiny";}}s:11:"unique keys";a:0:{}s:7:"indexes";a:0:{}s:12:"foreign keys";a:0:{}}s:10:"�*�indexes";a:0:{}s:17:"�*�itemDefinition";O:51:"Drupal\Core\Field\TypedData\FieldItemDataDefinition":2:{s:18:"�*�fieldDefinition";r:618;s:13:"�*�definition";a:2:{s:4:"type";s:18:"field_item:boolean";s:8:"settings";a:2:{s:8:"on_label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:2:"On";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:9:"off_label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:3:"Off";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}}}}s:13:"�*�definition";a:9:{s:5:"label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:29:"Revision translation affected";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:11:"description";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:72:"Indicates if the last edit of a translation belongs to current revision.";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:9:"read-only";b:1;s:12:"revisionable";b:1;s:12:"translatable";b:1;s:8:"provider";s:5:"media";s:10:"field_name";s:29:"revision_translation_affected";s:11:"entity_type";s:5:"media";s:6:"bundle";N;}}s:17:"field_media_image";O:38:"Drupal\field\Entity\FieldStorageConfig":28:{s:5:"�*�id";s:23:"media.field_media_image";s:13:"�*�field_name";s:17:"field_media_image";s:14:"�*�entity_type";s:5:"media";s:7:"�*�type";s:5:"image";s:9:"�*�module";s:5:"image";s:11:"�*�settings";a:5:{s:13:"default_image";a:5:{s:4:"uuid";N;s:3:"alt";s:0:"";s:5:"title";s:0:"";s:5:"width";N;s:6:"height";N;}s:11:"target_type";s:4:"file";s:13:"display_field";b:0;s:15:"display_default";b:0;s:10:"uri_scheme";s:6:"public";}s:14:"�*�cardinality";i:1;s:15:"�*�translatable";b:1;s:9:"�*�locked";b:0;s:25:"�*�persist_with_no_fields";b:0;s:14:"custom_storage";b:0;s:10:"�*�indexes";a:0:{}s:10:"�*�deleted";b:0;s:13:"�*�originalId";s:23:"media.field_media_image";s:9:"�*�status";b:1;s:7:"�*�uuid";s:36:"75d4d2e3-85ec-43f2-8fdb-5fee698fb950";s:11:"�*�langcode";s:2:"en";s:23:"�*�third_party_settings";a:0:{}s:8:"�*�_core";a:1:{s:19:"default_config_hash";s:43:"7ZBrcl87ZXaw42v952wwcw_9cQgTBq5_5tgyUkE-VV0";}s:14:"�*�trustedData";b:1;s:15:"�*�entityTypeId";s:20:"field_storage_config";s:15:"�*�enforceIsNew";b:1;s:12:"�*�typedData";N;s:16:"�*�cacheContexts";a:0:{}s:12:"�*�cacheTags";a:0:{}s:14:"�*�cacheMaxAge";i:-1;s:14:"�*�_serviceIds";a:0:{}s:15:"�*�dependencies";a:2:{s:8:"enforced";a:1:{s:6:"module";a:1:{i:0;s:5:"media";}}s:6:"module";a:3:{i:0;s:4:"file";i:1;s:5:"image";i:2;s:5:"media";}}}s:16:"field_media_file";O:38:"Drupal\field\Entity\FieldStorageConfig":28:{s:5:"�*�id";s:22:"media.field_media_file";s:13:"�*�field_name";s:16:"field_media_file";s:14:"�*�entity_type";s:5:"media";s:7:"�*�type";s:4:"file";s:9:"�*�module";s:4:"file";s:11:"�*�settings";a:4:{s:10:"uri_scheme";s:6:"public";s:11:"target_type";s:4:"file";s:13:"display_field";b:0;s:15:"display_default";b:0;}s:14:"�*�cardinality";i:1;s:15:"�*�translatable";b:1;s:9:"�*�locked";b:0;s:25:"�*�persist_with_no_fields";b:0;s:14:"custom_storage";b:0;s:10:"�*�indexes";a:0:{}s:10:"�*�deleted";b:0;s:13:"�*�originalId";s:22:"media.field_media_file";s:9:"�*�status";b:1;s:7:"�*�uuid";s:36:"c66c117d-73ea-4a3e-a68d-58f3e368927e";s:11:"�*�langcode";s:2:"en";s:23:"�*�third_party_settings";a:0:{}s:8:"�*�_core";a:1:{s:19:"default_config_hash";s:43:"4GNilUMnj0opT050eZIkWhkfuzu69ClyEr-cHxofjQw";}s:14:"�*�trustedData";b:1;s:15:"�*�entityTypeId";s:20:"field_storage_config";s:15:"�*�enforceIsNew";b:1;s:12:"�*�typedData";N;s:16:"�*�cacheContexts";a:0:{}s:12:"�*�cacheTags";a:0:{}s:14:"�*�cacheMaxAge";i:-1;s:14:"�*�_serviceIds";a:0:{}s:15:"�*�dependencies";a:2:{s:8:"enforced";a:1:{s:6:"module";a:1:{i:0;s:5:"media";}}s:6:"module";a:2:{i:0;s:4:"file";i:1;s:5:"media";}}}}',
+    'name' => 'media.field_storage_definitions',
+    'collection' => 'entity.definitions.installed',
+  ])
+  ->execute();
+
+$connection->merge('key_value')
+  ->condition('collection', 'entity.definitions.installed')
+  ->condition('name', 'media_type.entity_type')
+  ->fields([
+    'value' => 'O:42:"Drupal\Core\Config\Entity\ConfigEntityType":41:{s:16:"�*�config_prefix";s:4:"type";s:15:"�*�static_cache";b:0;s:14:"�*�lookup_keys";a:1:{i:0;s:4:"uuid";}s:16:"�*�config_export";a:9:{i:0;s:2:"id";i:1;s:5:"label";i:2;s:11:"description";i:3;s:6:"source";i:4;s:25:"queue_thumbnail_downloads";i:5;s:12:"new_revision";i:6;s:20:"source_configuration";i:7;s:9:"field_map";i:8;s:6:"status";}s:21:"�*�mergedConfigExport";a:0:{}s:15:"�*�render_cache";b:1;s:19:"�*�persistent_cache";b:1;s:14:"�*�entity_keys";a:9:{s:2:"id";s:2:"id";s:5:"label";s:5:"label";s:6:"status";s:6:"status";s:8:"revision";s:0:"";s:6:"bundle";s:0:"";s:8:"langcode";s:8:"langcode";s:16:"default_langcode";s:16:"default_langcode";s:29:"revision_translation_affected";s:29:"revision_translation_affected";s:4:"uuid";s:4:"uuid";}s:5:"�*�id";s:10:"media_type";s:16:"�*�originalClass";s:29:"Drupal\media\Entity\MediaType";s:11:"�*�handlers";a:5:{s:4:"form";a:3:{s:3:"add";s:26:"Drupal\media\MediaTypeForm";s:4:"edit";s:26:"Drupal\media\MediaTypeForm";s:6:"delete";s:44:"Drupal\media\Form\MediaTypeDeleteConfirmForm";}s:12:"list_builder";s:33:"Drupal\media\MediaTypeListBuilder";s:14:"route_provider";a:1:{s:4:"html";s:51:"Drupal\Core\Entity\Routing\DefaultHtmlRouteProvider";}s:6:"access";s:45:"Drupal\Core\Entity\EntityAccessControlHandler";s:7:"storage";s:45:"Drupal\Core\Config\Entity\ConfigEntityStorage";}s:19:"�*�admin_permission";s:22:"administer media types";s:25:"�*�permission_granularity";s:11:"entity_type";s:8:"�*�links";a:4:{s:8:"add-form";s:26:"/admin/structure/media/add";s:9:"edit-form";s:42:"/admin/structure/media/manage/{media_type}";s:11:"delete-form";s:49:"/admin/structure/media/manage/{media_type}/delete";s:10:"collection";s:22:"/admin/structure/media";}s:17:"�*�label_callback";N;s:21:"�*�bundle_entity_type";N;s:12:"�*�bundle_of";s:5:"media";s:15:"�*�bundle_label";N;s:13:"�*�base_table";N;s:22:"�*�revision_data_table";N;s:17:"�*�revision_table";N;s:13:"�*�data_table";N;s:15:"�*�translatable";b:0;s:19:"�*�show_revision_ui";b:0;s:8:"�*�label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:10:"Media type";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:19:"�*�label_collection";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:11:"Media types";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:17:"�*�label_singular";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:10:"media type";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:15:"�*�label_plural";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:11:"media types";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:0:{}}s:14:"�*�label_count";a:3:{s:8:"singular";s:17:"@count media type";s:6:"plural";s:18:"@count media types";s:7:"context";N;}s:15:"�*�uri_callback";N;s:8:"�*�group";s:13:"configuration";s:14:"�*�group_label";O:48:"Drupal\Core\StringTranslation\TranslatableMarkup":3:{s:9:"�*�string";s:13:"Configuration";s:12:"�*�arguments";a:0:{}s:10:"�*�options";a:1:{s:7:"context";s:17:"Entity type group";}}s:22:"�*�field_ui_base_route";N;s:26:"�*�common_reference_target";b:0;s:22:"�*�list_cache_contexts";a:0:{}s:18:"�*�list_cache_tags";a:1:{i:0;s:22:"config:media_type_list";}s:14:"�*�constraints";a:0:{}s:13:"�*�additional";a:0:{}s:8:"�*�class";s:29:"Drupal\media\Entity\MediaType";s:11:"�*�provider";s:5:"media";s:20:"�*�stringTranslation";N;}',
+    'name' => 'media_type.entity_type',
+    'collection' => 'entity.definitions.installed',
+  ])
+  ->execute();
diff --git a/core/modules/media/tests/src/Functional/MediaAccessTest.php b/core/modules/media/tests/src/Functional/MediaAccessTest.php
index b7ec0f8c40c6f81d50c1d733d4dafa63692dfd2e..ef9f648f4954176632b81cabc2deee81c82554e9 100644
--- a/core/modules/media/tests/src/Functional/MediaAccessTest.php
+++ b/core/modules/media/tests/src/Functional/MediaAccessTest.php
@@ -81,43 +81,66 @@ public function testMediaAccess() {
     $this->assertSame("The 'view media' permission is required and the media item must be published.", $access_result->getReason());
     $this->grantPermissions($role, ['view media']);
     $this->drupalGet('media/' . $media->id());
-    $this->assertCacheContext('user');
+    $this->assertCacheContext('user.permissions');
+    $assert_session->statusCodeEquals(200);
+
+    // Test 'create BUNDLE media' permission.
+    $this->drupalGet('media/add/' . $media_type->id());
+    $this->assertCacheContext('user.permissions');
+    $assert_session->statusCodeEquals(403);
+    $permissions = ['create ' . $media_type->id() . ' media'];
+    $this->grantPermissions($role, $permissions);
+    $this->drupalGet('media/add/' . $media_type->id());
+    $this->assertCacheContext('user.permissions');
     $assert_session->statusCodeEquals(200);
+    user_role_revoke_permissions($role->id(), $permissions);
+    $role = Role::load(RoleInterface::AUTHENTICATED_ID);
 
     // Test 'create media' permission.
     $this->drupalGet('media/add/' . $media_type->id());
     $this->assertCacheContext('user.permissions');
     $assert_session->statusCodeEquals(403);
-    $this->grantPermissions($role, ['create media']);
+    $permissions = ['create media'];
+    $this->grantPermissions($role, $permissions);
     $this->drupalGet('media/add/' . $media_type->id());
     $this->assertCacheContext('user.permissions');
     $assert_session->statusCodeEquals(200);
+    user_role_revoke_permissions($role->id(), $permissions);
+    $role = Role::load(RoleInterface::AUTHENTICATED_ID);
 
-    // Test 'update media' and 'delete media' permissions.
+    // Test 'edit own BUNDLE media' and 'delete own BUNDLE media' permissions.
     $this->drupalGet('media/' . $user_media->id() . '/edit');
-    $this->assertCacheContext('user');
+    $this->assertCacheContext('user.permissions');
     $assert_session->statusCodeEquals(403);
     $this->drupalGet('media/' . $user_media->id() . '/delete');
-    $this->assertCacheContext('user');
+    $this->assertCacheContext('user.permissions');
     $assert_session->statusCodeEquals(403);
-    $this->grantPermissions($role, ['update media']);
-    $this->grantPermissions($role, ['delete media']);
+    $permissions = [
+      'edit own ' . $user_media->bundle() . ' media',
+      'delete own ' . $user_media->bundle() . ' media',
+    ];
+    $this->grantPermissions($role, $permissions);
     $this->drupalGet('media/' . $user_media->id() . '/edit');
     $this->assertCacheContext('user');
     $assert_session->statusCodeEquals(200);
     $this->drupalGet('media/' . $user_media->id() . '/delete');
     $this->assertCacheContext('user');
     $assert_session->statusCodeEquals(200);
+    user_role_revoke_permissions($role->id(), $permissions);
+    $role = Role::load(RoleInterface::AUTHENTICATED_ID);
 
-    // Test 'update any media' and 'delete any media' permissions.
+    // Test 'edit any BUNDLE media' and 'delete any BUNDLE media' permissions.
     $this->drupalGet('media/' . $media->id() . '/edit');
-    $this->assertCacheContext('user');
+    $this->assertCacheContext('user.permissions');
     $assert_session->statusCodeEquals(403);
     $this->drupalGet('media/' . $media->id() . '/delete');
-    $this->assertCacheContext('user');
+    $this->assertCacheContext('user.permissions');
     $assert_session->statusCodeEquals(403);
-    $this->grantPermissions($role, ['update any media']);
-    $this->grantPermissions($role, ['delete any media']);
+    $permissions = [
+      'edit any ' . $media->bundle() . ' media',
+      'delete any ' . $media->bundle() . ' media',
+    ];
+    $this->grantPermissions($role, $permissions);
     $this->drupalGet('media/' . $media->id() . '/edit');
     $this->assertCacheContext('user.permissions');
     $assert_session->statusCodeEquals(200);
diff --git a/core/modules/media/tests/src/Functional/MediaFunctionalTestTrait.php b/core/modules/media/tests/src/Functional/MediaFunctionalTestTrait.php
index 4fa7b54280f795bc35c91f3476ab19c0d7715ae7..9ce3934e7d4edbb1e900735ee2fd3a9de9564f48 100644
--- a/core/modules/media/tests/src/Functional/MediaFunctionalTestTrait.php
+++ b/core/modules/media/tests/src/Functional/MediaFunctionalTestTrait.php
@@ -20,11 +20,6 @@ trait MediaFunctionalTestTrait {
     'administer media display',
     'administer media types',
     'view media',
-    'create media',
-    'update media',
-    'update any media',
-    'delete media',
-    'delete any media',
     // Other permissions.
     'administer views',
     'access content overview',
diff --git a/core/modules/media/tests/src/Functional/Update/MediaUpdateTest.php b/core/modules/media/tests/src/Functional/Update/MediaUpdateTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..2dbe28be365074c3aed24000b3e132f3e1402277
--- /dev/null
+++ b/core/modules/media/tests/src/Functional/Update/MediaUpdateTest.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace Drupal\Tests\media\Functional\Update;
+
+use Drupal\FunctionalTests\Update\UpdatePathTestBase;
+use Drupal\user\Entity\Role;
+
+/**
+ * Tests that media settings are properly updated during database updates.
+ *
+ * @group media
+ */
+class MediaUpdateTest extends UpdatePathTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setDatabaseDumpFiles() {
+    $this->databaseDumpFiles = [
+      __DIR__ . '/../../../../../system/tests/fixtures/update/drupal-8.bare.standard.php.gz',
+      __DIR__ . '/../../../fixtures/update/drupal-8.media-enabled.php',
+    ];
+  }
+
+  /**
+   * Tests that media permissions are correctly migrated.
+   *
+   * @see media_update_8500()
+   */
+  public function testBundlePermission() {
+    $role = Role::load(Role::AUTHENTICATED_ID);
+
+    $this->grantPermissions($role, [
+      'update media',
+      'update any media',
+      'delete media',
+      'delete any media',
+      'create media',
+    ]);
+
+    $this->runUpdates();
+
+    /** @var \Drupal\user\RoleInterface $role */
+    $role = Role::load(Role::AUTHENTICATED_ID);
+
+    $media_types = \Drupal::entityQuery('media_type')->execute();
+    foreach ($media_types as $media_type) {
+      $this->assertTrue($role->hasPermission("create $media_type media"));
+      $this->assertTrue($role->hasPermission("edit own $media_type media"));
+      $this->assertTrue($role->hasPermission("edit any $media_type media"));
+      $this->assertTrue($role->hasPermission("delete own $media_type media"));
+      $this->assertTrue($role->hasPermission("delete any $media_type media"));
+    }
+  }
+
+}
diff --git a/core/modules/rest/tests/src/Functional/EntityResource/Media/MediaResourceTestBase.php b/core/modules/rest/tests/src/Functional/EntityResource/Media/MediaResourceTestBase.php
index 430b731be7438f426894880e47d433671c6675e0..414b3ebb858124450228216aa6057ed06ea1444a 100644
--- a/core/modules/rest/tests/src/Functional/EntityResource/Media/MediaResourceTestBase.php
+++ b/core/modules/rest/tests/src/Functional/EntityResource/Media/MediaResourceTestBase.php
@@ -45,17 +45,17 @@ protected function setUpAuthorization($method) {
         break;
 
       case 'POST':
-        $this->grantPermissionsToTestedRole(['create media']);
+        $this->grantPermissionsToTestedRole(['create camelids media']);
         break;
 
       case 'PATCH':
-        $this->grantPermissionsToTestedRole(['update any media']);
+        $this->grantPermissionsToTestedRole(['edit any camelids media']);
         // @todo Remove this in https://www.drupal.org/node/2824851.
         $this->grantPermissionsToTestedRole(['access content']);
         break;
 
       case 'DELETE':
-        $this->grantPermissionsToTestedRole(['delete any media']);
+        $this->grantPermissionsToTestedRole(['delete any camelids media']);
         break;
     }
   }