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_entity_display.yml b/core/modules/block_content/migration_templates/block_content_entity_display.yml
index 06a35d7..ef73655 100644
--- a/core/modules/block_content/migration_templates/block_content_entity_display.yml
+++ b/core/modules/block_content/migration_templates/block_content_entity_display.yml
@@ -22,6 +22,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_entity_form_display.yml b/core/modules/block_content/migration_templates/block_content_entity_form_display.yml
index 92b5a10..b324da0 100644
--- a/core/modules/block_content/migration_templates/block_content_entity_form_display.yml
+++ b/core/modules/block_content/migration_templates/block_content_entity_form_display.yml
@@ -20,6 +20,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 8371d45..9121a11 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 7b35aff..ac6fd58 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/tests/modules/migrate_external_translated_test/src/Plugin/migrate/source/MigrateExternalTranslatedTestSource.php b/core/modules/migrate/tests/modules/migrate_external_translated_test/src/Plugin/migrate/source/MigrateExternalTranslatedTestSource.php
index ceda6d8..e2a9f7c 100644
--- a/core/modules/migrate/tests/modules/migrate_external_translated_test/src/Plugin/migrate/source/MigrateExternalTranslatedTestSource.php
+++ b/core/modules/migrate/tests/modules/migrate_external_translated_test/src/Plugin/migrate/source/MigrateExternalTranslatedTestSource.php
@@ -8,7 +8,8 @@
  * A simple migrate source for our tests.
  *
  * @MigrateSource(
- *   id = "migrate_external_translated_test"
+ *   id = "migrate_external_translated_test",
+ *   source_provider = "migrate_external_translated_test"
  * )
  */
 class MigrateExternalTranslatedTestSource extends SourcePluginBase {
diff --git a/core/modules/migrate/tests/modules/migrate_high_water_test/src/Plugin/migrate/source/HighWaterTest.php b/core/modules/migrate/tests/modules/migrate_high_water_test/src/Plugin/migrate/source/HighWaterTest.php
index 8376721..9b46022 100644
--- a/core/modules/migrate/tests/modules/migrate_high_water_test/src/Plugin/migrate/source/HighWaterTest.php
+++ b/core/modules/migrate/tests/modules/migrate_high_water_test/src/Plugin/migrate/source/HighWaterTest.php
@@ -8,7 +8,8 @@
  * Source plugin for migration high water tests.
  *
  * @MigrateSource(
- *   id = "high_water_test"
+ *   id = "high_water_test",
+ *   source_provider = "migrate_high_water_test"
  * )
  */
 class HighWaterTest extends SqlBase {
diff --git a/core/modules/migrate_drupal_ui/migrate_drupal_ui.services.yml b/core/modules/migrate_drupal_ui/migrate_drupal_ui.services.yml
new file mode 100644
index 0000000..98b1e03
--- /dev/null
+++ b/core/modules/migrate_drupal_ui/migrate_drupal_ui.services.yml
@@ -0,0 +1,5 @@
+services:
+  migrate_drupal_ui.providers:
+    class: Drupal\migrate_drupal_ui\MigrationProviders
+    arguments:
+      - migration
diff --git a/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php b/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php
index 29b1484..698387c 100644
--- a/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php
+++ b/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php
@@ -11,6 +11,7 @@
 use Drupal\migrate\Plugin\MigrationPluginManagerInterface;
 use Drupal\migrate_drupal_ui\Batch\MigrateUpgradeImportBatch;
 use Drupal\migrate_drupal\MigrationConfigurationTrait;
+use Drupal\migrate_drupal_ui\MigrationProviders;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -21,654 +22,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_entity_form_display' => [
-      'source_module' => 'block',
-      'destination_module' => 'block_content',
-    ],
-    'block_content_entity_display' => [
-      'source_module' => 'block',
-      'destination_module' => 'block_content',
-    ],
-    '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',
-    ],
-    '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
@@ -697,6 +50,13 @@ class MigrateUpgradeForm extends ConfirmFormBase {
   protected $pluginManager;
 
   /**
+   * The migration provider service.
+   *
+   * @var \Drupal\migrate_drupal_ui\MigrationProviders
+   */
+  protected $migrationProviders;
+
+  /**
    * Constructs the MigrateUpgradeForm.
    *
    * @param \Drupal\Core\State\StateInterface $state
@@ -707,12 +67,15 @@ class MigrateUpgradeForm extends ConfirmFormBase {
    *   The renderer service.
    * @param \Drupal\migrate\Plugin\MigrationPluginManagerInterface $plugin_manager
    *   The migration plugin manager.
+   * @param \Drupal\migrate_drupal_ui\MigrationProviders $migration_providers
+   *   The migration provider service.
    */
-  public function __construct(StateInterface $state, DateFormatterInterface $date_formatter, RendererInterface $renderer, MigrationPluginManagerInterface $plugin_manager) {
+  public function __construct(StateInterface $state, DateFormatterInterface $date_formatter, RendererInterface $renderer, MigrationPluginManagerInterface $plugin_manager, MigrationProviders $migration_providers) {
     $this->state = $state;
     $this->dateFormatter = $date_formatter;
     $this->renderer = $renderer;
     $this->pluginManager = $plugin_manager;
+    $this->migrationProviders = $migration_providers;
   }
 
   /**
@@ -723,7 +86,8 @@ public static function create(ContainerInterface $container) {
       $container->get('state'),
       $container->get('date.formatter'),
       $container->get('renderer'),
-      $container->get('plugin.manager.migration')
+      $container->get('plugin.manager.migration'),
+      $container->get('migrate_drupal_ui.providers')
     );
   }
 
@@ -992,6 +356,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'));
 
@@ -1040,26 +405,38 @@ 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) {
+      $providers = $this->migrationProviders->getProviders($migration);
+      list($source_module, $destination_module) = $providers;
+      $migration_id = $migration->getPluginId();
+      if (!$source_module) {
+        drupal_set_message($this->t('Source provider not found for @migration_id.', ['@migration_id' => $migration_id]), 'error');
+      }
+      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/migrate_drupal_ui/src/MigrationProviders.php b/core/modules/migrate_drupal_ui/src/MigrationProviders.php
new file mode 100644
index 0000000..a590bea
--- /dev/null
+++ b/core/modules/migrate_drupal_ui/src/MigrationProviders.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Drupal\migrate_drupal_ui;
+
+/**
+ * Gets the source and destination provider for a migration.
+ */
+class MigrationProviders {
+
+  /**
+   * @param \Drupal\migrate\Plugin\MigrationInterface $migration
+   *   The migration entity.
+   *
+   * @return array
+   *   And indexed array containing the source and destination provider.
+   */
+  public function getProviders($migration) {
+    // 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;
+    }
+
+    // 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'];
+      }
+    }
+    return ([$source_module, $destination_module]);
+  }
+}
diff --git a/core/modules/migrate_drupal_ui/src/Tests/MigrateUpgradeTestBase.php b/core/modules/migrate_drupal_ui/src/Tests/MigrateUpgradeTestBase.php
index b635f2a..5baf19d 100644
--- a/core/modules/migrate_drupal_ui/src/Tests/MigrateUpgradeTestBase.php
+++ b/core/modules/migrate_drupal_ui/src/Tests/MigrateUpgradeTestBase.php
@@ -39,6 +39,7 @@
     'book',
     'forum',
     'statistics',
