diff --git a/config/schema/entity_browser.schema.yml b/config/schema/entity_browser.schema.yml
index 7416799..cf2c9ec 100644
--- a/config/schema/entity_browser.schema.yml
+++ b/config/schema/entity_browser.schema.yml
@@ -169,6 +169,9 @@ field.widget.settings.entity_browser_entity_reference:
     field_widget_remove:
       type: boolean
       label: 'Field widget remove'
+    field_widget_replace:
+      type: boolean
+      label: 'Field widget replace'
     open:
       type: boolean
       label: 'Open'
@@ -211,6 +214,9 @@ field.widget.settings.entity_browser_file:
     field_widget_remove:
       type: boolean
       label: 'Field widget remove'
+    field_widget_replace:
+      type: boolean
+      label: 'Field widget replace'
     open:
       type: boolean
       label: 'Open'
diff --git a/js/entity_browser.entity_reference.js b/js/entity_browser.entity_reference.js
index 882799a..d828e4b 100644
--- a/js/entity_browser.entity_reference.js
+++ b/js/entity_browser.entity_reference.js
@@ -19,6 +19,12 @@
           stop: Drupal.entityBrowserEntityReference.entitiesReordered
         });
       });
+      // The AJAX callback will give us a flag when we need to re-open the
+      // browser, most likely due to a "Replace" button being clicked.
+      if (typeof drupalSettings.entity_browser_reopen_browser !== 'undefined' &&  drupalSettings.entity_browser_reopen_browser) {
+        var data_drupal_selector = '[data-drupal-selector^=edit-' + drupalSettings.entity_browser_reopen_browser.replace(/_/g, '-') + '-entity-browser-entity-browser' + ']';
+        $(context).find('.field--widget-entity-browser-entity-reference ' + data_drupal_selector).click();
+      }
     }
   };
 
diff --git a/modules/example/config/install/core.entity_form_display.node.entity_browser_test.default.yml b/modules/example/config/install/core.entity_form_display.node.entity_browser_test.default.yml
index de7d83c..0bf7b37 100644
--- a/modules/example/config/install/core.entity_form_display.node.entity_browser_test.default.yml
+++ b/modules/example/config/install/core.entity_form_display.node.entity_browser_test.default.yml
@@ -44,6 +44,7 @@ content:
       open: false
       field_widget_edit: true
       field_widget_remove: true
+      field_widget_replace: false
     third_party_settings: {  }
   field_files1:
     type: entity_browser_entity_reference
@@ -55,6 +56,7 @@ content:
       open: false
       field_widget_edit: true
       field_widget_remove: true
+      field_widget_replace: false
     third_party_settings: {  }
   field_files_over_ajax:
     weight: 36
@@ -63,6 +65,7 @@ content:
       field_widget_display: label
       field_widget_edit: true
       field_widget_remove: true
+      field_widget_replace: false
       selection_mode: selection_edit
       open: false
       field_widget_display_settings: {  }
@@ -74,6 +77,7 @@ content:
       entity_browser: test_files
       field_widget_edit: true
       field_widget_remove: true
+      field_widget_replace: false
       open: false
     third_party_settings: {  }
     type: entity_browser_file
@@ -87,6 +91,7 @@ content:
       open: false
       field_widget_edit: true
       field_widget_remove: true
+      field_widget_replace: false
     third_party_settings: {  }
   path:
     type: path
diff --git a/src/Plugin/Field/FieldWidget/EntityReferenceBrowserWidget.php b/src/Plugin/Field/FieldWidget/EntityReferenceBrowserWidget.php
index c2096b5..10c25b3 100644
--- a/src/Plugin/Field/FieldWidget/EntityReferenceBrowserWidget.php
+++ b/src/Plugin/Field/FieldWidget/EntityReferenceBrowserWidget.php
@@ -136,6 +136,7 @@ class EntityReferenceBrowserWidget extends WidgetBase implements ContainerFactor
       'field_widget_display' => 'label',
       'field_widget_edit' => TRUE,
       'field_widget_remove' => TRUE,
