diff --git a/core/modules/action/migration_templates/action_settings.yml b/core/modules/action/migration_templates/action_settings.yml
index df69e33..4aca21a 100644
--- a/core/modules/action/migration_templates/action_settings.yml
+++ b/core/modules/action/migration_templates/action_settings.yml
@@ -7,6 +7,7 @@ source:
   plugin: variable
   variables:
     - actions_max_stack
+  provider: action
 process:
   recursion_limit: actions_max_stack
 destination:
diff --git a/core/modules/aggregator/migration_templates/d6_aggregator_settings.yml b/core/modules/aggregator/migration_templates/d6_aggregator_settings.yml
index 72372e4..12abfd5 100644
--- a/core/modules/aggregator/migration_templates/d6_aggregator_settings.yml
+++ b/core/modules/aggregator/migration_templates/d6_aggregator_settings.yml
@@ -12,6 +12,7 @@ source:
     - aggregator_teaser_length
     - aggregator_clear
     - aggregator_summary_items
+  provider: aggregator
 process:
   fetcher: aggregator_fetcher
   parser: aggregator_parser
diff --git a/core/modules/aggregator/migration_templates/d7_aggregator_settings.yml b/core/modules/aggregator/migration_templates/d7_aggregator_settings.yml
index c8c793f..229dd01 100644
--- a/core/modules/aggregator/migration_templates/d7_aggregator_settings.yml
+++ b/core/modules/aggregator/migration_templates/d7_aggregator_settings.yml
@@ -12,6 +12,7 @@ source:
     - aggregator_teaser_length
     - aggregator_clear
     - aggregator_summary_items
+  provider: aggregator
 process:
   fetcher: aggregator_fetcher
   parser: aggregator_parser
diff --git a/core/modules/block_content/migration_templates/block_content_body_field.yml b/core/modules/block_content/migration_templates/block_content_body_field.yml
index b51d032..113fb98 100644
--- a/core/modules/block_content/migration_templates/block_content_body_field.yml
+++ b/core/modules/block_content/migration_templates/block_content_body_field.yml
@@ -19,6 +19,7 @@ source:
       type: string
     field_name:
       type: string
+  provider: block
 process:
   entity_type: entity_type
   bundle: bundle
diff --git a/core/modules/block_content/migration_templates/block_content_type.yml b/core/modules/block_content/migration_templates/block_content_type.yml
index bc75eea..77ae99d 100644
--- a/core/modules/block_content/migration_templates/block_content_type.yml
+++ b/core/modules/block_content/migration_templates/block_content_type.yml
@@ -12,6 +12,7 @@ source:
   ids:
     id:
       type: string
+  provider: block
 process:
   id: id
   label: label
