diff --git a/core/modules/migrate_drupal/tests/fixtures/drupal7-file.php b/core/modules/migrate_drupal/tests/fixtures/drupal7-file.php
new file mode 100644
index 0000000000..a42246b0cb
--- /dev/null
+++ b/core/modules/migrate_drupal/tests/fixtures/drupal7-file.php
@@ -0,0 +1,286 @@
+<?php
+// @codingStandardsIgnoreFile
+/**
+ * @file
+ * A database agnostic dump for testing purposes.
+ *
+ * This file was generated by the Drupal 8.0 db-tools.php script.
+ */
+
+use Drupal\Core\Database\Database;
+
+$connection = Database::getConnection();
+
+$connection->schema()->createTable('file_managed', array(
+  'fields' => array(
+    'fid' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'unsigned' => TRUE,
+    ),
+    'uid' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'default' => '0',
+      'unsigned' => TRUE,
+    ),
+    'filename' => array(
+      'type' => 'varchar',
+      'not null' => TRUE,
+      'length' => '255',
+      'default' => '',
+    ),
+    'uri' => array(
+      'type' => 'varchar',
+      'not null' => TRUE,
+      'length' => '255',
+      'default' => '',
+    ),
+    'filemime' => array(
+      'type' => 'varchar',
+      'not null' => TRUE,
+      'length' => '255',
+      'default' => '',
+    ),
+    'filesize' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'default' => '0',
+      'unsigned' => TRUE,
+    ),
+    'status' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'default' => '0',
+    ),
+    'timestamp' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'default' => '0',
+      'unsigned' => TRUE,
+    ),
+  ),
+  'primary key' => array(
+    'fid',
+  ),
+  'mysql_character_set' => 'utf8',
+));
+
+$connection->insert('file_managed')
+->fields(array(
+  'fid',
+  'uid',
+  'filename',
+  'uri',
+  'filemime',
+  'filesize',
+  'status',
+  'timestamp',
+))
+->values(array(
+  'fid' => '1',
+  'uid' => '1',
+  'filename' => 'cube.jpeg',
+  'uri' => 'public://cube.jpeg',
+  'filemime' => 'image/jpeg',
+  'filesize' => '3620',
+  'status' => '1',
+  'timestamp' => '1421727515',
+))
+->values(array(
+  'fid' => '2',
+  'uid' => '1',
+  'filename' => 'ds9.txt',
+  'uri' => 'public://ds9.txt',
+  'filemime' => 'text/plain',
+  'filesize' => '4720',
+  'status' => '1',
+  'timestamp' => '1421727516',
+))
+->values(array(
+  'fid' => '3',
+  'uid' => '1',
+  'filename' => 'Babylon5.txt',
+  'uri' => 'private://Babylon5.txt',
+  'filemime' => 'text/plain',
+  'filesize' => '4',
+  'status' => '1',
+  'timestamp' => '1486104045',
+))
+->values(array(
+  'fid' => '4',
+  'uid' => '1',
+  'filename' => 'TerokNor.txt',
+  'uri' => 'temporary://TerokNor.txt',
+  'filemime' => 'text/plain',
+  'filesize' => '2369',
+  'status' => '1',
+  'timestamp' => '1421747516',
+))
+->execute();
+
+$connection->schema()->createTable('system', array(
+  'fields' => array(
+    'filename' => array(
+      'type' => 'varchar',
+      'not null' => TRUE,
+      'length' => '255',
+      'default' => '',
+    ),
+    'name' => array(
+      'type' => 'varchar',
+      'not null' => TRUE,
+      'length' => '255',
+      'default' => '',
+    ),
+    'type' => array(
+      'type' => 'varchar',
+      'not null' => TRUE,
+      'length' => '12',
+      'default' => '',
+    ),
+    'owner' => array(
+      'type' => 'varchar',
+      'not null' => TRUE,
+      'length' => '255',
+      'default' => '',
+    ),
+    'status' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'default' => '0',
+    ),
+    'bootstrap' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'default' => '0',
+    ),
+    'schema_version' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'default' => '-1',
+    ),
+    'weight' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+      'default' => '0',
+    ),
+    'info' => array(
+      'type' => 'blob',
+      'not null' => FALSE,
+      'size' => 'normal',
+    ),
+  ),
+  'primary key' => array(
+    'filename',
+  ),
+  'mysql_character_set' => 'utf8',
+));
+
+$connection->insert('system')
+->fields(array(
+  'filename',
+  'name',
+  'type',
+  'owner',
+  'status',
+  'bootstrap',
+  'schema_version',
+  'weight',
+  'info',
+))
+->values(array(
+  'filename' => 'modules/file/file.module',
+  'name' => 'file',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'bootstrap' => '0',
+  'schema_version' => '0',
+  'weight' => '0',
+  'info' => 'a:14:{s:4:"name";s:4:"File";s:11:"description";s:26:"Defines a file field type.";s:7:"package";s:4:"Core";s:7:"version";s:4:"7.40";s:4:"core";s:3:"7.x";s:12:"dependencies";a:1:{i:0;s:5:"field";}s:5:"files";a:1:{i:0;s:15:"tests/file.test";}s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1444866674";s:5:"mtime";i:1444866674;s:3:"php";s:5:"5.2.4";s:9:"bootstrap";i:0;s:8:"required";b:1;s:11:"explanation";s:73:"Field type(s) in use - see <a href="/admin/reports/fields">Field list</a>";}',
+))
+->values(array(
+  'filename' => 'modules/system/system.module',
+  'name' => 'system',
+  'type' => 'module',
+  'owner' => '',
+  'status' => '1',
+  'bootstrap' => '1',
+  'schema_version' => '7080',
+  'weight' => '0',
+  'info' => 'a:14:{s:4:"name";s:6:"System";s:11:"description";s:54:"Handles general site configuration for administrators.";s:7:"package";s:4:"Core";s:7:"version";s:4:"7.40";s:4:"core";s:3:"7.x";s:5:"files";a:6:{i:0;s:19:"system.archiver.inc";i:1;s:15:"system.mail.inc";i:2;s:16:"system.queue.inc";i:3;s:14:"system.tar.inc";i:4;s:18:"system.updater.inc";i:5;s:11:"system.test";}s:8:"required";b:1;s:9:"configure";s:19:"admin/config/system";s:7:"project";s:6:"drupal";s:9:"datestamp";s:10:"1444866674";s:5:"mtime";i:1444866674;s:12:"dependencies";a:0:{}s:3:"php";s:5:"5.2.4";s:9:"bootstrap";i:0;}',
+))
+->execute();
+
+$connection->schema()->createTable('variable', array(
+  'fields' => array(
+    'name' => array(
+      'type' => 'varchar',
+      'not null' => TRUE,
+      'length' => '128',
+      'default' => '',
+    ),
+    'value' => array(
+      'type' => 'blob',
+      'not null' => TRUE,
+      'size' => 'normal',
+    ),
+  ),
+  'primary key' => array(
+    'name',
+  ),
+  'mysql_character_set' => 'utf8',
+));
+
+$connection->insert('variable')
+->fields(array(
+  'name',
+  'value',
+))
+->values(array(
+  'name' => 'actions_max_stack',
+  'value' => 'i:28;',
+))
+->values(array(
+  'name' => 'file_default_scheme',
+  'value' => 's:6:"public";',
+))
+->values(array(
+  'name' => 'file_description_length',
+  'value' => 'i:256;',
+))
+->values(array(
+  'name' => 'file_description_type',
+  'value' => 's:9:"textfield";',
+))
+->values(array(
+  'name' => 'file_directory_path',
+  'value' => 's:19:"sites/default/files";',
+))
+->values(array(
+  'name' => 'file_icon_directory',
+  'value' => 's:25:"sites/default/files/icons";',
+))
+->values(array(
+  'name' => 'file_private_path',
+  'value' => 's:21:"sites/default/private";',
+))
+->values(array(
+  'name' => 'file_public_path',
+  'value' => 's:19:"sites/default/files";',
+))
+->values(array(
+  'name' => 'file_temporary_path',
+  'value' => 's:4:"/tmp";',
+))
+->execute();
diff --git a/core/modules/migrate_drupal_ui/src/Batch/MigrateUpgradeImportBatch.php b/core/modules/migrate_drupal_ui/src/Batch/MigrateUpgradeImportBatch.php
index c9c19a5c30..03b26c5dc2 100644
--- a/core/modules/migrate_drupal_ui/src/Batch/MigrateUpgradeImportBatch.php
+++ b/core/modules/migrate_drupal_ui/src/Batch/MigrateUpgradeImportBatch.php
@@ -114,10 +114,10 @@ public static function run($initial_ids, $config, &$context) {
     // @todo Find a way to avoid this in https://www.drupal.org/node/2804611.
     if ($definition['destination']['plugin'] === 'entity:file') {
       // Make sure we have a single trailing slash.
-      if ($definition['source']['plugin'] === 'd7_file_private') {
+      $configuration['source']['constants']['source_base_path'] = rtrim($config['source_base_path'], '/') . '/';
+      if ($definition['source']['scheme'] === 'private') {
         $configuration['source']['constants']['source_base_path'] = rtrim($config['source_private_file_path'], '/') . '/';
       }
-      $configuration['source']['constants']['source_base_path'] = rtrim($config['source_base_path'], '/') . '/';
     }
 
     /** @var \Drupal\migrate\Plugin\Migration $migration */
diff --git a/core/modules/migrate_drupal_ui/src/Form/ReviewForm.php b/core/modules/migrate_drupal_ui/src/Form/ReviewForm.php
index 5be85c42f2..380db92658 100644
--- a/core/modules/migrate_drupal_ui/src/Form/ReviewForm.php
+++ b/core/modules/migrate_drupal_ui/src/Form/ReviewForm.php
@@ -228,6 +228,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
    */
   public function submitForm(array &$form, FormStateInterface $form_state) {
     $config['source_base_path'] = $this->store->get('source_base_path');
+    $config['source_private_file_path'] = $this->store->get('source_private_file_path');
     $batch = [
       'title' => $this->t('Running upgrade'),
       'progress_message' => '',
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeExecuteTestBase.php b/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeExecuteTestBase.php
index 8ca811ccb4..c2dc3ebc2c 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeExecuteTestBase.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeExecuteTestBase.php
@@ -59,6 +59,7 @@ public function testMigrateUpgradeExecute() {
     }
     else {
       $edit['source_base_path'] = $this->getSourceBasePath();
+      $edit['source_private_file_path'] = $this->getSourcePrivateFilePath();
     }
     if (count($drivers) !== 1) {
       $edit['driver'] = $driver;
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeTestBase.php b/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeTestBase.php
index 4b6754487c..80b2b65544 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeTestBase.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeTestBase.php
@@ -260,4 +260,23 @@ protected function assertMigrationResults(array $expected_counts, $version) {
     }
   }
 
+  /**
+   * Checks public and private files are copied but not temporary files.
+   */
+  protected function assertFileMigrations() {
+    $fs = \Drupal::service('file_system');
+    $filesystems = $this->getFilenames();
+    foreach ($filesystems as $filesystem => $filenames) {
+      foreach ($filenames as $filename) {
+        $filepath = $fs->realpath($filesystem . '://' . $filename);
+        if ($filesystem === 'temporary') {
+          $this->assertFileNotExists($filepath);
+        }
+        else {
+          $this->assertFileExists($filepath);
+        }
+      }
+    }
+  }
+
 }
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/FilePathTest.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/FilePathTest.php
new file mode 100644
index 0000000000..4916f30ccd
--- /dev/null
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/FilePathTest.php
@@ -0,0 +1,139 @@
+<?php
+
+namespace Drupal\Tests\migrate_drupal_ui\Functional\d7;
+
+use Drupal\Tests\migrate_drupal_ui\Functional\MigrateUpgradeTestBase;
+
+/**
+ * Tests Drupal 7 file migrations from the Migrate UI.
+ *
+ * @group migrate_drupal_ui
+ */
+class FilePathTest extends MigrateUpgradeTestBase {
+
+  /**
+   * The profile to install as a basis for testing.
+   *
+   * @var string
+   */
+  protected $profile = 'testing';
+
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'stark';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'file',
+    'migrate',
+    'migrate_drupal',
+    'migrate_drupal_ui',
+  ];
+
+  /**
+   * The entity storage for node.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface
+   */
+  protected $nodeStorage;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+    $this->loadFixture(drupal_get_path('module', 'migrate_drupal') . '/tests/fixtures/drupal7-file.php');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getSourceBasePath() {
+    return __DIR__ . '/files';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getSourcePrivateFilePath() {
+    return __DIR__ . '/files';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getFilenames() {
+    return [
+      'public' => ['cube.jpeg', 'ds9.txt'],
+      'private' => ['Babylon5.txt'],
+      'temporary' => ['TerokNor.txt'],
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEntityCounts() {}
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEntityCountsIncremental() {}
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getAvailablePaths() {}
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getMissingPaths() {}
+
+  /**
+   * Executes all steps of migrations upgrade.
+   */
+  public function testMigrateUpgradeExecute() {
+    $connection_options = $this->sourceDatabase->getConnectionOptions();
+    $session = $this->assertSession();
+
+    $driver = $connection_options['driver'];
+    $connection_options['prefix'] = $connection_options['prefix']['default'];
+
+    // Use the driver connection form to get the correct options out of the
+    // database settings. This supports all of the databases we test against.
+    $drivers = drupal_get_database_types();
+    $form = $drivers[$driver]->getFormOptions($connection_options);
+    $connection_options = array_intersect_key($connection_options, $form + $form['advanced_options']);
+    $version = $this->getLegacyDrupalVersion($this->sourceDatabase);
+    $edit = [
+      $driver => $connection_options,
+      'source_private_file_path' => $this->getSourceBasePath(),
+      'version' => $version,
+    ];
+    if ($version == 6) {
+      $edit['d6_source_base_path'] = $this->getSourceBasePath();
+    }
+    else {
+      $edit['source_base_path'] = $this->getSourceBasePath();
+      $edit['source_private_file_path'] = $this->getSourcePrivateFilePath();
+    }
+    if (count($drivers) !== 1) {
+      $edit['driver'] = $driver;
+    }
+    $edits = $this->translatePostValues($edit);
+
+    // Start the upgrade process.
+    $this->drupalGet('/upgrade');
+    $this->drupalPostForm(NULL, [], t('Continue'));
+    $this->drupalPostForm(NULL, $edits, t('Review upgrade'));
+    $this->drupalPostForm(NULL, [], t('Perform upgrade'));
+    $this->resetAll();
+    $this->assertFileMigrations();
+  }
+
+}
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/Upgrade7Test.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/Upgrade7Test.php
index 95b26fcccf..b7e9042347 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/Upgrade7Test.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/Upgrade7Test.php
@@ -69,6 +69,24 @@ protected function getSourceBasePath() {
     return __DIR__ . '/files';
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  protected function getSourcePrivateFilePath() {
+    return __DIR__ . '/files';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getFilenames() {
+    return [
+      'public' => ['cube.jpeg', 'ds9.txt'],
+      'private' => ['Babylon5.txt'],
+      'temporary' => ['TerokNor.txt'],
+    ];
+  }
+
   /**
    * {@inheritdoc}
    */
