diff --git a/core/modules/media_library/src/Plugin/Field/FieldWidget/MediaLibraryWidget.php b/core/modules/media_library/src/Plugin/Field/FieldWidget/MediaLibraryWidget.php
index e612c3e4f4..fee8860403 100644
--- a/core/modules/media_library/src/Plugin/Field/FieldWidget/MediaLibraryWidget.php
+++ b/core/modules/media_library/src/Plugin/Field/FieldWidget/MediaLibraryWidget.php
@@ -320,6 +320,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
       '#attached' => [
         'library' => ['media_library/widget'],
       ],
+      '#element_validate' => [[static::class, 'validateElement']],
     ];
 
     // When the list of allowed types in the field configuration is null,
@@ -534,7 +535,8 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
       '#validate' => [[static::class, 'validateItems']],
       '#submit' => [[static::class, 'addItems']],
       // Prevent errors in other widgets from preventing updates.
-      '#limit_validation_errors' => $limit_validation_errors,
+      // Exclude other validations in case there is no data yet.
+      '#limit_validation_errors' => !empty($referenced_entities) ? $limit_validation_errors : [],
     ];
 
     return $element;
@@ -736,6 +738,47 @@ public static function openMediaLibrary(array $form, FormStateInterface $form_st
       ->addCommand(new OpenModalDialogCommand($dialog_options['title'], $library_ui, $dialog_options));
   }
 
