diff --git a/core/modules/file/src/Plugin/migrate/source/d7/File.php b/core/modules/file/src/Plugin/migrate/source/d7/File.php
index b801a36..8b5c4c6 100644
--- a/core/modules/file/src/Plugin/migrate/source/d7/File.php
+++ b/core/modules/file/src/Plugin/migrate/source/d7/File.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\file\Plugin\migrate\source\d7;
 
+use Drupal\Core\Database\Query\Condition;
 use Drupal\migrate\Row;
 use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
 
@@ -44,9 +45,28 @@ class File extends DrupalSqlBase {
    * {@inheritdoc}
    */
   public function query() {
-    return $this->select('file_managed', 'f')
+    $query = $this->select('file_managed', 'f')
       ->fields('f')
       ->orderBy('timestamp');
+
+    // Filter by scheme(s), if configured.
+    if (isset($this->configuration['scheme'])) {
+      $schemes = array();
+      // Accept either a single scheme, or a list.
+      foreach ((array) $this->configuration['scheme'] as $scheme) {
+        $schemes[] = rtrim($scheme) . '://';
+      }
+      $schemes = array_map([$this->getDatabase(), 'escapeLike'], $schemes);
+
+      // uri LIKE 'public://%' OR uri LIKE 'private://%'
+      $conditions = new Condition('OR');
+      foreach ($schemes as $scheme) {
+        $conditions->condition('uri', $scheme . '%', 'LIKE');
+      }
+      $query->condition($conditions);
+    }
+
+    return $query;
   }
 
   /**
@@ -69,7 +89,8 @@ public function prepareRow(Row $row) {
     // At this point, $path could be an absolute path or a relative path,
     // depending on how the scheme's variable was set. So we need to shear out
     // the source_base_path in order to make them all relative.
-    $path = str_replace($this->migration->get('destination.source_base_path'), NULL, $path);
+    // @todo Don't depend on destination configuration.
+    $path = str_replace($this->migration->get('destination')['source_base_path'], NULL, $path);
     $row->setSourceProperty('filepath', $path);
     return parent::prepareRow($row);
   }
diff --git a/core/modules/file/tests/src/Unit/Plugin/migrate/source/d7/FileTest.php b/core/modules/file/tests/src/Unit/Plugin/migrate/source/d7/FileTest.php
index 7849746..13659d5 100644
--- a/core/modules/file/tests/src/Unit/Plugin/migrate/source/d7/FileTest.php
+++ b/core/modules/file/tests/src/Unit/Plugin/migrate/source/d7/FileTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Tests\file\Unit\Plugin\migrate\source\d7;
 
+use Drupal\Core\Database\Query\ConditionInterface;
 use Drupal\file\Plugin\migrate\source\d7\File;
 use Drupal\migrate\Row;
 use Drupal\Tests\migrate\Unit\MigrateSqlSourceTestCase;
@@ -20,12 +21,19 @@ class FileTest extends MigrateSqlSourceTestCase {
 
   const PLUGIN_CLASS = 'Drupal\Tests\file\Unit\Plugin\migrate\source\d7\TestFile';
 
-  // The fake Migration configuration entity.
   protected $migrationConfiguration = array(
-    // The ID of the entity, can be any string.
     'id' => 'test',
     'source' => array(
       'plugin' => 'd7_file',
+      // Used by testFilteringByScheme().
+      'scheme' => array(
+        'public',
+        'private',
+      ),
+    ),
+    'destination' => array(
+      'plugin' => 'entity:file',
+      'source_base_path' => '/path/to/files',
     ),
   );
 
@@ -84,6 +92,25 @@ public function testTemporaryUri() {
       $row->getSourceProperty('filepath'));
   }
 
+  /**
+   * Tests that it's possible to filter files by scheme.
+   */
+  public function testFilteringByScheme() {
+    $query_conditions = $this->source->query()->conditions();
+    $scheme_condition = end($query_conditions);
+
+    $this->assertInstanceOf(ConditionInterface::class, $scheme_condition['field']);
+    $conditions = $scheme_condition['field']->conditions();
+
+    $this->assertSame('uri', $conditions[0]['field']);
+    $this->assertSame('LIKE', $conditions[0]['operator']);
+    $this->assertSame('public://%', $conditions[0]['value']);
+
+    $this->assertSame('uri', $conditions[1]['field']);
+    $this->assertSame('LIKE', $conditions[1]['operator']);
+    $this->assertSame('private://%', $conditions[1]['value']);
+  }
+
 }
 
 /**