+      'field_widget_replace' => FALSE,
       'field_widget_display_settings' => [],
       'selection_mode' => EntityBrowserElement::SELECTION_MODE_APPEND,
     ] + parent::defaultSettings();
@@ -201,6 +202,13 @@ class EntityReferenceBrowserWidget extends WidgetBase implements ContainerFactor
       '#default_value' => $this->getSetting('field_widget_remove'),
     ];
 
+    $element['field_widget_replace'] = [
+      '#title' => $this->t('Display Replace button'),
+      '#description' => $this->t('This button will only be displayed if there is a single entity in the current selection.'),
+      '#type' => 'checkbox',
+      '#default_value' => $this->getSetting('field_widget_replace'),
+    ];
+
     $element['open'] = [
       '#title' => $this->t('Show widget details as open by default'),
       '#description' => $this->t('If marked, the fieldset container that wraps the browser on the entity form will be loaded initially expanded.'),
@@ -420,18 +428,29 @@ class EntityReferenceBrowserWidget extends WidgetBase implements ContainerFactor
    */
   public static function updateWidgetCallback(array &$form, FormStateInterface $form_state) {
     $trigger = $form_state->getTriggeringElement();
+    $reopen_browser = FALSE;
     // AJAX requests can be triggered by hidden "target_id" element when
     // entities are added or by one of the "Remove" buttons. Depending on that
     // we need to figure out where root of the widget is in the form structure
     // and use this information to return correct part of the form.
+    $parents = [];
     if (!empty($trigger['#ajax']['event']) && $trigger['#ajax']['event'] == 'entity_browser_value_updated') {
       $parents = array_slice($trigger['#array_parents'], 0, -1);
     }
     elseif ($trigger['#type'] == 'submit' && strpos($trigger['#name'], '_remove_')) {
       $parents = array_slice($trigger['#array_parents'], 0, -static::$deleteDepth);
     }
+    elseif ($trigger['#type'] == 'submit' && strpos($trigger['#name'], '_replace_')) {
+      $parents = array_slice($trigger['#array_parents'], 0, -static::$deleteDepth);
+      // We need to re-open the browser. Instead of just passing "TRUE", send
+      // to the JS the unique part of the button's name that needs to be clicked
+      // on to relaunch the browser.
+      $reopen_browser = $parents[0];
+    }
 
-    return NestedArray::getValue($form, $parents);
+    $parents = NestedArray::getValue($form, $parents);
+    $parents['#attached']['drupalSettings']['entity_browser_reopen_browser'] = $reopen_browser;
+    return $parents;
   }
 
   /**
@@ -504,11 +523,15 @@ class EntityReferenceBrowserWidget extends WidgetBase implements ContainerFactor
       $classes[] = 'sortable';
     }
 
+    // The "Replace" button will only be shown if this setting is enabled in the
+    // widget, and there is only one entity in the current selection.
+    $replace_button_access = $this->getSetting('field_widget_replace') && (count($entities) === 1);
+
     return [
       '#theme_wrappers' => ['container'],
       '#attributes' => ['class' => $classes],
       'items' => array_map(
-        function (ContentEntityInterface $entity, $row_id) use ($field_widget_display, $details_id, $field_parents) {
+        function (ContentEntityInterface $entity, $row_id) use ($field_widget_display, $details_id, $field_parents, $replace_button_access) {
           $display = $field_widget_display->view($entity);
           $edit_button_access = $this->getSetting('field_widget_edit') && $entity->access('update', $this->currentUser);
           if ($entity->getEntityTypeId() == 'file') {
@@ -541,9 +564,27 @@ class EntityReferenceBrowserWidget extends WidgetBase implements ContainerFactor
               '#attributes' => [
                 'data-entity-id' => $entity->getEntityTypeId() . ':' . $entity->id(),
                 'data-row-id' => $row_id,
+                'class' => ['remove-button'],
               ],
               '#access' => (bool) $this->getSetting('field_widget_remove'),
             ],
+            'replace_button' => [
+              '#type' => 'submit',
+              '#value' => $this->t('Replace'),
+              '#ajax' => [
+                'callback' => [get_class($this), 'updateWidgetCallback'],
+                'wrapper' => $details_id,
+              ],
+              '#submit' => [[get_class($this), 'removeItemSubmit']],
+              '#name' => $this->fieldDefinition->getName() . '_replace_' . $entity->id() . '_' . $row_id . '_' . md5(json_encode($field_parents)),
+              '#limit_validation_errors' => [array_merge($field_parents, [$this->fieldDefinition->getName()])],
+              '#attributes' => [
+                'data-entity-id' => $entity->getEntityTypeId() . ':' . $entity->id(),
+                'data-row-id' => $row_id,
+                'class' => ['replace-button'],
+              ],
+              '#access' => $replace_button_access,
+            ],
             'edit_button' => [
               '#type' => 'submit',
               '#value' => $this->t('Edit'),
@@ -560,6 +601,9 @@ class EntityReferenceBrowserWidget extends WidgetBase implements ContainerFactor
                   ],
                 ],
               ],
+              '#attributes' => [
+                'class' => ['edit-button'],
+              ],
               '#access' => $edit_button_access,
             ],
           ];
diff --git a/src/Plugin/Field/FieldWidget/FileBrowserWidget.php b/src/Plugin/Field/FieldWidget/FileBrowserWidget.php
index 6db9c8d..f9eea20 100644
--- a/src/Plugin/Field/FieldWidget/FileBrowserWidget.php
+++ b/src/Plugin/Field/FieldWidget/FileBrowserWidget.php
@@ -253,6 +253,10 @@ class FileBrowserWidget extends EntityReferenceBrowserWidget {
         $edit_button_access = $can_edit && $entity->access('update', $this->currentUser);
       }
 
+      // The "Replace" button will only be shown if this setting is enabled in
+      // the widget, and there is only one entity in the current selection.
+      $replace_button_access = $this->getSetting('field_widget_replace') && (count($entities) === 1);
+
       $entity_id = $entity->id();
 
       // Find the default description.
@@ -356,9 +360,27 @@ class FileBrowserWidget extends EntityReferenceBrowserWidget {
           '#attributes' => [
             'data-entity-id' => $entity->getEntityTypeId() . ':' . $entity->id(),
             'data-row-id' => $delta,
+            'class' => ['edit-button'],
           ],
           '#access' => $edit_button_access,
         ],
+        'replace_button' => [
+          '#type' => 'submit',
+          '#value' => $this->t('Replace'),
+          '#ajax' => [
+            'callback' => [get_class($this), 'updateWidgetCallback'],
+            'wrapper' => $details_id,
+          ],
+          '#submit' => [[get_class($this), 'removeItemSubmit']],
+          '#name' => $field_machine_name . '_replace_' . $entity_id . '_' . md5(json_encode($field_parents)),
+          '#limit_validation_errors' => [array_merge($field_parents, [$field_machine_name, 'target_id'])],
+          '#attributes' => [
+            'data-entity-id' => $entity->getEntityTypeId() . ':' . $entity->id(),
+            'data-row-id' => $delta,
+            'class' => ['replace-button'],
+          ],
+          '#access' => $replace_button_access,
+        ],
         'remove_button' => [
           '#type' => 'submit',
           '#value' => $this->t('Remove'),
@@ -372,6 +394,7 @@ class FileBrowserWidget extends EntityReferenceBrowserWidget {
           '#attributes' => [
             'data-entity-id' => $entity->getEntityTypeId() . ':' . $entity->id(),
             'data-row-id' => $delta,
+            'class' => ['remove-button'],
           ],
           '#access' => (bool) $widget_settings['field_widget_remove'],
         ],
diff --git a/tests/modules/entity_browser_ief_test/config/install/core.entity_form_display.media.ief_media_bundle.default.yml b/tests/modules/entity_browser_ief_test/config/install/core.entity_form_display.media.ief_media_bundle.default.yml
index 6288723..f2ab144 100644
--- a/tests/modules/entity_browser_ief_test/config/install/core.entity_form_display.media.ief_media_bundle.default.yml
+++ b/tests/modules/entity_browser_ief_test/config/install/core.entity_form_display.media.ief_media_bundle.default.yml
@@ -18,6 +18,7 @@ content:
       field_widget_display: label
       field_widget_edit: true
       field_widget_remove: true
+      field_widget_replace: false
       open: true
       selection_mode: selection_edit
       field_widget_display_settings: {  }
diff --git a/tests/modules/entity_browser_test_paragraphs/config/install/core.entity_form_display.paragraph.content_embed.default.yml b/tests/modules/entity_browser_test_paragraphs/config/install/core.entity_form_display.paragraph.content_embed.default.yml
index 5732c92..d09edbb 100644
--- a/tests/modules/entity_browser_test_paragraphs/config/install/core.entity_form_display.paragraph.content_embed.default.yml
+++ b/tests/modules/entity_browser_test_paragraphs/config/install/core.entity_form_display.paragraph.content_embed.default.yml
@@ -20,6 +20,7 @@ content:
       field_widget_display: label
       field_widget_edit: true
       field_widget_remove: true
+      field_widget_replace: false
       selection_mode: selection_append
       open: true
       field_widget_display_settings: {  }
diff --git a/tests/modules/entity_browser_test_paragraphs/config/install/core.entity_form_display.paragraph.nested_paragrah.default.yml b/tests/modules/entity_browser_test_paragraphs/config/install/core.entity_form_display.paragraph.nested_paragrah.default.yml
index 50848f7..2a817a9 100644
--- a/tests/modules/entity_browser_test_paragraphs/config/install/core.entity_form_display.paragraph.nested_paragrah.default.yml
+++ b/tests/modules/entity_browser_test_paragraphs/config/install/core.entity_form_display.paragraph.nested_paragrah.default.yml
@@ -19,6 +19,7 @@ content:
       field_widget_display: label
       field_widget_edit: true
       field_widget_remove: true
+      field_widget_replace: false
       selection_mode: selection_append
       open: true
       field_widget_display_settings: {  }
diff --git a/tests/src/FunctionalJavascript/EntityReferenceWidgetTest.php b/tests/src/FunctionalJavascript/EntityReferenceWidgetTest.php
index c760cce..0a412b1 100644
--- a/tests/src/FunctionalJavascript/EntityReferenceWidgetTest.php
+++ b/tests/src/FunctionalJavascript/EntityReferenceWidgetTest.php
@@ -24,8 +24,11 @@ class EntityReferenceWidgetTest extends EntityBrowserJavascriptTestBase {
 
     /** @var \Drupal\user\RoleInterface $role */
     $role = Role::load('authenticated');
-    $this->grantPermissions($role, ['access test_entity_browser_iframe_node_view entity browser pages']);
-    $this->grantPermissions($role, ['bypass node access']);
+    $this->grantPermissions($role, [
+      'access test_entity_browser_iframe_node_view entity browser pages',
+      'bypass node access',
+      'administer node form display',
+    ]);
 
   }
 