+    'provider_test',
   ];
 
   /**
@@ -144,6 +145,29 @@ public function testMigrateUpgrade() {
     $this->drupalPostForm(NULL, $edits, t('Review upgrade'));
     $this->assertResponse(200);
     $this->assertText('Are you sure?');
+    // Ensure we get errors about missing providers.
+    $this->assertText(t('Source provider not found for provider_no_annotation.'));
+    $this->assertText(t(' Source provider not found for provider_test.'));
+    $this->assertText(t('Destination provider not found for provider_test'));
+
+    // Uninstall the module causing the missing provider error messages.
+    $this->container->get('module_installer')->uninstall(['provider_test'], TRUE);
+
+    // Restart the upgrade process.
+    $this->drupalGet('/upgrade');
+    $this->assertText('Upgrade a site by importing it into a clean and empty new install of Drupal 8. You will lose any existing configuration once you import your site into it. See the online documentation for Drupal site upgrades for more detailed information.');
+
+    $this->drupalPostForm(NULL, [], t('Continue'));
+    $this->assertText('Provide credentials for the database of the Drupal site you want to upgrade.');
+    $this->assertFieldByName('mysql[host]');
+
+    $this->drupalPostForm(NULL, $edits, t('Review upgrade'));
+    $this->assertResponse(200);
+    $this->assertText('Are you sure?');
+    // Ensure there are no errors about the missing providers.
+    $this->assertNoText(t('Source provider not found for provider_no_annotation.'));
+    $this->assertNoText(t(' Source provider not found for provider_test.'));
+    $this->assertNoText(t('Destination provider not found for provider_test'));
     $this->drupalPostForm(NULL, [], t('Perform upgrade'));
     $this->assertText(t('Congratulations, you upgraded Drupal!'));
 
diff --git a/core/modules/migrate_drupal_ui/tests/modules/provider_test/migration_templates/provider_no_annotation.yml b/core/modules/migrate_drupal_ui/tests/modules/provider_test/migration_templates/provider_no_annotation.yml
new file mode 100644
index 0000000..7cbcec4
--- /dev/null
+++ b/core/modules/migrate_drupal_ui/tests/modules/provider_test/migration_templates/provider_no_annotation.yml
@@ -0,0 +1,13 @@
+id: provider_no_annotation
+label: Missing source annotation
+migration_tags:
+  - Drupal 6
+  - Drupal 7
+source:
+# Test plugin without a source_provider annotation
+  plugin: no_source_provider
+process:
+  message: site_offline_message
+destination:
+  plugin: config
+  config_name: test.settings
diff --git a/core/modules/migrate_drupal_ui/tests/modules/provider_test/migration_templates/provider_test.yml b/core/modules/migrate_drupal_ui/tests/modules/provider_test/migration_templates/provider_test.yml
new file mode 100644
index 0000000..3bb0d7a
--- /dev/null
+++ b/core/modules/migrate_drupal_ui/tests/modules/provider_test/migration_templates/provider_test.yml
@@ -0,0 +1,16 @@
+id: provider_test
+label: Missing source and destination provider
+migration_tags:
+  - Drupal 6
+  - Drupal 7
+source:
+  plugin: variable
+  variables:
+    - site_offline_message
+# Do not add a provider for the test.
+process:
+  message: site_offline_message
+destination:
+  plugin: config
+# An empty config_name will not have a destination provider.
+  config_name:
diff --git a/core/modules/migrate_drupal_ui/tests/modules/provider_test/provider_test.info.yml b/core/modules/migrate_drupal_ui/tests/modules/provider_test/provider_test.info.yml
new file mode 100644
index 0000000..8642c6c
--- /dev/null
+++ b/core/modules/migrate_drupal_ui/tests/modules/provider_test/provider_test.info.yml
@@ -0,0 +1,6 @@
+name: 'Provider missing'
+type: module
+description: 'Add a migration missing a source and destination and a source plugin missing a source provide.'
+package: Testing
+version: VERSION
+core: 8.x
diff --git a/core/modules/migrate_drupal_ui/tests/modules/provider_test/src/Plugin/migrate/source/NoSourceProvider.php b/core/modules/migrate_drupal_ui/tests/modules/provider_test/src/Plugin/migrate/source/NoSourceProvider.php
new file mode 100644
index 0000000..fc4b2c5
--- /dev/null
+++ b/core/modules/migrate_drupal_ui/tests/modules/provider_test/src/Plugin/migrate/source/NoSourceProvider.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Drupal\provider_test\Plugin\migrate\source;
+
+use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+
+/**
+ * A test source plugin without a source_provider.
+ *
+ * @MigrateSource(
+ *   id = "no_source_provider",
+ * )
+ */
+class NoSourceProvider extends DrupalSqlBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {}
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {}
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {}
+
+}
diff --git a/core/modules/migrate_drupal_ui/tests/src/Kernel/ProvidersExistTest.php b/core/modules/migrate_drupal_ui/tests/src/Kernel/ProvidersExistTest.php
new file mode 100644
index 0000000..506837b
--- /dev/null
+++ b/core/modules/migrate_drupal_ui/tests/src/Kernel/ProvidersExistTest.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace Drupal\Tests\migrate_drupal_ui\Kernel;
+
+Use Drupal\Component\Render\FormattableMarkup;
+use Drupal\Tests\migrate_drupal\Kernel\MigrateDrupalTestBase;
+
+/**
+ * Tests that providers exist for all source and destination plugins.
+ *
+ * @group migrate_drupal_ui
+ */
+class ProvidersExistTest extends MigrateDrupalTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['migrate_drupal', 'migrate_drupal_ui'];
+
+  /**
+   * Tests that providers exist for all source and destination plugins.
+   */
+  public function testProvidersExist() {
+    // Install all available modules.
+    $module_handler = $this->container->get('module_handler');
+    $modules = system_rebuild_module_data();
+    $modules_enabled = $module_handler->getModuleList();
+    $modules_to_enable = array_keys(array_diff_key($modules, $modules_enabled));
+    $this->enableModules($modules_to_enable);
+
+    /** @var \Drupal\migrate\Plugin\MigrationPluginManager $manager */
+    $pluginManager =  $this->container->get('plugin.manager.migration');
+    $migrationProviders  = $this->container->get('migrate_drupal_ui.providers');
+    // Get all the migrations
+    $migrations = $pluginManager->createInstances(array_keys($pluginManager->getDefinitions()));
+    /** @var \Drupal\migrate\Plugin\Migration $migration */
+    foreach ($migrations as $migration) {
+      $providers = $migrationProviders->getProviders($migration);
+      list($source_module, $destination_module) = $providers;
+      $migration_id = $migration->getPluginId();
+      if ($migration_id == 'provider_test') {
+        $this->assertFalse($source_module, new FormattableMarkup('Source provider not found for @migration_id.', ['@migration_id' => $migration_id]));
+        $this->assertFalse($destination_module, new FormattableMarkup('Destination provider not found for @migration_id.', ['@migration_id' => $migration_id]));
+      }
+      elseif ($migration_id == 'provider_no_annotation') {
+        $this->assertFalse($source_module, new FormattableMarkup('Source provider not found for @migration_id.', ['@migration_id' => $migration_id]));
+        $this->assertTrue($destination_module, new FormattableMarkup('Destination provider found for @migration_id.', ['@migration_id' => $migration_id]));
+      }
+      else {
+        $this->assertTrue($source_module, new FormattableMarkup('Source provider found for @migration_id.', ['@migration_id' => $migration_id]));
+        $this->assertTrue($destination_module, new FormattableMarkup('Destination provider found for @migration_id.', ['@migration_id' => $migration_id]));
+      }
+    }
+  }
+
+}
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 b5a66ce..2814dbd 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/taxonomy/tests/modules/taxonomy_term_stub_test/migrations/taxonomy_term_stub_test.yml b/core/modules/taxonomy/tests/modules/taxonomy_term_stub_test/migrations/taxonomy_term_stub_test.yml
index ad56fff..2482e49 100644
--- a/core/modules/taxonomy/tests/modules/taxonomy_term_stub_test/migrations/taxonomy_term_stub_test.yml
+++ b/core/modules/taxonomy/tests/modules/taxonomy_term_stub_test/migrations/taxonomy_term_stub_test.yml
@@ -13,6 +13,7 @@ source:
   ids:
     id:
       type: integer
+  provider: taxonomy_term_stub_test
 process:
   tid: id
   vid: vocab
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 {
