diff --git a/core/modules/config_translation/config_translation.links.action.yml b/core/modules/config_translation/config_translation.links.action.yml
new file mode 100644
index 0000000..241539b
--- /dev/null
+++ b/core/modules/config_translation/config_translation.links.action.yml
@@ -0,0 +1,4 @@
+config_translation.local_actions:
+  title: 'Translate'
+  deriver: 'Drupal\config_translation\Plugin\Derivative\ConfigTranslationLocalActions'
+  weight: 100
diff --git a/core/modules/config_translation/config_translation.module b/core/modules/config_translation/config_translation.module
index e22ecd8..32d4808 100644
--- a/core/modules/config_translation/config_translation.module
+++ b/core/modules/config_translation/config_translation.module
@@ -7,9 +7,12 @@

 use Drupal\Core\Url;
 use Drupal\Core\Config\Entity\ConfigEntityInterface;
+use Drupal\Core\Entity\Display\EntityDisplayInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\field\FieldConfigInterface;
+use Drupal\config_translation\ConfigTranslation\EntityDisplayMapper;
+use Drupal\config_translation\Controller\ConfigTranslationEntityDisplayListBuilder;

 /**
  * Implements hook_help().
@@ -86,6 +89,10 @@ function config_translation_entity_type_alter(array &$entity_types) {
         // Will be filled in dynamically, see \Drupal\field\Entity\FieldConfig::linkTemplates().
         $entity_type->setLinkTemplate('config-translation-overview', $entity_type->getLinkTemplate('edit-form') . '/translate');
       }
+      elseif ($entity_type->entityClassImplements(EntityDisplayInterface::class)) {
+        $class = ConfigTranslationEntityDisplayListBuilder::class;
+        // @todo Link template is not used but should be set so other logic can apply.
+      }
       else {
         $class = 'Drupal\config_translation\Controller\ConfigTranslationEntityListBuilder';
       }
@@ -118,6 +125,22 @@ function config_translation_config_translation_info(&$info) {
           'base_entity_type' => $entity_type_id,
           'weight' => 10,
         ];
+        $info[$entity_type_id . '_form_display'] = [
+          'base_route_name' => "entity.entity_form_display.{$entity_type_id}.form_mode",
+          'entity_type' => 'entity_form_display',
+          'class' => EntityDisplayMapper::class,
+          'base_entity_type' => $entity_type_id,
+          'display_context' => 'form',
+          'weight' => 10,
+        ];
+        $info[$entity_type_id . '_view_display'] = [
+          'base_route_name' => "entity.entity_view_display.{$entity_type_id}.view_mode",
+          'entity_type' => 'entity_view_display',
+          'class' => EntityDisplayMapper::class,
+          'base_entity_type' => $entity_type_id,
+          'display_context' => 'view',
+          'weight' => 10,
+        ];
       }
     }
   }
diff --git a/core/modules/config_translation/src/ConfigTranslation/EntityDisplayMapper.php b/core/modules/config_translation/src/ConfigTranslation/EntityDisplayMapper.php
new file mode 100644
index 0000000..98d75c4
--- /dev/null
+++ b/core/modules/config_translation/src/ConfigTranslation/EntityDisplayMapper.php
@@ -0,0 +1,112 @@
+<?php
+
+namespace Drupal\config_translation\ConfigTranslation;
+
+use Drupal\config_translation\ConfigEntityMapper;
+use Drupal\Core\Routing\RouteMatchInterface;
+
+/**
+ * Provides a configuration mapper for entity displays.
+ */
+class EntityDisplayMapper extends ConfigEntityMapper {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getBaseRouteParameters() {
+    $base_entity_info = $this->entityTypeManager
+      ->getDefinition($this->pluginDefinition['base_entity_type']);
+    $bundle_parameter_key = $base_entity_info
+      ->getBundleEntityType() ?: 'bundle';
+
+    $parameters = [];
+    $parameters[$bundle_parameter_key] = $this->entity->getTargetBundle();
+    $parameters[$this->pluginDefinition['display_context'] . '_mode_name'] = $this->entity->getMode();
+
+    return $parameters;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getOverviewRouteName() {
+    return "entity.{$this->entityType}.config_translation_overview.{$this->pluginDefinition['base_entity_type']}";
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTitle() {
+    $base_entity_info = $this->entityTypeManager
+      ->getDefinition($this->pluginDefinition['base_entity_type']);
+    $bundle = $base_entity_info->getLabel();
+    if ($bundle_type = $base_entity_info->getBundleEntityType()) {
+      $bundle = $this->entityTypeManager
+        ->getStorage($bundle_type)
+        ->load($this->entity->getTargetBundle())
+        ->label();
+    }
+
+    $mode = $this->entityTypeManager
+      ->getStorage("entity_{$this->pluginDefinition['display_context']}_mode")
+      ->load($this->pluginDefinition['base_entity_type'] . '.' . $this->entity->getMode());
+    $mode = $mode ? $mode->label() : $this->t('Default');
+
+    if ($this->entityType == 'entity_view_display') {
+      return $this->t('@bundle @mode display', [
+        '@bundle' => $bundle,
+        '@mode' => $mode,
+      ]);
+    }
+    elseif ($this->entityType == 'entity_form_display') {
+      return $this->t('@bundle @mode form display', [
+        '@bundle' => $bundle,
+        '@mode' => $mode,
+      ]);
+    }
+    parent::getTypeLabel();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTypeLabel() {
+    $base_entity_info = $this->entityTypeManager
+      ->getDefinition($this->pluginDefinition['base_entity_type']);
+
+    if ($this->entityType == 'entity_view_display') {
+      return $this->t('@label view display', [
+        '@label' => $base_entity_info->getLabel(),
+      ]);
+    }
+    elseif ($this->entityType == 'entity_form_display') {
+      return $this->t('@label form display', [
+        '@label' => $base_entity_info->getLabel(),
+      ]);
+    }
+    parent::getTypeLabel();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function populateFromRouteMatch(RouteMatchInterface $route_match) {
+    $bundle_entity_type = $this->entityTypeManager
+      ->getDefinition($this->pluginDefinition['base_entity_type'])
+      ->getBundleEntityType();
+    $bundle = $route_match->getParameter($bundle_entity_type ?: 'bundle') ?: $this->pluginDefinition['base_entity_type'];
+    $mode = $route_match->getParameter($this->pluginDefinition['display_context'] . '_mode_name') ?: 'default';
+
+    $entity = $this->entityTypeManager
+      ->getStorage($this->entityType)
+      ->load("{$this->pluginDefinition['base_entity_type']}.{$bundle}.{$mode}");
+
+    if ($entity) {
+      $route_match->getParameters()->set($this->entityType, $entity);
+
+      $this->setEntity($entity);
+      parent::populateFromRouteMatch($route_match);
+    }
+  }
+
+}
diff --git a/core/modules/config_translation/src/Controller/ConfigTranslationEntityDisplayListBuilder.php b/core/modules/config_translation/src/Controller/ConfigTranslationEntityDisplayListBuilder.php
new file mode 100644
index 0000000..b24e46f
--- /dev/null
+++ b/core/modules/config_translation/src/Controller/ConfigTranslationEntityDisplayListBuilder.php
@@ -0,0 +1,117 @@
+<?php
+
+namespace Drupal\config_translation\Controller;
+
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Entity\EntityStorageInterface;
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Url;
+
+/**
+ * Defines the config translation list builder for entity display entities.
+ */
+class ConfigTranslationEntityDisplayListBuilder extends ConfigTranslationFieldListBuilder {
+
+  /**
+   * Context display id.
+   *
+   * @var string
+   */
+  protected $displayContext;
+
+  /**
+   * Constructs a new ConfigTranslationEntityDisplayListBuilder object.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
+   *   The entity type definition.
+   * @param \Drupal\Core\Entity\EntityStorageInterface $storage
+   *   The entity storage class.
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager.
+   * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entity_type_bundle_info
+   *   The entity type bundle info.
+   */
+  public function __construct(EntityTypeInterface $entity_type, EntityStorageInterface $storage, EntityTypeManagerInterface $entity_type_manager, EntityTypeBundleInfoInterface $entity_type_bundle_info) {
+    parent::__construct($entity_type, $storage, $entity_type_manager, $entity_type_bundle_info);
+    // @todo There must be a better way to get this information?
+    $this->displayContext = preg_replace('/^entity_(.+)_display$/', '\1', $this->entityType->id());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function load() {
+    // It is not possible to use the standard load method, because this needs
+    // all display entities only for the given baseEntityType.
+    $ids = \Drupal::entityQuery($this->entityType->id())
+      ->condition('id', $this->baseEntityType . '.', 'STARTS_WITH')
+      ->execute();
+    return $this->storage->loadMultiple($ids);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFilterLabels() {
+    $info = parent::getFilterLabels();
+    $bundle = $this->baseEntityInfo->getBundleLabel() ?: $this->t('Bundle');
+    $bundle = mb_strtolower($bundle);
+    $info['placeholder'] = $this->t('Enter mode or @bundle', [
+      '@bundle' => $bundle,
+    ]);
+    $info['description'] = $this->t('Enter a part of the mode or @bundle to filter by.', [
+      '@bundle' => $bundle,
+    ]);
+    return $info;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildRow(EntityInterface $entity) {
+    $row = parent::buildRow($entity);
+    $row['label']['data'] = $entity->getMode() == 'default' ? $this->t('Default') : $this->entityTypeManager
+      ->getStorage('entity_' . $this->displayContext . '_mode')
+      ->load($entity->getTargetEntityTypeId() . '.' . $entity->getMode())
+      ->label();
+    return $row;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildHeader() {
+    $header = parent::buildHeader();
+    $header['label'] = $this->entityType->getLabel();
+    return $header;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getOperations(EntityInterface $entity) {
+    // Entity displays have no canonical no direct edit-form links so we
+    // hard-code the route to the translation operation.
+    // @todo Use config-translation-overview link template like field_ui does.
+    $route_parameters = [
+      $this->displayContext . '_mode_name' => $entity->getMode(),
+    ];
+
+    $bundle_type = $this->entityTypeManager
+      ->getDefinition($entity->getTargetEntityTypeId())
+      ->getBundleEntityType();
+    if ($bundle_type) {
+      $route_parameters[$bundle_type] = $entity->getTargetBundle();
+    }
+
+    $operations['translate'] = [
+      'title' => $this->t('Translate'),
+      'url' => $this->ensureDestination(Url::fromRoute("entity.{$this->entityType->id()}.config_translation_overview.{$entity->getTargetEntityTypeId()}", $route_parameters)),
+    ];
+
+    return $operations;
+  }
+
+}
diff --git a/core/modules/config_translation/src/Plugin/Derivative/ConfigTranslationLocalActions.php b/core/modules/config_translation/src/Plugin/Derivative/ConfigTranslationLocalActions.php
new file mode 100644
index 0000000..b1bde98
--- /dev/null
+++ b/core/modules/config_translation/src/Plugin/Derivative/ConfigTranslationLocalActions.php
@@ -0,0 +1,73 @@
+<?php
+
+namespace Drupal\config_translation\Plugin\Derivative;
+
+use Drupal\Component\Plugin\Derivative\DeriverBase;
+use Drupal\config_translation\ConfigMapperManagerInterface;
+use Drupal\config_translation\ConfigTranslation\EntityDisplayMapper;
+use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides dynamic local actions for config translation.
+ */
+class ConfigTranslationLocalActions extends DeriverBase implements ContainerDeriverInterface {
+
+  /**
+   * The mapper plugin discovery service.
+   *
+   * @var \Drupal\config_translation\ConfigMapperManagerInterface
+   */
+  protected $mapperManager;
+
+  /**
+   * The base plugin ID.
+   *
+   * @var string
+   */
+  protected $basePluginId;
+
+  /**
+   * Constructs a new ConfigTranslationLocalTasks.
+   *
+   * @param string $base_plugin_id
+   *   The base plugin ID.
+   * @param \Drupal\config_translation\ConfigMapperManagerInterface $mapper_manager
+   *   The mapper plugin discovery service.
+   */
+  public function __construct($base_plugin_id, ConfigMapperManagerInterface $mapper_manager) {
+    $this->basePluginId = $base_plugin_id;
+    $this->mapperManager = $mapper_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, $base_plugin_id) {
+    return new static(
+      $base_plugin_id,
+      $container->get('plugin.manager.config_translation.mapper')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDerivativeDefinitions($base_plugin_definition) {
+    // Entity display modes are already local tasks. In order to offer easy
+    // access, we use local actions instead.
+    foreach ($this->mapperManager->getMappers() as $plugin_id => $mapper) {
+      /** @var \Drupal\config_translation\ConfigMapperInterface $mapper */
+      if ($mapper instanceof EntityDisplayMapper && $base_route = $mapper->getBaseRouteName()) {
+        $this->derivatives[$plugin_id] = $base_plugin_definition;
+        $this->derivatives[$plugin_id]['route_name'] = $mapper->getOverviewRouteName();
+        $this->derivatives[$plugin_id]['appears_on'] = [
+          $base_route,
+          substr($base_route, 0, strrpos($base_route, '.')) . '.default',
+        ];
+      }
+    }
+    return parent::getDerivativeDefinitions($base_plugin_definition);
+  }
+
+}
diff --git a/core/modules/config_translation/tests/src/Functional/ConfigTranslationListUiTest.php b/core/modules/config_translation/tests/src/Functional/ConfigTranslationListUiTest.php
index edb5fc2..b315517 100644
--- a/core/modules/config_translation/tests/src/Functional/ConfigTranslationListUiTest.php
+++ b/core/modules/config_translation/tests/src/Functional/ConfigTranslationListUiTest.php
@@ -506,4 +506,20 @@ public function testTranslateOperationInListUi() {
     $this->doSettingsPageTest('admin/config/services/rss-publishing');
   }

+  /**
+   * Asserts that missing default display does not break the form display page.
+   */
+  public function testDisplayTranslation() {
+    $this->drupalLogin($this->rootUser);
+    // Setup vocabulary.
+    Vocabulary::create([
+      'vid' => 'tags',
+      'name' => 'Tags',
+    ])->save();
+    // Assert there is no default form display.
+    $this->assertNull(EntityFormDisplay::load('taxonomy_term.tags.default'));
+    $this->drupalGet('admin/structure/taxonomy/manage/tags/overview/form-display');
+    $this->assertSession()->statusCodeEquals(200);
+  }
+
 }
