diff --git a/core/modules/field/migration_templates/d7_field_formatter_settings.yml b/core/modules/field/migration_templates/d7_field_formatter_settings.yml
index 126fd29..3055e47 100644
--- a/core/modules/field/migration_templates/d7_field_formatter_settings.yml
+++ b/core/modules/field/migration_templates/d7_field_formatter_settings.yml
@@ -44,14 +44,14 @@ process:
       map:
         full: default
   field_name: field_name
-  "options/label": label
-  "options/weight": weight
+  "options/label": 'formatter/label'
+  "options/weight": 'formatter/weight'
   # The formatter to use.
   "options/type":
     -
       plugin: static_map
       bypass: true
-      source: formatter_type
+      source: 'formatter/type'
       map:
         date_default: datetime_default
         email_default: email_mailto
@@ -69,7 +69,7 @@ process:
       method: row
   "options/settings":
     plugin: default_value
-    source: settings
+    source: 'formatter/settings'
     default_value: []
   "options/third_party_settings": 'constants/third_party_settings'
 destination:
diff --git a/core/modules/field/migration_templates/d7_field_instance.yml b/core/modules/field/migration_templates/d7_field_instance.yml
index f3518c9..03e77cd 100644
--- a/core/modules/field/migration_templates/d7_field_instance.yml
+++ b/core/modules/field/migration_templates/d7_field_instance.yml
@@ -19,15 +19,15 @@ process:
   settings:
     plugin: d7_field_instance_settings
     source:
-      - instance_settings
-      - widget_settings
-      - field_settings
+      - settings
+      - widget
+      - field_definition
   default_value_function: ''
   default_value:
     plugin: d7_field_instance_defaults
     source:
       - default_value
-      - widget_settings
+      - widget
   translatable: translatable
 destination:
   plugin: entity:field_config
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 e2bbcf4..85a67cb 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
@@ -52,7 +52,7 @@ process:
     plugin: field_instance_widget_settings
     source:
       - 'widget/type'
-      - widget_settings
+      - 'widget/settings'
   'options/third_party_settings': 'constants/third_party_settings'
 destination:
   plugin: component_entity_form_display