@@ -33,12 +36,12 @@ class EntityReferenceWidgetTest extends EntityBrowserJavascriptTestBase {
    * Tests Entity Reference widget.
    */
   public function testEntityReferenceWidget() {
-
-    $page = $this->getSession()->getPage();
+    $session = $this->getSession();
+    $page = $session->getPage();
     $assert_session = $this->assertSession();
 
     // Create an entity_reference field to test the widget.
-    FieldStorageConfig::create([
+    $field_storage = FieldStorageConfig::create([
       'field_name' => 'field_entity_reference1',
       'type' => 'entity_reference',
       'entity_type' => 'node',
@@ -46,15 +49,17 @@ class EntityReferenceWidgetTest extends EntityBrowserJavascriptTestBase {
       'settings' => [
         'target_type' => 'node',
       ],
-    ])->save();
+    ]);
+    $field_storage->save();
 
-    FieldConfig::create([
+    $field = FieldConfig::create([
       'field_name' => 'field_entity_reference1',
       'entity_type' => 'node',
       'bundle' => 'article',
       'label' => 'Referenced articles',
       'settings' => [],
-    ])->save();
+    ]);
+    $field->save();
 
     /** @var \Drupal\Core\Entity\Display\EntityFormDisplayInterface $form_display */
     $form_display = $this->container->get('entity_type.manager')
@@ -68,6 +73,7 @@ class EntityReferenceWidgetTest extends EntityBrowserJavascriptTestBase {
         'open' => TRUE,
         'field_widget_edit' => TRUE,
         'field_widget_remove' => TRUE,
+        'field_widget_replace' => FALSE,
         'selection_mode' => EntityBrowserElement::SELECTION_MODE_APPEND,
         'field_widget_display' => 'label',
         'field_widget_display_settings' => [],
@@ -83,11 +89,11 @@ class EntityReferenceWidgetTest extends EntityBrowserJavascriptTestBase {
 
     $this->drupalGet('/node/add/article');
     $page->fillField('title[0][value]', 'Referencing node 1');
-    $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
+    $session->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
     $this->waitForAjaxToFinish();
     $page->checkField('edit-entity-browser-select-node1');
     $page->pressButton('Select entities');
-    $this->getSession()->switchToIFrame();
+    $session->switchToIFrame();
     $this->waitForAjaxToFinish();
     $page->pressButton('Save');
 
@@ -110,6 +116,7 @@ class EntityReferenceWidgetTest extends EntityBrowserJavascriptTestBase {
         'open' => TRUE,
         'field_widget_edit' => FALSE,
         'field_widget_remove' => FALSE,
+        'field_widget_replace' => FALSE,
         'selection_mode' => EntityBrowserElement::SELECTION_MODE_APPEND,
         'field_widget_display' => 'label',
         'field_widget_display_settings' => [],
@@ -127,31 +134,88 @@ class EntityReferenceWidgetTest extends EntityBrowserJavascriptTestBase {
         'open' => TRUE,
         'field_widget_edit' => TRUE,
         'field_widget_remove' => TRUE,
+        'field_widget_replace' => FALSE,
         'selection_mode' => EntityBrowserElement::SELECTION_MODE_APPEND,
         'field_widget_display' => 'label',
         'field_widget_display_settings' => [],
       ],
     ])->save();
     $this->drupalGet('node/' . $nid . '/edit');
-    $assert_session->buttonExists('edit-field-entity-reference1-current-items-0-remove-button');
-    $assert_session->buttonExists('edit-field-entity-reference1-current-items-0-edit-button');
+    $remove_button = $assert_session->buttonExists('edit-field-entity-reference1-current-items-0-remove-button');
+    $this->assertEquals('Remove', $remove_button->getValue());
+    $this->assertTrue($remove_button->hasClass('remove-button'));
+    $edit_button = $assert_session->buttonExists('edit-field-entity-reference1-current-items-0-edit-button');
+    $this->assertEquals('Edit', $edit_button->getValue());
+    $this->assertTrue($edit_button->hasClass('edit-button'));
+    // Make sure the "Replace" button is not there.
+    $assert_session->buttonNotExists('edit-field-entity-reference1-current-items-0-replace-button');
 
     // Test the "Remove" button on the widget works.
     $page->pressButton('Remove');
     $this->waitForAjaxToFinish();
     $assert_session->pageTextNotContains('Target example node 1');
 
+    // Test the "Replace" button functionality.
+    $form_display->setComponent('field_entity_reference1', [
+      'type' => 'entity_browser_entity_reference',
+      'settings' => [
+        'entity_browser' => 'test_entity_browser_iframe_node_view',
+        'open' => TRUE,
+        'field_widget_edit' => TRUE,
+        'field_widget_remove' => TRUE,
+        'field_widget_replace' => TRUE,
+        'selection_mode' => EntityBrowserElement::SELECTION_MODE_APPEND,
+        'field_widget_display' => 'label',
+        'field_widget_display_settings' => [],
+      ],
+    ])->save();
+    // We'll need a third node to be able to make a new selection.
+    $target_node2 = Node::create([
+      'title' => 'Target example node 2',
+      'type' => 'article',
+    ]);
+    $target_node2->save();
+    $this->drupalGet('node/' . $nid . '/edit');
+    // If there is only one entity in the current selection the button should
+    // show up.
+    $replace_button = $assert_session->buttonExists('edit-field-entity-reference1-current-items-0-replace-button');
+    $this->assertEquals('Replace', $replace_button->getValue());
+    $this->assertTrue($replace_button->hasClass('replace-button'));
+    // Clicking on the button should empty the selection and automatically
+    // open the browser again.
+    $remove_button->click();
+    $this->waitForAjaxToFinish();
+    $session->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
+    $this->waitForAjaxToFinish();
+    $page->checkField('edit-entity-browser-select-node3');
+    $page->pressButton('Select entities');
+    $session->switchToIFrame();
+    $this->waitForAjaxToFinish();
+    // Even in the AJAX-built markup for the newly selected element, the replace
+    // button should be there.
+    $assert_session->elementExists('css', 'input[data-drupal-selector="edit-field-entity-reference1-current-items-0-replace-button"]');
+    // Adding a new node to the selection, however, should make it disappear.
+    $session->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
+    $this->waitForAjaxToFinish();
+    $page->checkField('edit-entity-browser-select-node1');
+    $page->pressButton('Select entities');
+    $session->switchToIFrame();
+    $this->waitForAjaxToFinish();
+    $assert_session->elementNotExists('css', 'input[data-drupal-selector="edit-field-entity-reference1-current-items-0-replace-button"]');
+    $page->pressButton('Save');
+    $assert_session->pageTextContains('Article Referencing node 1 has been updated.');
+
     // Verify that if the user cannot edit the entity, the "Edit" button does
     // not show up, even if configured to.
     /** @var \Drupal\user\RoleInterface $role */
     $role = Role::load('authenticated');
     $role->revokePermission('bypass node access')->trustData()->save();
     $this->drupalGet('node/add/article');
-    $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
+    $session->switchToIFrame('entity_browser_iframe_test_entity_browser_iframe_node_view');
     $this->waitForAjaxToFinish();
     $page->checkField('edit-entity-browser-select-node1');
     $page->pressButton('Select entities');
-    $this->getSession()->switchToIFrame();
+    $session->switchToIFrame();
     $this->waitForAjaxToFinish();
     $assert_session->buttonNotExists('edit-field-entity-reference1-current-items-0-edit-button');
 
diff --git a/tests/src/FunctionalJavascript/ImageFieldTest.php b/tests/src/FunctionalJavascript/ImageFieldTest.php
index a08781a..ea1e223 100644
--- a/tests/src/FunctionalJavascript/ImageFieldTest.php
+++ b/tests/src/FunctionalJavascript/ImageFieldTest.php
@@ -70,6 +70,7 @@ class ImageFieldTest extends EntityBrowserJavascriptTestBase {
         'open' => TRUE,
         'field_widget_edit' => FALSE,
         'field_widget_remove' => TRUE,
+        'field_widget_replace' => FALSE,
         'selection_mode' => EntityBrowserElement::SELECTION_MODE_APPEND,
         'view_mode' => 'default',
         'preview_image_style' => 'thumbnail',