diff --git a/core/modules/block_content/src/Plugin/migrate/source/d6/Box.php b/core/modules/block_content/src/Plugin/migrate/source/d6/Box.php
index a28927b..65c0940 100644
--- a/core/modules/block_content/src/Plugin/migrate/source/d6/Box.php
+++ b/core/modules/block_content/src/Plugin/migrate/source/d6/Box.php
@@ -8,7 +8,8 @@
  * Drupal 6 block source from database.
  *
  * @MigrateSource(
- *   id = "d6_box"
+ *   id = "d6_box",
+ *   source_provider = "block"
  * )
  */
 class Box extends DrupalSqlBase {
diff --git a/core/modules/block_content/src/Plugin/migrate/source/d7/BlockCustom.php b/core/modules/block_content/src/Plugin/migrate/source/d7/BlockCustom.php
index ea33682..edd6563 100644
--- a/core/modules/block_content/src/Plugin/migrate/source/d7/BlockCustom.php
+++ b/core/modules/block_content/src/Plugin/migrate/source/d7/BlockCustom.php
@@ -8,7 +8,8 @@
  * Drupal 7 custom block source from database.
  *
  * @MigrateSource(
- *   id = "d7_block_custom"
+ *   id = "d7_block_custom",
+ *   source_provider = "block"
  * )
  */
 class BlockCustom extends DrupalSqlBase {
diff --git a/core/modules/book/migration_templates/d6_book_settings.yml b/core/modules/book/migration_templates/d6_book_settings.yml
index 16e6695..8b7b377 100644
--- a/core/modules/book/migration_templates/d6_book_settings.yml
+++ b/core/modules/book/migration_templates/d6_book_settings.yml
@@ -8,6 +8,7 @@ source:
     - book_child_type
     - book_block_mode
     - book_allowed_types
+  provider: book
 process:
   child_type: book_child_type
   'block/navigation/mode': book_block_mode
diff --git a/core/modules/book/src/Plugin/migrate/source/d6/Book.php b/core/modules/book/src/Plugin/migrate/source/d6/Book.php
index f41bb42..dc43fb0 100644
--- a/core/modules/book/src/Plugin/migrate/source/d6/Book.php
+++ b/core/modules/book/src/Plugin/migrate/source/d6/Book.php
@@ -8,7 +8,8 @@
  * Drupal 6 book source.
  *
  * @MigrateSource(
- *   id = "d6_book"
+ *   id = "d6_book",
+ *   source_provider = "book"
  * )
  */
 class Book extends DrupalSqlBase {
diff --git a/core/modules/comment/migration_templates/d6_comment_entity_display.yml b/core/modules/comment/migration_templates/d6_comment_entity_display.yml
index c650673..c07cccc 100644
--- a/core/modules/comment/migration_templates/d6_comment_entity_display.yml
+++ b/core/modules/comment/migration_templates/d6_comment_entity_display.yml
@@ -12,6 +12,7 @@ source:
       label: hidden
       type: comment_default
       weight: 20
+  provider: comment
 process:
   entity_type: 'constants/entity_type'
   field_name: 'constants/field_name'
diff --git a/core/modules/comment/migration_templates/d6_comment_entity_form_display.yml b/core/modules/comment/migration_templates/d6_comment_entity_form_display.yml
index c33685f..dab38e4 100644
--- a/core/modules/comment/migration_templates/d6_comment_entity_form_display.yml
+++ b/core/modules/comment/migration_templates/d6_comment_entity_form_display.yml
@@ -11,6 +11,7 @@ source:
     options:
       type: comment_default
       weight: 20
+  provider: comment
 process:
   entity_type: 'constants/entity_type'
   field_name: 'constants/field_name'
diff --git a/core/modules/comment/migration_templates/d6_comment_entity_form_display_subject.yml b/core/modules/comment/migration_templates/d6_comment_entity_form_display_subject.yml
index abe6191..e05a757 100644
--- a/core/modules/comment/migration_templates/d6_comment_entity_form_display_subject.yml
+++ b/core/modules/comment/migration_templates/d6_comment_entity_form_display_subject.yml
@@ -11,6 +11,7 @@ source:
     options:
       type: string_textfield
       weight: 10
+  provider: comment
 process:
   entity_type: 'constants/entity_type'
   field_name: 'constants/field_name'
diff --git a/core/modules/comment/migration_templates/d6_comment_field.yml b/core/modules/comment/migration_templates/d6_comment_field.yml
index d14d1aa..3a9a405 100644
--- a/core/modules/comment/migration_templates/d6_comment_field.yml
+++ b/core/modules/comment/migration_templates/d6_comment_field.yml
@@ -7,6 +7,7 @@ source:
   constants:
     entity_type: node
     type: comment
+  provider: comment
 process:
   entity_type: 'constants/entity_type'
   field_name: comment_type
diff --git a/core/modules/comment/migration_templates/d6_comment_field_instance.yml b/core/modules/comment/migration_templates/d6_comment_field_instance.yml
index d708619..f715199 100644
--- a/core/modules/comment/migration_templates/d6_comment_field_instance.yml
+++ b/core/modules/comment/migration_templates/d6_comment_field_instance.yml
@@ -8,6 +8,7 @@ source:
     entity_type: node
     label: Comments
     required: true
+  provider: comment
 process:
   entity_type: 'constants/entity_type'
   label: 'constants/label'
diff --git a/core/modules/comment/migration_templates/d6_comment_type.yml b/core/modules/comment/migration_templates/d6_comment_type.yml
index 69a2bd8..2f5fbcb 100644
--- a/core/modules/comment/migration_templates/d6_comment_type.yml
+++ b/core/modules/comment/migration_templates/d6_comment_type.yml
@@ -6,6 +6,7 @@ source:
   plugin: d6_comment_variable_per_comment_type
   constants:
     entity_type: node
+  provider: comment
 process:
   target_entity_type_id: 'constants/entity_type'
   id: comment_type
diff --git a/core/modules/config_translation/migration_templates/d6_i18n_system_maintenance.yml b/core/modules/config_translation/migration_templates/d6_i18n_system_maintenance.yml
index 1c99961..f1c4c7e 100644
--- a/core/modules/config_translation/migration_templates/d6_i18n_system_maintenance.yml
+++ b/core/modules/config_translation/migration_templates/d6_i18n_system_maintenance.yml
@@ -6,6 +6,7 @@ source:
   plugin: i18n_variable
   variables:
     - site_offline_message
+  provider: system
 process:
   langcode: language
   message: site_offline_message
diff --git a/core/modules/config_translation/migration_templates/d6_i18n_system_site.yml b/core/modules/config_translation/migration_templates/d6_i18n_system_site.yml
index 3c80821..148e757 100644
--- a/core/modules/config_translation/migration_templates/d6_i18n_system_site.yml
+++ b/core/modules/config_translation/migration_templates/d6_i18n_system_site.yml
@@ -13,6 +13,7 @@ source:
     - site_frontpage
     - site_403
     - site_404
+  provider: system
 process:
   langcode: language
   name: site_name
diff --git a/core/modules/config_translation/migration_templates/d6_i18n_user_mail.yml b/core/modules/config_translation/migration_templates/d6_i18n_user_mail.yml
index d1e5db5..bae575d 100644
--- a/core/modules/config_translation/migration_templates/d6_i18n_user_mail.yml
+++ b/core/modules/config_translation/migration_templates/d6_i18n_user_mail.yml
@@ -19,6 +19,7 @@ source:
     - user_mail_register_pending_approval_body
     - user_mail_status_blocked_subject
     - user_mail_status_blocked_body
+  provider: system
 process:
   langcode: language
   'status_activated/subject':
diff --git a/core/modules/config_translation/migration_templates/d6_i18n_user_settings.yml b/core/modules/config_translation/migration_templates/d6_i18n_user_settings.yml
index 36b0fa6c..11c7c16 100644
--- a/core/modules/config_translation/migration_templates/d6_i18n_user_settings.yml
+++ b/core/modules/config_translation/migration_templates/d6_i18n_user_settings.yml
@@ -10,6 +10,7 @@ source:
     - user_email_verification
     - user_register
     - anonymous
+  provider: system
 process:
   langcode: language
   'notify/status_blocked': user_mail_status_blocked_notify
diff --git a/core/modules/dblog/migration_templates/d6_dblog_settings.yml b/core/modules/dblog/migration_templates/d6_dblog_settings.yml
index 64da0a7..afa1e53 100644
--- a/core/modules/dblog/migration_templates/d6_dblog_settings.yml
+++ b/core/modules/dblog/migration_templates/d6_dblog_settings.yml
@@ -6,8 +6,10 @@ source:
   plugin: variable
   variables:
     - dblog_row_limit
+  provider: dblog
 process:
   row_limit: dblog_row_limit
 destination:
   plugin: config
   config_name: dblog.settings
+  provider: dblog
diff --git a/core/modules/dblog/migration_templates/d7_dblog_settings.yml b/core/modules/dblog/migration_templates/d7_dblog_settings.yml
index e22768f..b2dbfb2 100644
--- a/core/modules/dblog/migration_templates/d7_dblog_settings.yml
+++ b/core/modules/dblog/migration_templates/d7_dblog_settings.yml
@@ -6,8 +6,10 @@ source:
   plugin: variable
   variables:
     - dblog_row_limit
+  provider: dblog
 process:
   row_limit: dblog_row_limit
 destination:
   plugin: config
   config_name: dblog.settings
+  provider: dblog
diff --git a/core/modules/field/migration_templates/d7_field.yml b/core/modules/field/migration_templates/d7_field.yml
index 15079d8..726fa46 100644
--- a/core/modules/field/migration_templates/d7_field.yml
+++ b/core/modules/field/migration_templates/d7_field.yml
@@ -9,6 +9,7 @@ source:
   constants:
     status: true
     langcode: und
+  provider: field
 process:
   entity_type: entity_type
   status: 'constants/status'
diff --git a/core/modules/field/migration_templates/d7_field_instance_widget_settings.yml b/core/modules/field/migration_templates/d7_field_instance_widget_settings.yml
index b5ee417..37a6923 100644
--- a/core/modules/field/migration_templates/d7_field_instance_widget_settings.yml
+++ b/core/modules/field/migration_templates/d7_field_instance_widget_settings.yml
@@ -9,6 +9,7 @@ source:
   constants:
     form_mode: default
     third_party_settings: { }
+  provider: field
 process:
   # We skip field types that don't exist because they weren't migrated by the
   # field migration.
diff --git a/core/modules/field/migration_templates/d7_view_modes.yml b/core/modules/field/migration_templates/d7_view_modes.yml
index fd17138..aca872b 100644
--- a/core/modules/field/migration_templates/d7_view_modes.yml
+++ b/core/modules/field/migration_templates/d7_view_modes.yml
@@ -4,6 +4,7 @@ migration_tags:
   - Drupal 7
 source:
   plugin: d7_view_mode
+  provider: field
 process:
   mode:
     plugin: static_map
diff --git a/core/modules/file/migration_templates/d6_file.yml b/core/modules/file/migration_templates/d6_file.yml
index c25f63f..2298745 100644
--- a/core/modules/file/migration_templates/d6_file.yml
+++ b/core/modules/file/migration_templates/d6_file.yml
@@ -12,6 +12,7 @@ source:
     # table are specified, and must end with a /. See source_full_path
     # configuration in this migration's process pipeline as an example.
     source_base_path: ''
+  provider: system
 process:
     # If you are using both this migration and d6_user_picture_file in a custom
     # migration and executing migrations incrementally, it is strongly
diff --git a/core/modules/file/migration_templates/d6_upload_field.yml b/core/modules/file/migration_templates/d6_upload_field.yml
index a919f91..3191be6 100644
--- a/core/modules/file/migration_templates/d6_upload_field.yml
+++ b/core/modules/file/migration_templates/d6_upload_field.yml
@@ -13,6 +13,7 @@ source:
     name: upload
     cardinality: -1
     display_field: true
+  provider: upload
 process:
   entity_type: 'constants/entity_type'
   field_name: 'constants/name'
diff --git a/core/modules/file/migration_templates/d7_file.yml b/core/modules/file/migration_templates/d7_file.yml
index 7ebf83b..87e1e21 100644
--- a/core/modules/file/migration_templates/d7_file.yml
+++ b/core/modules/file/migration_templates/d7_file.yml
@@ -12,6 +12,7 @@ source:
     # table are specified, and must end with a /. See source_full_path
     # configuration in this migration's process pipeline as an example.
     source_base_path: ''
+  provider: file
 process:
   # If you are using this file to build a custom migration consider removing
   # the fid field to allow incremental migrations.
diff --git a/core/modules/file/migration_templates/file_settings.yml b/core/modules/file/migration_templates/file_settings.yml
index 36584cc..422af6d 100644
--- a/core/modules/file/migration_templates/file_settings.yml
+++ b/core/modules/file/migration_templates/file_settings.yml
@@ -9,6 +9,7 @@ source:
     - file_description_type
     - file_description_length
     - file_icon_directory
+  provider: system
 process:
   'description/type': file_description_type
   'description/length': file_description_length
@@ -16,3 +17,4 @@ process:
 destination:
   plugin: config
   config_name: file.settings
+  provider: file
diff --git a/core/modules/filter/migration_templates/d6_filter_format.yml b/core/modules/filter/migration_templates/d6_filter_format.yml
index a5f4388..9346be9 100644
--- a/core/modules/filter/migration_templates/d6_filter_format.yml
+++ b/core/modules/filter/migration_templates/d6_filter_format.yml
@@ -4,6 +4,7 @@ migration_tags:
   - Drupal 6
 source:
   plugin: d6_filter_format
+  provider: filter
 process:
   format:
     plugin: machine_name
diff --git a/core/modules/filter/migration_templates/d7_filter_format.yml b/core/modules/filter/migration_templates/d7_filter_format.yml
index c0710b5..5a49026 100644
--- a/core/modules/filter/migration_templates/d7_filter_format.yml
+++ b/core/modules/filter/migration_templates/d7_filter_format.yml
@@ -4,6 +4,7 @@ migration_tags:
   - Drupal 7
 source:
   plugin: d7_filter_format
+  provider: filter
 process:
   format: format
   name: name
diff --git a/core/modules/filter/migration_templates/d7_filter_settings.yml b/core/modules/filter/migration_templates/d7_filter_settings.yml
index d6239fc..b71065e 100644
--- a/core/modules/filter/migration_templates/d7_filter_settings.yml
+++ b/core/modules/filter/migration_templates/d7_filter_settings.yml
@@ -6,6 +6,7 @@ source:
   plugin: variable
   variables:
     - filter_fallback_format
+  provider: filter
 process:
   fallback_format: filter_fallback_format
 destination:
diff --git a/core/modules/forum/migration_templates/d6_forum_settings.yml b/core/modules/forum/migration_templates/d6_forum_settings.yml
index 5516848..dfb8be4 100644
--- a/core/modules/forum/migration_templates/d6_forum_settings.yml
+++ b/core/modules/forum/migration_templates/d6_forum_settings.yml
@@ -11,6 +11,7 @@ source:
     - forum_block_num_0
     - forum_block_num_1
     - forum_nav_vocabulary
+  provider: forum
 process:
   'block/active/limit': forum_block_num_0
   'block/new/limit': forum_block_num_1
diff --git a/core/modules/forum/migration_templates/d7_forum_settings.yml b/core/modules/forum/migration_templates/d7_forum_settings.yml
index b84d485..1656420 100644
--- a/core/modules/forum/migration_templates/d7_forum_settings.yml
+++ b/core/modules/forum/migration_templates/d7_forum_settings.yml
@@ -11,6 +11,7 @@ source:
     - forum_block_num_active
     - forum_block_num_new
     - forum_nav_vocabulary
+  provider: forum
 process:
   'block/active/limit': forum_block_num_active
   'block/new/limit': forum_block_num_new
diff --git a/core/modules/image/migration_templates/d7_image_settings.yml b/core/modules/image/migration_templates/d7_image_settings.yml
index bfae4d5..d2223fe 100644
--- a/core/modules/image/migration_templates/d7_image_settings.yml
+++ b/core/modules/image/migration_templates/d7_image_settings.yml
@@ -8,6 +8,7 @@ source:
     - allow_insecure_derivatives
     - suppress_itok_output
     - image_style_preview_image
+  provider: image
 process:
   suppress_itok_output: suppress_itok_output
   allow_insecure_derivatives: allow_insecure_derivatives
diff --git a/core/modules/language/migration_templates/d6_language_content_settings.yml b/core/modules/language/migration_templates/d6_language_content_settings.yml
index 3bf9078..42e041b 100644
--- a/core/modules/language/migration_templates/d6_language_content_settings.yml
+++ b/core/modules/language/migration_templates/d6_language_content_settings.yml
@@ -7,6 +7,7 @@ source:
   plugin: d6_language_content_settings
   constants:
     target_type: 'node'
+  provider: locale
 process:
 # Ignore i18n_node_options_[node_type] options not available in Drupal 8,
 # i18n_required_node and i18n_newnode_current
diff --git a/core/modules/language/migration_templates/d6_language_negotiation_settings.yml b/core/modules/language/migration_templates/d6_language_negotiation_settings.yml
index abc71f6..ee02902 100644
--- a/core/modules/language/migration_templates/d6_language_negotiation_settings.yml
+++ b/core/modules/language/migration_templates/d6_language_negotiation_settings.yml
@@ -6,6 +6,7 @@ source:
   plugin: variable
   variables:
     - language_negotiation
+  provider: language
 process:
   session/parameter:
     plugin: default_value
diff --git a/core/modules/language/migration_templates/d6_language_types.yml b/core/modules/language/migration_templates/d6_language_types.yml
index 05ce300..e4403ce 100644
--- a/core/modules/language/migration_templates/d6_language_types.yml
+++ b/core/modules/language/migration_templates/d6_language_types.yml
@@ -6,6 +6,7 @@ source:
   plugin: variable
   variables:
     - language_negotiation
+  provider: language
 process:
   all:
     plugin: default_value
diff --git a/core/modules/language/migration_templates/d7_language_content_settings.yml b/core/modules/language/migration_templates/d7_language_content_settings.yml
index 09437fa..f5f62bd 100644
--- a/core/modules/language/migration_templates/d7_language_content_settings.yml
+++ b/core/modules/language/migration_templates/d7_language_content_settings.yml
@@ -6,6 +6,7 @@ source:
   plugin: d7_language_content_settings
   constants:
     target_type: 'node'
+  provider: locale
 process:
 # Ignore i18n_node_options_[node_type] options not available in Drupal 8,
 # i18n_required_node and i18n_newnode_current
diff --git a/core/modules/language/migration_templates/d7_language_negotiation_settings.yml b/core/modules/language/migration_templates/d7_language_negotiation_settings.yml
index 7759965..7b6c52f 100644
--- a/core/modules/language/migration_templates/d7_language_negotiation_settings.yml
+++ b/core/modules/language/migration_templates/d7_language_negotiation_settings.yml
@@ -7,6 +7,7 @@ source:
   variables:
     - locale_language_negotiation_session_param
     - locale_language_negotiation_url_part
+  provider: locale
 process:
   session/parameter:
     plugin: default_value
@@ -27,6 +28,7 @@ process:
 destination:
   plugin: config
   config_name: language.negotiation
+  provider: language
 migration_dependencies:
   required:
     - language
diff --git a/core/modules/language/migration_templates/d7_language_types.yml b/core/modules/language/migration_templates/d7_language_types.yml
index 3a634a2..75f0ea7 100644
--- a/core/modules/language/migration_templates/d7_language_types.yml
+++ b/core/modules/language/migration_templates/d7_language_types.yml
@@ -12,6 +12,7 @@ source:
     - locale_language_providers_weight_language
     - locale_language_providers_weight_language_content
     - locale_language_providers_weight_language_url
+  provider: language
 process:
   all:
     plugin: language_types
diff --git a/core/modules/language/migration_templates/default_language.yml b/core/modules/language/migration_templates/default_language.yml
index 6d7604d..8784acb 100644
--- a/core/modules/language/migration_templates/default_language.yml
+++ b/core/modules/language/migration_templates/default_language.yml
@@ -7,6 +7,7 @@ source:
   plugin: variable
   variables:
     - language_default
+  provider: locale
 process:
   default_langcode:
     -
diff --git a/core/modules/locale/migration_templates/locale_settings.yml b/core/modules/locale/migration_templates/locale_settings.yml
index 6eebe20..f61b8a1 100644
--- a/core/modules/locale/migration_templates/locale_settings.yml
+++ b/core/modules/locale/migration_templates/locale_settings.yml
@@ -8,6 +8,7 @@ source:
   variables:
     - locale_cache_strings
     - locale_js_directory
+  provider: locale
 process:
   cache_strings: locale_cache_strings
   'javascript/directory': locale_js_directory
diff --git a/core/modules/menu_link_content/src/Plugin/migrate/source/MenuLink.php b/core/modules/menu_link_content/src/Plugin/migrate/source/MenuLink.php
index 338d3ec..dd87ee7 100644
--- a/core/modules/menu_link_content/src/Plugin/migrate/source/MenuLink.php
+++ b/core/modules/menu_link_content/src/Plugin/migrate/source/MenuLink.php
@@ -11,6 +11,7 @@
  *
  * @MigrateSource(
  *   id = "menu_link",
+ *   source_provider = "menu"
  * )
  */
 class MenuLink extends DrupalSqlBase {
diff --git a/core/modules/menu_ui/migration_templates/menu_settings.yml b/core/modules/menu_ui/migration_templates/menu_settings.yml
index dee5f9e..70d2ca4 100644
--- a/core/modules/menu_ui/migration_templates/menu_settings.yml
+++ b/core/modules/menu_ui/migration_templates/menu_settings.yml
@@ -8,8 +8,10 @@ source:
   plugin: variable
   variables:
     - menu_override_parent_selector
+  provider: menu
 process:
   override_parent_selector: menu_override_parent_selector
 destination:
   plugin: config
   config_name: menu_ui.settings
+  provider: menu_ui
diff --git a/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php b/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php
index 6b1fc1b..61bc480 100644
--- a/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php
+++ b/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php
@@ -21,646 +21,6 @@ class MigrateUpgradeForm extends ConfirmFormBase {
   use MigrationConfigurationTrait;
 
   /**
-   * Mapping of known migrations and their source and destination modules.
-   *
-   * @todo https://www.drupal.org/node/2569805 Hardcoding this information is
-   *   not robust - the migrations themselves should hold the necessary
-   *   information.
-   *
-   * @var array[]
-   */
-  protected $moduleUpgradePaths = [
-    'action_settings' => [
-      'source_module' => 'system',
-      'destination_module' => 'action',
-    ],
-    'd6_aggregator_feed' => [
-      'source_module' => 'aggregator',
-      'destination_module' => 'aggregator',
-    ],
-    'd6_aggregator_item' => [
-      'source_module' => 'aggregator',
-      'destination_module' => 'aggregator',
-    ],
-    'd6_aggregator_settings' => [
-      'source_module' => 'aggregator',
-      'destination_module' => 'aggregator',
-    ],
-    'd7_aggregator_feed' => [
-      'source_module' => 'aggregator',
-      'destination_module' => 'aggregator',
-    ],
-    'd7_aggregator_item' => [
-      'source_module' => 'aggregator',
-      'destination_module' => 'aggregator',
-    ],
-    'd7_aggregator_settings' => [
-      'source_module' => 'aggregator',
-      'destination_module' => 'aggregator',
-    ],
-    'd7_blocked_ips' => [
-      'source_module' => 'system',
-      'destination_module' => 'ban',
-    ],
-    'd6_block' => [
-      'source_module' => 'block',
-      'destination_module' => 'block',
-    ],
-    'd7_block' => [
-      'source_module' => 'block',
-      'destination_module' => 'block',
-    ],
-    'block_content_body_field' => [
-      'source_module' => 'block',
-      'destination_module' => 'block_content',
-    ],
-    'block_content_type' => [
-      'source_module' => 'block',
-      'destination_module' => 'block_content',
-    ],
-    'd6_custom_block' => [
-      'source_module' => 'block',
-      'destination_module' => 'block_content',
-    ],
-    'd7_custom_block' => [
-      'source_module' => 'block',
-      'destination_module' => 'block_content',
-    ],
-    'd6_book' => [
-      'source_module' => 'book',
-      'destination_module' => 'book',
-    ],
-    'd6_book_settings' => [
-      'source_module' => 'book',
-      'destination_module' => 'book',
-    ],
-    'd6_comment' => [
-      'source_module' => 'comment',
-      'destination_module' => 'comment',
-    ],
-    'd6_comment_entity_display' => [
-      'source_module' => 'comment',
-      'destination_module' => 'comment',
-    ],
-    'd6_comment_entity_form_display' => [
-      'source_module' => 'comment',
-      'destination_module' => 'comment',
-    ],
-    'd6_comment_entity_form_display_subject' => [
-      'source_module' => 'comment',
-      'destination_module' => 'comment',
-    ],
-    'd6_comment_field' => [
-      'source_module' => 'comment',
-      'destination_module' => 'comment',
-    ],
-    'd6_comment_field_instance' => [
-      'source_module' => 'comment',
-      'destination_module' => 'comment',
-    ],
-    'd6_comment_type' => [
-      'source_module' => 'comment',
-      'destination_module' => 'comment',
-    ],
-    'd7_comment' => [
-      'source_module' => 'comment',
-      'destination_module' => 'comment',
-    ],
-    'd7_comment_entity_display' => [
-      'source_module' => 'comment',
-      'destination_module' => 'comment',
-    ],
-    'd7_comment_entity_form_display' => [
-      'source_module' => 'comment',
-      'destination_module' => 'comment',
-    ],
-    'd7_comment_entity_form_display_subject' => [
-      'source_module' => 'comment',
-      'destination_module' => 'comment',
-    ],
-    'd7_comment_field' => [
-      'source_module' => 'comment',
-      'destination_module' => 'comment',
-    ],
-    'd7_comment_field_instance' => [
-      'source_module' => 'comment',
-      'destination_module' => 'comment',
-    ],
-    'd7_comment_type' => [
-      'source_module' => 'comment',
-      'destination_module' => 'comment',
-    ],
-    'contact_category' => [
-      'source_module' => 'contact',
-      'destination_module' => 'contact',
-    ],
-    'd6_contact_settings' => [
-      'source_module' => 'contact',
-      'destination_module' => 'contact',
-    ],
-    'd7_contact_settings' => [
-      'source_module' => 'contact',
-      'destination_module' => 'contact',
-    ],
-    'd6_dblog_settings' => [
-      'source_module' => 'dblog',
-      'destination_module' => 'dblog',
-    ],
-    'd7_dblog_settings' => [
-      'source_module' => 'dblog',
-      'destination_module' => 'dblog',
-    ],
-    'default_language' => [
-      'source_module' => 'locale',
-      'destination_module' => 'language',
-    ],
-    'd6_field' => [
-      'source_module' => 'content',
-      'destination_module' => 'field',
-    ],
-    'd6_field_formatter_settings' => [
-      'source_module' => 'content',
-      'destination_module' => 'field',
-    ],
-    'd6_field_instance' => [
-      'source_module' => 'content',
-      'destination_module' => 'field',
-    ],
-    'd6_field_instance_widget_settings' => [
-      'source_module' => 'content',
-      'destination_module' => 'field',
-    ],
-    'd7_field' => [
-      'source_module' => 'field',
-      'destination_module' => 'field',
-    ],
-    'd7_field_formatter_settings' => [
-      'source_module' => 'field',
-      'destination_module' => 'field',
-    ],
-    'd7_field_instance' => [
-      'source_module' => 'field',
-      'destination_module' => 'field',
-    ],
-    'd7_field_instance_widget_settings' => [
-      'source_module' => 'field',
-      'destination_module' => 'field',
-    ],
-    'd7_view_modes' => [
-      'source_module' => 'field',
-      'destination_module' => 'field',
-    ],
-    'd6_file' => [
-      'source_module' => 'system',
-      'destination_module' => 'file',
-    ],
-    'file_settings' => [
-      'source_module' => 'system',
-      'destination_module' => 'file',
-    ],
-    'd6_upload' => [
-      'source_module' => 'upload',
-      'destination_module' => 'file',
-    ],
-    'd6_upload_entity_display' => [
-      'source_module' => 'upload',
-      'destination_module' => 'file',
-    ],
-    'd6_upload_entity_form_display' => [
-      'source_module' => 'upload',
-      'destination_module' => 'file',
-    ],
-    'd6_upload_field' => [
-      'source_module' => 'upload',
-      'destination_module' => 'file',
-    ],
-    'd6_upload_field_instance' => [
-      'source_module' => 'upload',
-      'destination_module' => 'file',
-    ],
-    'd7_file' => [
-      'source_module' => 'file',
-      'destination_module' => 'file',
-    ],
-    'd6_filter_format' => [
-      'source_module' => 'filter',
-      'destination_module' => 'filter',
-    ],
-    'd7_filter_format' => [
-      'source_module' => 'filter',
-      'destination_module' => 'filter',
-    ],
-    'd7_filter_settings' => [
-      'source_module' => 'filter',
-      'destination_module' => 'filter',
-    ],
-    'd6_forum_settings' => [
-      'source_module' => 'forum',
-      'destination_module' => 'forum',
-    ],
-    'd7_forum_settings' => [
-      'source_module' => 'forum',
-      'destination_module' => 'forum',
-    ],
-    'd7_global_theme_settings' => [
-      'source_module' => 'system',
-      'destination_module' => 'system',
-    ],
-    'd6_imagecache_presets' => [
-      'source_module' => 'imagecache',
-      'destination_module' => 'image',
-    ],
-    'd7_image_settings' => [
-      'source_module' => 'image',
-      'destination_module' => 'image',
-    ],
-    'd7_image_styles' => [
-      'source_module' => 'image',
-      'destination_module' => 'image',
-    ],
-    'd6_language_content_settings' => [
-      'source_module' => 'locale',
-      'destination_module' => 'language',
-    ],
-    'd7_language_content_settings' => [
-      'source_module' => 'locale',
-      'destination_module' => 'language',
-    ],
-    'd6_language_negotiation_settings' => [
-      'source_module' => 'locale',
-      'destination_module' => 'language',
-    ],
-    'd7_language_negotiation_settings' => [
-      'source_module' => 'locale',
-      'destination_module' => 'language',
-    ],
-    'language_prefixes_and_domains' => [
-      'source_module' => 'locale',
-      'destination_module' => 'language',
-    ],
-    'd6_language_types' => [
-      'source_module' => 'locale',
-      'destination_module' => 'language',
-    ],
-    'language' => [
-      'source_module' => 'locale',
-      'destination_module' => 'language',
-    ],
-    'd7_language_types' => [
-      'source_module' => 'locale',
-      'destination_module' => 'language',
-    ],
-    'locale_settings' => [
-      'source_module' => 'locale',
-      'destination_module' => 'locale',
-    ],
-    'd6_menu_links' => [
-      'source_module' => 'menu',
-      'destination_module' => 'menu_link_content',
-    ],
-    'menu_settings' => [
-      'source_module' => 'menu',
-      'destination_module' => 'menu_ui',
-    ],
-    'd7_menu_links' => [
-      'source_module' => 'menu',
-      'destination_module' => 'menu_link_content',
-    ],
-    'd6_node' => [
-      'source_module' => 'node',
-      'destination_module' => 'node',
-    ],
-    'd6_node_translation' => [
-      'source_module' => 'translation',
-      'destination_module' => 'content_translation',
-    ],
-    'd6_node_revision' => [
-      'source_module' => 'node',
-      'destination_module' => 'node',
-    ],
-    'd6_node_setting_promote' => [
-      'source_module' => 'node',
-      'destination_module' => 'node',
-    ],
-    'd6_node_setting_status' => [
-      'source_module' => 'node',
-      'destination_module' => 'node',
-    ],
-    'd6_node_setting_sticky' => [
-      'source_module' => 'node',
-      'destination_module' => 'node',
-    ],
-    'd6_node_settings' => [
-      'source_module' => 'node',
-      'destination_module' => 'node',
-    ],
-    'd6_node_type' => [
-      'source_module' => 'node',
-      'destination_module' => 'node',
-    ],
-    'd6_view_modes' => [
-      'source_module' => 'node',
-      'destination_module' => 'node',
-    ],
-    'd7_node' => [
-      'source_module' => 'node',
-      'destination_module' => 'node',
-    ],
-    'd7_node_revision' => [
-      'source_module' => 'node',
-      'destination_module' => 'node',
-    ],
-    'd7_node_settings' => [
-      'source_module' => 'node',
-      'destination_module' => 'node',
-    ],
-    'd7_node_translation' => [
-      'source_module' => 'node',
-      'destination_module' => 'node',
-    ],
-    'd7_node_title_label' => [
-      'source_module' => 'node',
-      'destination_module' => 'node',
-    ],
-    'd7_node_type' => [
-      'source_module' => 'node',
-      'destination_module' => 'node',
-    ],
-    'd6_url_alias' => [
-      'source_module' => 'path',
-      'destination_module' => 'path',
-    ],
-    'd7_url_alias' => [
-      'source_module' => 'path',
-      'destination_module' => 'path',
-    ],
-    'search_page' => [
-      'source_module' => 'search',
-      'destination_module' => 'search',
-    ],
-    'd6_search_settings' => [
-      'source_module' => 'search',
-      'destination_module' => 'search',
-    ],
-    'd7_search_settings' => [
-      'source_module' => 'search',
-      'destination_module' => 'search',
-    ],
-    'd7_shortcut' => [
-      'source_module' => 'shortcut',
-      'destination_module' => 'shortcut',
-    ],
-    'd7_shortcut_set' => [
-      'source_module' => 'shortcut',
-      'destination_module' => 'shortcut',
-    ],
-    'd7_shortcut_set_users' => [
-      'source_module' => 'shortcut',
-      'destination_module' => 'shortcut',
-    ],
-    'd6_simpletest_settings' => [
-      'source_module' => 'simpletest',
-      'destination_module' => 'simpletest',
-    ],
-    'd7_simpletest_settings' => [
-      'source_module' => 'simpletest',
-      'destination_module' => 'simpletest',
-    ],
-    'd6_statistics_settings' => [
-      'source_module' => 'statistics',
-      'destination_module' => 'statistics',
-    ],
-    'd6_syslog_settings' => [
-      'source_module' => 'syslog',
-      'destination_module' => 'syslog',
-    ],
-    'd7_syslog_settings' => [
-      'source_module' => 'syslog',
-      'destination_module' => 'syslog',
-    ],
-    'd6_date_formats' => [
-      'source_module' => 'system',
-      'destination_module' => 'system',
-    ],
-    'd6_system_cron' => [
-      'source_module' => 'system',
-      'destination_module' => 'system',
-    ],
-    'd6_system_date' => [
-      'source_module' => 'system',
-      'destination_module' => 'system',
-    ],
-    'd6_system_file' => [
-      'source_module' => 'system',
-      'destination_module' => 'system',
-    ],
-    'system_image' => [
-      'source_module' => 'system',
-      'destination_module' => 'system',
-    ],
-    'system_image_gd' => [
-      'source_module' => 'system',
-      'destination_module' => 'system',
-    ],
-    'system_logging' => [
-      'source_module' => 'system',
-      'destination_module' => 'system',
-    ],
-    'system_maintenance' => [
-      'source_module' => 'system',
-      'destination_module' => 'system',
-    ],
-    'd6_system_performance' => [
-      'source_module' => 'system',
-      'destination_module' => 'system',
-    ],
-    'system_rss' => [
-      'source_module' => 'system',
-      'destination_module' => 'system',
-    ],
-    'system_site' => [
-      'source_module' => 'system',
-      'destination_module' => 'system',
-    ],
-    'd7_system_authorize' => [
-      'source_module' => 'system',
-      'destination_module' => 'system',
-    ],
-    'd7_system_cron' => [
-      'source_module' => 'system',
-      'destination_module' => 'system',
-    ],
-    'd7_system_date' => [
-      'source_module' => 'system',
-      'destination_module' => 'system',
-    ],
-    'd7_system_file' => [
-      'source_module' => 'system',
-      'destination_module' => 'system',
-    ],
-    'd7_system_mail' => [
-      'source_module' => 'system',
-      'destination_module' => 'system',
-    ],
-    'd7_system_performance' => [
-      'source_module' => 'system',
-      'destination_module' => 'system',
-    ],
-    'd6_menu' => [
-      'source_module' => 'menu',
-      'destination_module' => 'system',
-    ],
-    'd7_menu' => [
-      'source_module' => 'menu',
-      'destination_module' => 'system',
-    ],
-    'taxonomy_settings' => [
-      'source_module' => 'taxonomy',
-      'destination_module' => 'taxonomy',
-    ],
-    'd6_taxonomy_term' => [
-      'source_module' => 'taxonomy',
-      'destination_module' => 'taxonomy',
-    ],
-    'd6_taxonomy_vocabulary' => [
-      'source_module' => 'taxonomy',
-      'destination_module' => 'taxonomy',
-    ],
-    'd6_term_node' => [
-      'source_module' => 'taxonomy',
-      'destination_module' => 'taxonomy',
-    ],
-    'd6_term_node_revision' => [
-      'source_module' => 'taxonomy',
-      'destination_module' => 'taxonomy',
-    ],
-    'd6_vocabulary_entity_display' => [
-      'source_module' => 'taxonomy',
-      'destination_module' => 'taxonomy',
-    ],
-    'd6_vocabulary_entity_form_display' => [
-      'source_module' => 'taxonomy',
-      'destination_module' => 'taxonomy',
-    ],
-    'd6_vocabulary_field' => [
-      'source_module' => 'taxonomy',
-      'destination_module' => 'taxonomy',
-    ],
-    'd6_vocabulary_field_instance' => [
-      'source_module' => 'taxonomy',
-      'destination_module' => 'taxonomy',
-    ],
-    'd7_taxonomy_term' => [
-      'source_module' => 'taxonomy',
-      'destination_module' => 'taxonomy',
-    ],
-    'd7_taxonomy_vocabulary' => [
-      'source_module' => 'taxonomy',
-      'destination_module' => 'taxonomy',
-    ],
-    'text_settings' => [
-      'source_module' => 'text',
-      'destination_module' => 'text',
-    ],
-    'd7_tracker_node' => [
-      'source_module' => 'tracker',
-      'destination_module' => 'tracker',
-    ],
-    'd7_tracker_settings' => [
-      'source_module' => 'tracker',
-      'destination_module' => 'tracker',
-    ],
-    'd7_tracker_user' => [
-      'source_module' => 'tracker',
-      'destination_module' => 'tracker',
-    ],
-    'update_settings' => [
-      'source_module' => 'update',
-      'destination_module' => 'update',
-    ],
-    'd6_profile_values' => [
-      'source_module' => 'profile',
-      'destination_module' => 'user',
-    ],
-    'd6_user' => [
-      'source_module' => 'user',
-      'destination_module' => 'user',
-    ],
-    'd6_user_contact_settings' => [
-      'source_module' => 'user',
-      'destination_module' => 'user',
-    ],
-    'd6_user_mail' => [
-      'source_module' => 'user',
-      'destination_module' => 'user',
-    ],
-    'd6_user_picture_file' => [
-      'source_module' => 'user',
-      'destination_module' => 'user',
-    ],
-    'd6_user_role' => [
-      'source_module' => 'user',
-      'destination_module' => 'user',
-    ],
-    'd6_user_settings' => [
-      'source_module' => 'user',
-      'destination_module' => 'user',
-    ],
-    'd7_user' => [
-      'source_module' => 'user',
-      'destination_module' => 'user',
-    ],
-    'd7_user_flood' => [
-      'source_module' => 'user',
-      'destination_module' => 'user',
-    ],
-    'd7_user_mail' => [
-      'source_module' => 'user',
-      'destination_module' => 'user',
-    ],
-    'd7_user_role' => [
-      'source_module' => 'user',
-      'destination_module' => 'user',
-    ],
-    'user_picture_entity_display' => [
-      'source_module' => 'user',
-      'destination_module' => 'user',
-    ],
-    'user_picture_entity_form_display' => [
-      'source_module' => 'user',
-      'destination_module' => 'user',
-    ],
-    'user_picture_field' => [
-      'source_module' => 'user',
-      'destination_module' => 'user',
-    ],
-    'user_picture_field_instance' => [
-      'source_module' => 'user',
-      'destination_module' => 'user',
-    ],
-    'user_profile_entity_display' => [
-      'source_module' => 'profile',
-      'destination_module' => 'user',
-    ],
-    'user_profile_entity_form_display' => [
-      'source_module' => 'profile',
-      'destination_module' => 'user',
-    ],
-    'user_profile_field' => [
-      'source_module' => 'profile',
-      'destination_module' => 'user',
-    ],
-    'user_profile_field_instance' => [
-      'source_module' => 'profile',
-      'destination_module' => 'user',
-    ],
-    'd6_i18n_user_profile_field_instance' => [
-      'source_module' => 'i18n',
-      'destination_module' => 'user',
-    ],
-  ];
-
-  /**
    * The state service.
    *
    * @var \Drupal\Core\State\StateInterface
@@ -984,6 +344,7 @@ public function validateCredentialForm(array &$form, FormStateInterface $form_st
         }
 
         // Store the retrieved migration IDs in form storage.
+        $form_state->set('version', $version);
         $form_state->set('migrations', $migration_array);
         $form_state->set('source_base_path', $form_state->getValue('source_base_path'));
 
@@ -1032,26 +393,68 @@ public function buildConfirmForm(array $form, FormStateInterface $form_state) {
 
     $form['actions']['submit']['#value'] = $this->t('Perform upgrade');
 
+    $version = $form_state->get('version');
+    $migrations = $this->getMigrations('migrate_drupal_' . $version, $version);
+
     $table_data = [];
-    $system_data = [];
-    foreach ($form_state->get('migrations') as $migration_id => $migration_label) {
-      // Fetch the system data at the first opportunity.
-      if (empty($system_data)) {
-        $system_data = $form_state->get('system_data');
+    foreach ($migrations as $migration) {
+      $migration_id = $migration->getPluginId();
+
+      // Determine the source provider, looking in configuration first. The
+      // source_provider is expected to be the name of module in the source
+      // database. It is explicitly set in either the migration configuration or
+      // the source plugin annotation.
+      $source_configuration = $migration->getSourceConfiguration();
+      $source_module = (!empty($source_configuration['provider'])) ? $source_configuration['provider'] : NULL;
+      if (!$source_module) {
+        // Get the source_provider from the plugin definition.
+        $plugin_definition = $migration->getSourcePlugin()->getPluginDefinition();
+        $source_module = (!empty($plugin_definition['source_provider'])) ? $plugin_definition['source_provider'] : NULL;
+      }
+      if (!$source_module) {
+        drupal_set_message($this->t('Source provider not found for @migration_id.', ['@migration_id' => $migration_id]), 'error');
+      }
+
+      // Determine the destination provider, looking in configuration first.
+      $destination_configuration = $migration->getDestinationConfiguration();
+      $destination_module = (!empty($destination_configuration['provider'])) ? $destination_configuration['provider'] : NULL;
+      if (!$destination_module) {
+        $destination_plugin = $migration->getDestinationPlugin();
+        if ($destination_plugin->getPluginId() == 'config') {
+          // For configuration destinations pull out the module name from the
+          // configuration destination string.
+          $configuration_destination = (!empty($destination_configuration['config_name'])) ? $destination_configuration['config_name'] : NULL;
+          if ($configuration_destination) {
+            $destination_module = explode('.', $configuration_destination, 2)[0];
+          }
+        }
+        else {
+          // If not a config destination, the destination module is simply
+          // the provider of the plugin.
+          $destination_module = $destination_plugin->getPluginDefinition()['provider'];
+        }
+      }
+      if (!$destination_module) {
+        drupal_set_message($this->t('Destination provider not found for @migration_id.', ['@migration_id' => $migration_id]), 'error');
       }
 
-      // Handle derivatives.
-      list($migration_id,) = explode(':', $migration_id, 2);
-      $source_module = $this->moduleUpgradePaths[$migration_id]['source_module'];
-      $destination_module = $this->moduleUpgradePaths[$migration_id]['destination_module'];
-      $table_data[$source_module][$destination_module][$migration_id] = $migration_label;
+      if ($source_module && $destination_module) {
+        $table_data[$source_module][$destination_module][$migration_id] = $migration->label();
+      }
     }
+
     // Sort the table by source module names and within that destination
     // module names.
     ksort($table_data);
     foreach ($table_data as $source_module => $destination_module_info) {
       ksort($table_data[$source_module]);
     }
+
+    $system_data = [];
+    // Fetch the system data at the first opportunity.
+    if (empty($system_data)) {
+      $system_data = $form_state->get('system_data');
+    }
     $unmigrated_source_modules = array_diff_key($system_data['module'], $table_data);
 
     // Missing migrations.
diff --git a/core/modules/node/migration_templates/d6_node_settings.yml b/core/modules/node/migration_templates/d6_node_settings.yml
index 17b0857..19c680d 100644
--- a/core/modules/node/migration_templates/d6_node_settings.yml
+++ b/core/modules/node/migration_templates/d6_node_settings.yml
@@ -6,6 +6,7 @@ source:
   plugin: variable
   variables:
     - node_admin_theme
+  provider: node
 process:
   use_admin_theme: node_admin_theme
 destination:
diff --git a/core/modules/node/migration_templates/d7_node_settings.yml b/core/modules/node/migration_templates/d7_node_settings.yml
index 0461754..0cf40f8 100644
--- a/core/modules/node/migration_templates/d7_node_settings.yml
+++ b/core/modules/node/migration_templates/d7_node_settings.yml
@@ -6,6 +6,7 @@ source:
   plugin: variable
   variables:
     - node_admin_theme
+  provider: node
 process:
   use_admin_theme: node_admin_theme
 destination:
diff --git a/core/modules/node/src/Plugin/migrate/source/d6/Node.php b/core/modules/node/src/Plugin/migrate/source/d6/Node.php
index ffa2659..0fd9820 100644
--- a/core/modules/node/src/Plugin/migrate/source/d6/Node.php
+++ b/core/modules/node/src/Plugin/migrate/source/d6/Node.php
@@ -15,7 +15,9 @@
  * Drupal 6 node source from database.
  *
  * @MigrateSource(
- *   id = "d6_node"
+ *   id = "d6_node",
+ *   source_provider = "node"
+ *
  * )
  */
 class Node extends DrupalSqlBase {
diff --git a/core/modules/node/src/Plugin/migrate/source/d6/NodeRevision.php b/core/modules/node/src/Plugin/migrate/source/d6/NodeRevision.php
index f3296c2..814795e 100644
--- a/core/modules/node/src/Plugin/migrate/source/d6/NodeRevision.php
+++ b/core/modules/node/src/Plugin/migrate/source/d6/NodeRevision.php
@@ -7,7 +7,8 @@
  * Drupal 6 node revision source from database.
  *
  * @MigrateSource(
- *   id = "d6_node_revision"
+ *   id = "d6_node_revision",
+ *   source_provider = "node"
  * )
  */
 class NodeRevision extends Node {
diff --git a/core/modules/node/src/Plugin/migrate/source/d6/NodeType.php b/core/modules/node/src/Plugin/migrate/source/d6/NodeType.php
index 6a6a32b..f19a886 100644
--- a/core/modules/node/src/Plugin/migrate/source/d6/NodeType.php
+++ b/core/modules/node/src/Plugin/migrate/source/d6/NodeType.php
@@ -9,7 +9,8 @@
  * Drupal 6 Node types source from database.
  *
  * @MigrateSource(
- *   id = "d6_node_type"
+ *   id = "d6_node_type",
+ *   source_provider = "node"
  * )
  */
 class NodeType extends DrupalSqlBase {
diff --git a/core/modules/search/migration_templates/d6_search_settings.yml b/core/modules/search/migration_templates/d6_search_settings.yml
index 28f8600..cb192b9 100644
--- a/core/modules/search/migration_templates/d6_search_settings.yml
+++ b/core/modules/search/migration_templates/d6_search_settings.yml
@@ -10,6 +10,7 @@ source:
     - minimum_word_size
     - overlap_cjk
     - search_cron_limit
+  provider: search
 process:
   'index/minimum_word_size': minimum_word_size
   'index/overlap_cjk': overlap_cjk
diff --git a/core/modules/search/migration_templates/d7_search_settings.yml b/core/modules/search/migration_templates/d7_search_settings.yml
index 57db8b9..7fe2688 100644
--- a/core/modules/search/migration_templates/d7_search_settings.yml
+++ b/core/modules/search/migration_templates/d7_search_settings.yml
@@ -13,6 +13,7 @@ source:
     - search_tag_weights
     - search_and_or_limit
     - search_default_module
+  provider: search
 process:
   'index/minimum_word_size': minimum_word_size
   'index/overlap_cjk': overlap_cjk
diff --git a/core/modules/search/migration_templates/search_page.yml b/core/modules/search/migration_templates/search_page.yml
index 8ddc02a..1173ebb 100644
--- a/core/modules/search/migration_templates/search_page.yml
+++ b/core/modules/search/migration_templates/search_page.yml
@@ -16,6 +16,7 @@ source:
     id: node_search
     path: node
     plugin: node_search
+  provider: search
 process:
   id: 'constants/id'
   path: 'constants/path'
diff --git a/core/modules/simpletest/migration_templates/d6_simpletest_settings.yml b/core/modules/simpletest/migration_templates/d6_simpletest_settings.yml
index c9eedbb..e9aad31 100644
--- a/core/modules/simpletest/migration_templates/d6_simpletest_settings.yml
+++ b/core/modules/simpletest/migration_templates/d6_simpletest_settings.yml
@@ -10,6 +10,7 @@ source:
     - simpletest_httpauth_password
     - simpletest_httpauth_username
     - simpletest_verbose
+  provider: simpletest
 process:
   clear_results: simpletest_clear_results
   'httpauth/method': simpletest_httpauth_method
diff --git a/core/modules/simpletest/migration_templates/d7_simpletest_settings.yml b/core/modules/simpletest/migration_templates/d7_simpletest_settings.yml
index b77f76a..7e185b5 100644
--- a/core/modules/simpletest/migration_templates/d7_simpletest_settings.yml
+++ b/core/modules/simpletest/migration_templates/d7_simpletest_settings.yml
@@ -10,6 +10,7 @@ source:
     - simpletest_httpauth_password
     - simpletest_httpauth_username
     - simpletest_verbose
+  provider: simpletest
 process:
   clear_results: simpletest_clear_results
   'httpauth/method': simpletest_httpauth_method
diff --git a/core/modules/statistics/migration_templates/statistics_settings.yml b/core/modules/statistics/migration_templates/statistics_settings.yml
index 1f5b5bb..9a010eb 100644
--- a/core/modules/statistics/migration_templates/statistics_settings.yml
+++ b/core/modules/statistics/migration_templates/statistics_settings.yml
@@ -9,6 +9,7 @@ source:
     - statistics_enable_access_log
     - statistics_flush_accesslog_timer
     - statistics_count_content_views
+  provider: statistics
 process:
   'count_content_views': statistics_count_content_views
 destination:
diff --git a/core/modules/syslog/migration_templates/d6_syslog_settings.yml b/core/modules/syslog/migration_templates/d6_syslog_settings.yml
index 86a7017..8b0ea22 100644
--- a/core/modules/syslog/migration_templates/d6_syslog_settings.yml
+++ b/core/modules/syslog/migration_templates/d6_syslog_settings.yml
@@ -7,6 +7,7 @@ source:
   variables:
     - syslog_identity
     - syslog_facility
+  provider: syslog
 process:
   identity: syslog_identity
   facility: syslog_facility
diff --git a/core/modules/syslog/migration_templates/d7_syslog_settings.yml b/core/modules/syslog/migration_templates/d7_syslog_settings.yml
index 4000572..5b60d73 100644
--- a/core/modules/syslog/migration_templates/d7_syslog_settings.yml
+++ b/core/modules/syslog/migration_templates/d7_syslog_settings.yml
@@ -8,6 +8,7 @@ source:
     - syslog_facility
     - syslog_format
     - syslog_identity
+  provider: syslog
 process:
   facility: syslog_facility
   format: syslog_format
diff --git a/core/modules/system/migration_templates/d6_date_formats.yml b/core/modules/system/migration_templates/d6_date_formats.yml
index 71257d4..a90f80b 100644
--- a/core/modules/system/migration_templates/d6_date_formats.yml
+++ b/core/modules/system/migration_templates/d6_date_formats.yml
@@ -8,6 +8,7 @@ source:
     - date_format_long
     - date_format_medium
     - date_format_short
+  provider: system
 process:
   id:
     plugin: static_map
diff --git a/core/modules/system/migration_templates/d6_system_cron.yml b/core/modules/system/migration_templates/d6_system_cron.yml
index 7dd3a2b..840d932 100644
--- a/core/modules/system/migration_templates/d6_system_cron.yml
+++ b/core/modules/system/migration_templates/d6_system_cron.yml
@@ -8,6 +8,7 @@ source:
     - cron_threshold_warning
     - cron_threshold_error
     - cron_last
+  provider: system
 process:
   'threshold/requirements_warning': cron_threshold_warning
   'threshold/requirements_error': cron_threshold_error
diff --git a/core/modules/system/migration_templates/d6_system_date.yml b/core/modules/system/migration_templates/d6_system_date.yml
index 25f6728..5240716 100644
--- a/core/modules/system/migration_templates/d6_system_date.yml
+++ b/core/modules/system/migration_templates/d6_system_date.yml
@@ -8,6 +8,7 @@ source:
     - configurable_timezones
     - date_first_day
     - date_default_timezone
+  provider: system
 process:
   'timezone/user/configurable': configurable_timezones
   first_day: date_first_day
diff --git a/core/modules/system/migration_templates/d6_system_file.yml b/core/modules/system/migration_templates/d6_system_file.yml
index 60cd616..fc0b8d5 100644
--- a/core/modules/system/migration_templates/d6_system_file.yml
+++ b/core/modules/system/migration_templates/d6_system_file.yml
@@ -7,6 +7,7 @@ source:
   variables:
     - file_directory_temp
     - allow_insecure_uploads
+  provider: system
 process:
   'path/temporary': file_directory_temp
   allow_insecure_uploads:
diff --git a/core/modules/system/migration_templates/d6_system_performance.yml b/core/modules/system/migration_templates/d6_system_performance.yml
index 6f9666e..f1d81c6 100644
--- a/core/modules/system/migration_templates/d6_system_performance.yml
+++ b/core/modules/system/migration_templates/d6_system_performance.yml
@@ -10,6 +10,7 @@ source:
     - cache_lifetime
     - cache
     - page_compression
+  provider: system
 process:
   'css/preprocess': preprocess_css
   'js/preprocess': preprocess_js
diff --git a/core/modules/system/migration_templates/d7_global_theme_settings.yml b/core/modules/system/migration_templates/d7_global_theme_settings.yml
index 42c5177..cc7e354 100644
--- a/core/modules/system/migration_templates/d7_global_theme_settings.yml
+++ b/core/modules/system/migration_templates/d7_global_theme_settings.yml
@@ -6,6 +6,7 @@ source:
   plugin: variable
   variables:
     - theme_settings
+  provider: system
 process:
   'features/logo': theme_settings/toggle_logo
   'features/name': theme_settings/toggle_name
diff --git a/core/modules/system/migration_templates/d7_system_authorize.yml b/core/modules/system/migration_templates/d7_system_authorize.yml
index 420497b..a0ef270 100644
--- a/core/modules/system/migration_templates/d7_system_authorize.yml
+++ b/core/modules/system/migration_templates/d7_system_authorize.yml
@@ -5,6 +5,7 @@ source:
   plugin: variable
   variables:
     - authorize_filetransfer_default
+  provider: system
 process:
    filetransfer_default: authorize_filetransfer_default
 destination:
diff --git a/core/modules/system/migration_templates/d7_system_cron.yml b/core/modules/system/migration_templates/d7_system_cron.yml
index a603af3..4f820ea 100644
--- a/core/modules/system/migration_templates/d7_system_cron.yml
+++ b/core/modules/system/migration_templates/d7_system_cron.yml
@@ -7,6 +7,7 @@ source:
   variables:
     - cron_threshold_warning
     - cron_threshold_error
+  provider: system
 process:
   'threshold/requirements_warning': cron_threshold_warning
   'threshold/requirements_error': cron_threshold_error
diff --git a/core/modules/system/migration_templates/d7_system_date.yml b/core/modules/system/migration_templates/d7_system_date.yml
index b380c89..382e054 100644
--- a/core/modules/system/migration_templates/d7_system_date.yml
+++ b/core/modules/system/migration_templates/d7_system_date.yml
@@ -10,6 +10,7 @@ source:
     - configurable_timezones
     - empty_timezone_message
     - user_default_timezone
+  provider: system
 process:
   'country/default': site_default_country
   first_day: date_first_day
diff --git a/core/modules/system/migration_templates/d7_system_file.yml b/core/modules/system/migration_templates/d7_system_file.yml
index 2295e0e..3e6cb59 100644
--- a/core/modules/system/migration_templates/d7_system_file.yml
+++ b/core/modules/system/migration_templates/d7_system_file.yml
@@ -7,6 +7,7 @@ source:
   variables:
     - allow_insecure_uploads
     - file_temporary_path
+  provider: system
 process:
   allow_insecure_uploads:
     plugin: static_map
diff --git a/core/modules/system/migration_templates/d7_system_mail.yml b/core/modules/system/migration_templates/d7_system_mail.yml
index d4a569c..c6d46b4 100644
--- a/core/modules/system/migration_templates/d7_system_mail.yml
+++ b/core/modules/system/migration_templates/d7_system_mail.yml
@@ -5,6 +5,7 @@ source:
   plugin: variable
   variables:
     - mail_system
+  provider: system
 process:
   'interface/default':
     plugin: static_map
diff --git a/core/modules/system/migration_templates/d7_system_performance.yml b/core/modules/system/migration_templates/d7_system_performance.yml
index b41d75e..e658172 100644
--- a/core/modules/system/migration_templates/d7_system_performance.yml
+++ b/core/modules/system/migration_templates/d7_system_performance.yml
@@ -9,6 +9,7 @@ source:
     - preprocess_js
     - cache_lifetime
     - page_compression
+  provider: system
 process:
   'css/preprocess': preprocess_css
   'js/preprocess': preprocess_js
diff --git a/core/modules/system/migration_templates/system_image.yml b/core/modules/system/migration_templates/system_image.yml
index 7bb16b1..4ab33fb 100644
--- a/core/modules/system/migration_templates/system_image.yml
+++ b/core/modules/system/migration_templates/system_image.yml
@@ -7,6 +7,7 @@ source:
   plugin: variable
   variables:
     - image_toolkit
+  provider: system
 process:
   toolkit: image_toolkit
 destination:
diff --git a/core/modules/system/migration_templates/system_image_gd.yml b/core/modules/system/migration_templates/system_image_gd.yml
index 685116e..4c433a2 100644
--- a/core/modules/system/migration_templates/system_image_gd.yml
+++ b/core/modules/system/migration_templates/system_image_gd.yml
@@ -7,6 +7,7 @@ source:
   plugin: variable
   variables:
     - image_jpeg_quality
+  provider: system
 process:
   jpeg_quality: image_jpeg_quality
 destination:
diff --git a/core/modules/system/migration_templates/system_logging.yml b/core/modules/system/migration_templates/system_logging.yml
index c1e8114..5bacd44 100644
--- a/core/modules/system/migration_templates/system_logging.yml
+++ b/core/modules/system/migration_templates/system_logging.yml
@@ -7,6 +7,7 @@ source:
   plugin: variable
   variables:
     - error_level
+  provider: system
 process:
   error_level:
     plugin: static_map
diff --git a/core/modules/system/migration_templates/system_maintenance.yml b/core/modules/system/migration_templates/system_maintenance.yml
index b9f6c34..5e5a11c 100644
--- a/core/modules/system/migration_templates/system_maintenance.yml
+++ b/core/modules/system/migration_templates/system_maintenance.yml
@@ -7,6 +7,7 @@ source:
   plugin: variable
   variables:
     - site_offline_message
+  provider: system
 process:
   message: site_offline_message
 destination:
diff --git a/core/modules/system/migration_templates/system_rss.yml b/core/modules/system/migration_templates/system_rss.yml
index 92ce45a..20d15aa 100644
--- a/core/modules/system/migration_templates/system_rss.yml
+++ b/core/modules/system/migration_templates/system_rss.yml
@@ -8,6 +8,7 @@ source:
   variables:
     - feed_default_items
     - feed_item_length
+  provider: system
 process:
   'items/limit': feed_default_items
   'items/view_mode': feed_item_length
diff --git a/core/modules/system/migration_templates/system_site.yml b/core/modules/system/migration_templates/system_site.yml
index c8fd849..e314ecb 100644
--- a/core/modules/system/migration_templates/system_site.yml
+++ b/core/modules/system/migration_templates/system_site.yml
@@ -16,6 +16,7 @@ source:
     - site_404
     - drupal_weight_select_max
     - admin_compact_mode
+  provider: system
 process:
   name: site_name
   mail: site_mail
diff --git a/core/modules/taxonomy/migration_templates/taxonomy_settings.yml b/core/modules/taxonomy/migration_templates/taxonomy_settings.yml
index c20372c..cab3669 100644
--- a/core/modules/taxonomy/migration_templates/taxonomy_settings.yml
+++ b/core/modules/taxonomy/migration_templates/taxonomy_settings.yml
@@ -8,6 +8,7 @@ source:
   variables:
     - taxonomy_override_selector
     - taxonomy_terms_per_page_admin
+  provider: taxonomy
 process:
   override_selector: taxonomy_override_selector
   terms_per_page_admin: taxonomy_terms_per_page_admin
diff --git a/core/modules/taxonomy/src/Plugin/migrate/source/d6/TermNodeRevision.php b/core/modules/taxonomy/src/Plugin/migrate/source/d6/TermNodeRevision.php
index 91c133b..9c4669f 100644
--- a/core/modules/taxonomy/src/Plugin/migrate/source/d6/TermNodeRevision.php
+++ b/core/modules/taxonomy/src/Plugin/migrate/source/d6/TermNodeRevision.php
@@ -6,7 +6,8 @@
  * Source returning tids from the term_node table for the non-current revision.
  *
  * @MigrateSource(
- *   id = "d6_term_node_revision"
+ *   id = "d6_term_node_revision",
+ *   source_provider = "taxonomy"
  * )
  */
 class TermNodeRevision extends TermNode {
diff --git a/core/modules/text/migration_templates/text_settings.yml b/core/modules/text/migration_templates/text_settings.yml
index 45d426d..e17c4d6 100644
--- a/core/modules/text/migration_templates/text_settings.yml
+++ b/core/modules/text/migration_templates/text_settings.yml
@@ -7,6 +7,7 @@ source:
   plugin: variable
   variables:
     - teaser_length
+  provider: text
 process:
   default_summary_length: teaser_length
 destination:
diff --git a/core/modules/tracker/migration_templates/d7_tracker_settings.yml b/core/modules/tracker/migration_templates/d7_tracker_settings.yml
index ce06cbd..beb0143 100644
--- a/core/modules/tracker/migration_templates/d7_tracker_settings.yml
+++ b/core/modules/tracker/migration_templates/d7_tracker_settings.yml
@@ -6,6 +6,7 @@ source:
   plugin: variable
   variables:
     - tracker_batch_size
+  provider: tracker
 process:
   cron_index_limit: tracker_batch_size
 destination:
diff --git a/core/modules/update/migration_templates/update_settings.yml b/core/modules/update/migration_templates/update_settings.yml
index ad22472..ae9e8f1 100644
--- a/core/modules/update/migration_templates/update_settings.yml
+++ b/core/modules/update/migration_templates/update_settings.yml
@@ -11,6 +11,7 @@ source:
     - update_notification_threshold
     - update_notify_emails
     - update_check_frequency
+  provider: update
 process:
   'fetch/max_attempts': update_max_fetch_attempts
   'fetch/url': update_fetch_url
diff --git a/core/modules/user/migration_templates/d6_user_mail.yml b/core/modules/user/migration_templates/d6_user_mail.yml
index b06b6ea..2c15e96 100644
--- a/core/modules/user/migration_templates/d6_user_mail.yml
+++ b/core/modules/user/migration_templates/d6_user_mail.yml
@@ -19,6 +19,7 @@ source:
     - user_mail_register_pending_approval_body
     - user_mail_status_blocked_subject
     - user_mail_status_blocked_body
+  provider: user
 process:
   'status_activated/subject':
     plugin: convert_tokens
diff --git a/core/modules/user/migration_templates/d6_user_settings.yml b/core/modules/user/migration_templates/d6_user_settings.yml
index 6e25ece..b85deb3 100644
--- a/core/modules/user/migration_templates/d6_user_settings.yml
+++ b/core/modules/user/migration_templates/d6_user_settings.yml
@@ -10,6 +10,7 @@ source:
     - user_email_verification
     - user_register
     - anonymous
+  provider: user
 process:
   'notify/status_blocked': user_mail_status_blocked_notify
   'notify/status_activated': user_mail_status_activated_notify
diff --git a/core/modules/user/migration_templates/d7_user_flood.yml b/core/modules/user/migration_templates/d7_user_flood.yml
index ae00ce0..8c62e26 100644
--- a/core/modules/user/migration_templates/d7_user_flood.yml
+++ b/core/modules/user/migration_templates/d7_user_flood.yml
@@ -10,6 +10,7 @@ source:
     - user_failed_login_ip_window
     - user_failed_login_user_window
     - user_failed_login_user_limit
+  provider: user
 process:
   uid_only: user_failed_login_identifier_uid_only
   ip_limit: user_failed_login_ip_limit
diff --git a/core/modules/user/migration_templates/d7_user_mail.yml b/core/modules/user/migration_templates/d7_user_mail.yml
index 0c5e74c..b52626c 100644
--- a/core/modules/user/migration_templates/d7_user_mail.yml
+++ b/core/modules/user/migration_templates/d7_user_mail.yml
@@ -19,6 +19,7 @@ source:
     - user_mail_register_pending_approval_body
     - user_mail_status_blocked_subject
     - user_mail_status_blocked_body
+  provider: user
 process:
    'status_activated/subject': user_mail_status_activated_subject
    'status_activated/body': user_mail_status_activated_body
diff --git a/core/modules/user/migration_templates/d7_user_role.yml b/core/modules/user/migration_templates/d7_user_role.yml
index 5f88757..a7055ee 100644
--- a/core/modules/user/migration_templates/d7_user_role.yml
+++ b/core/modules/user/migration_templates/d7_user_role.yml
@@ -4,6 +4,7 @@ migration_tags:
   - Drupal 7
 source:
   plugin: d7_user_role
+  provider: user
 process:
   id:
     -
diff --git a/core/modules/user/migration_templates/user_picture_entity_display.yml b/core/modules/user/migration_templates/user_picture_entity_display.yml
index 3f404d6..e7edeaf 100644
--- a/core/modules/user/migration_templates/user_picture_entity_display.yml
+++ b/core/modules/user/migration_templates/user_picture_entity_display.yml
@@ -16,6 +16,7 @@ source:
       settings:
         image_style: ''
         image_link: content
+  provider: user
 process:
   entity_type: 'constants/entity_type'
   bundle: 'constants/bundle'
diff --git a/core/modules/user/migration_templates/user_picture_entity_form_display.yml b/core/modules/user/migration_templates/user_picture_entity_form_display.yml
index 4d0f8bc..fadddf1 100644
--- a/core/modules/user/migration_templates/user_picture_entity_form_display.yml
+++ b/core/modules/user/migration_templates/user_picture_entity_form_display.yml
@@ -15,6 +15,7 @@ source:
       settings:
         progress_indicator: throbber
         preview_image_style: thumbnail
+  provider: user
 process:
   entity_type: 'constants/entity_type'
   bundle: 'constants/bundle'
diff --git a/core/modules/user/migration_templates/user_picture_field.yml b/core/modules/user/migration_templates/user_picture_field.yml
index ff8bd82..de4226b 100644
--- a/core/modules/user/migration_templates/user_picture_field.yml
+++ b/core/modules/user/migration_templates/user_picture_field.yml
@@ -12,6 +12,7 @@ source:
     type: image
     name: user_picture
     cardinality: 1
+  provider: user
 process:
   entity_type: 'constants/entity_type'
   field_name: 'constants/name'
diff --git a/core/modules/user/migration_templates/user_picture_field_instance.yml b/core/modules/user/migration_templates/user_picture_field_instance.yml
index 4332e09..a5e27a1 100644
--- a/core/modules/user/migration_templates/user_picture_field_instance.yml
+++ b/core/modules/user/migration_templates/user_picture_field_instance.yml
@@ -16,6 +16,7 @@ source:
       min_resolution: ''
       alt_field_required: false
       title_field_required: false
+  provider: user
 process:
   entity_type: 'constants/entity_type'
   bundle: 'constants/bundle'
diff --git a/core/modules/user/migration_templates/user_profile_entity_display.yml b/core/modules/user/migration_templates/user_profile_entity_display.yml
index f4353dd..160b990 100644
--- a/core/modules/user/migration_templates/user_profile_entity_display.yml
+++ b/core/modules/user/migration_templates/user_profile_entity_display.yml
@@ -39,6 +39,7 @@ process:
       4: true # PROFILE_HIDDEN
 destination:
   plugin: component_entity_display
+  provider: user
 migration_dependencies:
   required:
     - user_profile_field_instance
diff --git a/core/modules/user/src/Plugin/migrate/source/d6/Role.php b/core/modules/user/src/Plugin/migrate/source/d6/Role.php
index 82ad3e9..1286a30 100644
--- a/core/modules/user/src/Plugin/migrate/source/d6/Role.php
+++ b/core/modules/user/src/Plugin/migrate/source/d6/Role.php
@@ -9,7 +9,8 @@
  * Drupal 6 role source from database.
  *
  * @MigrateSource(
- *   id = "d6_user_role"
+ *   id = "d6_user_role",
+ *   source_provider = "user"
  * )
  */
 class Role extends DrupalSqlBase {
diff --git a/core/modules/user/src/Plugin/migrate/source/d6/User.php b/core/modules/user/src/Plugin/migrate/source/d6/User.php
index c8e9d19..33ac374 100644
--- a/core/modules/user/src/Plugin/migrate/source/d6/User.php
+++ b/core/modules/user/src/Plugin/migrate/source/d6/User.php
@@ -9,7 +9,8 @@
  * Drupal 6 user source from database.
  *
  * @MigrateSource(
- *   id = "d6_user"
+ *   id = "d6_user",
+ *   source_provider = "user"
  * )
  */
 class User extends DrupalSqlBase {
diff --git a/core/modules/user/src/Plugin/migrate/source/d6/UserPicture.php b/core/modules/user/src/Plugin/migrate/source/d6/UserPicture.php
index 6b16ad4..544f9af 100644
--- a/core/modules/user/src/Plugin/migrate/source/d6/UserPicture.php
+++ b/core/modules/user/src/Plugin/migrate/source/d6/UserPicture.php
@@ -10,7 +10,8 @@
  * @todo Support default picture?
  *
  * @MigrateSource(
- *   id = "d6_user_picture"
+ *   id = "d6_user_picture",
+ *   source_provider = "user"
  * )
  */
 class UserPicture extends DrupalSqlBase {
diff --git a/core/modules/user/src/Plugin/migrate/source/d6/UserPictureFile.php b/core/modules/user/src/Plugin/migrate/source/d6/UserPictureFile.php
index 8952ffd..c279a7e 100644
--- a/core/modules/user/src/Plugin/migrate/source/d6/UserPictureFile.php
+++ b/core/modules/user/src/Plugin/migrate/source/d6/UserPictureFile.php
@@ -9,7 +9,8 @@
  * Drupal 6 user picture source from database.
  *
  * @MigrateSource(
- *   id = "d6_user_picture_file"
+ *   id = "d6_user_picture_file",
+ *   source_provider = "user"
  * )
  */
 class UserPictureFile extends DrupalSqlBase {
diff --git a/core/modules/user/src/Plugin/migrate/source/d7/User.php b/core/modules/user/src/Plugin/migrate/source/d7/User.php
index 408d998..97ddef8 100644
--- a/core/modules/user/src/Plugin/migrate/source/d7/User.php
+++ b/core/modules/user/src/Plugin/migrate/source/d7/User.php
@@ -9,7 +9,8 @@
  * Drupal 7 user source from database.
  *
  * @MigrateSource(
- *   id = "d7_user"
+ *   id = "d7_user",
+ *   source_provider = "user"
  * )
  */
 class User extends FieldableEntity {
