diff --git a/core/modules/field/field.module b/core/modules/field/field.module
index 14340b8bf0..18458a8979 100644
--- a/core/modules/field/field.module
+++ b/core/modules/field/field.module
@@ -334,6 +334,23 @@ function field_form_config_admin_import_form_alter(&$form, FormStateInterface $f
   }
 }
 
+/**
+ * Implements hook_ENTITY_TYPE_insert() for 'field_config'.
+ */
+function field_field_config_insert(FieldConfigInterface $field) {
+  if ($field->isSyncing()) {
+    // Don't change anything during a configuration sync.
+    return;
+  }
+
+  // Allow other view modes to update their configuration for the new field.
+  // Otherwise, configuration for view modes won't get updated until the mode
+  // is used for the first time, creating noise in config diffs.
+  /** @var \Drupal\field\EntityDisplayRebuilder $display_rebuilder */
+  $display_rebuilder = \Drupal::service('field.entity_display_rebuilder');
+  $display_rebuilder->rebuildEntityTypeDisplays($field->getTargetEntityTypeId());
+}
+
 /**
  * Implements hook_ENTITY_TYPE_update() for 'field_storage_config'.
  *
diff --git a/core/modules/field/field.services.yml b/core/modules/field/field.services.yml
index 321cf916cf..3ca8cfabe3 100644
--- a/core/modules/field/field.services.yml
+++ b/core/modules/field/field.services.yml
@@ -5,3 +5,6 @@ services:
       - { name: module_install.uninstall_validator }
     arguments: ['@entity_type.manager', '@string_translation', '@plugin.manager.field.field_type']
     lazy: true
+  field.entity_display_rebuilder:
+    class: Drupal\field\EntityDisplayRebuilder
+    arguments: ['@entity_type.manager', '@entity_display.repository', '@entity_type.bundle.info']
diff --git a/core/modules/field/src/EntityDisplayRebuilder.php b/core/modules/field/src/EntityDisplayRebuilder.php
new file mode 100644
index 0000000000..02bba49c5a
--- /dev/null
+++ b/core/modules/field/src/EntityDisplayRebuilder.php
@@ -0,0 +1,86 @@
+<?php
+
+namespace Drupal\field;
+
+use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
+use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+
+/**
+ * Rebuilds displays.
+ */
+class EntityDisplayRebuilder {
+
+  /**
+   * The field storage config storage.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManager
+   */
+  protected $entityTypeManager;
+
+  /**
+   * The display repository.
+   *
+   * @var \Drupal\Core\Entity\EntityDisplayRepository
+   */
+  protected $entityDisplayRepository;
+
+  /**
+   * The entity type bundle info.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface
+   */
+  protected $entityTypeBundleInfo;
+
+  /**
+   * Constructs a new EntityDisplayRebuilder.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity manager.
+   * @param \Drupal\Core\Entity\EntityDisplayRepositoryInterface $entity_display_repository
+   *   The entity display repository.
+   * @param \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entity_type_bundle_info
+   *   The entity type bundle info.
+   */
+  public function __construct(EntityTypeManagerInterface $entity_type_manager, EntityDisplayRepositoryInterface $entity_display_repository, EntityTypeBundleInfoInterface $entity_type_bundle_info) {
+    $this->entityTypeManager = $entity_type_manager;
+    $this->entityDisplayRepository = $entity_display_repository;
+    $this->entityTypeBundleInfo = $entity_type_bundle_info;
+  }
+
+  /**
+   * Rebuild displays for single Entity Type.
+   *
+   * @param string $entity_type_id
+   *   The entity type machine name.
+   *
+   * @throws \Drupal\Core\Entity\EntityStorageException
+   *   In case of failures an exception is thrown.
+   */
+  public function rebuildEntityTypeDisplays($entity_type_id) {
+
+    // Get the displays.
+    $view_modes = $this->entityDisplayRepository->getViewModeOptions($entity_type_id);
+    $form_modes = $this->entityDisplayRepository->getFormModeOptions($entity_type_id);
+
+    // Loop through all bundles and save all displays.
+    $entity_bundles = $this->entityTypeBundleInfo->getBundleInfo($entity_type_id);
+    foreach ($entity_bundles as $bundle => $bundle_definition) {
+      // Save view mode displays.
+      $view_mode_ids = array_map(function ($view_mode) use ($entity_type_id, $bundle) {
+        return "$entity_type_id.$bundle.$view_mode";
+      }, array_keys($view_modes));
+      foreach ($this->entityTypeManager->getStorage('entity_view_display')->loadMultiple($view_mode_ids) as $display) {
+        $display->save();
+      }
+      // Save form mode displays.
+      $form_mode_ids = array_map(function ($form_mode) use ($entity_type_id, $bundle) {
+        return "$entity_type_id.$bundle.$form_mode";
+      }, array_keys($form_modes));
+      foreach ($this->entityTypeManager->getStorage('entity_form_display')->loadMultiple($form_mode_ids) as $display) {
+        $display->save();
+      }
+    }
+  }
+
+}
diff --git a/core/modules/field/src/Tests/FieldImportDeleteUninstallUiTest.php b/core/modules/field/src/Tests/FieldImportDeleteUninstallUiTest.php
index e35308603f..f669eef087 100644
--- a/core/modules/field/src/Tests/FieldImportDeleteUninstallUiTest.php
+++ b/core/modules/field/src/Tests/FieldImportDeleteUninstallUiTest.php
@@ -86,9 +86,10 @@ public function testImportDeleteUninstall() {
     unset($core_extension['module']['telephone']);
     $sync->write('core.extension', $core_extension);
 
-    // Stage the field deletion
+    // Stage the field deletion including its dependencies.
     $sync->delete('field.storage.entity_test.field_tel');
     $sync->delete('field.field.entity_test.entity_test.field_tel');
+    $sync->delete('core.entity_form_display.entity_test.entity_test.default');
     $this->drupalGet('admin/config/development/configuration');
     // Test that the message for one field being purged during a configuration
     // synchronization is correct.
diff --git a/core/modules/field/src/Tests/FormTest.php b/core/modules/field/src/Tests/FormTest.php
index 326cfe23b8..abe35d66fd 100644
--- a/core/modules/field/src/Tests/FormTest.php
+++ b/core/modules/field/src/Tests/FormTest.php
@@ -689,6 +689,10 @@ protected function widgetAlterTest($hook, $widget) {
       ])
       ->save();
 