diff --git a/core/modules/field/src/Plugin/migrate/process/d7/FieldInstanceDefaults.php b/core/modules/field/src/Plugin/migrate/process/d7/FieldInstanceDefaults.php
index 2a46381..a6707bd 100644
--- a/core/modules/field/src/Plugin/migrate/process/d7/FieldInstanceDefaults.php
+++ b/core/modules/field/src/Plugin/migrate/process/d7/FieldInstanceDefaults.php
@@ -19,6 +19,11 @@ class FieldInstanceDefaults extends ProcessPluginBase {
   public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
     list($default_value, $widget_settings) = $value;
     $widget_type = $widget_settings['type'];
+    $default_value = $default_value ?: [];
+    if ($widget_type == 'email_textfield' && $default_value) {
+      $default_value[0]['value'] = $default_value[0]['email'];
+      unset($default_value[0]['email']);
+    }
 
     $default = [];
 
diff --git a/core/modules/field/src/Plugin/migrate/process/d7/FieldInstanceSettings.php b/core/modules/field/src/Plugin/migrate/process/d7/FieldInstanceSettings.php
index 70a9498..991ce09c 100644
--- a/core/modules/field/src/Plugin/migrate/process/d7/FieldInstanceSettings.php
+++ b/core/modules/field/src/Plugin/migrate/process/d7/FieldInstanceSettings.php
@@ -17,9 +17,12 @@ class FieldInstanceSettings extends ProcessPluginBase {
    * {@inheritdoc}
    */
   public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
-    list($instance_settings, $widget_settings, $field_settings) = $value;
+    list($instance_settings, $widget_settings, $field_definition) = $value;
     $widget_type = $widget_settings['type'];
 
+    $field_data = unserialize($field_definition['data']);
+    $field_settings = $field_data['settings'];
+
     // Get entityreference handler settings from source field configuration.
     if ($row->getSourceProperty('type') == "entityreference") {
       $instance_settings['handler'] = 'default:' . $field_settings['target_type'];
diff --git a/core/modules/field/src/Plugin/migrate/source/d7/FieldInstance.php b/core/modules/field/src/Plugin/migrate/source/d7/FieldInstance.php
index d06336e..8b86a94 100644
--- a/core/modules/field/src/Plugin/migrate/source/d7/FieldInstance.php
+++ b/core/modules/field/src/Plugin/migrate/source/d7/FieldInstance.php
@@ -8,6 +8,11 @@
 /**
  * Drupal 7 field instances source from database.
  *
+ * @internal
+ *
+ * This class is marked as internal and should not be extended. Use
+ * Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase instead.
+ *
  * @MigrateSource(
  *   id = "d7_field_instance",
  *   source_provider = "field"
@@ -21,14 +26,12 @@ class FieldInstance extends DrupalSqlBase {
   public function query() {
     $query = $this->select('field_config_instance', 'fci')
       ->fields('fci')
-      ->condition('fci.deleted', 0)
+      ->fields('fc', ['type'])
       ->condition('fc.active', 1)
-      ->condition('fc.deleted', 0)
       ->condition('fc.storage_active', 1)
-      ->fields('fc', ['type']);
-
-    $query->innerJoin('field_config', 'fc', 'fci.field_id = fc.id');
-    $query->addField('fc', 'data', 'field_data');
+      ->condition('fc.deleted', 0)
+      ->condition('fci.deleted', 0);
+    $query->join('field_config', 'fc', 'fci.field_id = fc.id');
 
     // Optionally filter by entity type and bundle.
     if (isset($this->configuration['entity_type'])) {
@@ -45,16 +48,39 @@ public function query() {
   /**
    * {@inheritdoc}
    */
+  protected function initializeIterator() {
+    $results = $this->prepareQuery()->execute()->fetchAll();
+
+    // Group all instances by their base field.
+    $instances = [];
+    foreach ($results as $result) {
+      $instances[$result['field_id']][] = $result;
+    }
+
+    // Add the array of all instances using the same base field to each row.
+    $rows = [];
+    foreach ($results as $result) {
+      $result['instances'] = $instances[$result['field_id']];
+      $rows[] = $result;
+    }
+
+    return new \ArrayIterator($rows);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function fields() {
     return [
-      'field_name' => $this->t('The machine name of field.'),
+      'id' => $this->t('The field instance ID.'),
+      'field_id' => $this->t('The field ID.'),
+      'field_name' => $this->t('The field name.'),
       'entity_type' => $this->t('The entity type.'),
       'bundle' => $this->t('The entity bundle.'),
-      'default_value' => $this->t('Default value'),
-      'instance_settings' => $this->t('Field instance settings.'),
-      'widget_settings' => $this->t('Widget settings.'),
-      'display_settings' => $this->t('Display settings.'),
-      'field_settings' => $this->t('Field settings.'),
+      'data' => $this->t('The field instance data.'),
+      'deleted' => $this->t('Deleted'),
+      'type' => $this->t('The field type'),
+      'field_definition' => $this->t('The field definition.'),
     ];
   }
 
@@ -62,29 +88,16 @@ public function fields() {
    * {@inheritdoc}
    */
   public function prepareRow(Row $row) {
-    $data = unserialize($row->getSourceProperty('data'));
-
-    $row->setSourceProperty('label', $data['label']);
-    $row->setSourceProperty('description', $data['description']);
-    $row->setSourceProperty('required', $data['required']);
-
-    $default_value = !empty($data['default_value']) ? $data['default_value'] : [];
-    if ($data['widget']['type'] == 'email_textfield' && $default_value) {
-      $default_value[0]['value'] = $default_value[0]['email'];
-      unset($default_value[0]['email']);
+    foreach (unserialize($row->getSourceProperty('data')) as $key => $value) {
+      $row->setSourceProperty($key, $value);
     }
-    $row->setSourceProperty('default_value', $default_value);
-
-    // Settings.
-    $row->setSourceProperty('instance_settings', $data['settings']);
-    $row->setSourceProperty('widget_settings', $data['widget']);
-    $row->setSourceProperty('display_settings', $data['display']);
 
-    // This is for parity with the d6_field_instance plugin.
-    $row->setSourceProperty('widget_type', $data['widget']['type']);
-
-    $field_data = unserialize($row->getSourceProperty('field_data'));
-    $row->setSourceProperty('field_settings', $field_data['settings']);
+    $field_definition = $this->select('field_config', 'fc')
+      ->fields('fc')
+      ->condition('id', $row->getSourceProperty('field_id'))
+      ->execute()
+      ->fetch();
+    $row->setSourceProperty('field_definition', $field_definition);
 
     $translatable = FALSE;
     if ($row->getSourceProperty('entity_type') == 'node') {
@@ -100,8 +113,8 @@ public function prepareRow(Row $row) {
     else {
       // This is not a node entity. Get the translatable value from the source
       // field_config table.
-      $data = unserialize($row->getSourceProperty('field_data'));
-      $translatable = $data['translatable'];
+      $field_data = unserialize($field_definition['data']);
+      $translatable = $field_data['translatable'];
     }
     $row->setSourceProperty('translatable', $translatable);
 
@@ -128,4 +141,11 @@ public function getIds() {
     ];
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function count() {
+    return $this->initializeIterator()->count();
+  }
+
 }
diff --git a/core/modules/field/src/Plugin/migrate/source/d7/FieldInstancePerFormDisplay.php b/core/modules/field/src/Plugin/migrate/source/d7/FieldInstancePerFormDisplay.php
index ac599ec..6ada96f 100644
--- a/core/modules/field/src/Plugin/migrate/source/d7/FieldInstancePerFormDisplay.php
+++ b/core/modules/field/src/Plugin/migrate/source/d7/FieldInstancePerFormDisplay.php
@@ -2,58 +2,17 @@
 
 namespace Drupal\field\Plugin\migrate\source\d7;
 
-use Drupal\migrate\Row;
-use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+use Drupal\field\Plugin\migrate\source\d7\FieldInstance;
 
 /**
  * The field instance per form display source class.
  *
  * @MigrateSource(
- *   id = "d7_field_instance_per_form_display"
+ *   id = "d7_field_instance_per_form_display",
+ *   source_provider = "field"
  * )
  */
-class FieldInstancePerFormDisplay extends DrupalSqlBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function query() {
-    $query = $this->select('field_config_instance', 'fci')
-      ->fields('fci', [
-        'field_name',
-        'bundle',
-        'data',
-        'entity_type'
-      ])
-      ->fields('fc', [
-        'type',
-        'module',
-      ]);
-    $query->join('field_config', 'fc', 'fci.field_id = fc.id');
-    return $query;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function prepareRow(Row $row) {
-    $data = unserialize($row->getSourceProperty('data'));
-    $row->setSourceProperty('widget', $data['widget']);
-    $row->setSourceProperty('widget_settings', $data['widget']['settings']);
-    return parent::prepareRow($row);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function fields() {
-    return [
-      'field_name' => $this->t('The machine name of field.'),
-      'bundle' => $this->t('Content type where this field is used.'),
-      'data' => $this->t('Field configuration data.'),
-      'entity_type' => $this->t('The entity type.'),
-    ];
-  }
+class FieldInstancePerFormDisplay extends FieldInstance {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/field/src/Plugin/migrate/source/d7/FieldInstancePerViewMode.php b/core/modules/field/src/Plugin/migrate/source/d7/FieldInstancePerViewMode.php
index 7339e76..f61c011 100644
--- a/core/modules/field/src/Plugin/migrate/source/d7/FieldInstancePerViewMode.php
+++ b/core/modules/field/src/Plugin/migrate/source/d7/FieldInstancePerViewMode.php
@@ -2,7 +2,7 @@
 
 namespace Drupal\field\Plugin\migrate\source\d7;
 
-use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+use Drupal\field\Plugin\migrate\source\d7\FieldInstance;
 
 /**
  * The field instance per view mode source class.
@@ -12,26 +12,21 @@
  *   source_provider = "field"
  * )
  */
-class FieldInstancePerViewMode extends DrupalSqlBase {
+class FieldInstancePerViewMode extends FieldInstance {
 
   /**
    * {@inheritdoc}
    */
   protected function initializeIterator() {
-    $rows = [];
-    $result = $this->prepareQuery()->execute();
-    foreach ($result as $field_instance) {
-      $data = unserialize($field_instance['data']);
-      // We don't need to include the serialized data in the returned rows.
-      unset($field_instance['data']);
-
-      foreach ($data['display'] as $view_mode => $info) {
-        // Rename type to formatter_type in the info array.
-        $info['formatter_type'] = $info['type'];
-        unset($info['type']);
+    $instances = parent::initializeIterator();
 
-        $rows[] = array_merge($field_instance, $info, [
+    $rows = [];
+    foreach ($instances->getArrayCopy() as $instance) {
+      $data = unserialize($instance['data']);
+      foreach ($data['display'] as $view_mode => $formatter) {
+        $rows[] = array_merge($instance, [
           'view_mode' => $view_mode,
+          'formatter' => $formatter,
         ]);
       }
     }
@@ -41,30 +36,11 @@ protected function initializeIterator() {
   /**
    * {@inheritdoc}
    */
-  public function query() {
-    $query = $this->select('field_config_instance', 'fci')
-      ->fields('fci', ['entity_type', 'bundle', 'field_name', 'data'])
-      ->fields('fc', ['type']);
-    $query->join('field_config', 'fc', 'fc.field_name = fci.field_name');
-    return $query;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function fields() {
-    return [
-      'entity_type' => $this->t('The entity type ID.'),
-      'bundle' => $this->t('The bundle ID.'),
-      'field_name' => $this->t('Machine name of the field.'),
+    return array_merge(parent::fields(), [
       'view_mode' => $this->t('The original machine name of the view mode.'),
-      'label' => $this->t('The display label of the field.'),
-      'type' => $this->t('The field ID.'),
-      'formatter_type' => $this->t('The formatter ID.'),
-      'settings' => $this->t('Array of formatter-specific settings.'),
-      'module' => $this->t('The module providing the formatter.'),
-      'weight' => $this->t('Display weight of the field.'),
-    ];
+      'formatter' => $this->t('The formatter settings.'),
+    ]);
   }
 
   /**
@@ -87,11 +63,4 @@ public function getIds() {
     ];
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function count() {
-    return $this->initializeIterator()->count();
-  }
-
 }
diff --git a/core/modules/field/src/Plugin/migrate/source/d7/ViewMode.php b/core/modules/field/src/Plugin/migrate/source/d7/ViewMode.php
index 3dd037c..de44ce6 100644
--- a/core/modules/field/src/Plugin/migrate/source/d7/ViewMode.php
+++ b/core/modules/field/src/Plugin/migrate/source/d7/ViewMode.php
@@ -2,31 +2,35 @@
 
 namespace Drupal\field\Plugin\migrate\source\d7;
 
-use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+use Drupal\field\Plugin\migrate\source\d7\FieldInstance;
 
 /**
+ * The view mode source class.
+ *
  * @MigrateSource(
- *  id = "d7_view_mode"
+ *   id = "d7_view_mode",
+ *   source_provider = "field"
  * )
  */
-class ViewMode extends DrupalSqlBase {
+class ViewMode extends FieldInstance {
 
   /**
    * {@inheritdoc}
    */
   protected function initializeIterator() {
+    $instances = parent::initializeIterator();
+
     $rows = [];
-    $result = $this->prepareQuery()->execute();
-    foreach ($result as $field_instance) {
-      $data = unserialize($field_instance['data']);
+    foreach ($instances->getArrayCopy() as $instance) {
+      $data = unserialize($instance['data']);
       foreach (array_keys($data['display']) as $view_mode) {
-        $key = $field_instance['entity_type'] . '.' . $view_mode;
-        $rows[$key] = [
-          'entity_type' => $field_instance['entity_type'],
+        $key = $instance['entity_type'] . '.' . $view_mode;
+        $rows[$key] = array_merge($instance, [
           'view_mode' => $view_mode,
-        ];
+        ]);
       }
     }
+
     return new \ArrayIterator($rows);
   }
 
@@ -34,18 +38,9 @@ protected function initializeIterator() {
    * {@inheritdoc}
    */
   public function fields() {
-    return [
+    return array_merge(parent::fields(), [
       'view_mode' => $this->t('The view mode ID.'),
-      'entity_type' => $this->t('The entity type ID.'),
-    ];
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function query() {
-    return $this->select('field_config_instance', 'fci')
-      ->fields('fci', ['entity_type', 'data']);
+    ]);
   }
 
   /**
@@ -62,11 +57,4 @@ public function getIds() {
     ];
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function count() {
-    return $this->initializeIterator()->count();
-  }
-
 }
diff --git a/core/modules/field/tests/src/Kernel/Plugin/migrate/source/d7/FieldInstanceTest.php b/core/modules/field/tests/src/Kernel/Plugin/migrate/source/d7/FieldInstanceTest.php
index c9e93ef..895fe3f 100644
--- a/core/modules/field/tests/src/Kernel/Plugin/migrate/source/d7/FieldInstanceTest.php
+++ b/core/modules/field/tests/src/Kernel/Plugin/migrate/source/d7/FieldInstanceTest.php
@@ -61,20 +61,30 @@ public function providerSource() {
     // The expected results.
     $tests[0]['expected_data'] = [
       [
+        'id' => '2',
+        'field_id' => '2',
         'field_name' => 'body',
         'entity_type' => 'node',
         'bundle' => 'page',
+        'data' => 'a:6:{s:5:"label";s:4:"Body";s:6:"widget";a:4:{s:4:"type";s:26:"text_textarea_with_summary";s:8:"settings";a:2:{s:4:"rows";i:20;s:12:"summary_rows";i:5;}s:6:"weight";i:-4;s:6:"module";s:4:"text";}s:8:"settings";a:3:{s:15:"display_summary";b:1;s:15:"text_processing";i:1;s:18:"user_register_form";b:0;}s:7:"display";a:2:{s:7:"default";a:5:{s:5:"label";s:6:"hidden";s:4:"type";s:12:"text_default";s:8:"settings";a:0:{}s:6:"module";s:4:"text";s:6:"weight";i:0;}s:6:"teaser";a:5:{s:5:"label";s:6:"hidden";s:4:"type";s:23:"text_summary_or_trimmed";s:8:"settings";a:1:{s:11:"trim_length";i:600;}s:6:"module";s:4:"text";s:6:"weight";i:0;}}s:8:"required";b:0;s:11:"description";s:0:"";}',
+        'deleted' => '0',
+        'type' => 'text_with_summary',
         'label' => 'Body',
-        'widget_settings' => [
-          'module' => 'text',
+        'widget' => [
+          'type' => 'text_textarea_with_summary',
           'settings' => [
             'rows' => 20,
             'summary_rows' => 5,
           ],
-          'type' => 'text_textarea_with_summary',
           'weight' => -4,
+          'module' => 'text',
+        ],
+        'settings' => [
+          'display_summary' => TRUE,
+          'text_processing' => '1',
+          'user_register_form' => FALSE,
         ],
-        'display_settings' => [
+        'display' => [
           'default' => [
             'label' => 'hidden',
             'type' => 'text_default',
@@ -92,9 +102,35 @@ public function providerSource() {
             'weight' => 0,
           ],
         ],
-        'description' => '',
         'required' => FALSE,
-        'field_data' => 'a:6:{s:12:"entity_types";a:1:{i:0;s:4:"node";}s:12:"translatable";b:0;s:8:"settings";a:0:{}s:7:"storage";a:4:{s:4:"type";s:17:"field_sql_storage";s:8:"settings";a:0:{}s:6:"module";s:17:"field_sql_storage";s:6:"active";i:1;}s:12:"foreign keys";a:1:{s:6:"format";a:2:{s:5:"table";s:13:"filter_format";s:7:"columns";a:1:{s:6:"format";s:6:"format";}}}s:7:"indexes";a:1:{s:6:"format";a:1:{i:0;s:6:"format";}}}',
+        'description' => '',
+        'field_definition' => [
+          'id' => '2',
+          'field_name' => 'body',
+          'type' => 'text_with_summary',
+          'module' => 'text',
+          'active' => '1',
+          'storage_type' => 'field_sql_storage',
+          'storage_module' => 'field_sql_storage',
+          'storage_active' => '1',
+          'locked' => '0',
+          'data' => 'a:6:{s:12:"entity_types";a:1:{i:0;s:4:"node";}s:12:"translatable";b:0;s:8:"settings";a:0:{}s:7:"storage";a:4:{s:4:"type";s:17:"field_sql_storage";s:8:"settings";a:0:{}s:6:"module";s:17:"field_sql_storage";s:6:"active";i:1;}s:12:"foreign keys";a:1:{s:6:"format";a:2:{s:5:"table";s:13:"filter_format";s:7:"columns";a:1:{s:6:"format";s:6:"format";}}}s:7:"indexes";a:1:{s:6:"format";a:1:{i:0;s:6:"format";}}}',
+          'cardinality' => '1',
+          'translatable' => '0',
+          'deleted' => '0',
+        ],
+        'instances' => [
+          [
+            'id' => '2',
+            'field_id' => '2',
+            'field_name' => 'body',
+            'entity_type' => 'node',
+            'bundle' => 'page',
+            'data' => 'a:6:{s:5:"label";s:4:"Body";s:6:"widget";a:4:{s:4:"type";s:26:"text_textarea_with_summary";s:8:"settings";a:2:{s:4:"rows";i:20;s:12:"summary_rows";i:5;}s:6:"weight";i:-4;s:6:"module";s:4:"text";}s:8:"settings";a:3:{s:15:"display_summary";b:1;s:15:"text_processing";i:1;s:18:"user_register_form";b:0;}s:7:"display";a:2:{s:7:"default";a:5:{s:5:"label";s:6:"hidden";s:4:"type";s:12:"text_default";s:8:"settings";a:0:{}s:6:"module";s:4:"text";s:6:"weight";i:0;}s:6:"teaser";a:5:{s:5:"label";s:6:"hidden";s:4:"type";s:23:"text_summary_or_trimmed";s:8:"settings";a:1:{s:11:"trim_length";i:600;}s:6:"module";s:4:"text";s:6:"weight";i:0;}}s:8:"required";b:0;s:11:"description";s:0:"";}',
+            'deleted' => '0',
+            'type' => 'text_with_summary',
+          ],
+        ],
       ],
     ];
 
diff --git a/core/modules/field/tests/src/Unit/Plugin/migrate/process/d7/FieldInstanceSettingsTest.php b/core/modules/field/tests/src/Unit/Plugin/migrate/process/d7/FieldInstanceSettingsTest.php
index 8c405b0..115ff48 100644
--- a/core/modules/field/tests/src/Unit/Plugin/migrate/process/d7/FieldInstanceSettingsTest.php
+++ b/core/modules/field/tests/src/Unit/Plugin/migrate/process/d7/FieldInstanceSettingsTest.php
@@ -28,7 +28,7 @@ public function testTransformImageSettings() {
       ->disableOriginalConstructor()
       ->getMock();
 
-    $value = $plugin->transform([[], ['type' => 'image_image'], []], $executable, $row, 'foo');
+    $value = $plugin->transform([[], ['type' => 'image_image'], ['data' => '']], $executable, $row, 'foo');
     $this->assertInternalType('array', $value['default_image']);
     $this->assertSame('', $value['default_image']['alt']);
     $this->assertSame('', $value['default_image']['title']);
diff --git a/core/modules/link/src/Plugin/migrate/field/d7/LinkField.php b/core/modules/link/src/Plugin/migrate/field/d7/LinkField.php
index 4e78ee5..bb71418 100644
--- a/core/modules/link/src/Plugin/migrate/field/d7/LinkField.php
+++ b/core/modules/link/src/Plugin/migrate/field/d7/LinkField.php
@@ -34,7 +34,7 @@ public function getFieldWidgetMap() {
   public function processFieldInstance(MigrationInterface $migration) {
     $process = [
       'plugin' => 'static_map',
-      'source' => 'instance_settings/title',
+      'source' => 'settings/title',
       'bypass' => TRUE,
       'map' => [
         'disabled' => DRUPAL_DISABLED,
diff --git a/core/modules/text/src/Plugin/migrate/cckfield/TextField.php b/core/modules/text/src/Plugin/migrate/cckfield/TextField.php
index 1d18b30..99619bb 100644
--- a/core/modules/text/src/Plugin/migrate/cckfield/TextField.php
+++ b/core/modules/text/src/Plugin/migrate/cckfield/TextField.php
@@ -43,7 +43,9 @@ public function getFieldFormatterMap() {
    * {@inheritdoc}
    */
   public function processCckFieldValues(MigrationInterface $migration, $field_name, $field_info) {
-    if ($field_info['widget_type'] == 'optionwidgets_onoff') {
+    $widget_type = isset($field_info['widget_type']) ? $field_info['widget_type'] : $field_info['widget']['type'];
+
+    if ($widget_type == 'optionwidgets_onoff') {
       $process = [
         'value' => [
           'plugin' => 'static_map',
