diff --git a/core/modules/field_ui/src/FieldConfigListBuilder.php b/core/modules/field_ui/src/FieldConfigListBuilder.php
index cb720c3..dee7069 100644
--- a/core/modules/field_ui/src/FieldConfigListBuilder.php
+++ b/core/modules/field_ui/src/FieldConfigListBuilder.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Url;
 use Drupal\field\FieldConfigInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\Component\Serialization\Json;
 
 /**
  * Provides lists of field config entities.
@@ -77,6 +78,10 @@ public function render($target_entity_type_id = NULL, $target_bundle = NULL) {
     $this->targetBundle = $target_bundle;
 
     $build = parent::render();
+
+    // Add the AJAX library to the form for dialog support.
+    $build['#attached']['library'][] = 'core/drupal.dialog.ajax';
+
     $build['table']['#attributes']['id'] = 'field-overview';
     $build['table']['#empty'] = $this->t('No fields are present yet.');
 
@@ -132,7 +137,16 @@ public function buildRow(EntityInterface $field_config) {
             '#type' => 'link',
             '#title' => $this->fieldTypeManager->getDefinitions()[$field_storage->getType()]['label'],
             '#url' => Url::fromRoute("entity.field_config.{$this->targetEntityTypeId}_storage_edit_form", $route_parameters),
-            '#options' => ['attributes' => ['title' => $this->t('Edit field settings.')]],
+            '#options' => [
+              'attributes' => [
+                'title' => $this->t('Edit field settings.'),
+                'class' => ['use-ajax'],
+                'data-dialog-type' => 'modal',
+                'data-dialog-options' => Json::encode([
+                  'width' => 700,
+                ]),
+              ],
+            ],
           ],
         ],
       ],
@@ -162,7 +176,12 @@ public function getDefaultOperations(EntityInterface $entity) {
         'weight' => 10,
         'url' => $entity->urlInfo("{$entity->getTargetEntityTypeId()}-field-edit-form"),
         'attributes' => [
-          'title' => $this->t('Edit field settings.')
+          'title' => $this->t('Edit field settings.'),
+          'class' => ['use-ajax'],
+          'data-dialog-type' => 'modal',
+          'data-dialog-options' => Json::encode([
+            'width' => 700,
+          ]),
         ],
       ];
     }
@@ -172,7 +191,12 @@ public function getDefaultOperations(EntityInterface $entity) {
         'weight' => 100,
         'url' => $entity->urlInfo("{$entity->getTargetEntityTypeId()}-field-delete-form"),
         'attributes' => [
-          'title' => $this->t('Delete field.')
+          'title' => $this->t('Delete field.'),
+          'class' => ['use-ajax'],
+          'data-dialog-type' => 'modal',
+          'data-dialog-options' => Json::encode([
+            'width' => 700,
+          ]),
         ],
       ];
     }
@@ -180,7 +204,14 @@ public function getDefaultOperations(EntityInterface $entity) {
     $operations['storage-settings'] = [
       'title' => $this->t('Storage settings'),
       'weight' => 20,
-      'attributes' => ['title' => $this->t('Edit storage settings.')],
+      'attributes' => [
+        'title' => $this->t('Edit storage settings.'),
+        'class' => ['use-ajax'],
+        'data-dialog-type' => 'modal',
+        'data-dialog-options' => Json::encode([
+          'width' => 700,
+        ]),
+      ],
       'url' => $entity->urlInfo("{$entity->getTargetEntityTypeId()}-storage-edit-form"),
     ];
 
diff --git a/core/modules/field_ui/tests/src/FunctionalJavascript/FieldConfigListBuilderTest.php b/core/modules/field_ui/tests/src/FunctionalJavascript/FieldConfigListBuilderTest.php
new file mode 100644
index 0000000..30160f0
--- /dev/null
+++ b/core/modules/field_ui/tests/src/FunctionalJavascript/FieldConfigListBuilderTest.php
@@ -0,0 +1,72 @@
+<?php
+
+namespace Drupal\Tests\field_ui\FunctionalJavascript;
+
+use Drupal\field\Entity\FieldConfig;
+use Drupal\FunctionalJavascriptTests\JavascriptTestBase;
+
+/**
+ * AJAX modal tests for field config list builder.
+ *
+ * @group field_ui
+ */
+class FieldConfigListBuilderTest extends JavascriptTestBase {
+
+  /**
+   * A test user.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  protected $adminUser;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['node', 'field_ui'];
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setUp() {
+    parent::setUp();
+
+    $this->drupalCreateContentType(['type' => 'test']);
+
+    $this->adminUser = $this->drupalCreateUser(['administer content types', 'administer node fields']);
+    $this->drupalLogin($this->adminUser);
+
+  }
+
+  /**
+   * Test that delete confirm forms use a modal dialog.
+   */
+  public function testDeleteConfirmForm() {
+    $this->drupalGet('admin/structure/types/manage/test/fields');
+    $assert_session = $this->assertSession();
+    $page = $this->getSession()->getPage();
+    $screen_dir = \Drupal::root() . '/sites/default/files/simpletest/';
+
+    // Expand the operations for the field and click the delete button.
+    $this->click('table tr:contains(body) button .dropbutton-arrow');
+    $this->createScreenshot($screen_dir . date('YmdHis') . microtime(true) . '-after-dropbutton-arrow.jpg');
+    $delete_button = $assert_session->waitForElementVisible('css', 'table tr:contains(body) a:contains(Delete)');
+    $this->assertTrue($delete_button->isVisible(), 'Delete field button found.');
+    $delete_button->click();
+    $this->createScreenshot($screen_dir . date('YmdHis') . microtime(true) . '-after-delete-button-click.jpg');
+    $assert_session->assertWaitOnAjaxRequest();
+    $this->createScreenshot($screen_dir . date('YmdHis') . microtime(true) . '-after-wait-on-ajax.jpg');
+
+    $modal = $assert_session->waitForElementVisible('css', '#drupal-modal');
+    $this->createScreenshot($screen_dir . date('YmdHis') . microtime(true) . '-after-findbyid-drupal-modal.jpg');
+    $this->assertTrue($modal->isVisible(), 'Modal window found.');
+
+    // Delete the field and check that it was deleted.
+    $delete_button = $assert_session->waitForElementVisible('css', '.ui-dialog button:contains(Delete)');
+    $this->assertTrue($delete_button->isVisible(), 'Delete button found.');
+    $delete_button->click();
+    $this->createScreenshot($screen_dir . date('YmdHis') . microtime(true) . '-after-modal-delete-button-click.jpg');
+    $this->assertNull(FieldConfig::loadByName('node', 'test',  'body'), 'Field was deleted.');
+
+  }
+
+}