+  /**
+   * Validation checks on the element level.
+   *
+   * @param $element
+   *  The form element.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *  The form state.
+   * @param array $form
+   *  The form array.
+   */
+  public static function validateElement($element, FormStateInterface $form_state, array $form) {
+    $media = static::getNewMediaItems($element, $form_state);
+    // Mark the field as required if there is no existing or new media
+    // and this does not concern a remove call.
+    if (empty($media)
+      && !isset($element['selection'][0])
+      && $element['#required'] === TRUE
+      && !in_array([static::class, 'removeItem'], $form_state->getSubmitHandlers())) {
+      $form_state->setError($element, \Drupal::translation()->translate('Please select an item from the media library.'));
+
+      return;
+    }
+
+    if (!in_array([static::class, 'removeItem'], $form_state->getSubmitHandlers())) {
+      $field_state = static::getFieldState($element, $form_state);
+
+      // Ensure 1 target_id exists to avoid future validation errors.
+      if (count($field_state['items']) === 0) {
+        foreach ($media as $media_item) {
+          // Any ID can be passed to the widget, so we have to check access.
+          if ($media_item->access('view')) {
+            $field_state['items'][] = [
+              'target_id' => $media_item->id(),
+            ];
+          }
+        }
+      }
+      static::setFieldState($element, $form_state, $field_state);
+    }
+  }
+
   /**
    * Validates that newly selected items can be added to the widget.
    *
diff --git a/core/modules/media_library/tests/modules/media_library_test_widget/config/schema/media_library_test_widget.schema.yml b/core/modules/media_library/tests/modules/media_library_test_widget/config/schema/media_library_test_widget.schema.yml
new file mode 100644
index 0000000000..81186253e1
--- /dev/null
+++ b/core/modules/media_library/tests/modules/media_library_test_widget/config/schema/media_library_test_widget.schema.yml
@@ -0,0 +1,10 @@
+field.widget.settings.media_library_inception_widget:
+  type: mapping
+  label: 'Media library inception widget settings'
+  mapping:
+    media_types:
+      type: sequence
+      label: 'Allowed media types, in display order'
+      sequence:
+        type: string
+        label: 'Media type ID'
diff --git a/core/modules/media_library/tests/modules/media_library_test_widget/media_library_test_widget.info.yml b/core/modules/media_library/tests/modules/media_library_test_widget/media_library_test_widget.info.yml
new file mode 100644
index 0000000000..fe6cac86a5
--- /dev/null
+++ b/core/modules/media_library/tests/modules/media_library_test_widget/media_library_test_widget.info.yml
@@ -0,0 +1,9 @@
+name: 'Media Library test widget'
+type: module
+description: 'Test widget that has a nested media library widget'
+package: Testing
+core: 8.x
+dependencies:
+  - drupal:image
+  - drupal:media_library
+  - drupal:media_test_source
diff --git a/core/modules/media_library/tests/modules/media_library_test_widget/media_library_test_widget.module b/core/modules/media_library/tests/modules/media_library_test_widget/media_library_test_widget.module
new file mode 100644
index 0000000000..69bbbc376c
--- /dev/null
+++ b/core/modules/media_library/tests/modules/media_library_test_widget/media_library_test_widget.module
@@ -0,0 +1,13 @@
+<?php
+
+use \Drupal\Core\Form\FormStateInterface;
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ */
+function media_library_test_widget_form_alter(&$form, FormStateInterface $form_state, $form_id) {
+  $stop = 'here';
+  // entity_test_entity_test_form 2x
+  // node_article_form
+  //media_library_add_form
+}
diff --git a/core/modules/media_library/tests/modules/media_library_test_widget/src/Plugin/Field/FieldWidget/MediaLibraryInceptionWidget.php b/core/modules/media_library/tests/modules/media_library_test_widget/src/Plugin/Field/FieldWidget/MediaLibraryInceptionWidget.php
new file mode 100644
index 0000000000..8bb08c415e
--- /dev/null
+++ b/core/modules/media_library/tests/modules/media_library_test_widget/src/Plugin/Field/FieldWidget/MediaLibraryInceptionWidget.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace Drupal\media_library_test_widget\Plugin\Field\FieldWidget;
+
+use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Entity\Entity\EntityFormDisplay;
+use Drupal\media_library\Plugin\Field\FieldWidget\MediaLibraryWidget;
+
+/**
+ * Plugin implementation of the 'media_library_inception_widget' widget.
+ *
+ * This widget is used to simulate the media library widget nested inside
+ * another widget that performs validation of required fields before there is
+ * an opportunity to add media.
+ *
+ * @FieldWidget(
+ *   id = "media_library_inception_widget",
+ *   label = @Translation("Media library inception widget"),
+ *   description = @Translation("Puts a widget in a widget for testing purposes"),
+ *   field_types = {
+ *     "entity_reference"
+ *   },
+ *   multiple_values = TRUE,
+ * )
+ */
+class MediaLibraryInceptionWidget extends MediaLibraryWidget {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
+    $element['#element_validate'][] = [$this, 'elementValidate'];
+    return parent::formElement($items, $delta, $element, $form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function elementValidate($element, FormStateInterface $form_state, $form) {
+    $field_name = $element['#field_name'];
+    $entity = $form_state->getFormObject()->getEntity();
+    $input = $form_state->getUserInput();
+    if (!empty($input['_triggering_element_name']) && strpos($input['_triggering_element_name'], 'media-library-update') !== FALSE) {
+      // This will validate a required field before an upload is completed.
+      $display = EntityFormDisplay::collectRenderDisplay($entity, 'edit');
+      $display->extractFormValues($entity, $form, $form_state);
+      $display->validateFormValues($entity, $form, $form_state);
+    }
+    $form_value = $form_state->getValue($field_name);
+    if (!empty($form_value['media_library_selection'])) {
+      $entity->set($field_name, $form_value['media_library_selection']);
+    }
+  }
+
+}
diff --git a/core/modules/media_library/tests/src/FunctionalJavascript/EmbeddedFormWidgetTest.php b/core/modules/media_library/tests/src/FunctionalJavascript/EmbeddedFormWidgetTest.php
new file mode 100644
index 0000000000..da28420160
--- /dev/null
+++ b/core/modules/media_library/tests/src/FunctionalJavascript/EmbeddedFormWidgetTest.php
@@ -0,0 +1,106 @@
+<?php
+
+namespace Drupal\Tests\media_library\FunctionalJavascript;
+
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
+use Drupal\Tests\TestFileCreationTrait;
+
+/**
+ * Tests media widget nested inside another widget.
+ */
+class EmbeddedFormWidgetTest extends WebDriverTestBase {
+
+  use TestFileCreationTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'media_library',
+    'media_library_test',
+    'media_library_test_widget',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $display_repository = $this->container->get('entity_display.repository');
+
+    FieldStorageConfig::create([
+      'field_name' => 'media_image_field',
+      'entity_type' => 'node',
+      'type' => 'entity_reference',
+      'settings' => [
+        'target_type' => 'media',
+        'required' => TRUE,
+      ],
+    ])->save();
+
+    FieldConfig::create([
+      'label' => 'A Media Image Field',
+      'field_name' => 'media_image_field',
+      'entity_type' => 'node',
+      'bundle' => 'basic_page',
+      'field_type' => 'entity_reference',
+      'required' => TRUE,
+      'settings' => [
+        'handler_settings' => [
+          'target_bundles' => [
+            'type_three' => 'type_three',
+          ],
+        ],
+      ],
+    ])->save();
+
+
+    $display_repository->getFormDisplay('node', 'basic_page')
+      ->setComponent('media_image_field', [
+        'type' => 'media_library_inception_widget',
+        'region' => 'content',
+        'settings' => [
+          'media_types' => ['type_three'],
+        ],
+      ])
+      ->save();
+
+    $user = $this->drupalCreateUser([
+      'access content',
+      'access media overview',
+      'edit own basic_page content',
+      'create basic_page content',
+      'create media',
+      'view media',
+    ]);
+    $this->drupalLogin($user);
+  }
+
+  /**
+   * Test media inside another widget that validates too enthusiastically.
+   */
+  public function testEmbeddedFormWidget() {
+    $page = $this->getSession()->getPage();
+    $assert_session = $this->assertSession();
+
+    foreach ($this->getTestFiles('image') as $image) {
+      $extension = pathinfo($image->filename, PATHINFO_EXTENSION);
+      if ($extension === 'jpg') {
+        $jpg_image = $image;
+      }
+    }
+
+    $this->drupalGet('node/add/basic_page');
+    $assert_session->elementExists('css', '.media-library-open-button[name="media_image_field-media-library-open-button"]')->click();
+    $this->assertTrue($assert_session->waitForText('Add or select media'));
+    $page->attachFileToField('Add file', $this->container->get('file_system')->realpath($jpg_image->uri));
+    $this->assertTrue($assert_session->waitForText('Alternative text'));
+    $page->fillField('Alternative text', $this->randomString());
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save and insert');
+    $this->assertTrue($assert_session->waitForText($jpg_image->filename));
+  }
+
+}
diff --git a/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php b/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php
index b8c5ba751e..cfe783c81e 100644
--- a/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php
+++ b/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php
@@ -143,7 +143,6 @@ public function testAdministrationPage() {
 
     // Test empty text.
     $assert_session->pageTextContains('No media available.');
-
     // Verify that the "Table" link is present, click it and check address.
     $assert_session->linkExists('Table');
     $page->clickLink('Table');
