diff --git a/core/modules/media_library/css/media_library.module.css b/core/modules/media_library/css/media_library.module.css
index d5b69262c2..1ba3b89c06 100644
--- a/core/modules/media_library/css/media_library.module.css
+++ b/core/modules/media_library/css/media_library.module.css
@@ -24,6 +24,7 @@
 
 .media-library-views-form,
 .media-library-selection,
+.media-library-add-form-selection,
 .media-library-views-form__bulk_form,
 .media-library-view .form--inline {
   display: flex;
@@ -81,7 +82,8 @@
 
 /* @todo Remove or re-work in https://www.drupal.org/node/2985168 */
 .media-library-widget .media-library-item__name a,
-.media-library-view--widget .media-library-item__name a {
+.media-library-view--widget .media-library-item__name a,
+.media-library-add-form-selection .media-library-item__name a {
   pointer-events: none;
 }
 
diff --git a/core/modules/media_library/css/media_library.theme.css b/core/modules/media_library/css/media_library.theme.css
index cef94cad47..fbbb015c75 100644
--- a/core/modules/media_library/css/media_library.theme.css
+++ b/core/modules/media_library/css/media_library.theme.css
@@ -95,6 +95,10 @@
   margin: 0 0 1em;
 }
 
+.media-library-add-form-media {
+  outline: none;
+}
+
 /* Style the media add upload form. */
 .media-library-add-form--upload.media-library-add-form--without-input .form-item-upload {
   margin-bottom: 0;
@@ -104,6 +108,10 @@
   margin: 8px 0 0;
 }
 
+.media-library-add-form-description {
+  margin: 0;
+}
+
 /* Style the media add oEmbed form. */
 .media-library-add-form-oembed-wrapper {
   display: flex;
@@ -129,6 +137,21 @@
   align-self: center;
 }
 
+/* Media add form selection styles. */
+.media-library-add-form-selection {
+  margin-top: 1em;
+  padding-top: 1em;
+  border-top: 1px solid #c0c0c0;
+}
+
+.media-library-add-form-selection .media-library-item {
+  width: 120px;
+}
+
+.media-library-add-form-selection .media-library-item .field--name-thumbnail img {
+  height: 100px;
+}
+
 /* Generic media library view styles. */
 .media-library-select-all {
   margin: 10px 0 10px 0;
@@ -448,7 +471,8 @@
 
 /* @todo Remove or re-work in https://www.drupal.org/node/2985168 */
 .media-library-widget .media-library-item__name a,
-.media-library-view--widget .media-library-item__name a {
+.media-library-view--widget .media-library-item__name a,
+.media-library-add-form-selection .media-library-item__name a {
   text-decoration: none;
   color: black;
 }
diff --git a/core/modules/media_library/js/media_library.click_to_select.es6.js b/core/modules/media_library/js/media_library.click_to_select.es6.js
index db42fe4790..536526a6c8 100644
--- a/core/modules/media_library/js/media_library.click_to_select.es6.js
+++ b/core/modules/media_library/js/media_library.click_to_select.es6.js
@@ -24,12 +24,29 @@
             .find('.js-click-to-select-checkbox input');
           $input.prop('checked', !$input.prop('checked')).trigger('change');
         });
+
       $('.js-click-to-select-checkbox input', context)
         .once('media-library-click-to-select')
+        // Adds checked class to the click-to-select element.
         .on('change', ({ currentTarget }) => {
           $(currentTarget)
             .closest('.js-click-to-select')
             .toggleClass('checked', $(currentTarget).prop('checked'));
+        })
+        // Adds is-focus class to the click-to-select element.
+        .on('focus blur', ({ currentTarget, type }) => {
+          $(currentTarget)
+            .closest('.js-click-to-select')
+            .toggleClass('is-focus', type === 'focus');
+        });
+
+      // Adds hover class to the click-to-select element.
+      $('.js-click-to-select-trigger, .js-click-to-select-checkbox', context)
+        .once('media-library-click-to-select-hover')
+        .on('mouseover mouseout', ({ currentTarget, type }) => {
+          $(currentTarget)
+            .closest('.js-click-to-select')
+            .toggleClass('is-hover', type === 'mouseover');
         });
     },
   };
diff --git a/core/modules/media_library/js/media_library.click_to_select.js b/core/modules/media_library/js/media_library.click_to_select.js
index 01cbb1431b..265ec4531b 100644
--- a/core/modules/media_library/js/media_library.click_to_select.js
+++ b/core/modules/media_library/js/media_library.click_to_select.js
@@ -14,10 +14,23 @@
         var $input = $(event.currentTarget).closest('.js-click-to-select').find('.js-click-to-select-checkbox input');
         $input.prop('checked', !$input.prop('checked')).trigger('change');
       });
+
       $('.js-click-to-select-checkbox input', context).once('media-library-click-to-select').on('change', function (_ref) {
         var currentTarget = _ref.currentTarget;
 
         $(currentTarget).closest('.js-click-to-select').toggleClass('checked', $(currentTarget).prop('checked'));
+      }).on('focus blur', function (_ref2) {
+        var currentTarget = _ref2.currentTarget,
+            type = _ref2.type;
+
+        $(currentTarget).closest('.js-click-to-select').toggleClass('is-focus', type === 'focus');
+      });
+
+      $('.js-click-to-select-trigger, .js-click-to-select-checkbox', context).once('media-library-click-to-select-hover').on('mouseover mouseout', function (_ref3) {
+        var currentTarget = _ref3.currentTarget,
+            type = _ref3.type;
+
+        $(currentTarget).closest('.js-click-to-select').toggleClass('is-hover', type === 'mouseover');
       });
     }
   };
