diff --git a/core/modules/migrate_drupal/config/schema/migrate_drupal.source.schema.yml b/core/modules/migrate_drupal/config/schema/migrate_drupal.source.schema.yml
index 86e801e..7f7030e 100644
--- a/core/modules/migrate_drupal/config/schema/migrate_drupal.source.schema.yml
+++ b/core/modules/migrate_drupal/config/schema/migrate_drupal.source.schema.yml
@@ -50,6 +50,154 @@ migrate.source.variable_multirow:
         type: string
         label: 'Variable'
 
+migrate.source.d6_comment_variable:
+  type: migrate_source_sql
+  label: 'Drupal 6 comment variable'
+  mapping:
+    constants:
+      type: migrate_entity_constant
+      label: 'Constants'
+
+migrate.source.d6_contact_settings:
+  type: migrate_source_sql
+  label: 'Drupal 6 contact settings'
+  mapping:
+    variables:
+      type: sequence
+      label: 'Variables'
+      sequence:
+        type: string
+        label: 'Variable'
+
+migrate.source.d6_view_mode:
+  type: migrate_source_sql
+  label: 'Drupal 6 view mode'
+  mapping:
+    constants:
+      type: mapping
+      label: 'Constants'
+      mapping:
+        targetEntityType:
+          type: string
+          label: 'Target entity type'
+        status:
+          type: boolean
+          label: 'Status'
+
+migrate.source.d6_profile_field:
+  type: migrate_source_sql
+  label: 'Drupal 6 profile field'
+  mapping:
+    constants:
+      type: migrate_entity_constant
+      label: 'Constants'
+
+migrate.source.d6_field_formatter_settings:
+  type: migrate_source_sql
+  label: 'Drupal 6 field formatter settings'
+  mapping:
+    constants:
+      type: migrate_entity_constant
+      label: 'Constants'
+
+migrate.source.d6_node_type:
+  type: migrate_source_sql
+  label: 'Drupal 6 node type'
+  mapping:
+    constants:
+      type: migrate_entity_constant
+      label: 'Constants'
+
+migrate.source.d6_node:
+  type: migrate_source_sql
+  label: 'Drupal 6 node'
+  mapping:
+    node_type:
+      # The node type can be specified both as a string ID of a node type or an
+      # array of node type IDs, so there is no way to consistently parse this.
+      type: ignore
+      label: 'Node type'
+
+migrate.source.d6_node_revision:
+  type: migrate_source_sql
+  label: 'Drupal 6 node'
+  mapping:
+    node_type:
+      # The node type can be specified both as a string ID of a node type or an
+      # array of node type IDs, so there is no way to consistently parse this.
+      type: ignore
+      label: 'Node type'
+
+migrate.source.d6_upload_instance:
+  type: migrate_source_sql
+  label: 'Drupal 6 upload form display'
+  mapping:
+    constants:
+      type: migrate_entity_constant
+      label: 'Constants'
+
+migrate.source.d6_field_instance:
+  type: migrate_source_sql
+  label: 'Drupal 6 field instance'
+  mapping:
+    constants:
+      type: migrate_entity_constant
+      label: 'Constants'
+
+migrate.source.d6_field_instance_per_view_mode:
+  type: migrate_source_sql
+  label: 'Drupal 6 field formatter'
+  mapping:
+    constants:
+      type: migrate_entity_constant
+      label: 'Constants'
+
+migrate.source.d6_user:
+  type: migrate_source_sql
+  label: 'Drupal 6 user'
+  mapping:
+    constants:
+      type: mapping
+      label: 'Constants'
+      mapping:
+        key:
+          type: string
+          label: 'User data key'
+        module:
+          type: string
+          label: 'Module name'
+
+migrate.source.d6_user_picture_file:
+  type: migrate_source_sql
+  label: 'Drupal 6 user picure display'
+  mapping:
+    constants:
+      type: mapping
+      label: 'Constant'
+      mapping:
+        is_public:
+          type: boolean
+          label: 'Public'
+
+migrate.source.d6_user_picture_instance:
+  type: migrate_source_sql
+  label: 'Drupal 6 user picure display'
+  mapping:
+    provider:
+      type: string
+      label: 'Provider'
+    constants:
+      type: migrate_entity_constant
+      label: 'Constants'
+
+migrate.source.d7_node_type:
+  type: migrate_source_sql
+  label: 'Drupal 7 node type'
+  mapping:
+    constants:
+      type: migrate_entity_constant
+      label: 'Constants'
+
 migrate_entity_constant:
   type: mapping
   mapping:
@@ -144,6 +292,9 @@ migrate_entity_constant:
     auto_create:
       type: boolean
       label: 'Entity reference selection setting: Auto-create new entities'
+    has_body:
+      type: integer
+      label: 'Whether or not a node type has a body field.'
 
 migrate.source.md_empty:
   type: migrate.source.empty
