diff -u b/core/modules/migrate_drupal/tests/src/Kernel/d6/MigrateDrupal6TestBase.php b/core/modules/migrate_drupal/tests/src/Kernel/d6/MigrateDrupal6TestBase.php
--- b/core/modules/migrate_drupal/tests/src/Kernel/d6/MigrateDrupal6TestBase.php
+++ b/core/modules/migrate_drupal/tests/src/Kernel/d6/MigrateDrupal6TestBase.php
@@ -24,6 +24,7 @@
     'options',
     'telephone',
     'text',
+    'migrate_drupal',
   ];
 
   /**
diff -u b/core/modules/node/node.module b/core/modules/node/node.module
--- b/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -1468,6 +1468,10 @@
  * Implements hook_migration_plugins_alter().
  */
 function node_migration_plugins_alter(array &$definitions) {
+  // Don't alter the node migrations unless migrate_drupal is installed.
+  if (!\Drupal::moduleHandler()->moduleExists('migrate_drupal')) {
+    return;
+  }
   $version = FALSE;
   $connection = \Drupal::database();
   // We need to get the version of the source database in order to check
diff -u b/core/modules/node/tests/src/Kernel/Migrate/MigrationPluginAlterTest.php b/core/modules/node/tests/src/Kernel/Migrate/MigrationPluginAlterTest.php
--- b/core/modules/node/tests/src/Kernel/Migrate/MigrationPluginAlterTest.php
+++ b/core/modules/node/tests/src/Kernel/Migrate/MigrationPluginAlterTest.php
@@ -18,7 +18,10 @@
   /**
    * {@inheritdoc}
    */
-  public static $modules = ['migrate_drupal', 'node'];
+  public static $modules = [
+    'migrate_drupal',
+    'node',
+  ];
 
   /**
    * {@inheritdoc}
only in patch2:
unchanged:
--- /dev/null
+++ b/core/modules/migrate/tests/modules/migrate_no_migrate_drupal_test/migrate_no_migrate_drupal_test.info.yml
@@ -0,0 +1,8 @@
+name: 'Migrate No Migrate Drupal Test'
+type: module
+description: Provides fixture for testing without migrate_drupal.
+package: Testing
+version: VERSION
+dependencies:
+  - drupal:migrate
+  - drupal:node
only in patch2:
unchanged:
--- /dev/null
+++ b/core/modules/migrate/tests/modules/migrate_no_migrate_drupal_test/migrate_no_migrate_drupal_test.routing.yml
@@ -0,0 +1,7 @@
+migrate_no_migrate_drupal_test.execute:
+  path: '/migrate_no_migrate_drupal_test/execute'
+  defaults:
+    _controller: '\Drupal\migrate_no_migrate_drupal_test\Controller\ExecuteMigration::execute'
+    _title: 'Execute'
+  requirements:
+    _access: 'TRUE'
only in patch2:
unchanged:
--- /dev/null
+++ b/core/modules/migrate/tests/modules/migrate_no_migrate_drupal_test/migrations/node_migration_no_upgrade.yml
@@ -0,0 +1,22 @@
+id: node_migration_no_migate_drupal
+label: Node Migration No Migrate Drupal
+source:
+  plugin: embedded_data
+  data_rows:
+    -
+      id: 1
+      nid: 1
+      title: Node 1
+    -
+      id: 2
+      nid: 2
+      title: Node 2
+  ids:
+    id:
+      type: integer
+process:
+  nid: nid
+  title: title
+destination:
+  default_bundle: no_migrate_drupal
+  plugin: entity:node
only in patch2:
unchanged:
--- /dev/null
+++ b/core/modules/migrate/tests/modules/migrate_no_migrate_drupal_test/src/Controller/ExecuteMigration.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Drupal\migrate_no_migrate_drupal_test\Controller;
+
+use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException;
+use Drupal\Core\Controller\ControllerBase;
+use Drupal\migrate\MigrateExecutable;
+use Drupal\migrate\Plugin\MigrationInterface;
+
+/**
+ * Class ExecuteMigration.
+ */
+class ExecuteMigration extends ControllerBase {
+
+  /**
+   * Display success.
+   *
+   * @return array
+   *   Return markup array.
+   */
+  public function execute() {
+    $migration_plugin_manager = \Drupal::service('plugin.manager.migration');
+    $definitions = $migration_plugin_manager->getDefinitions();
+    if ($definitions['node_migration_no_migate_drupal']['label'] !== 'Node Migration No Migrate Drupal') {
+      throw new InvalidPluginDefinitionException('node_migration_no_migate_drupal');
+    }
+    $migrations = $migration_plugin_manager->createInstances('');
+    $result = (new MigrateExecutable($migrations['node_migration_no_migate_drupal']))->import();
+    if ($result !== MigrationInterface::RESULT_COMPLETED) {
+      throw new \RuntimeException('Migration failed');
+    }
+
+    return [
+      '#type' => 'markup',
+      '#markup' => 'Migration was successful.',
+    ];
+  }
+
+}
only in patch2:
unchanged:
--- /dev/null
+++ b/core/modules/migrate/tests/src/Functional/MigrateNoMigrateDrupalTest.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Drupal\Tests\migrate\Functional;
+
+use Drupal\node\Entity\Node;
+use Drupal\Tests\BrowserTestBase;
+use Drupal\Tests\node\Traits\ContentTypeCreationTrait;
+
+/**
+ * Execute migration.
+ *
+ * @group migrate
+ */
+class MigrateNoMigrateDrupalTest extends BrowserTestBase {
+  use ContentTypeCreationTrait;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $defaultTheme = 'stark';
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = [
+    'migrate',
+    'migrate_no_migrate_drupal_test',
+    'node',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->createContentType(['type' => 'no_migrate_drupal']);
+  }
+
+  /**
+   * Tests execution of a migration.
+   */
+  public function testExecutionNoMigrateDrupal() {
+    $this->drupalGet('/migrate_no_migrate_drupal_test/execute');
+    $this->assertSession()->pageTextContains('Migration was successful.');
+    $node_1 = Node::load(1);
+    $node_2 = Node::load(2);
+    $this->assertEquals('Node 1', $node_1->label());
+    $this->assertEquals('Node 2', $node_2->label());
+  }
+
+}