+    // We need to rebuild hook information after setting the component through
+    // the API.
+    $this->rebuildAll();
+
     $this->drupalGet('entity_test/add');
     $this->assertUniqueText("From $hook(): prefix on $field_name parent element.");
     if ($widget === 'test_field_widget_multiple_single_value') {
diff --git a/core/modules/field/tests/src/Kernel/DisplayModeUpdateTest.php b/core/modules/field/tests/src/Kernel/DisplayModeUpdateTest.php
new file mode 100644
index 0000000000..9587621df2
--- /dev/null
+++ b/core/modules/field/tests/src/Kernel/DisplayModeUpdateTest.php
@@ -0,0 +1,115 @@
+<?php
+
+namespace Drupal\Tests\field\Kernel;
+
+use Drupal\Core\Entity\Entity\EntityFormDisplay;
+use Drupal\Core\Entity\Entity\EntityFormMode;
+use Drupal\Core\Entity\Entity\EntityViewDisplay;
+use Drupal\Core\Entity\Entity\EntityViewMode;
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+
+/**
+ * Tests exposing field definitions for configurable fields.
+ *
+ * @group field
+ */
+class DisplayModeUpdateTest extends FieldKernelTestBase {
+
+  protected $defaultViewDisplayName;
+  protected $defaultFormDisplayName;
+  protected $foobarViewDisplayName;
+  protected $foobarFormDisplayName;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    // Create 'default' view-display.
+    $default_view_display = EntityViewDisplay::create([
+      'targetEntityType' => 'entity_test',
+      'bundle' => 'entity_test',
+      'mode' => 'default',
+      'status' => TRUE,
+    ]);
+    $default_view_display->save();
+    $this->defaultViewDisplayName = $default_view_display->getConfigDependencyName();
+
+    // Create 'default' form-display.
+    $default_form_display = EntityFormDisplay::create([
+      'targetEntityType' => 'entity_test',
+      'bundle' => 'entity_test',
+      'mode' => 'default',
+      'status' => TRUE,
+    ]);
+    $default_form_display->save();
+    $this->defaultFormDisplayName = $default_form_display->getConfigDependencyName();
+
+    // Create a view-mode 'foobar', create view-display that uses it.
+    EntityViewMode::create([
+      'id' => 'entity_test.foobar',
+      'targetEntityType' => 'entity_test',
+      'status' => TRUE,
+      'enabled' => TRUE,
+    ])->save();
+    $foobar_view_display = EntityViewDisplay::create([
+      'targetEntityType' => 'entity_test',
+      'bundle' => 'entity_test',
+      'mode' => 'foobar',
+      'status' => TRUE,
+    ]);
+    $foobar_view_display->save();
+    $this->foobarViewDisplayName = $foobar_view_display->getConfigDependencyName();
+
+    // Create a new form-mode 'foobar', create form-display that uses it.
+    EntityFormMode::create([
+      'id' => 'entity_test.foobar',
+      'targetEntityType' => 'entity_test',
+      'status' => TRUE,
+      'enabled' => TRUE,
+    ])->save();
+    $foobar_form_display = EntityFormDisplay::create([
+      'targetEntityType' => 'entity_test',
+      'bundle' => 'entity_test',
+      'mode' => 'foobar',
+      'status' => TRUE,
+    ]);
+    $foobar_form_display->save();
+    $this->foobarFormDisplayName = $foobar_form_display->getConfigDependencyName();
+  }
+
+  /**
+   * Ensure display modes are updated when fields are created.
+   */
+  public function testDisplayModeUpdateAfterFieldCreation() {
+
+    // Sanity test: field has not been created yet, so should not exist in display.
+    $this->assertArrayNotHasKey('field_test', \Drupal::config($this->defaultViewDisplayName)->get('hidden'));
+    $this->assertArrayNotHasKey('field_test', \Drupal::config($this->defaultFormDisplayName)->get('hidden'));
+    $this->assertArrayNotHasKey('field_test', \Drupal::config($this->foobarViewDisplayName)->get('hidden'));
+    $this->assertArrayNotHasKey('field_test', \Drupal::config($this->foobarFormDisplayName)->get('hidden'));
+
+    $field_storage = FieldStorageConfig::create([
+      'field_name' => 'field_test',
+      'entity_type' => 'entity_test',
+      'type' => 'test_field',
+      'cardinality' => 1,
+    ]);
+    $field_storage->save();
+
+    FieldConfig::create([
+      'field_storage' => $field_storage,
+      'bundle' => 'entity_test',
+    ])->save();
+
+    // Ensure field is added to display modes.
+    $this->assertArrayHasKey('field_test', \Drupal::config($this->defaultViewDisplayName)->get('hidden'));
+    $this->assertArrayHasKey('field_test', \Drupal::config($this->defaultFormDisplayName)->get('hidden'));
+    $this->assertArrayHasKey('field_test', \Drupal::config($this->foobarViewDisplayName)->get('hidden'));
+    $this->assertArrayHasKey('field_test', \Drupal::config($this->foobarFormDisplayName)->get('hidden'));
+
+  }
+
+}
diff --git a/core/modules/system/tests/modules/entity_test/entity_test.module b/core/modules/system/tests/modules/entity_test/entity_test.module
index 8b4f2ba827..a3af69fafe 100644
--- a/core/modules/system/tests/modules/entity_test/entity_test.module
+++ b/core/modules/system/tests/modules/entity_test/entity_test.module
@@ -273,11 +273,9 @@ function entity_test_entity_form_mode_info_alter(&$form_modes) {
   $entity_info = \Drupal::entityManager()->getDefinitions();
   foreach ($entity_info as $entity_type => $info) {
     if ($entity_info[$entity_type]->getProvider() == 'entity_test') {
-      $form_modes[$entity_type] = [
-        'compact' => [
-          'label' => t('Compact version'),
-          'status' => TRUE,
-        ],
+      $form_modes[$entity_type]['compact'] = [
+        'label' => t('Compact version'),
+        'status' => TRUE,
       ];
     }
   }
