diff --git a/entity_browser.info.yml b/entity_browser.info.yml
index eb399f6..e571192 100644
--- a/entity_browser.info.yml
+++ b/entity_browser.info.yml
@@ -7,6 +7,6 @@ test_dependencies:
   - ctools:ctools
   - token:token
   - inline_entity_form:inline_entity_form
-  - media_entity:media_entity
+  - drupal:media (>= 8.4)
   - paragraphs:paragraphs
 configure: entity.entity_browser.collection
diff --git a/entity_browser.install b/entity_browser.install
index dce49e2..7e8f649 100644
--- a/entity_browser.install
+++ b/entity_browser.install
@@ -6,6 +6,38 @@
  */
 
 /**
+ * Implements hook_requirements().
+ */
+function entity_browser_requirements($phase) {
+  $requirements = [];
+
+  // This branch of Entity Browser shouldn't be used with core < 8.4.x or with
+  // media_entity 1.x enabled.
+  $incompatible = FALSE;
+  $drupal_version = explode('.', \Drupal::VERSION);
+  if ($drupal_version[1] < 4) {
+    $incompatible = TRUE;
+  }
+  elseif (\Drupal::moduleHandler()->moduleExists('media_entity')) {
+    $info = system_get_info('module', 'media_entity');
+    if (version_compare($info['version'], '8.x-2') < 0) {
+      $incompatible = TRUE;
+    }
+  }
+
+  if ($incompatible) {
+    $requirements['entity_browser_media'] = [
+      'title' => t('Entity Browser'),
+      'value' => t('This branch of Entity Browser is not compatible with the version of Media Entity installed.'),
+      'description' => t('This branch of Entity Browser is not compatible with the version of Media Entity installed.'),
+      'severity' => REQUIREMENT_ERROR,
+    ];
+  }
+
+  return $requirements;
+}
+
+/**
  * Updates submit text for existing Entity browsers.
  */
 function entity_browser_update_8001() {
diff --git a/src/Plugin/EntityBrowser/Widget/MediaImageUpload.php b/src/Plugin/EntityBrowser/Widget/MediaImageUpload.php
new file mode 100644
index 0000000..5baf1c8
--- /dev/null
+++ b/src/Plugin/EntityBrowser/Widget/MediaImageUpload.php
@@ -0,0 +1,133 @@
+<?php
+
+namespace Drupal\entity_browser\Plugin\EntityBrowser\Widget;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Url;
+use Drupal\entity_browser\Plugin\EntityBrowser\Widget\Upload as FileUpload;
+use Drupal\media\MediaInterface;
+
+/**
+ * Uses upload to create media images.
+ *
+ * @EntityBrowserWidget(
+ *   id = "media_image_upload",
+ *   label = @Translation("Upload images as media items"),
+ *   description = @Translation("Upload widget that will create media entities of the uploaded images."),
+ *   auto_select = FALSE
+ * )
+ */
+class MediaImageUpload extends FileUpload {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return [
+      'extensions' => 'jpg jpeg png gif',
+      'media_type' => NULL,
+    ] + parent::defaultConfiguration();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getForm(array &$original_form, FormStateInterface $form_state, array $aditional_widget_parameters) {
+    /** @var \Drupal\media\MediaTypeInterface $media_type */
+    if (!$this->configuration['media_type'] || !($media_type = $this->entityTypeManager->getStorage('media_type')->load($this->configuration['media_type']))) {
+      return ['#markup' => $this->t('The media type is not configured correctly.')];
+    }
+
+    if ($media_type->getSource()->getPluginId() != 'image') {
+      return ['#markup' => $this->t('The configured media type is not using the image plugin.')];
+    }
+
+    $form = parent::getForm($original_form, $form_state, $aditional_widget_parameters);
+    $form['upload']['#upload_validators']['file_validate_extensions'] = [$this->configuration['extensions']];
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function prepareEntities(array $form, FormStateInterface $form_state) {
+    $files = parent::prepareEntities($form, $form_state);
+
+    /** @var \Drupal\media\MediaTypeInterface $media_type */
+    $media_type = $this->entityTypeManager
+      ->getStorage('media_type')
+      ->load($this->configuration['media_type']);
+
+    $images = [];
+    foreach ($files as $file) {
+      /** @var \Drupal\media\MediaInterface $image */
+      $image = $this->entityTypeManager->getStorage('media')->create([
+        'bundle' => $media_type->id(),
+        $media_type->getSource()->getConfiguration()['source_field'] => $file,
+      ]);
+      $images[] = $image;
+    }
+
+    return $images;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submit(array &$element, array &$form, FormStateInterface $form_state) {
+    if (!empty($form_state->getTriggeringElement()['#eb_widget_main_submit'])) {
+      $images = $this->prepareEntities($form, $form_state);
+      array_walk(
+        $images,
+        function (MediaInterface $media) {
+          $media->save();
+        }
+      );
+
+      $this->selectEntities($images, $form_state);
+      $this->clearFormValues($element, $form_state);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    $form = parent::buildConfigurationForm($form, $form_state);
+    $form['extensions'] = [
+      '#type' => 'textfield',
+      '#title' => $this->t('Allowed extensions'),
+      '#default_value' => $this->configuration['extensions'],
+      '#required' => TRUE,
+    ];
+
+    $media_type_options = [];
+    $media_types = $this
+      ->entityTypeManager
+      ->getStorage('media_type')
+      ->loadByProperties(['source' => 'image']);
+
+    foreach ($media_types as $media_type) {
+      $media_type_options[$media_type->id()] = $media_type->label();
+    }
+
+    if (empty($media_type_options)) {
+      $url = Url::fromRoute('entity.media_type.add_form')->toString();
+      $form['media_type'] = [
+        '#markup' => $this->t("You don't have media type of the Image type. You should <a href='!link'>create one</a>", ['!link' => $url]),
+      ];
+    }
+    else {
+      $form['media_type'] = [
+        '#type' => 'select',
+        '#title' => $this->t('Media type'),
+        '#default_value' => $this->configuration['media_type'],
+        '#options' => $media_type_options,
+      ];
+    }
+
+    return $form;
+  }
+
+}
diff --git a/src/WidgetManager.php b/src/WidgetManager.php
index 7dc33f7..04557a0 100644
--- a/src/WidgetManager.php
+++ b/src/WidgetManager.php
@@ -29,4 +29,19 @@ class WidgetManager extends DefaultPluginManager {
     $this->setCacheBackend($cache_backend, 'entity_browser_widget_plugins');
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  protected function findDefinitions() {
+    $definitions = parent::findDefinitions();
+
+    // Our own "media_image_upload" widget should only be available if the
+    // "Media" module is enabled.
+    if (!$this->moduleHandler->moduleExists('media')) {
+      unset($definitions['media_image_upload']);
+    }
+
+    return $definitions;
+  }
+
 }
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_type.default.yml
similarity index 79%
rename from tests/modules/entity_browser_ief_test/config/install/core.entity_form_display.media.ief_media_bundle.default.yml
rename to tests/modules/entity_browser_ief_test/config/install/core.entity_form_display.media.ief_media_type.default.yml
index 6288723..3fc9b5a 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_type.default.yml
@@ -2,13 +2,13 @@ langcode: en
 status: true
 dependencies:
   config:
-    - field.field.media.ief_media_bundle.ief_media_bundle_file_field
-    - media_entity.bundle.ief_media_bundle
+    - field.field.media.ief_media_type.ief_media_type_file_field
+    - media.type.ief_media_type
   module:
     - entity_browser
-id: media.ief_media_bundle.default
+id: media.ief_media_type.default
 targetEntityType: media
-bundle: ief_media_bundle
+bundle: ief_media_type
 mode: default
 content:
   ief_media_bundle_file_field:
diff --git a/tests/modules/entity_browser_ief_test/config/install/core.entity_view_display.media.ief_media_bundle.default.yml b/tests/modules/entity_browser_ief_test/config/install/core.entity_view_display.media.ief_media_type.default.yml
similarity index 84%
rename from tests/modules/entity_browser_ief_test/config/install/core.entity_view_display.media.ief_media_bundle.default.yml
rename to tests/modules/entity_browser_ief_test/config/install/core.entity_view_display.media.ief_media_type.default.yml
index f42a851..6a5ded1 100644
--- a/tests/modules/entity_browser_ief_test/config/install/core.entity_view_display.media.ief_media_bundle.default.yml
+++ b/tests/modules/entity_browser_ief_test/config/install/core.entity_view_display.media.ief_media_type.default.yml
@@ -2,15 +2,15 @@ langcode: en
 status: true
 dependencies:
   config:
-    - field.field.media.ief_media_bundle.ief_media_bundle_file_field
+    - field.field.media.ief_media_type.ief_media_type_file_field
     - image.style.thumbnail
-    - media_entity.bundle.ief_media_bundle
+    - media.type.ief_media_type
   module:
     - image
     - user
-id: media.ief_media_bundle.default
+id: media.ief_media_type.default
 targetEntityType: media
-bundle: ief_media_bundle
+bundle: ief_media_type
 mode: default
 content:
   created:
diff --git a/tests/modules/entity_browser_ief_test/config/install/field.field.media.ief_media_bundle.ief_media_bundle_file_field.yml b/tests/modules/entity_browser_ief_test/config/install/field.field.media.ief_media_type.ief_media_type_file_field.yml
similarity index 61%
rename from tests/modules/entity_browser_ief_test/config/install/field.field.media.ief_media_bundle.ief_media_bundle_file_field.yml
rename to tests/modules/entity_browser_ief_test/config/install/field.field.media.ief_media_type.ief_media_type_file_field.yml
index b6c1846..888d68e 100644
--- a/tests/modules/entity_browser_ief_test/config/install/field.field.media.ief_media_bundle.ief_media_bundle_file_field.yml
+++ b/tests/modules/entity_browser_ief_test/config/install/field.field.media.ief_media_type.ief_media_type_file_field.yml
@@ -2,12 +2,12 @@ langcode: en
 status: true
 dependencies:
   config:
-    - field.storage.media.ief_media_bundle_file_field
-    - media_entity.bundle.ief_media_bundle
-id: media.ief_media_bundle.ief_media_bundle_file_field
-field_name: ief_media_bundle_file_field
+    - field.storage.media.ief_media_type_file_field
+    - media.type.ief_media_type
+id: media.ief_media_type.ief_media_type_file_field
+field_name: ief_media_type_file_field
 entity_type: media
-bundle: ief_media_bundle
+bundle: ief_media_type
 label: files
 description: ''
 required: false
diff --git a/tests/modules/entity_browser_ief_test/config/install/field.field.node.ief_content.ief_media_field.yml b/tests/modules/entity_browser_ief_test/config/install/field.field.node.ief_content.ief_media_field.yml
index 656a830..3f215dd 100644
--- a/tests/modules/entity_browser_ief_test/config/install/field.field.node.ief_content.ief_media_field.yml
+++ b/tests/modules/entity_browser_ief_test/config/install/field.field.node.ief_content.ief_media_field.yml
@@ -3,7 +3,7 @@ status: true
 dependencies:
   config:
     - field.storage.node.ief_media_field
-    - media_entity.bundle.ief_media_bundle
+    - media.type.ief_media_type
     - node.type.ief_content
 id: node.ief_content.ief_media_field
 field_name: ief_media_field
@@ -19,7 +19,7 @@ settings:
   handler: 'default:media'
   handler_settings:
     target_bundles:
-      ief_media_bundle: ief_media_bundle
+      ief_media_type: ief_media_type
     sort:
       field: _none
     auto_create: false
diff --git a/tests/modules/entity_browser_ief_test/config/install/field.storage.media.ief_media_bundle_file_field.yml b/tests/modules/entity_browser_ief_test/config/install/field.storage.media.ief_media_type_file_field.yml
similarity index 72%
rename from tests/modules/entity_browser_ief_test/config/install/field.storage.media.ief_media_bundle_file_field.yml
rename to tests/modules/entity_browser_ief_test/config/install/field.storage.media.ief_media_type_file_field.yml
index b8bcb31..ab322c9 100644
--- a/tests/modules/entity_browser_ief_test/config/install/field.storage.media.ief_media_bundle_file_field.yml
+++ b/tests/modules/entity_browser_ief_test/config/install/field.storage.media.ief_media_type_file_field.yml
@@ -3,9 +3,9 @@ status: true
 dependencies:
   module:
     - file
-    - media_entity
-id: media.ief_media_bundle_file_field
-field_name: ief_media_bundle_file_field
+    - media
+id: media.ief_media_type_file_field
+field_name: ief_media_type_file_field
 entity_type: media
 type: entity_reference
 settings:
diff --git a/tests/modules/entity_browser_ief_test/config/install/field.storage.node.ief_media_field.yml b/tests/modules/entity_browser_ief_test/config/install/field.storage.node.ief_media_field.yml
index bf54bd1..172afdc 100644
--- a/tests/modules/entity_browser_ief_test/config/install/field.storage.node.ief_media_field.yml
+++ b/tests/modules/entity_browser_ief_test/config/install/field.storage.node.ief_media_field.yml
@@ -2,7 +2,7 @@ langcode: en
 status: true
 dependencies:
   module:
-    - media_entity
+    - media
     - node
 id: node.ief_media_field
 field_name: ief_media_field
diff --git a/tests/modules/entity_browser_ief_test/config/install/media_entity.bundle.ief_media_bundle.yml b/tests/modules/entity_browser_ief_test/config/install/media.type.ief_media_type.yml
similarity index 78%
rename from tests/modules/entity_browser_ief_test/config/install/media_entity.bundle.ief_media_bundle.yml
rename to tests/modules/entity_browser_ief_test/config/install/media.type.ief_media_type.yml
index 8bbfb68..8544158 100644
--- a/tests/modules/entity_browser_ief_test/config/install/media_entity.bundle.ief_media_bundle.yml
+++ b/tests/modules/entity_browser_ief_test/config/install/media.type.ief_media_type.yml
@@ -1,8 +1,8 @@
 langcode: en
 status: true
 dependencies: {  }
-id: ief_media_bundle
-label: 'Test File Bundle'
+id: ief_media_type
+label: 'Test File Type'
 description: ''
 type: generic
 queue_thumbnail_downloads: false
diff --git a/tests/modules/entity_browser_ief_test/entity_browser_ief_test.info.yml b/tests/modules/entity_browser_ief_test/entity_browser_ief_test.info.yml
index 94dd272..2c74b06 100644
--- a/tests/modules/entity_browser_ief_test/entity_browser_ief_test.info.yml
+++ b/tests/modules/entity_browser_ief_test/entity_browser_ief_test.info.yml
@@ -8,6 +8,6 @@ dependencies:
   - file
   - entity_browser
   - entity_browser_entity_form
-  - media_entity
+  - drupal:media (>= 8.4)
   - inline_entity_form
   - views
diff --git a/tests/src/FunctionalJavascript/InlineEntityFormTest.php b/tests/src/FunctionalJavascript/InlineEntityFormTest.php
index 259e0f8..da2b9cc 100644
--- a/tests/src/FunctionalJavascript/InlineEntityFormTest.php
+++ b/tests/src/FunctionalJavascript/InlineEntityFormTest.php
@@ -122,7 +122,7 @@ class InlineEntityFormTest extends EntityBrowserJavascriptTestBase {
     $this->assertSession()->assertWaitOnAjaxRequest();
 
     // Test reorder of elements.
-    $dragged = $this->xpath("//div[@data-drupal-selector='edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-bundle-file-field-current-items-0']")[0];
+    $dragged = $this->xpath("//div[@data-drupal-selector='edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-type-file-field-current-items-0']")[0];
     $this->dragDropElement($dragged, 150, 0);
     $this->assertSession()->assertWaitOnAjaxRequest();
 
@@ -133,14 +133,14 @@ class InlineEntityFormTest extends EntityBrowserJavascriptTestBase {
     $this->assertSession()->assertWaitOnAjaxRequest();
 
     // Check that element on second position is test_file1 (file:1).
-    $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-bundle-file-field-current"]/div[2]');
+    $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-type-file-field-current"]/div[2]');
     if (empty($secondElement)) {
       throw new \Exception('Element is not found.');
     }
     $this->assertSame('file:1', $secondElement->getAttribute('data-entity-id'));
 
     // Test remove of element.
-    $this->click('input[name*="ief_media_bundle_file_field_remove_1_1"]');
+    $this->click('input[name*="ief_media_type_file_field_remove_1_1"]');
     $this->assertSession()->assertWaitOnAjaxRequest();
 
     $page->pressButton('Update Test File Media');
@@ -151,7 +151,7 @@ class InlineEntityFormTest extends EntityBrowserJavascriptTestBase {
 
     // Check that remote button does not exist for already removed entity.
     $this->assertSession()
-      ->elementNotExists('css', '[name*="ief_media_bundle_file_field_remove_1_1"]');
+      ->elementNotExists('css', '[name*="ief_media_type_file_field_remove_1_1"]');
 
     // Test add inside Entity Browser.
     $page->clickLink('Select entities');
@@ -174,7 +174,7 @@ class InlineEntityFormTest extends EntityBrowserJavascriptTestBase {
     $this->assertSession()->assertWaitOnAjaxRequest();
 
     // Check that element on second position is test_file3 (file:3).
-    $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-bundle-file-field-current"]/div[2]');
+    $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-type-file-field-current"]/div[2]');
     if (empty($secondElement)) {
       throw new \Exception('Element is not found.');
     }
@@ -201,7 +201,7 @@ class InlineEntityFormTest extends EntityBrowserJavascriptTestBase {
     $this->assertSession()->assertWaitOnAjaxRequest();
 
     // Check that element on second position is test_file2 (file:2).
-    $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-bundle-file-field-current"]/div[2]');
+    $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-type-file-field-current"]/div[2]');
     if (empty($secondElement)) {
       throw new \Exception('Element is not found.');
     }
@@ -228,7 +228,7 @@ class InlineEntityFormTest extends EntityBrowserJavascriptTestBase {
     $this->assertSession()->assertWaitOnAjaxRequest();
 
     // Check that element on first position is test_file2 (file:2).
-    $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-bundle-file-field-current"]/div[1]');
+    $secondElement = $page->find('xpath', '//div[@data-drupal-selector="edit-ief-media-field-form-inline-entity-form-entities-0-form-ief-media-type-file-field-current"]/div[1]');
     if (empty($secondElement)) {
       throw new \Exception('Element is not found.');
     }