diff --git a/core/modules/migrate_drupal/src/Tests/Table/d7/NodeType.php b/core/modules/migrate_drupal/src/Tests/Table/d7/NodeType.php
index bbf0a4a..215bb60 100644
--- a/core/modules/migrate_drupal/src/Tests/Table/d7/NodeType.php
+++ b/core/modules/migrate_drupal/src/Tests/Table/d7/NodeType.php
@@ -122,7 +122,7 @@ public function load() {
       'base' => 'node_content',
       'module' => 'node',
       'description' => 'Use <em>articles</em> for time-sensitive content like news, press releases or blog posts.',
-      'help' => '',
+      'help' => 'Help text for articles',
       'has_title' => '1',
       'title_label' => 'Title',
       'custom' => '1',
@@ -136,11 +136,11 @@ public function load() {
       'base' => 'blog',
       'module' => 'blog',
       'description' => 'Use for multi-user blogs. Every user gets a personal blog.',
-      'help' => '',
+      'help' => 'Blog away, good sir!',
       'has_title' => '1',
       'title_label' => 'Title',
       'custom' => '0',
-      'modified' => '0',
+      'modified' => '1',
       'locked' => '1',
       'disabled' => '0',
       'orig_type' => 'blog',
@@ -164,11 +164,11 @@ public function load() {
       'base' => 'forum',
       'module' => 'forum',
       'description' => 'A <em>forum topic</em> starts a new discussion thread within a forum.',
-      'help' => '',
+      'help' => 'No name-calling, no flame wars. Be nice.',
       'has_title' => '1',
       'title_label' => 'Subject',
       'custom' => '0',
-      'modified' => '0',
+      'modified' => '1',
       'locked' => '1',
       'disabled' => '0',
       'orig_type' => 'forum',
@@ -178,7 +178,7 @@ public function load() {
       'base' => 'node_content',
       'module' => 'node',
       'description' => "Use <em>basic pages</em> for your static content, such as an 'About us' page.",
-      'help' => '',
+      'help' => 'Help text for basic pages',
       'has_title' => '1',
       'title_label' => 'Title',
       'custom' => '1',
@@ -192,7 +192,7 @@ public function load() {
       'base' => 'node_content',
       'module' => 'node',
       'description' => 'This is the description of the test content type.',
-      'help' => '',
+      'help' => 'Help text for test content type',
       'has_title' => '1',
       'title_label' => 'Title',
       'custom' => '1',
@@ -204,4 +204,4 @@ public function load() {
   }
 
 }
-#c3cc0500356b35e3e6b106aabf2c7aac
+#9bef45bc61d3712f730ca19ec8be6f21
diff --git a/core/modules/migrate_drupal/src/Tests/Table/d7/Variable.php b/core/modules/migrate_drupal/src/Tests/Table/d7/Variable.php
index 64e34d1..98cc8d5 100644
--- a/core/modules/migrate_drupal/src/Tests/Table/d7/Variable.php
+++ b/core/modules/migrate_drupal/src/Tests/Table/d7/Variable.php
@@ -44,9 +44,30 @@ public function load() {
       'value',
     ))
     ->values(array(
-      'name' => 'additional_settings__active_tab_test_content_type',
+      'name' => 'actions_max_stack',
+      'value' => 'i:28;',
+    ))->values(array(
+      'name' => 'additional_settings__active_tab_article',
+      'value' => 's:12:"edit-display";',
+    ))->values(array(
+      'name' => 'additional_settings__active_tab_blog',
+      'value' => 's:12:"edit-display";',
+    ))->values(array(
+      'name' => 'additional_settings__active_tab_book',
+      'value' => 's:13:"edit-workflow";',
+    ))->values(array(
+      'name' => 'additional_settings__active_tab_forum',
       'value' => 's:15:"edit-submission";',
     ))->values(array(
+      'name' => 'additional_settings__active_tab_page',
+      'value' => 's:15:"edit-submission";',
+    ))->values(array(
+      'name' => 'additional_settings__active_tab_test_content_type',
+      'value' => 's:13:"edit-workflow";',
+    ))->values(array(
+      'name' => 'admin_compact_mode',
+      'value' => 'b:1;',
+    ))->values(array(
       'name' => 'admin_theme',
       'value' => 's:5:"seven";',
     ))->values(array(
@@ -74,9 +95,15 @@ public function load() {
       'name' => 'allow_insecure_derivatives',
       'value' => 'b:1;',
     ))->values(array(
+      'name' => 'allow_insecure_uploads',
+      'value' => 'i:1;',
+    ))->values(array(
       'name' => 'anonymous',
       'value' => 's:9:"Anonymous";',
     ))->values(array(
+      'name' => 'authorize_filetransfer_default',
+      'value' => 's:3:"ftp";',
+    ))->values(array(
       'name' => 'block_cache',
       'value' => 'i:0;',
     ))->values(array(
@@ -92,30 +119,135 @@ public function load() {
       'name' => 'clean_url',
       'value' => 's:1:"1";',
     ))->values(array(
+      'name' => 'comment_anonymous_article',
+      'value' => 'i:0;',
+    ))->values(array(
+      'name' => 'comment_anonymous_blog',
+      'value' => 'i:0;',
+    ))->values(array(
+      'name' => 'comment_anonymous_book',
+      'value' => 'i:0;',
+    ))->values(array(
+      'name' => 'comment_anonymous_forum',
+      'value' => 'i:0;',
+    ))->values(array(
+      'name' => 'comment_anonymous_page',
+      'value' => 'i:0;',
+    ))->values(array(
       'name' => 'comment_anonymous_test_content_type',
       'value' => 'i:0;',
     ))->values(array(
+      'name' => 'comment_article',
+      'value' => 's:1:"2";',
+    ))->values(array(
+      'name' => 'comment_blog',
+      'value' => 's:1:"2";',
+    ))->values(array(
+      'name' => 'comment_book',
+      'value' => 's:1:"2";',
+    ))->values(array(
+      'name' => 'comment_default_mode_article',
+      'value' => 'i:1;',
+    ))->values(array(
+      'name' => 'comment_default_mode_blog',
+      'value' => 'i:1;',
+    ))->values(array(
+      'name' => 'comment_default_mode_book',
+      'value' => 'i:1;',
+    ))->values(array(
+      'name' => 'comment_default_mode_forum',
+      'value' => 'i:1;',
+    ))->values(array(
+      'name' => 'comment_default_mode_page',
+      'value' => 'i:1;',
+    ))->values(array(
       'name' => 'comment_default_mode_test_content_type',
       'value' => 'i:1;',
     ))->values(array(
+      'name' => 'comment_default_per_page_article',
+      'value' => 's:2:"50";',
+    ))->values(array(
+      'name' => 'comment_default_per_page_blog',
+      'value' => 's:2:"50";',
+    ))->values(array(
+      'name' => 'comment_default_per_page_book',
+      'value' => 's:2:"50";',
+    ))->values(array(
+      'name' => 'comment_default_per_page_forum',
+      'value' => 's:2:"50";',
+    ))->values(array(
+      'name' => 'comment_default_per_page_page',
+      'value' => 's:2:"50";',
+    ))->values(array(
       'name' => 'comment_default_per_page_test_content_type',
       'value' => 's:2:"30";',
     ))->values(array(
+      'name' => 'comment_form_location_article',
+      'value' => 'i:1;',
+    ))->values(array(
+      'name' => 'comment_form_location_blog',
+      'value' => 'i:1;',
+    ))->values(array(
+      'name' => 'comment_form_location_book',
+      'value' => 'i:1;',
+    ))->values(array(
+      'name' => 'comment_form_location_forum',
+      'value' => 'i:1;',
+    ))->values(array(
+      'name' => 'comment_form_location_page',
+      'value' => 'i:1;',
+    ))->values(array(
       'name' => 'comment_form_location_test_content_type',
       'value' => 'i:1;',
     ))->values(array(
+      'name' => 'comment_forum',
+      'value' => 's:1:"2";',
+    ))->values(array(
       'name' => 'comment_page',
-      'value' => 'i:0;',
+      'value' => 's:1:"0";',
+    ))->values(array(
+      'name' => 'comment_preview_article',
+      'value' => 's:1:"1";',
+    ))->values(array(
+      'name' => 'comment_preview_blog',
+      'value' => 's:1:"1";',
+    ))->values(array(
+      'name' => 'comment_preview_book',
+      'value' => 's:1:"1";',
+    ))->values(array(
+      'name' => 'comment_preview_forum',
+      'value' => 's:1:"1";',
+    ))->values(array(
+      'name' => 'comment_preview_page',
+      'value' => 's:1:"1";',
     ))->values(array(
       'name' => 'comment_preview_test_content_type',
       'value' => 's:1:"1";',
     ))->values(array(
+      'name' => 'comment_subject_field_article',
+      'value' => 'i:1;',
+    ))->values(array(
+      'name' => 'comment_subject_field_blog',
+      'value' => 'i:1;',
+    ))->values(array(
+      'name' => 'comment_subject_field_book',
+      'value' => 'i:1;',
+    ))->values(array(
+      'name' => 'comment_subject_field_forum',
+      'value' => 'i:1;',
+    ))->values(array(
+      'name' => 'comment_subject_field_page',
+      'value' => 'i:1;',
+    ))->values(array(
       'name' => 'comment_subject_field_test_content_type',
       'value' => 'i:1;',
     ))->values(array(
       'name' => 'comment_test_content_type',
       'value' => 's:1:"2";',
     ))->values(array(
+      'name' => 'configurable_timezones',
+      'value' => 'b:1;',
+    ))->values(array(
       'name' => 'contact_default_status',
       'value' => 'i:1;',
     ))->values(array(
@@ -123,7 +255,13 @@ public function load() {
       'value' => 's:43:"_vWFj-dRR2rNoHDwl7N__J9uZNutDcLz3w4tlPJzRAM";',
     ))->values(array(
       'name' => 'cron_last',
-      'value' => 'i:1432653550;',
+      'value' => 'i:1433858092;',
+    ))->values(array(
+      'name' => 'cron_threshold_error',
+      'value' => 'i:1209600;',
+    ))->values(array(
+      'name' => 'cron_threshold_warning',
+      'value' => 'i:172800;',
     ))->values(array(
       'name' => 'css_js_query_string',
       'value' => 's:6:"nihmmw";',
@@ -140,6 +278,9 @@ public function load() {
       'name' => 'date_default_timezone',
       'value' => 's:15:"America/Chicago";',
     ))->values(array(
+      'name' => 'date_first_day',
+      'value' => 'i:1;',
+    ))->values(array(
       'name' => 'default_nodes_main',
       'value' => 's:2:"10";',
     ))->values(array(
@@ -149,9 +290,24 @@ public function load() {
       'name' => 'drupal_private_key',
       'value' => 's:43:"9eRJWxrMwQ5CufYJjXBZbPGz_t8vPIYRQr18PamdKmM";',
     ))->values(array(
+      'name' => 'drupal_weight_select_max',
+      'value' => 'i:40;',
+    ))->values(array(
       'name' => 'email__active_tab',
       'value' => 's:25:"edit-email-password-reset";',
     ))->values(array(
+      'name' => 'empty_timezone_message',
+      'value' => 'b:1;',
+    ))->values(array(
+      'name' => 'error_level',
+      'value' => 'i:1;',
+    ))->values(array(
+      'name' => 'feed_default_items',
+      'value' => 'i:27;',
+    ))->values(array(
+      'name' => 'feed_item_length',
+      'value' => 's:8:"fulltext";',
+    ))->values(array(
       'name' => 'field_bundle_settings_comment__comment_node_test_content_type',
       'value' => 'a:2:{s:10:"view_modes";a:0:{}s:12:"extra_fields";a:2:{s:4:"form";a:2:{s:6:"author";a:1:{s:6:"weight";s:2:"-2";}s:7:"subject";a:1:{s:6:"weight";s:2:"-1";}}s:7:"display";a:0:{}}}',
     ))->values(array(
@@ -161,9 +317,24 @@ public function load() {
       'name' => 'field_bundle_settings_user__user',
       'value' => 'a:2:{s:10:"view_modes";a:0:{}s:12:"extra_fields";a:2:{s:4:"form";a:2:{s:7:"account";a:1:{s:6:"weight";s:3:"-10";}s:8:"timezone";a:1:{s:6:"weight";s:1:"6";}}s:7:"display";a:0:{}}}',
     ))->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_temporary_path',
       'value' => 's:4:"/tmp";',
     ))->values(array(
+      'name' => 'filter_allowed_protocols',
+      'value' => 'a:3:{i:0;s:4:"http";i:1;s:5:"https";i:2;s:3:"irc";}',
+    ))->values(array(
       'name' => 'filter_fallback_format',
       'value' => 's:10:"plain_text";',
     ))->values(array(
@@ -173,6 +344,12 @@ public function load() {
       'name' => 'forum_nav_vocabulary',
       'value' => 's:1:"2";',
     ))->values(array(
+      'name' => 'image_jpeg_quality',
+      'value' => 'i:80;',
+    ))->values(array(
+      'name' => 'image_toolkit',
+      'value' => 's:2:"gd";',
+    ))->values(array(
       'name' => 'install_profile',
       'value' => 's:8:"standard";',
     ))->values(array(
@@ -182,6 +359,21 @@ public function load() {
       'name' => 'install_time',
       'value' => 'i:1421694923;',
     ))->values(array(
+      'name' => 'language_content_type_article',
+      'value' => 's:1:"0";',
+    ))->values(array(
+      'name' => 'language_content_type_blog',
+      'value' => 's:1:"0";',
+    ))->values(array(
+      'name' => 'language_content_type_book',
+      'value' => 's:1:"0";',
+    ))->values(array(
+      'name' => 'language_content_type_forum',
+      'value' => 's:1:"0";',
+    ))->values(array(
+      'name' => 'language_content_type_page',
+      'value' => 's:1:"0";',
+    ))->values(array(
       'name' => 'language_content_type_test_content_type',
       'value' => 's:1:"0";',
     ))->values(array(
@@ -197,6 +389,9 @@ public function load() {
       'name' => 'language_types',
       'value' => 'a:3:{s:8:"language";b:1;s:16:"language_content";b:0;s:12:"language_url";b:0;}',
     ))->values(array(
+      'name' => 'mail_system',
+      'value' => 'a:1:{s:14:"default-system";s:17:"DefaultMailSystem";}',
+    ))->values(array(
       'name' => 'maintenance_mode',
       'value' => 'i:0;',
     ))->values(array(
@@ -207,13 +402,40 @@ public function load() {
       'value' => 'a:0:{}',
     ))->values(array(
       'name' => 'menu_masks',
-      'value' => 'a:36:{i:0;i:501;i:1;i:493;i:2;i:250;i:3;i:247;i:4;i:246;i:5;i:245;i:6;i:126;i:7;i:125;i:8;i:123;i:9;i:122;i:10;i:121;i:11;i:117;i:12;i:63;i:13;i:62;i:14;i:61;i:15;i:60;i:16;i:59;i:17;i:58;i:18;i:44;i:19;i:31;i:20;i:30;i:21;i:29;i:22;i:24;i:23;i:21;i:24;i:15;i:25;i:14;i:26;i:13;i:27;i:12;i:28;i:11;i:29;i:8;i:30;i:7;i:31;i:6;i:32;i:5;i:33;i:3;i:34;i:2;i:35;i:1;}',
+      'value' => 'a:35:{i:0;i:501;i:1;i:493;i:2;i:250;i:3;i:247;i:4;i:246;i:5;i:245;i:6;i:126;i:7;i:125;i:8;i:123;i:9;i:122;i:10;i:121;i:11;i:117;i:12;i:63;i:13;i:62;i:14;i:61;i:15;i:60;i:16;i:59;i:17;i:58;i:18;i:44;i:19;i:31;i:20;i:30;i:21;i:29;i:22;i:24;i:23;i:21;i:24;i:15;i:25;i:14;i:26;i:13;i:27;i:12;i:28;i:11;i:29;i:7;i:30;i:6;i:31;i:5;i:32;i:3;i:33;i:2;i:34;i:1;}',
+    ))->values(array(
+      'name' => 'menu_options_article',
+      'value' => 'a:1:{i:0;s:9:"main-menu";}',
+    ))->values(array(
+      'name' => 'menu_options_blog',
+      'value' => 'a:1:{i:0;s:9:"main-menu";}',
+    ))->values(array(
+      'name' => 'menu_options_book',
+      'value' => 'a:1:{i:0;s:9:"main-menu";}',
+    ))->values(array(
+      'name' => 'menu_options_forum',
+      'value' => 'a:1:{i:0;s:9:"main-menu";}',
+    ))->values(array(
+      'name' => 'menu_options_page',
+      'value' => 'a:1:{i:0;s:9:"main-menu";}',
     ))->values(array(
       'name' => 'menu_options_test_content_type',
       'value' => 'a:4:{i:0;s:9:"main-menu";i:1;s:10:"management";i:2;s:10:"navigation";i:3;s:9:"user-menu";}',
     ))->values(array(
-      'name' => 'menu_override_parent_selector',
-      'value' => 'b:1;',
+      'name' => 'menu_parent_article',
+      'value' => 's:11:"main-menu:0";',
+    ))->values(array(
+      'name' => 'menu_parent_blog',
+      'value' => 's:11:"main-menu:0";',
+    ))->values(array(
+      'name' => 'menu_parent_book',
+      'value' => 's:11:"main-menu:0";',
+    ))->values(array(
+      'name' => 'menu_parent_forum',
+      'value' => 's:11:"main-menu:0";',
+    ))->values(array(
+      'name' => 'menu_parent_page',
+      'value' => 's:11:"main-menu:0";',
     ))->values(array(
       'name' => 'menu_parent_test_content_type',
       'value' => 's:11:"main-menu:0";',
@@ -227,8 +449,14 @@ public function load() {
       'name' => 'node_cron_last',
       'value' => 's:10:"1421727515";',
     ))->values(array(
+      'name' => 'node_options_article',
+      'value' => 'a:2:{i:0;s:6:"status";i:1;s:7:"promote";}',
+    ))->values(array(
+      'name' => 'node_options_blog',
+      'value' => 'a:2:{i:0;s:6:"status";i:1;s:7:"promote";}',
+    ))->values(array(
       'name' => 'node_options_book',
-      'value' => 'a:1:{i:0;s:6:"status";}',
+      'value' => 'a:2:{i:0;s:6:"status";i:1;s:8:"revision";}',
     ))->values(array(
       'name' => 'node_options_forum',
       'value' => 'a:1:{i:0;s:6:"status";}',
@@ -237,7 +465,22 @@ public function load() {
       'value' => 'a:1:{i:0;s:6:"status";}',
     ))->values(array(
       'name' => 'node_options_test_content_type',
-      'value' => 'a:2:{i:0;s:6:"status";i:1;s:7:"promote";}',
+      'value' => 'a:3:{i:0;s:6:"status";i:1;s:7:"promote";i:2;s:8:"revision";}',
+    ))->values(array(
+      'name' => 'node_preview_article',
+      'value' => 's:1:"1";',
+    ))->values(array(
+      'name' => 'node_preview_blog',
+      'value' => 's:1:"1";',
+    ))->values(array(
+      'name' => 'node_preview_book',
+      'value' => 's:1:"1";',
+    ))->values(array(
+      'name' => 'node_preview_forum',
+      'value' => 's:1:"1";',
+    ))->values(array(
+      'name' => 'node_preview_page',
+      'value' => 's:1:"1";',
     ))->values(array(
       'name' => 'node_preview_test_content_type',
       'value' => 's:1:"1";',
@@ -257,11 +500,23 @@ public function load() {
       'name' => 'node_rank_views',
       'value' => 's:1:"0";',
     ))->values(array(
+      'name' => 'node_submitted_article',
+      'value' => 'i:1;',
+    ))->values(array(
+      'name' => 'node_submitted_blog',
+      'value' => 'i:1;',
+    ))->values(array(
+      'name' => 'node_submitted_book',
+      'value' => 'i:1;',
+    ))->values(array(
+      'name' => 'node_submitted_forum',
+      'value' => 'i:1;',
+    ))->values(array(
       'name' => 'node_submitted_page',
-      'value' => 'b:0;',
+      'value' => 'i:0;',
     ))->values(array(
       'name' => 'node_submitted_test_content_type',
-      'value' => 'i:1;',
+      'value' => 'i:0;',
     ))->values(array(
       'name' => 'overlap_cjk',
       'value' => 'i:1;',
@@ -332,6 +587,9 @@ public function load() {
       'name' => 'site_name',
       'value' => 's:13:"The Site Name";',
     ))->values(array(
+      'name' => 'site_offline_message',
+      'value' => 's:42:"This is a custom maintenance mode message.";',
+    ))->values(array(
       'name' => 'site_slogan',
       'value' => 's:10:"The Slogan";',
     ))->values(array(
@@ -356,8 +614,11 @@ public function load() {
       'name' => 'syslog_format',
       'value' => 's:72:"!base_url|!timestamp|!type|!ip|!request_uri|!referer|!uid|!link|!message";',
     ))->values(array(
-      'name' => 'syslog_identity',
-      'value' => 's:6:"drupal";',
+      'name' => 'taxonomy_override_selector',
+      'value' => 'b:1;',
+    ))->values(array(
+      'name' => 'taxonomy_terms_per_page_admin',
+      'value' => 'i:84;',
     ))->values(array(
       'name' => 'theme_default',
       'value' => 's:6:"bartik";',
@@ -371,6 +632,9 @@ public function load() {
       'name' => 'user_cancel_method',
       'value' => 's:17:"user_cancel_block";',
     ))->values(array(
+      'name' => 'user_default_timezone',
+      'value' => 'i:2;',
+    ))->values(array(
       'name' => 'user_email_verification',
       'value' => 'i:1;',
     ))->values(array(
@@ -476,4 +740,4 @@ public function load() {
   }
 
 }
-#a571d354b6652603b017f9647ce0975e
+#576279bc90c1af46955ba6485f3aff03
diff --git a/core/modules/node/migration_templates/d7_node.yml b/core/modules/node/migration_templates/d7_node.yml
new file mode 100644
index 0000000..9dbe11a
--- /dev/null
+++ b/core/modules/node/migration_templates/d7_node.yml
@@ -0,0 +1,43 @@
+id: d7_node
+label: Drupal 7 nodes
+migration_tags:
+  - Drupal 7
+builder:
+  plugin: d7_node
+source:
+  plugin: d7_node
+process:
+  nid: nid
+  vid: vid
+  type: type
+  langcode:
+    plugin: default_value
+    source: language
+    default_value: "und"
+  title: title
+  uid: node_uid
+# Core migrations are designed for replacing the upgrade path and therefore
+# all node and user ids are preserved. For that reason we do not need to look-up
+# the user id for the node. If you're writing a custom migration, user ids will
+# vary from the source site and a lookup as shown below will be required.
+#    plugin: migration
+#    migration: d6_user
+#    source: node_uid
+  status: status
+  created: created
+  changed: changed
+  promote: promote
+  sticky: sticky
+  revision_uid: revision_uid
+  revision_log: log
+  revision_timestamp: timestamp
+destination:
+  plugin: entity:node
+dependencies:
+  module:
+    - node
+  config:
+    - migrate.migration.d7_node_type
+migration_dependencies:
+  required:
+    - d7_node_type
diff --git a/core/modules/node/migration_templates/d7_node_settings.yml b/core/modules/node/migration_templates/d7_node_settings.yml
new file mode 100644
index 0000000..a4c4b53
--- /dev/null
+++ b/core/modules/node/migration_templates/d7_node_settings.yml
@@ -0,0 +1,16 @@
+id: d7_node_settings
+label: Drupal 7 node configuration
+migration_tags:
+  - Drupal 7
+source:
+  plugin: variable
+  variables:
+    - node_admin_theme
+process:
+  use_admin_theme: node_admin_theme
+destination:
+  plugin: config
+  config_name: node.settings
+dependencies:
+  module:
+    - node
diff --git a/core/modules/node/migration_templates/d7_node_type.yml b/core/modules/node/migration_templates/d7_node_type.yml
new file mode 100644
index 0000000..270b89c
--- /dev/null
+++ b/core/modules/node/migration_templates/d7_node_type.yml
@@ -0,0 +1,27 @@
+id: d7_node_type
+label: Drupal 7 node type configuration
+migration_tags:
+  - Drupal 7
+source:
+  plugin: d7_node_type
+  constants:
+    preview: 1 # DRUPAL_OPTIONAL
+    has_body: 1 # DRUPAL_OPTION
+process:
+  type: type
+  name: name
+  description: description
+  help: help
+  title_label: title_label
+  preview_mode: 'constants/preview'
+  display_submitted: display_submitted
+  new_revision: 'options/revision'
+  # I don't know what this is, but it does not appear to be a thing.
+  # 'settings/node/options': options
+  create_body: 'constants/has_body'
+  create_body_label: body_label
+destination:
+  plugin: entity:node_type
+dependencies:
+  module:
+    - node
diff --git a/core/modules/node/src/Plugin/migrate/source/d7/Node.php b/core/modules/node/src/Plugin/migrate/source/d7/Node.php
new file mode 100644
index 0000000..590ce84
--- /dev/null
+++ b/core/modules/node/src/Plugin/migrate/source/d7/Node.php
@@ -0,0 +1,117 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\node\Plugin\migrate\source\d7\Node.
+ */
+
+namespace Drupal\node\Plugin\migrate\source\d7;
+
+use Drupal\migrate\Row;
+use Drupal\migrate\Plugin\SourceEntityInterface;
+use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+
+/**
+ * Drupal 6 node source from database.
+ *
+ * @MigrateSource(
+ *   id = "d7_node"
+ * )
+ */
+class Node extends DrupalSqlBase implements SourceEntityInterface {
+
+  /**
+   * The join options between the node and the node_revisions table.
+   */
+  const JOIN = 'n.vid = nr.vid';
+
+  /**
+   * The default filter format.
+   *
+   * @var string
+   */
+  protected $filterDefaultFormat;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    // Select node in its last revision.
+    $query = $this->select('node_revision', 'nr')
+      ->fields('n', array(
+        'nid',
+        'type',
+        'language',
+        'status',
+        'created',
+        'changed',
+        'comment',
+        'promote',
+        'sticky',
+        'tnid',
+        'translate',
+      ))
+      ->fields('nr', array(
+        'vid',
+        'title',
+        'log',
+        'timestamp',
+      ));
+    $query->addField('n', 'uid', 'node_uid');
+    $query->addField('nr', 'uid', 'revision_uid');
+    $query->innerJoin('node', 'n', static::JOIN);
+
+    if (isset($this->configuration['node_type'])) {
+      $query->condition('type', $this->configuration['node_type']);
+    }
+
+    return $query;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    $fields = array(
+      'nid' => $this->t('Node ID'),
+      'type' => $this->t('Type'),
+      'title' => $this->t('Title'),
+      'node_uid' => $this->t('Node authored by (uid)'),
+      'revision_uid' => $this->t('Revision authored by (uid)'),
+      'created' => $this->t('Created timestamp'),
+      'changed' => $this->t('Modified timestamp'),
+      'status' => $this->t('Published'),
+      'promote' => $this->t('Promoted to front page'),
+      'sticky' => $this->t('Sticky at top of lists'),
+      'revision' => $this->t('Create new revision'),
+      'language' => $this->t('Language (fr, en, ...)'),
+      'tnid' => $this->t('The translation set id for this node'),
+      'timestamp' => $this->t('The timestamp the latest revision of this node was created.'),
+    );
+    return $fields;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    $ids['nid']['type'] = 'integer';
+    $ids['nid']['alias'] = 'n';
+    return $ids;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function bundleMigrationRequired() {
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function entityTypeId() {
+    return 'node';
+  }
+
+}
diff --git a/core/modules/node/src/Plugin/migrate/source/d7/NodeType.php b/core/modules/node/src/Plugin/migrate/source/d7/NodeType.php
new file mode 100644
index 0000000..5b820b5
--- /dev/null
+++ b/core/modules/node/src/Plugin/migrate/source/d7/NodeType.php
@@ -0,0 +1,127 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\node\Plugin\migrate\source\d7\NodeType.
+ */
+
+namespace Drupal\node\Plugin\migrate\source\d7;
+
+use Drupal\migrate\Row;
+use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+
+/**
+ * Drupal 7 Node types source from database.
+ *
+ * @MigrateSource(
+ *   id = "d7_node_type"
+ * )
+ */
+class NodeType extends DrupalSqlBase {
+
+  /**
+   * The teaser length
+   *
+   * @var int
+   */
+  protected $teaserLength;
+
+  /**
+   * Node preview optional / required.
+   *
+   * @var int
+   */
+  protected $nodePreview;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    return $this->select('node_type', 't')
+      ->fields('t', array(
+        'type',
+        'name',
+        'base',
+        'description',
+        'help',
+        'title_label',
+        'disabled',
+        'custom',
+        'modified',
+        'locked',
+        'orig_type',
+      ))
+      ->orderBy('t.type');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    return array(
+      'type' => $this->t('Machine name of the node type.'),
+      'name' => $this->t('Human name of the node type.'),
+      'description' => $this->t('Description of the node type.'),
+      'help' => $this->t('Help text for the node type.'),
+      'title_label' => $this->t('Title label.'),
+      'disabled' => $this->t('Flag indicating the node type is enable'),
+      'base' => $this->t('base node.'),
+      'custom' => $this->t('Flag.'),
+      'modified' => $this->t('Flag.'),
+      'locked' => $this->t('Flag.'),
+      'orig_type' => $this->t('The original type.'),
+      'teaser_length' => $this->t('Teaser length'),
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function runQuery() {
+    $this->teaserLength = $this->variableGet('teaser_length', 600);
+    $this->nodePreview = $this->variableGet('node_preview', 0);
+    return parent::runQuery();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function prepareRow(Row $row) {
+    $row->setSourceProperty('teaser_length', $this->teaserLength);
+    $row->setSourceProperty('node_preview', $this->nodePreview);
+
+    $type = $row->getSourceProperty('type');
+    $source_options = $this->variableGet('node_options_' . $type, array('promote', 'sticky'));
+    $options = array();
+    foreach (array('promote', 'sticky', 'status', 'revision') as $item) {
+      $options[$item] = in_array($item, $source_options);
+    }
+    $row->setSourceProperty('options', $options);
+
+    // Find body field for this node type.
+    $query = $this->select('field_config_instance', 'fci')
+      ->fields('fci', array('data'))
+      ->condition('entity_type', 'node')
+      ->condition('bundle', $row->getSourceProperty('type'))
+      ->condition('field_name', 'body')
+      ->execute()
+      ->fetchAssoc();
+
+    $body_data = unserialize($query['data']);
+    $body_label = $body_data['label'];
+    $row->setSourceProperty('body_label', $body_label);
+
+    $row->setSourceProperty('display_submitted', $this->variableGet('node_submitted_' . $type, TRUE));
+
+    return parent::prepareRow($row);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    $ids['type']['type'] = 'string';
+    return $ids;
+  }
+
+}
diff --git a/core/modules/node/src/Tests/Migrate/d6/MigrateNodeTestBase.php b/core/modules/node/src/Tests/Migrate/d6/MigrateNodeTestBase.php
index a47df1f..c28c656 100644
--- a/core/modules/node/src/Tests/Migrate/d6/MigrateNodeTestBase.php
+++ b/core/modules/node/src/Tests/Migrate/d6/MigrateNodeTestBase.php
@@ -38,7 +38,6 @@ protected function setUp() {
       'status' => 1,
     ])->enforceIsNew(TRUE)->save();
 
-
     $node_type = entity_create('node_type', array('type' => 'test_planet'));
     $node_type->save();
     node_add_body_field($node_type);
diff --git a/core/modules/node/src/Tests/Migrate/d7/MigrateNodeSettingsTest.php b/core/modules/node/src/Tests/Migrate/d7/MigrateNodeSettingsTest.php
new file mode 100644
index 0000000..21a4761
--- /dev/null
+++ b/core/modules/node/src/Tests/Migrate/d7/MigrateNodeSettingsTest.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\node\Tests\Migrate\d7\MigrateNodeSettingsTest.
+ */
+
+namespace Drupal\node\Tests\Migrate\d7;
+
+use Drupal\config\Tests\SchemaCheckTestTrait;
+use Drupal\migrate\MigrateExecutable;
+use Drupal\migrate_drupal\Tests\d7\MigrateDrupal7TestBase;
+
+/**
+ * Upgrade variables to node.settings config object.
+ *
+ * @group node
+ * @dumpFile d7/Variable.php
+ * @migration d7_node_settings
+ */
+class MigrateNodeSettingsTest extends MigrateDrupal7TestBase {
+
+  use SchemaCheckTestTrait;
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['node'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $migration = entity_load('migration', 'd7_node_settings');
+    $executable = new MigrateExecutable($migration, $this);
+    $executable->import();
+  }
+
+  /**
+   * Tests migration of node variables to node.settings config object.
+   */
+  public function testAggregatorSettings() {
+    $config = $this->config('node.settings');
+    $this->assertEqual(1, $config->get('use_admin_theme'));
+  }
+
+}
diff --git a/core/modules/node/src/Tests/Migrate/d7/MigrateNodeTest.php b/core/modules/node/src/Tests/Migrate/d7/MigrateNodeTest.php
new file mode 100644
index 0000000..a94815e
--- /dev/null
+++ b/core/modules/node/src/Tests/Migrate/d7/MigrateNodeTest.php
@@ -0,0 +1,124 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\node\Tests\Migrate\d7\MigrateNodeTest.
+ */
+
+namespace Drupal\node\Tests\Migrate\d7;
+
+use Drupal\migrate\MigrateExecutable;
+use Drupal\migrate_drupal\Tests\d7\MigrateDrupal7TestBase;
+use Drupal\Core\Database\Database;
+use Drupal\node\Entity\Node;
+use Drupal\node\NodeInterface;
+use Drupal\user\Entity\User;
+
+/**
+ * Node content migration.
+ *
+ * @group node
+ * @dumpFile d7/FieldConfig.php
+ * @dumpFile d7/FieldConfigInstance.php
+ * @dumpFile d7/NodeType.php
+ * @dumpFile d7/Node.php
+ * @dumpFile d7/NodeRevision.php
+ * @migration d7_node_type
+ * @migration d7_node
+ */
+class MigrateNodeTest extends MigrateDrupal7TestBase {
+
+  static $modules = array('node', 'text', 'filter', 'entity_reference');
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installEntitySchema('node');
+    $this->installConfig(['node']);
+    $this->installSchema('node', ['node_access']);
+    $this->installSchema('system', ['sequences']);
+
+    User::create([
+      'uid' => 1,
+      'name' => $this->randomMachineName(),
+      'status' => 1,
+    ])->enforceIsNew(TRUE)->save();
+
+    $migration = entity_load('migration', 'd7_node_type');
+    $executable = new MigrateExecutable($migration, $this);
+    $executable->import();
+
+    /** @var \Drupal\migrate\entity\Migration $migration */
+
+    $migration = entity_load('migration', 'd7_node');
+    $executable = new MigrateExecutable($migration, $this);
+    $executable->import();
+
+    // This is required for the second import below.
+    db_truncate($migration->getIdMap()->mapTableName())->execute();
+    $this->standalone = TRUE;
+  }
+
+  protected function assertEntity($id, $type, $langcode, $title, $uid, $status, $created, $changed, $promoted, $sticky) {
+    /** @var \Drupal\node\NodeInterface $node */
+    $node = Node::load($id);
+    $this->assertTrue($node instanceof NodeInterface);
+    $this->assertIdentical($type, $node->getType());
+    $this->assertIdentical($langcode, $node->langcode->value);
+    $this->assertIdentical($title, $node->getTitle());
+    $this->assertIdentical($uid, $node->getOwnerId());
+    $this->assertIdentical($status, $node->isPublished());
+    $this->assertIdentical($created, $node->getCreatedTime());
+    if (isset($changed)) {
+      $this->assertIdentical($changed, $node->getChangedTime());
+    }
+    $this->assertIdentical($promoted, $node->isPromoted());
+    $this->assertIdentical($sticky, $node->isSticky());
+  }
+
+  protected function assertRevision($id, $title, $uid, $log, $timestamp) {
+    $revision = node_revision_load($id);
+    $this->assertTrue($revision instanceof NodeInterface);
+    $this->assertIdentical($title, $revision->getTitle());
+    $this->assertIdentical($uid, $revision->getRevisionAuthor()->id());
+    $this->assertIdentical($log, $revision->revision_log->value);
+    $this->assertIdentical($timestamp, $revision->getRevisionCreationTime());
+  }
+
+  /**
+   * Test node migration from Drupal 7 to 8.
+   */
+  public function testNode() {
+    $this->assertEntity(1, 'test_content_type', 'en', 'A Node', '1', TRUE, '1421727515', '1421727515', TRUE, FALSE);
+    $this->assertRevision(1, 'A Node', '1', '', '1421727515');
+
+    // It is pointless to run the second half from MigrateDrupal6Test.
+    if (empty($this->standalone)) {
+      return;
+    }
+
+    // Change the revision title, then re-import. The revision should be
+    // updated in place.
+    Database::getConnection('default', 'migrate')
+      ->update('node_revision')
+      ->fields(array(
+        'title' => 'New node title',
+      ))
+      ->condition('vid', 1)
+      ->execute();
+
+    /** @var \Drupal\migrate\entity\Migration $migration */
+    $migration = entity_load('migration', 'd7_node');
+    $executable = new MigrateExecutable($migration, $this);
+    $executable->import();
+
+    // Don't test the node's changed time, since it will have been updated by
+    // the import we just did.
+    $this->assertEntity(1, 'test_content_type', 'en', 'New node title', '1', TRUE, '1421727515', NULL, TRUE, FALSE);
+    $this->assertRevision(1, 'New node title', '1', '', '1421727515');
+  }
+
+}
diff --git a/core/modules/node/src/Tests/Migrate/d7/MigrateNodeTypeTest.php b/core/modules/node/src/Tests/Migrate/d7/MigrateNodeTypeTest.php
new file mode 100644
index 0000000..ddb057e
--- /dev/null
+++ b/core/modules/node/src/Tests/Migrate/d7/MigrateNodeTypeTest.php
@@ -0,0 +1,100 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\node\Tests\Migrate\d7\MigrateNodeTypeTest.
+ */
+
+namespace Drupal\node\Tests\Migrate\d7;
+
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\FieldConfigInterface;
+use Drupal\migrate\MigrateExecutable;
+use Drupal\migrate_drupal\Tests\d7\MigrateDrupal7TestBase;
+use Drupal\node\Entity\NodeType;
+use Drupal\node\NodeTypeInterface;
+
+/**
+ * Upgrade node types to node.type.*.yml.
+ *
+ * @group node
+ * @dumpFile d7/FieldConfig.php
+ * @dumpFile d7/FieldConfigInstance.php
+ * @dumpFile d7/NodeType.php
+ * @dumpFile d7/Variable.php
+ * @migration d7_node_type
+ */
+class MigrateNodeTypeTest extends MigrateDrupal7TestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('node', 'text', 'filter');
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installConfig(array('node'));
+
+    $migration = entity_load('migration', 'd7_node_type');
+    $executable = new MigrateExecutable($migration, $this);
+    $executable->import();
+  }
+
+  /**
+   * Tests a single node type.
+   *
+   * @dataProvider testNodeTypeDataProvider
+   * @param string $id
+   *  The node type ID.
+   * @param string $label
+   *  The expected label.
+   * @param string $description
+   *  The expected node type description.
+   * @param string $help
+   *  The expected help text.
+   * @param string $title_label
+   *  The expected label of the node type's title field.
+   */
+  protected function assertEntity($id, $label, $description, $help, $title_label, $display_submitted, $new_revision, $body_label = NULL) {
+    /** @var \Drupal\node\NodeTypeInterface $entity */
+    $entity = NodeType::load($id);
+    $this->assertTrue($entity instanceof NodeTypeInterface);
+    $this->assertIdentical($label, $entity->label());
+    $this->assertIdentical($description, $entity->getDescription());
+    $this->assertIdentical($help, $entity->getHelp());
+
+    $fields = \Drupal::entityManager()->getFieldDefinitions('node', $id);
+    $this->assertIdentical($title_label, $fields['title']->getConfig($id)->getLabel());
+
+    $this->assertIdentical($display_submitted, $entity->displaySubmitted());
+    $this->assertIdentical($new_revision, $entity->isNewRevision());
+
+    if ($body_label) {
+      /** @var \Drupal\field\FieldConfigInterface $body */
+      $body = FieldConfig::load('node.' . $id . '.body');
+      $this->assertTrue($body instanceof FieldConfigInterface);
+      $this->assertIdentical($body_label, $body->label());
+    }
+  }
+
+  /**
+   * Tests Drupal 7 node type to Drupal 8 migration.
+   */
+  public function testNodeType() {
+    $this->assertEntity('article', 'Article', 'Use <em>articles</em> for time-sensitive content like news, press releases or blog posts.', 'Help text for articles', 'Title', TRUE, FALSE, "Body");
+    $this->assertEntity('blog', 'Blog entry', 'Use for multi-user blogs. Every user gets a personal blog.', 'Blog away, good sir!', 'Title', TRUE, FALSE, 'Body');
+    // book's display_submitted flag is not set, so it will default to TRUE.
+    $this->assertEntity('book', 'Book page', '<em>Books</em> have a built-in hierarchical navigation. Use for handbooks or tutorials.', '', 'Title', TRUE, TRUE, "Body");
+    $this->assertEntity('forum', 'Forum topic', 'A <em>forum topic</em> starts a new discussion thread within a forum.', 'No name-calling, no flame wars. Be nice.', 'Subject', TRUE, FALSE, 'Body');
+    $this->assertEntity('page', 'Basic page', "Use <em>basic pages</em> for your static content, such as an 'About us' page.", 'Help text for basic pages', 'Title', FALSE, FALSE, "Body");
+    // This node type does not carry a body field.
+    $this->assertEntity('test_content_type', 'Test content type', 'This is the description of the test content type.', 'Help text for test content type', 'Title', FALSE, TRUE);
+  }
+
+}
diff --git a/core/modules/node/tests/src/Unit/Plugin/migrate/d7 b/core/modules/node/tests/src/Unit/Plugin/migrate/d7
new file mode 100644
index 0000000..8244328
--- /dev/null
+++ b/core/modules/node/tests/src/Unit/Plugin/migrate/d7
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\migrate_drupal\Unit\source\d7\TestNode.
+ */
+
+namespace Drupal\Tests\migrate_drupal\Unit\source\d7;
+
+use Drupal\Core\Database\Connection;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\migrate_drupal\Plugin\migrate\source\d7\Node;
+
+/**
+ * Provides a node source plugin used for unit testing.
+ */
+class TestNode extends Node {
+
+  /**
+   * Sets the database connection for this source plugin.
+   *
+   * @param \Drupal\Core\Database\Connection $database
+   */
+  public function setDatabase(Connection $database) {
+    $this->database = $database;
+  }
+
+  /**
+   * Sets the module handler for this source plugin.
+   *
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   */
+  public function setModuleHandler(ModuleHandlerInterface $module_handler) {
+    $this->moduleHandler = $module_handler;
+  }
+
+}