diff --git a/core/modules/media_library/js/media_library.ui.es6.js b/core/modules/media_library/js/media_library.ui.es6.js
index d6ae04f1d1..9bec4ffb08 100644
--- a/core/modules/media_library/js/media_library.ui.es6.js
+++ b/core/modules/media_library/js/media_library.ui.es6.js
@@ -251,7 +251,10 @@
    */
   Drupal.behaviors.MediaLibraryItemSelection = {
     attach(context, settings) {
-      const $form = $('.js-media-library-views-form', context);
+      const $form = $(
+        '.js-media-library-views-form, .js-media-library-add-form',
+        context,
+      );
       const currentSelection = Drupal.MediaLibrary.currentSelection;
 
       if (!$form.length) {
@@ -263,30 +266,6 @@
         $form,
       );
 
-      // Update the selection array and the hidden form field when a media item
-      // is selected.
-      $mediaItems.once('media-item-change').on('change', e => {
-        const id = e.currentTarget.value;
-
-        // Update the selection.
-        const position = currentSelection.indexOf(id);
-        if (e.currentTarget.checked) {
-          // Check if the ID is not already in the selection and add if needed.
-          if (position === -1) {
-            currentSelection.push(id);
-          }
-        } else if (position !== -1) {
-          // Remove the ID when it is in the current selection.
-          currentSelection.splice(position, 1);
-        }
-
-        // Set the selection in the hidden form element.
-        $form
-          .find('#media-library-modal-selection')
-          .val(currentSelection.join())
-          .trigger('change');
-      });
-
       /**
        * Disable media items.
        *
@@ -343,23 +322,49 @@
         }
       }
 
-      // The hidden selection form field changes when the selection is updated.
-      $('#media-library-modal-selection', $form)
-        .once('media-library-selection-change')
-        .on('change', e => {
-          updateSelectionInfo(settings.media_library.selection_remaining);
+      // Update the selection array and the hidden form field when a media item
+      // is selected.
+      $mediaItems.once('media-item-change').on('change', e => {
+        const id = e.currentTarget.value;
 
-          // Prevent users from selecting more items than allowed.
-          if (
-            currentSelection.length ===
-            settings.media_library.selection_remaining
-          ) {
-            disableItems($mediaItems.not(':checked'));
-            enableItems($mediaItems.filter(':checked'));
-          } else {
-            enableItems($mediaItems);
+        // Update the selection.
+        const position = currentSelection.indexOf(id);
+        if (e.currentTarget.checked) {
+          // Check if the ID is not already in the selection and add if needed.
+          if (position === -1) {
+            currentSelection.push(id);
           }
-        });
+        } else if (position !== -1) {
+          // Remove the ID when it is in the current selection.
+          currentSelection.splice(position, 1);
+        }
+
+        // Set the selection in the hidden form element.
+        $form
+          .find('#media-library-modal-selection')
+          .val(currentSelection.join())
+          .trigger('change');
+
+        // Set the selection in the media library add form. Since the form is
+        // not necessarily loaded within the same context, we can't use the
+        // context here.
+        $('.js-media-library-add-form-current-selection').val(
+          currentSelection.join(),
+        );
+
+        // Update the number of selected items in the button pane.
+        updateSelectionInfo(settings.media_library.selection_remaining);
+
+        // Prevent users from selecting more items than allowed.
+        if (
+          currentSelection.length === settings.media_library.selection_remaining
+        ) {
+          disableItems($mediaItems.not(':checked'));
+          enableItems($mediaItems.filter(':checked'));
+        } else {
+          enableItems($mediaItems);
+        }
+      });
 
       // Apply the current selection to the media library view. Changing the
       // checkbox values triggers the change event for the media items. The
diff --git a/core/modules/media_library/js/media_library.ui.js b/core/modules/media_library/js/media_library.ui.js
index 9689a0d334..e7ce4a5dca 100644
--- a/core/modules/media_library/js/media_library.ui.js
+++ b/core/modules/media_library/js/media_library.ui.js
@@ -136,7 +136,7 @@
 
   Drupal.behaviors.MediaLibraryItemSelection = {
     attach: function attach(context, settings) {
-      var $form = $('.js-media-library-views-form', context);
+      var $form = $('.js-media-library-views-form, .js-media-library-add-form', context);
       var currentSelection = Drupal.MediaLibrary.currentSelection;
 
       if (!$form.length) {
@@ -145,21 +145,6 @@
 
       var $mediaItems = $('.js-media-library-item input[type="checkbox"]', $form);
 
-      $mediaItems.once('media-item-change').on('change', function (e) {
-        var id = e.currentTarget.value;
-
-        var position = currentSelection.indexOf(id);
-        if (e.currentTarget.checked) {
-          if (position === -1) {
-            currentSelection.push(id);
-          }
-        } else if (position !== -1) {
-          currentSelection.splice(position, 1);
-        }
-
-        $form.find('#media-library-modal-selection').val(currentSelection.join()).trigger('change');
-      });
-
       function disableItems($items) {
         $items.prop('disabled', true).closest('.js-media-library-item').addClass('media-library-item--disabled');
       }
@@ -183,7 +168,22 @@
         }
       }
 
-      $('#media-library-modal-selection', $form).once('media-library-selection-change').on('change', function (e) {
+      $mediaItems.once('media-item-change').on('change', function (e) {
+        var id = e.currentTarget.value;
+
+        var position = currentSelection.indexOf(id);
+        if (e.currentTarget.checked) {
+          if (position === -1) {
+            currentSelection.push(id);
+          }
+        } else if (position !== -1) {
+          currentSelection.splice(position, 1);
+        }
+
+        $form.find('#media-library-modal-selection').val(currentSelection.join()).trigger('change');
+
+        $('.js-media-library-add-form-current-selection').val(currentSelection.join());
+
         updateSelectionInfo(settings.media_library.selection_remaining);
 
         if (currentSelection.length === settings.media_library.selection_remaining) {
diff --git a/core/modules/media_library/js/media_library.view.es6.js b/core/modules/media_library/js/media_library.view.es6.js
index 3e7ee438c2..ce29a81571 100644
--- a/core/modules/media_library/js/media_library.view.es6.js
+++ b/core/modules/media_library/js/media_library.view.es6.js
@@ -2,46 +2,6 @@
  * @file media_library.view.es6.js
  */
 (($, Drupal) => {
-  /**
-   * Adds hover effect to media items.
-   *
-   * @type {Drupal~behavior}
-   *
-   * @prop {Drupal~behaviorAttach} attach
-   *   Attaches behavior to add a class when hovering over media items.
-   */
-  Drupal.behaviors.MediaLibraryHover = {
-    attach(context) {
-      $('.js-click-to-select-trigger, .js-click-to-select-checkbox', context)
-        .once('media-library-item-hover')
-        .on('mouseover mouseout', ({ currentTarget, type }) => {
-          $(currentTarget)
-            .closest('.js-media-library-item')
-            .toggleClass('is-hover', type === 'mouseover');
-        });
-    },
-  };
-
-  /**
-   * Adds focus effect to media items.
-   *
-   * @type {Drupal~behavior}
-   *
-   * @prop {Drupal~behaviorAttach} attach
-   *   Attaches behavior to add a focus effect to media items.
-   */
-  Drupal.behaviors.MediaLibraryFocus = {
-    attach(context) {
-      $('.js-click-to-select-checkbox input', context)
-        .once('media-library-item-focus')
-        .on('focus blur', ({ currentTarget, type }) => {
-          $(currentTarget)
-            .closest('.js-media-library-item')
-            .toggleClass('is-focus', type === 'focus');
-        });
-    },
-  };
-
   /**
    * Adds checkbox to select all items in the library.
    *
diff --git a/core/modules/media_library/js/media_library.view.js b/core/modules/media_library/js/media_library.view.js
index 28cdad64eb..e741370182 100644
--- a/core/modules/media_library/js/media_library.view.js
+++ b/core/modules/media_library/js/media_library.view.js
@@ -6,34 +6,12 @@
 **/
 
 (function ($, Drupal) {
-  Drupal.behaviors.MediaLibraryHover = {
-    attach: function attach(context) {
-      $('.js-click-to-select-trigger, .js-click-to-select-checkbox', context).once('media-library-item-hover').on('mouseover mouseout', function (_ref) {
-        var currentTarget = _ref.currentTarget,
-            type = _ref.type;
-
-        $(currentTarget).closest('.js-media-library-item').toggleClass('is-hover', type === 'mouseover');
-      });
-    }
-  };
-
-  Drupal.behaviors.MediaLibraryFocus = {
-    attach: function attach(context) {
-      $('.js-click-to-select-checkbox input', context).once('media-library-item-focus').on('focus blur', function (_ref2) {
-        var currentTarget = _ref2.currentTarget,
-            type = _ref2.type;
-
-        $(currentTarget).closest('.js-media-library-item').toggleClass('is-focus', type === 'focus');
-      });
-    }
-  };
-
   Drupal.behaviors.MediaLibrarySelectAll = {
     attach: function attach(context) {
       var $view = $('.js-media-library-view', context).once('media-library-select-all');
       if ($view.length && $view.find('.js-media-library-item').length) {
-        var $checkbox = $('<input type="checkbox" class="form-checkbox" />').on('click', function (_ref3) {
-          var currentTarget = _ref3.currentTarget;
+        var $checkbox = $('<input type="checkbox" class="form-checkbox" />').on('click', function (_ref) {
+          var currentTarget = _ref.currentTarget;
 
           var $checkboxes = $(currentTarget).closest('.media-library-view').find('.js-media-library-item input[type="checkbox"]');
           $checkboxes.prop('checked', $(currentTarget).prop('checked')).trigger('change');
diff --git a/core/modules/media_library/src/Form/AddFormBase.php b/core/modules/media_library/src/Form/AddFormBase.php
index 2f078af9cb..1589d1f9ae 100644
--- a/core/modules/media_library/src/Form/AddFormBase.php
+++ b/core/modules/media_library/src/Form/AddFormBase.php
@@ -3,6 +3,8 @@
 namespace Drupal\media_library\Form;
 
 use Drupal\Core\Ajax\AjaxResponse;
+use Drupal\Core\Ajax\CloseDialogCommand;
+use Drupal\Core\Ajax\InvokeCommand;
 use Drupal\Core\Ajax\ReplaceCommand;
 use Drupal\Core\Entity\Entity\EntityFormDisplay;
 use Drupal\Core\Entity\EntityStorageInterface;
@@ -14,6 +16,7 @@
 use Drupal\media_library\Ajax\UpdateSelectionCommand;
 use Drupal\media_library\MediaLibraryState;
 use Drupal\media_library\MediaLibraryUiBuilder;
+use Drupal\media_library\Plugin\Field\FieldWidget\MediaLibraryWidget;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -47,6 +50,13 @@ abstract class AddFormBase extends FormBase {
    */
   protected $mediaType;
 
+  /**
+   * The media view builder.
+   *
+   * @var \Drupal\Core\Entity\EntityViewBuilderInterface
+   */
+  protected $viewBuilder;
+
   /**
    * Constructs a AddFormBase object.
    *
@@ -58,6 +68,7 @@ abstract class AddFormBase extends FormBase {
   public function __construct(EntityTypeManagerInterface $entity_type_manager, MediaLibraryUiBuilder $library_ui_builder) {
     $this->entityTypeManager = $entity_type_manager;
     $this->libraryUiBuilder = $library_ui_builder;
+    $this->viewBuilder = $this->entityTypeManager->getViewBuilder('media');
   }
 
   /**
@@ -122,8 +133,12 @@ public function buildForm(array $form, FormStateInterface $form_state) {
       '#type' => 'status_messages',
     ];
 
-    $form['#attributes']['class'][] = 'media-library-add-form';
-    $added_media = $form_state->get('media');
+    $form['#attributes']['class'] = [
+      'media-library-add-form',
+      'js-media-library-add-form',
+    ];
+
+    $added_media = $this->getAddedMediaItems($form_state);
     if (empty($added_media)) {
       $form['#attributes']['class'][] = 'media-library-add-form--without-input';
       $form = $this->buildInputElement($form, $form_state);
@@ -133,14 +148,47 @@ public function buildForm(array $form, FormStateInterface $form_state) {
 
       $form['media'] = [
         '#type' => 'container',
+        '#attributes' => [
+          'class' => [
+            'media-library-add-form-media',
+          ],
+          'tabindex' => -1,
+          'aria-label' => $this->t('Added media items'),
+        ],
+      ];
+
+      $form['media']['description'] = [
+        '#type' => 'html_tag',
+        '#tag' => 'p',
+        '#value' => $this->formatPlural(count($added_media), 'The media item has been created. Fill in any required fields and save to add it to the media library.', 'The media items have been created. Fill in any required fields and save to add them to the media library.'),
+        '#attributes' => [
+          'class' => [
+            'media-library-add-form-description',
+          ],
+        ],
       ];
 
       foreach ($added_media as $delta => $media) {
         $form['media'][$delta] = $this->buildEntityFormElement($media, $form, $form_state, $delta);
       }
 
+      $form['selection'] = $this->buildCurrentSelectionArea($form, $form_state);
       $form['actions'] = $this->buildActions($form, $form_state);
     }
+
+    // Allow the current selection to be set in a hidden field so the selection
+    // can be passed between different states of the form.
+    // @see Drupal.behaviors.MediaLibraryItemSelection
+    $form['current_selection'] = [
+      '#type' => 'hidden',
+      '#default_value' => '',
+      '#attributes' => [
+        'class' => [
+          'js-media-library-add-form-current-selection',
+        ],
+      ],
+    ];
+
     return $form;
   }
 
@@ -247,6 +295,82 @@ protected function buildEntityFormElement(MediaInterface $media, array $form, Fo
     return $element;
   }
 
+  /**
+   * Returns a render array containing the current selection.
+   *
+   * @param array $form
+   *   The complete form.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current form state.
+   *
+   * @return array
+   *   A render array containing the current selection.
+   */
+  protected function buildCurrentSelectionArea(array $form, FormStateInterface $form_state) {
+    $pre_selected_items = $this->getPreSelectedMediaItems($form_state);
+
+    if (!$pre_selected_items) {
+      return [];
+    }
+
+    $selection = [
+      '#type' => 'container',
+      '#attributes' => [
+        'class' => [
+          'media-library-add-form-selection',
+        ],
+        'aria-label' => $this->t('Selected media items'),
+      ],
+    ];
+    foreach ($pre_selected_items as $media_id => $media) {
+      $selection[$media_id] = $this->buildSelectedItemElement($media, $form, $form_state);
+    }
+
+    return $selection;
+  }
+
+  /**
+   * Returns a render array for a single pre-selected media item.
+   *
+   * @param \Drupal\media\MediaInterface $media
+   *   The media item.
+   * @param array $form
+   *   The complete form.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current form state.
+   *
+   * @return array
+   *   A render array of a pre-selected media item.
+   */
+  protected function buildSelectedItemElement(MediaInterface $media, array $form, FormStateInterface $form_state) {
+    return [
+      '#type' => 'container',
+      '#attributes' => [
+        'class' => [
+          'media-library-item',
+          'media-library-item--grid',
+          'js-media-library-item',
+          'js-click-to-select',
+        ],
+      ],
+      'select' => [
+        '#type' => 'container',
+        '#attributes' => [
+          'class' => [
+            'js-click-to-select-checkbox',
+          ],
+        ],
+        'select_checkbox' => [
+          '#type' => 'checkbox',
+          '#title' => $this->t('Select @name', ['@name' => $media->label()]),
+          '#title_display' => 'invisible',
+          '#return_value' => $media->id(),
+        ],
+      ],
+      'rendered_entity' => $this->viewBuilder->view($media, 'media_library'),
+    ];
+  }
+
   /**
    * Returns an array of supported actions for the form.
    *
@@ -261,9 +385,18 @@ protected function buildEntityFormElement(MediaInterface $media, array $form, Fo
   protected function buildActions(array $form, FormStateInterface $form_state) {
     return [
       '#type' => 'actions',
-      'submit' => [
+      'save_submit' => [
+        '#type' => 'submit',
+        '#button_type' => 'primary',
+        '#value' => $this->t('Save and select'),
+        '#ajax' => [
+          'callback' => '::updateLibrary',
+          'wrapper' => 'media-library-add-form-wrapper',
+        ],
+      ],
+      'insert_submit' => [
         '#type' => 'submit',
-        '#value' => $this->t('Save'),
+        '#value' => $this->t('Save and insert'),
         '#ajax' => [
           'callback' => '::updateWidget',
           'wrapper' => 'media-library-add-form-wrapper',
@@ -338,25 +471,31 @@ protected function prepareMediaEntityForSave(MediaInterface $media) {
    *   The form render array or an AJAX response object.
    */
   public function updateFormCallback(array &$form, FormStateInterface $form_state) {
+    $triggering_element = $form_state->getTriggeringElement();
+    $wrapper_id = $triggering_element['#ajax']['wrapper'];
+
+    $response = new AjaxResponse();
+
     // When the source field input contains errors, replace the existing form to
     // let the user change the source field input. If the user input is valid,
     // the entire modal is replaced with the second step of the form to show the
     // form fields for each media item.
     if ($form_state::hasAnyErrors()) {
-      $response = new AjaxResponse();
       $response->addCommand(new ReplaceCommand('#media-library-add-form-wrapper', $form));
       return $response;
     }
 
-    return $form;
+    // Update the form and shift focus to the added media items.
+    $response->addCommand(new ReplaceCommand("#$wrapper_id", $form));
+    $response->addCommand(new InvokeCommand('#media-library-add-form-wrapper .media-library-add-form-media', 'focus'));
+    return $response;
   }
 
   /**
    * {@inheritdoc}
    */
   public function validateForm(array &$form, FormStateInterface $form_state) {
-    $added_media = $form_state->get('media') ?: [];
-    foreach ($added_media as $delta => $media) {
+    foreach ($this->getAddedMediaItems($form_state) as $delta => $media) {
       $this->validateMediaEntity($media, $form, $form_state, $delta);
     }
   }
@@ -383,8 +522,7 @@ protected function validateMediaEntity(MediaInterface $media, array $form, FormS
    * {@inheritdoc}
    */
   public function submitForm(array &$form, FormStateInterface $form_state) {
-    $added_media = $form_state->get('media') ?: [];
-    foreach ($added_media as $delta => $media) {
+    foreach ($this->getAddedMediaItems($form_state) as $delta => $media) {
       EntityFormDisplay::collectRenderDisplay($media, 'media_library')
         ->extractFormValues($media, $form['media'][$delta]['fields'], $form_state);
       $this->prepareMediaEntityForSave($media);
@@ -393,7 +531,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
   }
 
   /**
-   * AJAX callback to send the new media item(s) to the calling code.
+   * AJAX callback to send the new media item(s) to the media library.
    *
    * @param array $form
    *   The complete form.
@@ -401,18 +539,17 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
    *   The current form state.
    *
    * @return array|\Drupal\Core\Ajax\AjaxResponse
-   *   The form array when there are form errors or a AJAX response to select
-   *   the created items in the media library.
+   *   The form array if there are validation errors, or an AJAX response to add
+   *   the created items to the current selection.
    */
-  public function updateWidget(array &$form, FormStateInterface $form_state) {
+  public function updateLibrary(array &$form, FormStateInterface $form_state) {
     if ($form_state::hasAnyErrors()) {
       return $form;
     }
 
-    $added_media = $form_state->get('media') ?: [];
     $media_ids = array_map(function (MediaInterface $media) {
       return $media->id();
-    }, $added_media);
+    }, $this->getAddedMediaItems($form_state));
 
     // Get the render array for the media library. The media library state might
     // contain the 'media_library_content' when it has been opened from a
@@ -431,6 +568,39 @@ public function updateWidget(array &$form, FormStateInterface $form_state) {
     return $response;
   }
 
+  /**
+   * AJAX callback to send the new media item(s) to the calling code.
+   *
+   * @param array $form
+   *   The complete form.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current form state.
+   *
+   * @return array|\Drupal\Core\Ajax\AjaxResponse
+   *   The form array when there are form errors or a AJAX response to select
+   *   the created items in the media library.
+   */
+  public function updateWidget(array &$form, FormStateInterface $form_state) {
+    if ($form_state::hasAnyErrors()) {
+      return $form;
+    }
+
+    // Pass the selection to the field widget based on the current widget ID.
+    $opener_id = MediaLibraryState::fromRequest($this->getRequest())->getOpenerId();
+    if ($field_id = MediaLibraryWidget::getOpenerFieldId($opener_id)) {
+      // The added media items get an ID  when they are saved in ::submitForm().
+      // For that reason the added media items are keyed by delta in the form
+      // state and we have to do an array map to get each media ID.
+      $current_media_ids = array_map(function (MediaInterface $media) {
+        return $media->id();
+      }, $this->getCurrentMediaItems($form_state));
+      return (new AjaxResponse())
+        ->addCommand(new InvokeCommand("[data-media-library-widget-value=\"$field_id\"]", 'val', [implode(',', $current_media_ids)]))
+        ->addCommand(new InvokeCommand("[data-media-library-widget-update=\"$field_id\"]", 'trigger', ['mousedown']))
+        ->addCommand(new CloseDialogCommand());
+    }
+  }
+
   /**
    * Returns the name of the source field for a media type.
    *
@@ -446,4 +616,51 @@ protected function getSourceFieldName(MediaTypeInterface $media_type) {
       ->getName();
   }
 
+  /**
+   * Get all pre-selected media items from the form state.
+   *
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current form state.
+   *
+   * @return \Drupal\media\MediaInterface[]
+   *   An array containing the pre-selected media items keyed by ID.
+   */
+  protected function getPreSelectedMediaItems(FormStateInterface $form_state) {
+    $media_ids = array_filter(explode(',', $form_state->getValue('current_selection')));
+    if (!$media_ids) {
+      return [];
+    }
+    return $this->entityTypeManager->getStorage('media')->loadMultiple($media_ids);
+  }
+
+  /**
+   * Get all added media items from the form state.
+   *
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current form state.
+   *
+   * @return \Drupal\media\MediaInterface[]
+   *   An array containing the added media items keyed by delta. The media items
+   *   won't have an ID untill they are saved in ::submitForm().
+   */
+  protected function getAddedMediaItems(FormStateInterface $form_state) {
+    return $form_state->get('media') ?: [];
+  }
+
+  /**
+   * Get all pre-selected and added media items from the form state.
+   *
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current form state.
+   *
+   * @return \Drupal\media\MediaInterface[]
+   *   An array containing all pre-selected and added media items with
+   *   renumbered numeric keys.
+   */
+  protected function getCurrentMediaItems(FormStateInterface $form_state) {
+    $pre_selected_media = $this->getPreSelectedMediaItems($form_state);
+    $added_media = $form_state->get('media') ?: [];
+    return array_merge($pre_selected_media, $added_media);
+  }
+
 }
diff --git a/core/modules/media_library/src/Form/FileUploadForm.php b/core/modules/media_library/src/Form/FileUploadForm.php
index 6c1359779c..2a306b9ebe 100644
--- a/core/modules/media_library/src/Form/FileUploadForm.php
+++ b/core/modules/media_library/src/Form/FileUploadForm.php
@@ -189,6 +189,14 @@ public function validateUploadElement(array $element, FormStateInterface $form_s
    */
   public function processUploadElement(array $element, FormStateInterface $form_state) {
     $element['upload_button']['#submit'] = ['::uploadButtonSubmit'];
+    // Limit the validation errors to make sure
+    // FormValidator::handleErrorsWithLimitedValidation doesn't remove the
+    // current selection from the form state.
+    // @see Drupal\Core\Form\FormValidator::handleErrorsWithLimitedValidation()
+    $element['upload_button']['#limit_validation_errors'] = [
+      ['upload'],
+      ['current_selection'],
+    ];
     $element['upload_button']['#ajax'] = [
       'callback' => '::updateFormCallback',
       'wrapper' => 'media-library-wrapper',
diff --git a/core/modules/media_library/src/Plugin/views/field/MediaLibrarySelectForm.php b/core/modules/media_library/src/Plugin/views/field/MediaLibrarySelectForm.php
index c2067660e8..eee27e09de 100644
--- a/core/modules/media_library/src/Plugin/views/field/MediaLibrarySelectForm.php
+++ b/core/modules/media_library/src/Plugin/views/field/MediaLibrarySelectForm.php
@@ -97,7 +97,8 @@ public function viewsForm(array &$form, FormStateInterface $form_state) {
       'callback' => [static::class, 'updateWidget'],
     ];
 
-    $form['actions']['submit']['#value'] = $this->t('Select media');
+    $form['actions']['submit']['#value'] = $this->t('Insert selected');
+    $form['actions']['submit']['#button_type'] = 'primary';
     $form['actions']['submit']['#field_id'] = $selection_field_id;
     $form['actions']['submit']['#attributes'] = [
       'class' => ['media-library-select'],
diff --git a/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php b/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php
index 9e25b53eb7..f2a4afafbe 100644
--- a/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php
+++ b/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php
@@ -316,7 +316,7 @@ public function testWidget() {
     $assert_session->elementNotExists('css', '.media-library-view .media-library-item--table');
     // Assert the 'Apply filter' button is not moved to the button pane.
     $button_pane = $assert_session->elementExists('css', '.ui-dialog-buttonpane');
-    $assert_session->buttonExists('Select media', $button_pane);
+    $assert_session->buttonExists('Insert selected', $button_pane);
     $assert_session->buttonNotExists('Apply filters', $button_pane);
     $assert_session->linkExists('Grid');
     $page->clickLink('Table');
@@ -326,7 +326,7 @@ public function testWidget() {
     $this->assertNotEmpty($assert_session->waitForElementVisible('css', '.media-library-view .media-library-item--table'));
     $assert_session->elementNotExists('css', '.media-library-view .media-library-item--grid');
     // Assert the 'Apply filter' button is not moved to the button pane.
-    $assert_session->buttonExists('Select media', $button_pane);
+    $assert_session->buttonExists('Insert selected', $button_pane);
     $assert_session->buttonNotExists('Apply filters', $button_pane);
     $assert_session->pageTextContains('Dog');
     $assert_session->pageTextContains('Bear');
@@ -354,7 +354,7 @@ public function testWidget() {
     $assert_session->linkExists('Grid');
     $assert_session->linkExists('Table');
     // Select the item.
-    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Select media');
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected');
     $assert_session->assertWaitOnAjaxRequest();
     // Ensure that the selection completed successfully.
     $assert_session->pageTextNotContains('Add or select media');
@@ -434,7 +434,7 @@ public function testWidget() {
     $this->assertTrue($checkboxes[2]->hasAttribute('disabled'));
     $this->assertTrue($checkboxes[3]->hasAttribute('disabled'));
     // Select the items.
-    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Select media');
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected');
     $assert_session->assertWaitOnAjaxRequest();
 
     // Ensure that the selection completed successfully.
@@ -456,7 +456,7 @@ public function testWidget() {
     $assert_session->assertWaitOnAjaxRequest();
     $checkboxes = $page->findAll('css', '.media-library-view .js-click-to-select-checkbox input');
     $checkboxes[0]->click();
-    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Select media');
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected');
     $assert_session->assertWaitOnAjaxRequest();
     $assert_session->pageTextContains('Dog');
     $assert_session->pageTextNotContains('Cat');
@@ -531,7 +531,7 @@ public function testWidget() {
     $checkboxes[1]->click();
     $checkboxes[2]->click();
     $checkboxes[3]->click();
-    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Select media');
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected');
     $assert_session->assertWaitOnAjaxRequest();
     $assert_session->pageTextContains('Dog');
     $assert_session->pageTextContains('Cat');
@@ -574,7 +574,7 @@ public function testWidgetAnonymous() {
 
     // Select the first media item (should be Dog).
     $page->find('css', '.media-library-view .js-click-to-select-checkbox input')->click();
-    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Select media');
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected');
     $assert_session->assertWaitOnAjaxRequest();
 
     // Ensure that the selection completed successfully.
@@ -661,10 +661,8 @@ public function testWidgetUpload() {
     $assert_session->elementExists('css', '.media-library-open-button[href*="field_twin_media"]')->click();
     $assert_session->assertWaitOnAjaxRequest();
     $assert_session->pageTextContains('Add or select media');
-
     // Assert the default tab for media type one does not have an upload form.
     $assert_session->fieldNotExists('files[upload][]');
-
     // Assert we can upload a file to media type three.
     $page->clickLink('Type Three');
     $assert_session->assertWaitOnAjaxRequest();
@@ -672,38 +670,38 @@ public function testWidgetUpload() {
     $assert_session->elementNotExists('css', '.media-library-add-form--with-input');
     $page->attachFileToField('Add files', $this->container->get('file_system')->realpath($png_image->uri));
     $assert_session->assertWaitOnAjaxRequest();
+    $this->assertJsCondition('jQuery("#media-library-add-form-wrapper .media-library-add-form-media").is(":focus")');
+    $assert_session->pageTextContains('The media item has been created. Fill in any required fields and save to add it to the media library.');
+    $this->assertSame('Added media items', $assert_session->elementExists('css', '.media-library-add-form-media')->getAttribute('aria-label'));
     $assert_session->elementExists('css', '.media-library-add-form--with-input');
     $assert_session->elementNotExists('css', '.media-library-add-form--without-input');
-
+    // We do not have a pre-selected items, so the container should not be added
+    // to the form.
+    $assert_session->elementNotExists('css', '.media-library-add-form-selection');
     // Files are temporary until the form is saved.
     $files = $file_storage->loadMultiple();
     $file = array_pop($files);
     $this->assertSame('public://type-three-dir', $file_system->dirname($file->getFileUri()));
     $this->assertTrue($file->isTemporary());
-
     // Assert the revision_log_message field is not shown.
     $upload_form = $assert_session->elementExists('css', '.media-library-add-form');
     $assert_session->fieldNotExists('Revision log message', $upload_form);
-
     // Assert the name field contains the filename and the alt text is required.
     $assert_session->fieldValueEquals('Name', $png_image->filename);
-    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save');
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save and select');
     $assert_session->assertWaitOnAjaxRequest();
     $assert_session->pageTextContains('Alternative text field is required');
     $page->fillField('Alternative text', $this->randomString());
-    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save');
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save and select');
     $assert_session->assertWaitOnAjaxRequest();
-
     // The file should be permanent now.
     $files = $file_storage->loadMultiple();
     $file = array_pop($files);
     $this->assertFalse($file->isTemporary());
-
     // Load the created media item.
     $media_storage = $this->container->get('entity_type.manager')->getStorage('media');
     $media_items = $media_storage->loadMultiple();
     $added_media = array_pop($media_items);
-
     // Ensure the media item was saved to the library and automatically
     // selected. The added media items should be in the first position of the
     // add form.
@@ -712,42 +710,66 @@ public function testWidgetUpload() {
     $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id());
     $assert_session->checkboxChecked('media_library_select_form[0]');
     $assert_session->pageTextContains('1 of 2 items selected');
-
+    $assert_session->hiddenFieldValueEquals('current_selection', $added_media->id());
     // Ensure the created item is added in the widget.
-    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Select media');
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected');
     $assert_session->assertWaitOnAjaxRequest();
     $assert_session->pageTextNotContains('Add or select media');
     $assert_session->pageTextContains($png_image->filename);
 
+    // Remove the item.
+    $assert_session->elementExists('css', '.media-library-item__remove')->click();
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->pageTextNotContains($png_image->filename);
+
+    // Assert we can also directly insert uploaded files in the widget.
+    $assert_session->elementExists('css', '.media-library-open-button[href*="field_twin_media"]')->click();
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->pageTextContains('Add or select media');
+    $page->clickLink('Type Three');
+    $assert_session->assertWaitOnAjaxRequest();
+    $png_uri_2 = $file_system->copy($png_image->uri);
+    $page->attachFileToField('Add files', $this->container->get('file_system')->realpath($png_uri_2));
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->fillField('Alternative text', $this->randomString());
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save and insert');
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->pageTextNotContains('Add or select media');
+    $assert_session->pageTextContains($file_system->basename($png_uri_2));
+
     // Also make sure that we can upload to the unlimited cardinality field.
     $assert_session->elementExists('css', '.media-library-open-button[href*="field_unlimited_media"]')->click();
     $assert_session->assertWaitOnAjaxRequest();
     $assert_session->pageTextContains('Add or select media');
-
-    // Navigate to the media type three tab first.
     $page->clickLink('Type Three');
     $assert_session->assertWaitOnAjaxRequest();
 
-    // Select a media item.
-    $page->find('css', '.media-library-view .js-click-to-select-checkbox input')->click();
+    // Select a media item to check if the selection is persisted when adding
+    // new items.
+    $existing_media_name = $file_system->basename($png_uri_2);
+    $checkbox = $page->findField("Select $existing_media_name");
+    $selected_item_id = $checkbox->getAttribute('value');
+    $checkbox->click();
     $assert_session->pageTextContains('1 item selected');
-
+    $assert_session->hiddenFieldValueEquals('current_selection', $selected_item_id);
     // Multiple uploads should be allowed.
     // @todo Add test when https://github.com/minkphp/Mink/issues/358 is closed
     $this->assertTrue($assert_session->fieldExists('Add files')->hasAttribute('multiple'));
-
-    $page->attachFileToField('Add files', $this->container->get('file_system')->realpath($png_image->uri));
+    $png_uri_3 = $file_system->copy($png_image->uri);
+    $page->attachFileToField('Add files', $this->container->get('file_system')->realpath($png_uri_3));
     $assert_session->assertWaitOnAjaxRequest();
+    $selection_area = $assert_session->elementExists('css', '.media-library-add-form-selection');
+    $this->assertSame('Selected media items', $selection_area->getAttribute('aria-label'));
+    $assert_session->checkboxChecked("Select $existing_media_name", $selection_area);
     $page->fillField('Name', 'Unlimited Cardinality Image');
     $page->fillField('Alternative text', $this->randomString());
-    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save');
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save and select');
     $assert_session->assertWaitOnAjaxRequest();
-
     // Load the created media item.
     $media_storage = $this->container->get('entity_type.manager')->getStorage('media');
     $media_items = $media_storage->loadMultiple();
     $added_media = array_pop($media_items);
-
+    $added_media_name = $added_media->label();
     // Ensure the media item was saved to the library and automatically
     // selected. The added media items should be in the first position of the
     // add form.
@@ -755,69 +777,101 @@ public function testWidgetUpload() {
     $assert_session->pageTextContains('Unlimited Cardinality Image');
     $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id());
     $assert_session->checkboxChecked('media_library_select_form[0]');
-
     // Assert the item that was selected before uploading the file is still
     // selected.
     $assert_session->pageTextContains('2 items selected');
+    $assert_session->checkboxChecked("Select $added_media_name");
+    $assert_session->checkboxChecked("Select $existing_media_name");
+    $assert_session->hiddenFieldValueEquals('current_selection', implode(',', [$selected_item_id, $added_media->id()]));
     $checkboxes = $page->findAll('css', '.media-library-view .js-click-to-select-checkbox input');
     $selected_checkboxes = [];
     foreach ($checkboxes as $checkbox) {
       if ($checkbox->isChecked()) {
-        $selected_checkboxes[] = $checkbox->getValue();
+        $selected_checkboxes[] = $checkbox->getAttribute('value');
       }
     }
     $this->assertCount(2, $selected_checkboxes);
-
     // Ensure the created item is added in the widget.
-    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Select media');
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected');
     $assert_session->assertWaitOnAjaxRequest();
     $assert_session->pageTextNotContains('Add or select media');
     $assert_session->pageTextContains('Unlimited Cardinality Image');
 
-    // Verify we can only upload the files allowed by the media type.
+    // Assert we can now only upload one more media item.
     $assert_session->elementExists('css', '.media-library-open-button[href*="field_twin_media"]')->click();
     $assert_session->assertWaitOnAjaxRequest();
     $assert_session->pageTextContains('Add or select media');
     $page->clickLink('Type Four');
     $assert_session->assertWaitOnAjaxRequest();
-
-    // Assert we can now only upload one more media item.
     $this->assertFalse($assert_session->fieldExists('Add file')->hasAttribute('multiple'));
     $assert_session->pageTextContains('One file only.');
 
     // Assert media type four should only allow jpg files by trying a png file
     // first.
-    $page->attachFileToField('Add file', $file_system->realpath($png_image->uri));
+    $png_uri_4 = $file_system->copy($png_image->uri);
+    $page->attachFileToField('Add file', $file_system->realpath($png_uri_4));
     $assert_session->assertWaitOnAjaxRequest();
     $assert_session->pageTextContains('Only files with the following extensions are allowed');
-
     // Assert that jpg files are accepted by type four.
-    $page->attachFileToField('Add file', $file_system->realpath($jpg_image->uri));
+    $jpg_uri_2 = $file_system->copy($jpg_image->uri);
+    $page->attachFileToField('Add file', $file_system->realpath($jpg_uri_2));
     $assert_session->assertWaitOnAjaxRequest();
     $page->fillField('Alternative text', $this->randomString());
-
     // The type_four media type has another optional image field.
     $assert_session->pageTextContains('Extra Image');
-    $page->attachFileToField('Extra Image', $this->container->get('file_system')->realpath($jpg_image->uri));
+    $jpg_uri_3 = $file_system->copy($jpg_image->uri);
+    $page->attachFileToField('Extra Image', $this->container->get('file_system')->realpath($jpg_uri_3));
     $assert_session->assertWaitOnAjaxRequest();
     // Ensure that the extra image was uploaded to the correct directory.
     $files = $file_storage->loadMultiple();
     $file = array_pop($files);
     $this->assertSame('public://type-four-extra-dir', $file_system->dirname($file->getFileUri()));
-
-    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save');
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save and select');
     $assert_session->assertWaitOnAjaxRequest();
-
     // Ensure the media item was saved to the library and automatically
     // selected.
     $assert_session->pageTextContains('Add or select media');
-    $assert_session->pageTextContains($jpg_image->filename);
-
+    $assert_session->pageTextContains($file_system->basename($jpg_uri_2));
     // Ensure the created item is added in the widget.
-    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Select media');
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected');
     $assert_session->assertWaitOnAjaxRequest();
     $assert_session->pageTextNotContains('Add or select media');
-    $assert_session->pageTextContains($jpg_image->filename);
+    $assert_session->pageTextContains($file_system->basename($jpg_uri_2));
+
+    // Assert we can also remove selected items from the selection area in the
+    // upload form.
+    $assert_session->elementExists('css', '.media-library-open-button[href*="field_unlimited_media"]')->click();
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->pageTextContains('Add or select media');
+    $page->clickLink('Type Three');
+    $assert_session->assertWaitOnAjaxRequest();
+    $checkbox = $page->findField("Select $existing_media_name");
+    $selected_item_id = $checkbox->getAttribute('value');
+    $checkbox->click();
+    $assert_session->hiddenFieldValueEquals('current_selection', $selected_item_id);
+    $this->assertTrue($assert_session->fieldExists('Add files')->hasAttribute('multiple'));
+    $png_uri_5 = $file_system->copy($png_image->uri);
+    $page->attachFileToField('Add files', $this->container->get('file_system')->realpath($png_uri_5));
+    $assert_session->assertWaitOnAjaxRequest();
+    $selection_area = $assert_session->elementExists('css', '.media-library-add-form-selection');
+    $assert_session->checkboxChecked("Select $existing_media_name", $selection_area);
+    $page->uncheckField("Select $existing_media_name");
+    $page->fillField('Alternative text', $this->randomString());
+    $assert_session->hiddenFieldValueEquals('current_selection', '');
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save and select');
+    $assert_session->assertWaitOnAjaxRequest();
+    $media_storage = $this->container->get('entity_type.manager')->getStorage('media');
+    $media_items = $media_storage->loadMultiple();
+    $added_media = array_pop($media_items);
+    $added_media_name = $added_media->label();
+    $assert_session->pageTextContains('1 item selected');
+    $assert_session->checkboxChecked("Select $added_media_name");
+    $assert_session->checkboxNotChecked("Select $existing_media_name");
+    $assert_session->hiddenFieldValueEquals('current_selection', $added_media->id());
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected');
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->pageTextNotContains('Add or select media');
+    $assert_session->pageTextContains($file_system->basename($png_uri_5));
   }
 
   /**
@@ -827,9 +881,11 @@ public function testWidgetOEmbed() {
     $assert_session = $this->assertSession();
     $page = $this->getSession()->getPage();
 
-    $video_title = "Everyday I'm Drupalin' Drupal Rap (Rick Ross - Hustlin)";
-    $video_url = 'https://www.youtube.com/watch?v=PWjcqE3QKBg';
-    ResourceController::setResourceUrl($video_url, $this->getFixturesDirectory() . '/video_youtube.json');
+    $youtube_title = "Everyday I'm Drupalin' Drupal Rap (Rick Ross - Hustlin)";
+    $youtube_url = 'https://www.youtube.com/watch?v=PWjcqE3QKBg';
+    $vimeo_title = "Drupal Rap Video - Schipulcon09";
+    $vimeo_url = 'https://vimeo.com/7073899';
+    ResourceController::setResourceUrl($youtube_url, $this->getFixturesDirectory() . '/video_youtube.json');
 
     // Visit a node create page.
     $this->drupalGet('node/add/basic_page');
@@ -850,13 +906,13 @@ public function testWidgetOEmbed() {
     // Assert we can add an oEmbed video to media type five.
     $page->clickLink('Type Five');
     $assert_session->assertWaitOnAjaxRequest();
-    $page->fillField('Add Type Five via URL', $video_url);
+    $page->fillField('Add Type Five via URL', $youtube_url);
     $assert_session->pageTextContains('Allowed providers: YouTube, Vimeo.');
     $page->pressButton('Add');
     $assert_session->assertWaitOnAjaxRequest();
     // Assert the name field contains the remote video title.
-    $assert_session->fieldValueEquals('Name', $video_title);
-    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save');
+    $assert_session->fieldValueEquals('Name', $youtube_title);
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save and select');
     $assert_session->assertWaitOnAjaxRequest();
 
     // Load the created media item.
@@ -868,15 +924,15 @@ public function testWidgetOEmbed() {
     // selected. The added media items should be in the first position of the
     // add form.
     $assert_session->pageTextContains('Add or select media');
-    $assert_session->pageTextContains($video_title);
+    $assert_session->pageTextContains($youtube_title);
     $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id());
     $assert_session->checkboxChecked('media_library_select_form[0]');
 
     // Assert the created oEmbed video is correctly added to the widget.
-    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Select media');
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected');
     $assert_session->assertWaitOnAjaxRequest();
     $assert_session->pageTextNotContains('Add or select media');
-    $assert_session->pageTextContains($video_title);
+    $assert_session->pageTextContains($youtube_title);
 
     // Open the media library again for the unlimited field and go to the tab
     // for media type five.
@@ -887,7 +943,7 @@ public function testWidgetOEmbed() {
     $assert_session->assertWaitOnAjaxRequest();
 
     // Assert the video is available on the tab.
-    $assert_session->pageTextContains($video_title);
+    $assert_session->pageTextContains($youtube_title);
 
     // Assert we can only add supported URLs.
     $page->fillField('Add Type Five via URL', 'https://www.youtube.com/');
@@ -902,21 +958,101 @@ public function testWidgetOEmbed() {
     $assert_session->assertWaitOnAjaxRequest();
     $assert_session->pageTextContains('Could not retrieve the oEmbed resource.');
 
+    // Select a media item to check if the selection is persisted when adding
+    // new items.
+    $checkbox = $page->findField("Select $youtube_title");
+    $selected_item_id = $checkbox->getAttribute('value');
+    $checkbox->click();
+    $assert_session->pageTextContains('1 item selected');
+    $assert_session->hiddenFieldValueEquals('current_selection', $selected_item_id);
+
     // Assert we can add a oEmbed video with a custom name.
-    $page->fillField('Add Type Five via URL', $video_url);
+    $page->fillField('Add Type Five via URL', $youtube_url);
     $page->pressButton('Add');
     $assert_session->assertWaitOnAjaxRequest();
     $page->fillField('Name', 'Custom video title');
-    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save');
+    $selection_area = $assert_session->elementExists('css', '.media-library-add-form-selection');
+    $assert_session->checkboxChecked("Select $youtube_title", $selection_area);
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save and select');
     $assert_session->assertWaitOnAjaxRequest();
+
+    // Load the created media item.
+    $media_storage = $this->container->get('entity_type.manager')->getStorage('media');
+    $media_items = $media_storage->loadMultiple();
+    $added_media = array_pop($media_items);
+    // Ensure the media item was saved to the library and automatically
+    // selected. The added media items should be in the first position of the
+    // add form.
     $assert_session->pageTextContains('Add or select media');
     $assert_session->pageTextContains('Custom video title');
-
-    // Assert the created oEmbed video is correctly added to the widget.
-    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Select media');
+    $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id());
+    $assert_session->checkboxChecked('media_library_select_form[0]');
+    // Assert the item that was selected before uploading the file is still
+    // selected.
+    $assert_session->pageTextContains('2 items selected');
+    $assert_session->checkboxChecked("Select Custom video title");
+    $assert_session->checkboxChecked("Select $youtube_title");
+    $assert_session->hiddenFieldValueEquals('current_selection', implode(',', [$selected_item_id, $added_media->id()]));
+    $checkboxes = $page->findAll('css', '.media-library-view .js-click-to-select-checkbox input');
+    $selected_checkboxes = [];
+    foreach ($checkboxes as $checkbox) {
+      if ($checkbox->isChecked()) {
+        $selected_checkboxes[] = $checkbox->getAttribute('value');
+      }
+    }
+    $this->assertCount(2, $selected_checkboxes);
+    // Ensure the created item is added in the widget.
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected');
     $assert_session->assertWaitOnAjaxRequest();
     $assert_session->pageTextNotContains('Add or select media');
     $assert_session->pageTextContains('Custom video title');
+
+    // Assert we can directly insert added oEmbed media in the widget.
+    $assert_session->elementExists('css', '.media-library-open-button[href*="field_unlimited_media"]')->click();
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->pageTextContains('Add or select media');
+    $page->clickLink('Type Five');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->fillField('Add Type Five via URL', $vimeo_url);
+    $page->pressButton('Add');
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save and insert');
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->pageTextNotContains('Add or select media');
+    $assert_session->pageTextContains($vimeo_title);
+
+    // Assert we can remove selected items from the selection area in the oEmbed
+    // form.
+    $assert_session->elementExists('css', '.media-library-open-button[href*="field_unlimited_media"]')->click();
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->pageTextContains('Add or select media');
+    $page->clickLink('Type Five');
+    $assert_session->assertWaitOnAjaxRequest();
+    $checkbox = $page->findField("Select $vimeo_title");
+    $selected_item_id = $checkbox->getAttribute('value');
+    $checkbox->click();
+    $assert_session->hiddenFieldValueEquals('current_selection', $selected_item_id);
+    $page->fillField('Add Type Five via URL', $youtube_url);
+    $page->pressButton('Add');
+    $assert_session->assertWaitOnAjaxRequest();
+    $page->fillField('Name', 'Another video');
+    $selection_area = $assert_session->elementExists('css', '.media-library-add-form-selection');
+    $assert_session->checkboxChecked("Select $vimeo_title", $selection_area);
+    $page->uncheckField("Select $vimeo_title");
+    $assert_session->hiddenFieldValueEquals('current_selection', '');
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save and select');
+    $assert_session->assertWaitOnAjaxRequest();
+    $media_storage = $this->container->get('entity_type.manager')->getStorage('media');
+    $media_items = $media_storage->loadMultiple();
+    $added_media = array_pop($media_items);
+    $assert_session->pageTextContains('1 item selected');
+    $assert_session->checkboxChecked('Select Another video');
+    $assert_session->checkboxNotChecked("Select $vimeo_title");
+    $assert_session->hiddenFieldValueEquals('current_selection', $added_media->id());
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected');
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->pageTextNotContains('Add or select media');
+    $assert_session->pageTextContains('Another video');
   }
 
 }
