diff --git a/core/modules/field/migration_templates/d6_field.yml b/core/modules/field/migration_templates/d6_field.yml
index eb02178..92c28b2 100644
--- a/core/modules/field/migration_templates/d6_field.yml
+++ b/core/modules/field/migration_templates/d6_field.yml
@@ -2,8 +2,8 @@ id: d6_field
 label: Field configuration
 migration_tags:
   - Drupal 6
-class: Drupal\migrate_drupal\Plugin\migrate\CckMigration
-cck_plugin_method: processField
+class: Drupal\migrate_drupal\Plugin\migrate\FieldMigration
+field_plugin_method: processField
 source:
   plugin: d6_field
   constants:
diff --git a/core/modules/field/migration_templates/d6_field_formatter_settings.yml b/core/modules/field/migration_templates/d6_field_formatter_settings.yml
index 534501d..fc97ad0 100644
--- a/core/modules/field/migration_templates/d6_field_formatter_settings.yml
+++ b/core/modules/field/migration_templates/d6_field_formatter_settings.yml
@@ -2,8 +2,8 @@ id: d6_field_formatter_settings
 label: Field formatter configuration
 migration_tags:
   - Drupal 6
-class: Drupal\migrate_drupal\Plugin\migrate\CckMigration
-cck_plugin_method: processFieldFormatter
+class: Drupal\migrate_drupal\Plugin\migrate\FieldMigration
+field_plugin_method: processFieldFormatter
 source:
   plugin: d6_field_instance_per_view_mode
   constants:
diff --git a/core/modules/field/migration_templates/d6_field_instance.yml b/core/modules/field/migration_templates/d6_field_instance.yml
index 1934303..3a413c1 100644
--- a/core/modules/field/migration_templates/d6_field_instance.yml
+++ b/core/modules/field/migration_templates/d6_field_instance.yml
@@ -2,8 +2,8 @@ id: d6_field_instance
 label: Field instance configuration
 migration_tags:
   - Drupal 6
-class: Drupal\migrate_drupal\Plugin\migrate\CckMigration
-cck_plugin_method: processFieldInstance
+class: Drupal\migrate_drupal\Plugin\migrate\FieldMigration
+field_plugin_method: processFieldInstance
 source:
   plugin: d6_field_instance
   constants:
diff --git a/core/modules/field/migration_templates/d6_field_instance_widget_settings.yml b/core/modules/field/migration_templates/d6_field_instance_widget_settings.yml
index 85c7036..b5f6f6d 100644
--- a/core/modules/field/migration_templates/d6_field_instance_widget_settings.yml
+++ b/core/modules/field/migration_templates/d6_field_instance_widget_settings.yml
@@ -2,8 +2,8 @@ id: d6_field_instance_widget_settings
 label: Field instance widget configuration
 migration_tags:
   - Drupal 6
-class: Drupal\migrate_drupal\Plugin\migrate\CckMigration
-cck_plugin_method: processFieldWidget
+class: Drupal\migrate_drupal\Plugin\migrate\FieldMigration
+field_plugin_method: processFieldWidget
 source:
   plugin: d6_field_instance_per_form_display
   constants:
diff --git a/core/modules/field/migration_templates/d7_field.yml b/core/modules/field/migration_templates/d7_field.yml
index 15079d8..d455f8a 100644
--- a/core/modules/field/migration_templates/d7_field.yml
+++ b/core/modules/field/migration_templates/d7_field.yml
@@ -2,8 +2,8 @@ id: d7_field
 label: Field configuration
 migration_tags:
   - Drupal 7
-class: Drupal\migrate_drupal\Plugin\migrate\CckMigration
-cck_plugin_method: processField
+class: Drupal\migrate_drupal\Plugin\migrate\FieldMigration
+field_plugin_method: processField
 source:
   plugin: d7_field
   constants:
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 3055e47..2c0196b 100644
--- a/core/modules/field/migration_templates/d7_field_formatter_settings.yml
+++ b/core/modules/field/migration_templates/d7_field_formatter_settings.yml
@@ -2,8 +2,8 @@ id: d7_field_formatter_settings
 label: Field formatter configuration
 migration_tags:
   - Drupal 7
-class: Drupal\migrate_drupal\Plugin\migrate\CckMigration
-cck_plugin_method: processFieldFormatter
+class: Drupal\migrate_drupal\Plugin\migrate\FieldMigration
+field_plugin_method: processFieldFormatter
 source:
   plugin: d7_field_instance_per_view_mode
   constants:
diff --git a/core/modules/field/migration_templates/d7_field_instance.yml b/core/modules/field/migration_templates/d7_field_instance.yml
index 03e77cd..e18b273 100644
--- a/core/modules/field/migration_templates/d7_field_instance.yml
+++ b/core/modules/field/migration_templates/d7_field_instance.yml
@@ -2,8 +2,8 @@ id: d7_field_instance
 label: Field instance configuration
 migration_tags:
   - Drupal 7
-class: Drupal\migrate_drupal\Plugin\migrate\CckMigration
-cck_plugin_method: processFieldInstance
+class: Drupal\migrate_drupal\Plugin\migrate\FieldMigration
+field_plugin_method: processFieldInstance
 source:
   plugin: d7_field_instance
   constants:
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 85a67cb..986e02c 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
@@ -2,8 +2,8 @@ id: d7_field_instance_widget_settings
 label: Field instance widget configuration
 migration_tags:
   - Drupal 7
-class: Drupal\migrate_drupal\Plugin\migrate\CckMigration
-cck_plugin_method: processFieldWidget
+class: Drupal\migrate_drupal\Plugin\migrate\FieldMigration
+field_plugin_method: processFieldWidget
 source:
   plugin: d7_field_instance_per_form_display
   constants:
diff --git a/core/modules/file/src/Plugin/migrate/cckfield/d6/FileField.php b/core/modules/file/src/Plugin/migrate/cckfield/d6/FileField.php
index d63b9c2..373d1e9 100644
--- a/core/modules/file/src/Plugin/migrate/cckfield/d6/FileField.php
+++ b/core/modules/file/src/Plugin/migrate/cckfield/d6/FileField.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\file\Plugin\migrate\cckfield\d6;
 
+@trigger_error('FileField is deprecated in Drupal 8.3.x and will be removed before Drupal 9.0.x. Use \Drupal\file\Plugin\migrate\field\d6\FileField instead.', E_USER_DEPRECATED);
+
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Row;
 use Drupal\migrate_drupal\Plugin\migrate\cckfield\CckFieldPluginBase;
@@ -11,6 +13,11 @@
  *   id = "filefield",
  *   core = {6}
  * )
+ *
+ *  @deprecated in Drupal 8.3.x, to be removed before Drupal 9.0.x. Use
+ * \Drupal\file\Plugin\migrate\field\d6\FileField instead.
+ *
+ * @see https://www.drupal.org/node/2751897
  */
 class FileField extends CckFieldPluginBase {
 
diff --git a/core/modules/file/src/Plugin/migrate/cckfield/d7/FileField.php b/core/modules/file/src/Plugin/migrate/cckfield/d7/FileField.php
index d0b1335..9d184ff 100644
--- a/core/modules/file/src/Plugin/migrate/cckfield/d7/FileField.php
+++ b/core/modules/file/src/Plugin/migrate/cckfield/d7/FileField.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\file\Plugin\migrate\cckfield\d7;
 
+@trigger_error('FileField is deprecated in Drupal 8.3.x and will be removed before Drupal 9.0.x. Use \Drupal\file\Plugin\migrate\field\d7\FileField instead.', E_USER_DEPRECATED);
+
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Row;
 use Drupal\migrate_drupal\Plugin\migrate\cckfield\CckFieldPluginBase;
@@ -11,6 +13,11 @@
  *   id = "file",
  *   core = {7}
  * )
+ *
+ * @deprecated in Drupal 8.3.x, to be removed before Drupal 9.0.x. Use
+ * \Drupal\file\Plugin\migrate\field\d7\FileField instead.
+ *
+ * @see https://www.drupal.org/node/2751897
  */
 class FileField extends CckFieldPluginBase {
 
diff --git a/core/modules/file/src/Plugin/migrate/cckfield/d7/ImageField.php b/core/modules/file/src/Plugin/migrate/cckfield/d7/ImageField.php
index 2b34a80..45f5b9d 100644
--- a/core/modules/file/src/Plugin/migrate/cckfield/d7/ImageField.php
+++ b/core/modules/file/src/Plugin/migrate/cckfield/d7/ImageField.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\file\Plugin\migrate\cckfield\d7;
 
+@trigger_error('ImageField is deprecated in Drupal 8.3.x and will be removed before Drupal 9.0.x. Use \Drupal\file\Plugin\migrate\field\d7\ImageField instead.', E_USER_DEPRECATED);
+
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate_drupal\Plugin\migrate\cckfield\CckFieldPluginBase;
 
@@ -10,6 +12,11 @@
  *   id = "image",
  *   core = {7}
  * )
+ *
+ * @deprecated in Drupal 8.3.x, to be removed before Drupal 9.0.x. Use
+ * \Drupal\file\Plugin\migrate\field\d7\ImageField instead.
+ *
+ * @see https://www.drupal.org/node/2751897
  */
 class ImageField extends CckFieldPluginBase {
 
diff --git a/core/modules/file/src/Plugin/migrate/cckfield/d6/FileField.php b/core/modules/file/src/Plugin/migrate/field/d6/FileField.php
similarity index 74%
copy from core/modules/file/src/Plugin/migrate/cckfield/d6/FileField.php
copy to core/modules/file/src/Plugin/migrate/field/d6/FileField.php
index d63b9c2..930c13b 100644
--- a/core/modules/file/src/Plugin/migrate/cckfield/d6/FileField.php
+++ b/core/modules/file/src/Plugin/migrate/field/d6/FileField.php
@@ -1,18 +1,18 @@
 <?php
 
-namespace Drupal\file\Plugin\migrate\cckfield\d6;
+namespace Drupal\file\Plugin\migrate\field\d6;
 
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Row;
-use Drupal\migrate_drupal\Plugin\migrate\cckfield\CckFieldPluginBase;
+use Drupal\migrate_drupal\Plugin\migrate\field\FieldPluginBase;
 
 /**
- * @MigrateCckField(
+ * @MigrateField(
  *   id = "filefield",
  *   core = {6}
  * )
  */
-class FileField extends CckFieldPluginBase {
+class FileField extends FieldPluginBase {
 
   /**
    * {@inheritdoc}
@@ -40,9 +40,9 @@ public function getFieldFormatterMap() {
   /**
    * {@inheritdoc}
    */
-  public function processCckFieldValues(MigrationInterface $migration, $field_name, $data) {
+  public function processFieldValues(MigrationInterface $migration, $field_name, $data) {
     $process = [
-      'plugin' => 'd6_cck_file',
+      'plugin' => 'd6_field_file',
       'source' => $field_name,
     ];
     $migration->mergeProcessOfProperty($field_name, $process);
diff --git a/core/modules/file/src/Plugin/migrate/field/d7/FileField.php b/core/modules/file/src/Plugin/migrate/field/d7/FileField.php
new file mode 100644
index 0000000..4243d43
--- /dev/null
+++ b/core/modules/file/src/Plugin/migrate/field/d7/FileField.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Drupal\file\Plugin\migrate\field\d7;
+
+use Drupal\file\Plugin\migrate\field\d6\FileField as D6FileField;
+use Drupal\migrate\Plugin\MigrationInterface;
+
+/**
+ * @MigrateField(
+ *   id = "file",
+ *   core = {7}
+ * )
+ */
+class FileField extends D6FileField {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function processFieldValues(MigrationInterface $migration, $field_name, $data) {
+    $process = [
+      'plugin' => 'iterator',
+      'source' => $field_name,
+      'process' => [
+        'target_id' => 'fid',
+        'display' => 'display',
+        'description' => 'description',
+      ],
+    ];
+    $migration->mergeProcessOfProperty($field_name, $process);
+  }
+
+}
diff --git a/core/modules/file/src/Plugin/migrate/cckfield/d7/ImageField.php b/core/modules/file/src/Plugin/migrate/field/d7/ImageField.php
similarity index 62%
copy from core/modules/file/src/Plugin/migrate/cckfield/d7/ImageField.php
copy to core/modules/file/src/Plugin/migrate/field/d7/ImageField.php
index 2b34a80..7783ae2 100644
--- a/core/modules/file/src/Plugin/migrate/cckfield/d7/ImageField.php
+++ b/core/modules/file/src/Plugin/migrate/field/d7/ImageField.php
@@ -1,22 +1,22 @@
 <?php
 
-namespace Drupal\file\Plugin\migrate\cckfield\d7;
+namespace Drupal\file\Plugin\migrate\field\d7;
 
 use Drupal\migrate\Plugin\MigrationInterface;
-use Drupal\migrate_drupal\Plugin\migrate\cckfield\CckFieldPluginBase;
+use Drupal\migrate_drupal\Plugin\migrate\field\FieldPluginBase;
 
 /**
- * @MigrateCckField(
+ * @MigrateField(
  *   id = "image",
  *   core = {7}
  * )
  */
-class ImageField extends CckFieldPluginBase {
+class ImageField extends FieldPluginBase {
 
   /**
    * {@inheritdoc}
    */
-  public function processCckFieldValues(MigrationInterface $migration, $field_name, $data) {
+  public function processFieldValues(MigrationInterface $migration, $field_name, $data) {
     $process = [
       'plugin' => 'iterator',
       'source' => $field_name,
diff --git a/core/modules/file/src/Plugin/migrate/process/d6/CckFile.php b/core/modules/file/src/Plugin/migrate/process/d6/CckFile.php
index 8cf2d19..7ebd157 100644
--- a/core/modules/file/src/Plugin/migrate/process/d6/CckFile.php
+++ b/core/modules/file/src/Plugin/migrate/process/d6/CckFile.php
@@ -2,91 +2,16 @@
 
 namespace Drupal\file\Plugin\migrate\process\d6;
 
-use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
-use Drupal\migrate\Plugin\MigrationInterface;
-use Drupal\migrate\MigrateExecutableInterface;
-use Drupal\migrate\Plugin\MigrateProcessInterface;
-use Drupal\migrate\ProcessPluginBase;
-use Drupal\migrate\Row;
-use Symfony\Component\DependencyInjection\ContainerInterface;
+@trigger_error('CckFile is deprecated in Drupal 8.3.x and will be be removed before Drupal 9.0.x. Use \Drupal\file\Plugin\migrate\process\d6\FieldFile instead.', E_USER_DEPRECATED);
 
 /**
  * @MigrateProcessPlugin(
  *   id = "d6_cck_file"
  * )
+ *
+ *  @deprecated in Drupal 8.3.x, to be removed before Drupal 9.0.x. Use
+ * \Drupal\file\Plugin\migrate\process\d6\FieldFile instead.
+ *
+ * @see https://www.drupal.org/node/2751897
  */
-class CckFile extends ProcessPluginBase implements ContainerFactoryPluginInterface {
-
-  /**
-   * The migration process plugin, configured for lookups in d6_file.
-   *
-   * @var \Drupal\migrate\Plugin\MigrateProcessInterface
-   */
-  protected $migrationPlugin;
-
-  /**
-   * Constructs a CckFile plugin instance.
-   *
-   * @param array $configuration
-   *   The plugin configuration.
-   * @param string $plugin_id
-   *   The plugin ID.
-   * @param mixed $plugin_definition
-   *   The plugin definition.
-   * @param \Drupal\migrate\Plugin\MigrationInterface $migration
-   *   The current migration.
-   * @param \Drupal\migrate\Plugin\MigrateProcessInterface $migration_plugin
-   *   An instance of the 'migration' process plugin.
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, MigrateProcessInterface $migration_plugin) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
-    $this->migration = $migration;
-    $this->migrationPlugin = $migration_plugin;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) {
-    // Configure the migration process plugin to look up migrated IDs from
-    // a d6 file migration.
-    $migration_plugin_configuration = $configuration + [
-      'migration' => 'd6_file',
-      'source' => ['fid'],
-    ];
-
-    return new static(
-      $configuration,
-      $plugin_id,
-      $plugin_definition,
-      $migration,
-      $container->get('plugin.manager.migrate.process')->createInstance('migration', $migration_plugin_configuration, $migration)
-    );
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
-    $options = unserialize($value['data']);
-
-    // Try to look up the ID of the migrated file. If one cannot be found, it
-    // means the file referenced by the current field item did not migrate for
-    // some reason -- file migration is notoriously brittle -- and we do NOT
-    // want to send invalid file references into the field system (it causes
-    // fatals), so return an empty item instead.
-    if ($fid = $this->migrationPlugin->transform($value['fid'], $migrate_executable, $row, $destination_property)) {
-      return [
-        'target_id' => $fid,
-        'display' => $value['list'],
-        'description' => isset($options['description']) ? $options['description'] : '',
-        'alt' => isset($options['alt']) ? $options['alt'] : '',
-        'title' => isset($options['title']) ? $options['title'] : '',
-      ];
-    }
-    else {
-      return [];
-    }
-  }
-
-}
+class CckFile extends FieldFile {}
diff --git a/core/modules/file/src/Plugin/migrate/process/d6/CckFile.php b/core/modules/file/src/Plugin/migrate/process/d6/FieldFile.php
similarity index 95%
copy from core/modules/file/src/Plugin/migrate/process/d6/CckFile.php
copy to core/modules/file/src/Plugin/migrate/process/d6/FieldFile.php
index 8cf2d19..3b907a3 100644
--- a/core/modules/file/src/Plugin/migrate/process/d6/CckFile.php
+++ b/core/modules/file/src/Plugin/migrate/process/d6/FieldFile.php
@@ -12,10 +12,10 @@
 
 /**
  * @MigrateProcessPlugin(
- *   id = "d6_cck_file"
+ *   id = "d6_field_file"
  * )
  */
-class CckFile extends ProcessPluginBase implements ContainerFactoryPluginInterface {
+class FieldFile extends ProcessPluginBase implements ContainerFactoryPluginInterface {
 
   /**
    * The migration process plugin, configured for lookups in d6_file.
@@ -25,7 +25,7 @@ class CckFile extends ProcessPluginBase implements ContainerFactoryPluginInterfa
   protected $migrationPlugin;
 
   /**
-   * Constructs a CckFile plugin instance.
+   * Constructs a FieldFile plugin instance.
    *
    * @param array $configuration
    *   The plugin configuration.
diff --git a/core/modules/file/tests/src/Kernel/Migrate/process/d6/CckFileTest.php b/core/modules/file/tests/src/Kernel/Migrate/process/d6/CckFileTest.php
index 1c60c95..e0e1934 100644
--- a/core/modules/file/tests/src/Kernel/Migrate/process/d6/CckFileTest.php
+++ b/core/modules/file/tests/src/Kernel/Migrate/process/d6/CckFileTest.php
@@ -12,6 +12,7 @@
  * @coversDefaultClass \Drupal\file\Plugin\migrate\process\d6\CckFile
  *
  * @group file
+ * @group legacy
  */
 class CckFileTest extends MigrateDrupalTestBase {
 
diff --git a/core/modules/file/tests/src/Unit/Plugin/migrate/cckfield/d6/FileCckTest.php b/core/modules/file/tests/src/Unit/Plugin/migrate/cckfield/d6/FileCckTest.php
new file mode 100644
index 0000000..2997596
--- /dev/null
+++ b/core/modules/file/tests/src/Unit/Plugin/migrate/cckfield/d6/FileCckTest.php
@@ -0,0 +1,82 @@
+<?php
+
+namespace Drupal\Tests\file\Unit\Plugin\migrate\cckfield\d6;
+
+use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\migrate\Row;
+use Drupal\Tests\UnitTestCase;
+use Drupal\file\Plugin\migrate\cckfield\d6\FileField;
+use Prophecy\Argument;
+
+/**
+ * @coversDefaultClass \Drupal\file\Plugin\migrate\cckfield\d6\FileField
+ * @group file
+ * @group legacy
+ */
+class FileCckTest extends UnitTestCase {
+
+  /**
+   * @var \Drupal\migrate_drupal\Plugin\MigrateCckFieldInterface
+   */
+  protected $plugin;
+
+  /**
+   * @var \Drupal\migrate\Plugin\MigrationInterface
+   */
+  protected $migration;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    $this->plugin = new FileField([], 'file', []);
+
+    $migration = $this->prophesize(MigrationInterface::class);
+
+    // The plugin's processFieldValues() method will call
+    // mergeProcessOfProperty() and return nothing. So, in order to examine the
+    // process pipeline created by the plugin, we need to ensure that
+    // getProcess() always returns the last input to mergeProcessOfProperty().
+    $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array'))
+      ->will(function($arguments) use ($migration) {
+        $migration->getProcess()->willReturn($arguments[1]);
+      });
+    $this->migration = $migration->reveal();
+  }
+
+  /**
+   * @covers ::processCckFieldValues
+   */
+  public function testProcessCckFieldValues() {
+    $this->plugin->processCckFieldValues($this->migration, 'somefieldname', []);
+
+    $expected = [
+      'plugin' => 'd6_cck_file',
+      'source' => 'somefieldname',
+    ];
+    $this->assertSame($expected, $this->migration->getProcess());
+  }
+
+  /**
+   * Data provider for testGetFieldType().
+   */
+  public function getFieldTypeProvider() {
+    return [
+      ['image', 'imagefield_widget'],
+      ['file', 'filefield_widget'],
+      ['file', 'x_widget']
+    ];
+  }
+
+  /**
+   * @covers ::getFieldType
+   * @dataProvider getFieldTypeProvider
+   */
+  public function testGetFieldType($expected_type, $widget_type, array $settings = []) {
+    $row = new Row();
+    $row->setSourceProperty('widget_type', $widget_type);
+    $row->setSourceProperty('global_settings', $settings);
+    $this->assertSame($expected_type, $this->plugin->getFieldType($row));
+  }
+
+}
diff --git a/core/modules/file/tests/src/Unit/Plugin/migrate/cckfield/d7/FileCckTest.php b/core/modules/file/tests/src/Unit/Plugin/migrate/cckfield/d7/FileCckTest.php
new file mode 100644
index 0000000..8503eae
--- /dev/null
+++ b/core/modules/file/tests/src/Unit/Plugin/migrate/cckfield/d7/FileCckTest.php
@@ -0,0 +1,87 @@
+<?php
+
+namespace Drupal\Tests\file\Unit\Plugin\migrate\cckfield\d7;
+
+use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\migrate\Row;
+use Drupal\Tests\UnitTestCase;
+use Drupal\file\Plugin\migrate\cckfield\d7\FileField;
+use Prophecy\Argument;
+
+/**
+ * @coversDefaultClass \Drupal\file\Plugin\migrate\cckfield\d7\FileField
+ * @group file
+ * @group legacy
+ */
+class FileCckTest extends UnitTestCase {
+
+  /**
+   * @var \Drupal\migrate_drupal\Plugin\MigrateCckFieldInterface
+   */
+  protected $plugin;
+
+  /**
+   * @var \Drupal\migrate\Plugin\MigrationInterface
+   */
+  protected $migration;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    $this->plugin = new FileField([], 'file', []);
+
+    $migration = $this->prophesize(MigrationInterface::class);
+
+    // The plugin's processFieldValues() method will call
+    // mergeProcessOfProperty() and return nothing. So, in order to examine the
+    // process pipeline created by the plugin, we need to ensure that
+    // getProcess() always returns the last input to mergeProcessOfProperty().
+    $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array'))
+      ->will(function($arguments) use ($migration) {
+        $migration->getProcess()->willReturn($arguments[1]);
+      });
+    $this->migration = $migration->reveal();
+  }
+
+  /**
+   * @covers ::processCckFieldValues
+   */
+  public function testProcessCckFieldValues() {
+    $this->plugin->processCckFieldValues($this->migration, 'somefieldname', []);
+
+    $expected = [
+      'plugin' => 'iterator',
+      'source' => 'somefieldname',
+      'process' => [
+        'target_id' => 'fid',
+        'display' => 'display',
+        'description' => 'description',
+      ],
+    ];
+    $this->assertSame($expected, $this->migration->getProcess());
+  }
+
+  /**
+   * Data provider for testGetFieldType().
+   */
+  public function getFieldTypeProvider() {
+    return [
+      ['image', 'imagefield_widget'],
+      ['file', 'filefield_widget'],
+      ['file', 'x_widget']
+    ];
+  }
+
+  /**
+   * @covers ::getFieldType
+   * @dataProvider getFieldTypeProvider
+   */
+  public function testGetFieldType($expected_type, $widget_type, array $settings = []) {
+    $row = new Row();
+    $row->setSourceProperty('widget_type', $widget_type);
+    $row->setSourceProperty('global_settings', $settings);
+    $this->assertSame($expected_type, $this->plugin->getFieldType($row));
+  }
+
+}
diff --git a/core/modules/file/tests/src/Unit/Plugin/migrate/cckfield/d7/ImageCckTest.php b/core/modules/file/tests/src/Unit/Plugin/migrate/cckfield/d7/ImageCckTest.php
new file mode 100644
index 0000000..4a8f1ce
--- /dev/null
+++ b/core/modules/file/tests/src/Unit/Plugin/migrate/cckfield/d7/ImageCckTest.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace Drupal\Tests\file\Unit\Plugin\migrate\cckfield\d7;
+
+use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\Tests\UnitTestCase;
+use Drupal\file\Plugin\migrate\cckfield\d7\ImageField;
+use Prophecy\Argument;
+
+/**
+ * @coversDefaultClass \Drupal\file\Plugin\migrate\cckfield\d7\ImageField
+ * @group file
+ * @group legacy
+ */
+class ImageCckTest extends UnitTestCase {
+
+  /**
+   * @var \Drupal\migrate_drupal\Plugin\MigrateCckFieldInterface
+   */
+  protected $plugin;
+
+  /**
+   * @var \Drupal\migrate\Plugin\MigrationInterface
+   */
+  protected $migration;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    $this->plugin = new ImageField([], 'image', []);
+
+    $migration = $this->prophesize(MigrationInterface::class);
+
+    // The plugin's processFieldValues() method will call
+    // mergeProcessOfProperty() and return nothing. So, in order to examine the
+    // process pipeline created by the plugin, we need to ensure that
+    // getProcess() always returns the last input to mergeProcessOfProperty().
+    $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array'))
+      ->will(function($arguments) use ($migration) {
+        $migration->getProcess()->willReturn($arguments[1]);
+      });
+    $this->migration = $migration->reveal();
+  }
+
+  /**
+   * @covers ::processCckFieldValues
+   */
+  public function testProcessCckFieldValues() {
+    $this->plugin->processCckFieldValues($this->migration, 'somefieldname', []);
+
+    $expected = [
+      'plugin' => 'iterator',
+      'source' => 'somefieldname',
+      'process' => [
+        'target_id' => 'fid',
+        'alt' => 'alt',
+        'title' => 'title',
+        'width' => 'width',
+        'height' => 'height',
+      ],
+    ];
+    $this->assertSame($expected, $this->migration->getProcess());
+  }
+
+}
diff --git a/core/modules/file/tests/src/Unit/Plugin/migrate/field/d6/FileFieldTest.php b/core/modules/file/tests/src/Unit/Plugin/migrate/field/d6/FileFieldTest.php
new file mode 100644
index 0000000..28d0842
--- /dev/null
+++ b/core/modules/file/tests/src/Unit/Plugin/migrate/field/d6/FileFieldTest.php
@@ -0,0 +1,81 @@
+<?php
+
+namespace Drupal\Tests\file\Unit\Plugin\migrate\field\d6;
+
+use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\migrate\Row;
+use Drupal\Tests\UnitTestCase;
+use Drupal\file\Plugin\migrate\field\d6\FileField;
+use Prophecy\Argument;
+
+/**
+ * @coversDefaultClass \Drupal\file\Plugin\migrate\field\d6\FileField
+ * @group file
+ */
+class FileFieldTest extends UnitTestCase {
+
+  /**
+   * @var \Drupal\migrate_drupal\Plugin\MigrateFieldInterface
+   */
+  protected $plugin;
+
+  /**
+   * @var \Drupal\migrate\Plugin\MigrationInterface
+   */
+  protected $migration;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    $this->plugin = new FileField([], 'file', []);
+
+    $migration = $this->prophesize(MigrationInterface::class);
+
+    // The plugin's processFieldValues() method will call
+    // mergeProcessOfProperty() and return nothing. So, in order to examine the
+    // process pipeline created by the plugin, we need to ensure that
+    // getProcess() always returns the last input to mergeProcessOfProperty().
+    $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array'))
+      ->will(function($arguments) use ($migration) {
+        $migration->getProcess()->willReturn($arguments[1]);
+      });
+    $this->migration = $migration->reveal();
+  }
+
+  /**
+   * @covers ::processFieldValues
+   */
+  public function testProcessFieldValues() {
+    $this->plugin->processFieldValues($this->migration, 'somefieldname', []);
+
+    $expected = [
+      'plugin' => 'd6_field_file',
+      'source' => 'somefieldname',
+    ];
+    $this->assertSame($expected, $this->migration->getProcess());
+  }
+
+  /**
+   * Data provider for testGetFieldType().
+   */
+  public function getFieldTypeProvider() {
+    return [
+      ['image', 'imagefield_widget'],
+      ['file', 'filefield_widget'],
+      ['file', 'x_widget']
+    ];
+  }
+
+  /**
+   * @covers ::getFieldType
+   * @dataProvider getFieldTypeProvider
+   */
+  public function testGetFieldType($expected_type, $widget_type, array $settings = []) {
+    $row = new Row();
+    $row->setSourceProperty('widget_type', $widget_type);
+    $row->setSourceProperty('global_settings', $settings);
+    $this->assertSame($expected_type, $this->plugin->getFieldType($row));
+  }
+
+}
diff --git a/core/modules/file/tests/src/Unit/Plugin/migrate/field/d7/FileFieldTest.php b/core/modules/file/tests/src/Unit/Plugin/migrate/field/d7/FileFieldTest.php
new file mode 100644
index 0000000..15d86a1
--- /dev/null
+++ b/core/modules/file/tests/src/Unit/Plugin/migrate/field/d7/FileFieldTest.php
@@ -0,0 +1,86 @@
+<?php
+
+namespace Drupal\Tests\file\Unit\Plugin\migrate\field\d7;
+
+use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\migrate\Row;
+use Drupal\Tests\UnitTestCase;
+use Drupal\file\Plugin\migrate\field\d7\FileField;
+use Prophecy\Argument;
+
+/**
+ * @coversDefaultClass \Drupal\file\Plugin\migrate\field\d7\FileField
+ * @group file
+ */
+class FileFieldTest extends UnitTestCase {
+
+  /**
+   * @var \Drupal\migrate_drupal\Plugin\MigrateFieldInterface
+   */
+  protected $plugin;
+
+  /**
+   * @var \Drupal\migrate\Plugin\MigrationInterface
+   */
+  protected $migration;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    $this->plugin = new FileField([], 'file', []);
+
+    $migration = $this->prophesize(MigrationInterface::class);
+
+    // The plugin's processFieldValues() method will call
+    // mergeProcessOfProperty() and return nothing. So, in order to examine the
+    // process pipeline created by the plugin, we need to ensure that
+    // getProcess() always returns the last input to mergeProcessOfProperty().
+    $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array'))
+      ->will(function($arguments) use ($migration) {
+        $migration->getProcess()->willReturn($arguments[1]);
+      });
+    $this->migration = $migration->reveal();
+  }
+
+  /**
+   * @covers ::processFieldValues
+   */
+  public function testProcessFieldValues() {
+    $this->plugin->processFieldValues($this->migration, 'somefieldname', []);
+
+    $expected = [
+      'plugin' => 'iterator',
+      'source' => 'somefieldname',
+      'process' => [
+        'target_id' => 'fid',
+        'display' => 'display',
+        'description' => 'description',
+      ],
+    ];
+    $this->assertSame($expected, $this->migration->getProcess());
+  }
+
+  /**
+   * Data provider for testGetFieldType().
+   */
+  public function getFieldTypeProvider() {
+    return [
+      ['image', 'imagefield_widget'],
+      ['file', 'filefield_widget'],
+      ['file', 'x_widget']
+    ];
+  }
+
+  /**
+   * @covers ::getFieldType
+   * @dataProvider getFieldTypeProvider
+   */
+  public function testGetFieldType($expected_type, $widget_type, array $settings = []) {
+    $row = new Row();
+    $row->setSourceProperty('widget_type', $widget_type);
+    $row->setSourceProperty('global_settings', $settings);
+    $this->assertSame($expected_type, $this->plugin->getFieldType($row));
+  }
+
+}
diff --git a/core/modules/file/tests/src/Unit/Plugin/migrate/field/d7/ImageFieldTest.php b/core/modules/file/tests/src/Unit/Plugin/migrate/field/d7/ImageFieldTest.php
new file mode 100644
index 0000000..61fda03
--- /dev/null
+++ b/core/modules/file/tests/src/Unit/Plugin/migrate/field/d7/ImageFieldTest.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace Drupal\Tests\file\Unit\Plugin\migrate\field\d7;
+
+use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\Tests\UnitTestCase;
+use Drupal\file\Plugin\migrate\field\d7\ImageField;
+use Prophecy\Argument;
+
+/**
+ * @coversDefaultClass \Drupal\file\Plugin\migrate\field\d7\ImageField
+ * @group file
+ */
+class ImageFieldTest extends UnitTestCase {
+
+  /**
+   * @var \Drupal\migrate_drupal\Plugin\MigrateFieldInterface
+   */
+  protected $plugin;
+
+  /**
+   * @var \Drupal\migrate\Plugin\MigrationInterface
+   */
+  protected $migration;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    $this->plugin = new ImageField([], 'image', []);
+
+    $migration = $this->prophesize(MigrationInterface::class);
+
+    // The plugin's processFieldValues() method will call
+    // mergeProcessOfProperty() and return nothing. So, in order to examine the
+    // process pipeline created by the plugin, we need to ensure that
+    // getProcess() always returns the last input to mergeProcessOfProperty().
+    $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array'))
+      ->will(function($arguments) use ($migration) {
+        $migration->getProcess()->willReturn($arguments[1]);
+      });
+    $this->migration = $migration->reveal();
+  }
+
+  /**
+   * @covers ::processFieldValues
+   */
+  public function testProcessFieldValues() {
+    $this->plugin->processFieldValues($this->migration, 'somefieldname', []);
+
+    $expected = [
+      'plugin' => 'iterator',
+      'source' => 'somefieldname',
+      'process' => [
+        'target_id' => 'fid',
+        'alt' => 'alt',
+        'title' => 'title',
+        'width' => 'width',
+        'height' => 'height',
+      ],
+    ];
+    $this->assertSame($expected, $this->migration->getProcess());
+  }
+
+}
diff --git a/core/modules/file/tests/src/Unit/Plugin/migrate/process/d6/CckFileTest.php b/core/modules/file/tests/src/Unit/Plugin/migrate/process/d6/CckFileTest.php
index 1cce989..5bad279 100644
--- a/core/modules/file/tests/src/Unit/Plugin/migrate/process/d6/CckFileTest.php
+++ b/core/modules/file/tests/src/Unit/Plugin/migrate/process/d6/CckFileTest.php
@@ -11,6 +11,7 @@
 
 /**
  * @group file
+ * @group legacy
  */
 class CckFileTest extends UnitTestCase {
 
diff --git a/core/modules/file/tests/src/Unit/Plugin/migrate/process/d6/CckFileTest.php b/core/modules/file/tests/src/Unit/Plugin/migrate/process/d6/FieldFileTest.php
similarity index 87%
copy from core/modules/file/tests/src/Unit/Plugin/migrate/process/d6/CckFileTest.php
copy to core/modules/file/tests/src/Unit/Plugin/migrate/process/d6/FieldFileTest.php
index 1cce989..e57821c 100644
--- a/core/modules/file/tests/src/Unit/Plugin/migrate/process/d6/CckFileTest.php
+++ b/core/modules/file/tests/src/Unit/Plugin/migrate/process/d6/FieldFileTest.php
@@ -2,7 +2,7 @@
 
 namespace Drupal\Tests\file\Unit\Plugin\migrate\process\d6;
 
-use Drupal\file\Plugin\migrate\process\d6\CckFile;
+use Drupal\file\Plugin\migrate\process\d6\FieldFile;
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\MigrateExecutableInterface;
 use Drupal\migrate\Plugin\MigrateProcessInterface;
@@ -12,7 +12,7 @@
 /**
  * @group file
  */
-class CckFileTest extends UnitTestCase {
+class FieldFileTest extends UnitTestCase {
 
   /**
    * Tests that alt and title attributes are included in transformed values.
@@ -25,7 +25,7 @@ public function testTransformAltTitle() {
     $migration_plugin = $this->prophesize(MigrateProcessInterface::class);
     $migration_plugin->transform(1, $executable, $row, 'foo')->willReturn(1);
 
-    $plugin = new CckFile([], 'd6_cck_file', [], $migration, $migration_plugin->reveal());
+    $plugin = new FieldFile([], 'd6_file', [], $migration, $migration_plugin->reveal());
 
     $options = [
       'alt' => 'Foobaz',
diff --git a/core/modules/link/src/Plugin/migrate/cckfield/LinkField.php b/core/modules/link/src/Plugin/migrate/cckfield/LinkField.php
new file mode 100644
index 0000000..8acf70a
--- /dev/null
+++ b/core/modules/link/src/Plugin/migrate/cckfield/LinkField.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace Drupal\link\Plugin\migrate\cckfield;
+
+@trigger_error('LinkField is deprecated in Drupal 8.3.x and will be be removed before Drupal 9.0.x. Use \Drupal\link\Plugin\migrate\field\d6\LinkField instead.', E_USER_DEPRECATED);
+
+use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\migrate_drupal\Plugin\migrate\cckfield\CckFieldPluginBase;
+
+/**
+ * @MigrateCckField(
+ *   id = "link",
+ *   core = {6},
+ *   type_map = {
+ *     "link_field" = "link"
+ *   }
+ * )
+ *
+ * @deprecated in Drupal 8.3.x and will be removed in Drupal 9.0.x. Use
+ * \Drupal\link\Plugin\migrate\field\d6\LinkField instead.
+ *
+ * @see https://www.drupal.org/node/2751897
+ */
+class LinkField extends CckFieldPluginBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFieldFormatterMap() {
+    // See d6_field_formatter_settings.yml and CckFieldPluginBase
+    // processFieldFormatter().
+    return [
+      'default' => 'link',
+      'plain' => 'link',
+      'absolute' => 'link',
+      'title_plain' => 'link',
+      'url' => 'link',
+      'short' => 'link',
+      'label' => 'link',
+      'separate' => 'link_separate',
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function processCckFieldValues(MigrationInterface $migration, $field_name, $data) {
+    $process = [
+      'plugin' => 'd6_cck_link',
+      'source' => $field_name,
+    ];
+    $migration->mergeProcessOfProperty($field_name, $process);
+  }
+
+}
diff --git a/core/modules/link/src/Plugin/migrate/cckfield/d7/LinkField.php b/core/modules/link/src/Plugin/migrate/cckfield/d7/LinkField.php
new file mode 100644
index 0000000..6a7ff88
--- /dev/null
+++ b/core/modules/link/src/Plugin/migrate/cckfield/d7/LinkField.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace Drupal\link\Plugin\migrate\cckfield\d7;
+
+@trigger_error('LinkField is deprecated in Drupal 8.3.x and will be be removed before Drupal 9.0.x. Use \Drupal\link\Plugin\migrate\field\d7\LinkField instead.', E_USER_DEPRECATED);
+
+use Drupal\link\Plugin\migrate\cckfield\LinkField as D6LinkField;
+use Drupal\migrate\Plugin\MigrationInterface;
+
+/**
+ * @MigrateCckField(
+ *   id = "link_field",
+ *   core = {7},
+ *   type_map = {
+ *     "link_field" = "link"
+ *   }
+ * )
+ *
+ * This plugin provides the exact same functionality as the Drupal 6 "link"
+ * plugin with the exception that the plugin ID "link_field" is used in the
+ * field type map.
+ *
+ * @deprecated in Drupal 8.3.x, to be removed before Drupal 9.0.x. Use
+ * \Drupal\link\Plugin\migrate\field\d7\LinkField instead.
+ *
+ * @see https://www.drupal.org/node/2751897
+ */
+class LinkField extends D6LinkField {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFieldWidgetMap() {
+    // By default, use the plugin ID for the widget types.
+    return ['link_field' => 'link_default'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function processFieldInstance(MigrationInterface $migration) {
+    $process = [
+      'plugin' => 'static_map',
+      'source' => 'settings/title',
+      'bypass' => TRUE,
+      'map' => [
+        'disabled' => DRUPAL_DISABLED,
+        'optional' => DRUPAL_OPTIONAL,
+        'required' => DRUPAL_REQUIRED,
+      ],
+    ];
+    $migration->mergeProcessOfProperty('settings/title', $process);
+  }
+
+}
diff --git a/core/modules/link/tests/src/Kernel/Plugin/migrate/cckfield/d7/LinkCckTest.php b/core/modules/link/tests/src/Kernel/Plugin/migrate/cckfield/d7/LinkCckTest.php
new file mode 100644
index 0000000..77d35e0
--- /dev/null
+++ b/core/modules/link/tests/src/Kernel/Plugin/migrate/cckfield/d7/LinkCckTest.php
@@ -0,0 +1,73 @@
+<?php
+
+namespace Drupal\Tests\link\Kernel\Plugin\migrate\cckfield\d7;
+
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\link\Plugin\migrate\cckfield\d7\LinkField;
+use Prophecy\Argument;
+
+/**
+ * @coversDefaultClass \Drupal\link\Plugin\migrate\cckfield\d7\LinkField
+ * @group link
+ * @group legacy
+ */
+class LinkCckTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = ['system'];
+
+  /**
+   * @var \Drupal\migrate_drupal\Plugin\MigrateCckFieldInterface
+   */
+  protected $plugin;
+
+  /**
+   * @var \Drupal\migrate\Plugin\MigrationInterface
+   */
+  protected $migration;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->plugin = new LinkField([], 'link', []);
+
+    $migration = $this->prophesize(MigrationInterface::class);
+
+    // The plugin's processFieldInstance() method will call
+    // mergeProcessOfProperty() and return nothing. So, in order to examine the
+    // process pipeline created by the plugin, we need to ensure that
+    // getProcess() always returns the last input to mergeProcessOfProperty().
+    $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array'))
+      ->will(function($arguments) use ($migration) {
+        $migration->getProcess()->willReturn($arguments[1]);
+      });
+
+    $this->migration = $migration->reveal();
+  }
+
+  /**
+   * @covers ::processCckFieldValues
+   */
+  public function testProcessCckFieldValues() {
+    $this->plugin->processFieldInstance($this->migration);
+
+    $expected = [
+      'plugin' => 'static_map',
+      'source' => 'settings/title',
+      'bypass' => TRUE,
+      'map' => [
+        'disabled' => DRUPAL_DISABLED,
+        'optional' => DRUPAL_OPTIONAL,
+        'required' => DRUPAL_REQUIRED,
+      ],
+    ];
+    $this->assertSame($expected, $this->migration->getProcess());
+  }
+
+}
diff --git a/core/modules/link/tests/src/Kernel/Plugin/migrate/field/d7/LinkFieldTest.php b/core/modules/link/tests/src/Kernel/Plugin/migrate/field/d7/LinkFieldTest.php
new file mode 100644
index 0000000..7dea25e
--- /dev/null
+++ b/core/modules/link/tests/src/Kernel/Plugin/migrate/field/d7/LinkFieldTest.php
@@ -0,0 +1,72 @@
+<?php
+
+namespace Drupal\Tests\link\Kernel\Plugin\migrate\field\d7;
+
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\link\Plugin\migrate\field\d7\LinkField;
+use Prophecy\Argument;
+
+/**
+ * @coversDefaultClass \Drupal\link\Plugin\migrate\field\d7\LinkField
+ * @group link
+ */
+class LinkFieldTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = ['system'];
+
+  /**
+   * @var \Drupal\migrate_drupal\Plugin\MigrateFieldInterface
+   */
+  protected $plugin;
+
+  /**
+   * @var \Drupal\migrate\Plugin\MigrationInterface
+   */
+  protected $migration;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->plugin = new LinkField([], 'link', []);
+
+    $migration = $this->prophesize(MigrationInterface::class);
+
+    // The plugin's ProcessFieldInstance() method will call
+    // mergeProcessOfProperty() and return nothing. So, in order to examine the
+    // process pipeline created by the plugin, we need to ensure that
+    // getProcess() always returns the last input to mergeProcessOfProperty().
+    $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array'))
+      ->will(function($arguments) use ($migration) {
+        $migration->getProcess()->willReturn($arguments[1]);
+      });
+
+    $this->migration = $migration->reveal();
+  }
+
+  /**
+   * @covers ::processFieldInstance
+   */
+  public function testProcessFieldInstance() {
+    $this->plugin->processFieldInstance($this->migration);
+
+    $expected = [
+      'plugin' => 'static_map',
+      'source' => 'settings/title',
+      'bypass' => TRUE,
+      'map' => [
+        'disabled' => DRUPAL_DISABLED,
+        'optional' => DRUPAL_OPTIONAL,
+        'required' => DRUPAL_REQUIRED,
+      ],
+    ];
+    $this->assertSame($expected, $this->migration->getProcess());
+  }
+
+}
diff --git a/core/modules/link/tests/src/Unit/Plugin/migrate/cckfield/LinkCckTest.php b/core/modules/link/tests/src/Unit/Plugin/migrate/cckfield/LinkCckTest.php
new file mode 100644
index 0000000..f549a0d
--- /dev/null
+++ b/core/modules/link/tests/src/Unit/Plugin/migrate/cckfield/LinkCckTest.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Drupal\Tests\link\Unit\Plugin\migrate\cckfield;
+
+use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\Tests\UnitTestCase;
+use Drupal\link\Plugin\migrate\cckfield\LinkField;
+use Prophecy\Argument;
+
+/**
+ * @coversDefaultClass \Drupal\link\Plugin\migrate\cckfield\LinkField
+ * @group link
+ * @group legacy
+ */
+class LinkCckTest extends UnitTestCase {
+
+  /**
+   * @var \Drupal\migrate_drupal\Plugin\MigrateCckFieldInterface
+   */
+  protected $plugin;
+
+  /**
+   * @var \Drupal\migrate\Plugin\MigrationInterface
+   */
+  protected $migration;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    $this->plugin = new LinkField([], 'link', []);
+
+    $migration = $this->prophesize(MigrationInterface::class);
+
+    // The plugin's processCckFieldValues() method will call
+    // mergeProcessOfProperty() and return nothing. So, in order to examine the
+    // process pipeline created by the plugin, we need to ensure that
+    // getProcess() always returns the last input to mergeProcessOfProperty().
+    $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array'))
+      ->will(function($arguments) use ($migration) {
+        $migration->getProcess()->willReturn($arguments[1]);
+      });
+
+    $this->migration = $migration->reveal();
+  }
+
+  /**
+   * @covers ::processCckFieldValues
+   */
+  public function testProcessCckFieldValues() {
+    $this->plugin->processCckFieldValues($this->migration, 'somefieldname', []);
+
+    $expected = [
+      'plugin' => 'd6_cck_link',
+      'source' => 'somefieldname',
+    ];
+    $this->assertSame($expected, $this->migration->getProcess());
+  }
+
+}
diff --git a/core/modules/link/tests/src/Unit/Plugin/migrate/field/d6/LinkFieldTest.php b/core/modules/link/tests/src/Unit/Plugin/migrate/field/d6/LinkFieldTest.php
new file mode 100644
index 0000000..645e3e1
--- /dev/null
+++ b/core/modules/link/tests/src/Unit/Plugin/migrate/field/d6/LinkFieldTest.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Drupal\Tests\link\Unit\Plugin\migrate\field\d6;
+
+use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\Tests\UnitTestCase;
+use Drupal\link\Plugin\migrate\field\d6\LinkField;
+use Prophecy\Argument;
+
+/**
+ * @coversDefaultClass \Drupal\link\Plugin\migrate\field\d6\LinkField
+ * @group link
+ */
+class LinkFieldTest extends UnitTestCase {
+
+  /**
+   * @var \Drupal\migrate_drupal\Plugin\MigrateFieldInterface
+   */
+  protected $plugin;
+
+  /**
+   * @var \Drupal\migrate\Plugin\MigrationInterface
+   */
+  protected $migration;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    $this->plugin = new LinkField([], 'link', []);
+
+    $migration = $this->prophesize(MigrationInterface::class);
+
+    // The plugin's processFieldValues() method will call
+    // mergeProcessOfProperty() and return nothing. So, in order to examine the
+    // process pipeline created by the plugin, we need to ensure that
+    // getProcess() always returns the last input to mergeProcessOfProperty().
+    $migration->mergeProcessOfProperty(Argument::type('string'), Argument::type('array'))
+      ->will(function($arguments) use ($migration) {
+        $migration->getProcess()->willReturn($arguments[1]);
+      });
+
+    $this->migration = $migration->reveal();
+  }
+
+  /**
+   * @covers ::processFieldValues
+   */
+  public function testProcessFieldValues() {
+    $this->plugin->processFieldValues($this->migration, 'somefieldname', []);
+
+    $expected = [
+      'plugin' => 'd6_field_link',
+      'source' => 'somefieldname',
+    ];
+    $this->assertSame($expected, $this->migration->getProcess());
+  }
+
+}
diff --git a/core/modules/migrate_drupal/src/Annotation/MigrateCckField.php b/core/modules/migrate_drupal/src/Annotation/MigrateCckField.php
index 73949e1..2055820 100644
--- a/core/modules/migrate_drupal/src/Annotation/MigrateCckField.php
+++ b/core/modules/migrate_drupal/src/Annotation/MigrateCckField.php
@@ -2,9 +2,7 @@
 
 namespace Drupal\migrate_drupal\Annotation;
 
-@trigger_error('MigrateCckField is deprecated in Drupal 8.3.x and will be
-removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Annotation\MigrateField
-instead.', E_USER_DEPRECATED);
+@trigger_error('MigrateCckField is deprecated in Drupal 8.3.x and will be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Annotation\MigrateField instead.', E_USER_DEPRECATED);
 
 /**
  * Deprecated: Defines a cckfield plugin annotation object.
@@ -14,6 +12,8 @@
  *
  * Plugin Namespace: Plugin\migrate\cckfield
  *
+ * @see https://www.drupal.org/node/2751897
+ *
  * @Annotation
  */
 class MigrateCckField extends MigrateField {
diff --git a/core/modules/migrate_drupal/src/Plugin/MigrateCckFieldInterface.php b/core/modules/migrate_drupal/src/Plugin/MigrateCckFieldInterface.php
index 49f41a3..6dceeab 100644
--- a/core/modules/migrate_drupal/src/Plugin/MigrateCckFieldInterface.php
+++ b/core/modules/migrate_drupal/src/Plugin/MigrateCckFieldInterface.php
@@ -2,9 +2,7 @@
 
 namespace Drupal\migrate_drupal\Plugin;
 
-@trigger_error('MigrateCckFieldInterface is deprecated in Drupal 8.3.x and will
-be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Annotation\MigrateField
-instead.', E_USER_DEPRECATED);
+@trigger_error('MigrateCckFieldInterface is deprecated in Drupal 8.3.x and will be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Annotation\MigrateField instead.', E_USER_DEPRECATED);
 
 use Drupal\migrate\Plugin\MigrationInterface;
 
diff --git a/core/modules/migrate_drupal/src/Plugin/MigrateCckFieldPluginManager.php b/core/modules/migrate_drupal/src/Plugin/MigrateCckFieldPluginManager.php
index 9ade1e5..fbb765f 100644
--- a/core/modules/migrate_drupal/src/Plugin/MigrateCckFieldPluginManager.php
+++ b/core/modules/migrate_drupal/src/Plugin/MigrateCckFieldPluginManager.php
@@ -2,9 +2,7 @@
 
 namespace Drupal\migrate_drupal\Plugin;
 
-@trigger_error('MigrateCckFieldPluginManager is deprecated in Drupal 8.3.x and will
-be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Annotation\MigrateFieldPluginManager
-instead.', E_USER_DEPRECATED);
+@trigger_error('MigrateCckFieldPluginManager is deprecated in Drupal 8.3.x and will be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Annotation\MigrateFieldPluginManager instead.', E_USER_DEPRECATED);
 
 /**
  * Deprecated: Plugin manager for migrate field plugins.
@@ -12,6 +10,8 @@
  * @deprecated in Drupal 8.3.x, to be removed before Drupal 9.0.x. Use
  *   \Drupal\migrate_drupal\Plugin\MigrateFieldPluginManager instead.
  *
+ * @see https://www.drupal.org/node/2751897
+ *
  * @ingroup migration
  */
 class MigrateCckFieldPluginManager extends MigrateFieldPluginManager implements MigrateCckFieldPluginManagerInterface { }
diff --git a/core/modules/migrate_drupal/src/Plugin/MigrateCckFieldPluginManagerInterface.php b/core/modules/migrate_drupal/src/Plugin/MigrateCckFieldPluginManagerInterface.php
index bdb2879..50ee263 100644
--- a/core/modules/migrate_drupal/src/Plugin/MigrateCckFieldPluginManagerInterface.php
+++ b/core/modules/migrate_drupal/src/Plugin/MigrateCckFieldPluginManagerInterface.php
@@ -2,9 +2,7 @@
 
 namespace Drupal\migrate_drupal\Plugin;
 
-@trigger_error('MigrateCckFieldPluginManagerInterface is deprecated in Drupal 8.3.x
-and will be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Annotation\MigrateFieldPluginManagerInterface
-instead.', E_USER_DEPRECATED);
+@trigger_error('MigrateCckFieldPluginManagerInterface is deprecated in Drupal 8.3.x and will be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Annotation\MigrateFieldPluginManagerInterface instead.', E_USER_DEPRECATED);
 
 /**
  * Provides an interface for cck field plugin manager.
diff --git a/core/modules/migrate_drupal/src/Plugin/MigrateFieldPluginManager.php b/core/modules/migrate_drupal/src/Plugin/MigrateFieldPluginManager.php
index 6065157..2b33c85 100644
--- a/core/modules/migrate_drupal/src/Plugin/MigrateFieldPluginManager.php
+++ b/core/modules/migrate_drupal/src/Plugin/MigrateFieldPluginManager.php
@@ -7,7 +7,7 @@
 use Drupal\migrate\Plugin\MigrationInterface;
 
 /**
- * Plugin manager for migrate cckfield plugins.
+ * Plugin manager for migrate field plugins.
  *
  * @see \Drupal\migrate_drupal\Plugin\MigrateFieldInterface
  * @see \Drupal\migrate\Annotation\MigrateField
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/CckMigration.php b/core/modules/migrate_drupal/src/Plugin/migrate/CckMigration.php
index 082c051..d608fb0 100644
--- a/core/modules/migrate_drupal/src/Plugin/migrate/CckMigration.php
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/CckMigration.php
@@ -2,15 +2,15 @@
 
 namespace Drupal\migrate_drupal\Plugin\migrate;
 
-@trigger_error('CckMigration is deprecated in Drupal 8.3.x and will be removed
-before Drupal 9.0.x. Use \Drupal\migrate_drupal\Plugin\migrate\FieldMigration
-instead.', E_USER_DEPRECATED);
+@trigger_error('CckMigration is deprecated in Drupal 8.3.x and will be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Plugin\migrate\FieldMigration instead.', E_USER_DEPRECATED);
 
 /**
  * Migration plugin class for migrations dealing with CCK field values.
  *
  * @deprecated in Drupal 8.3.x, to be removed before Drupal 9.0.x. Use
  * \Drupal\migrate_drupal\Plugin\migrate\FieldMigration instead.
+ *
+ * @see https://www.drupal.org/node/2751897
  */
 class CckMigration extends FieldMigration {
 
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/cckfield/CckFieldPluginBase.php b/core/modules/migrate_drupal/src/Plugin/migrate/cckfield/CckFieldPluginBase.php
index 79a65a7..da1c7e9 100644
--- a/core/modules/migrate_drupal/src/Plugin/migrate/cckfield/CckFieldPluginBase.php
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/cckfield/CckFieldPluginBase.php
@@ -2,9 +2,7 @@
 
 namespace Drupal\migrate_drupal\Plugin\migrate\cckfield;
 
-@trigger_error('CckFieldPluginBase is deprecated in Drupal 8.3.x and will be
-be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Plugin\migrate\field\FieldPluginBase
-instead.', E_USER_DEPRECATED);
+@trigger_error('CckFieldPluginBase is deprecated in Drupal 8.3.x and will be be removed before Drupal 9.0.x. Use \Drupal\migrate_drupal\Plugin\migrate\field\FieldPluginBase instead.', E_USER_DEPRECATED);
 
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate_drupal\Plugin\migrate\field\FieldPluginBase;
@@ -12,9 +10,11 @@
 /**
  * The base class for all field plugins.
  *
- * @deprecated in Drupal 8.3.x, to be removed before Drupal 9.0.x. Use
+ * @deprecated in Drupal 8.4.x, to be removed before Drupal 9.0.x. Use
  * \Drupal\migrate_drupal\Plugin\migrate\field\FieldPluginBase instead.
  *
+ * @see https://www.drupal.org/node/2751897
+ *
  * @ingroup migration
  */
 abstract class CckFieldPluginBase extends FieldPluginBase {
diff --git a/core/modules/migrate_drupal/tests/modules/migrate_cckfield_plugin_manager_test/migrate_cckfield_plugin_manager_test.module b/core/modules/migrate_drupal/tests/modules/migrate_cckfield_plugin_manager_test/migrate_cckfield_plugin_manager_test.module
new file mode 100644
index 0000000..0cb89be
--- /dev/null
+++ b/core/modules/migrate_drupal/tests/modules/migrate_cckfield_plugin_manager_test/migrate_cckfield_plugin_manager_test.module
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * @file
+ * Module for Migrate CCK Field Plugin Manager testing.
+ */
+
+use Drupal\migrate_cckfield_plugin_manager_test\Plugin\migrate\cckfield\D6FileField;
+
+function migrate_cckfield_plugin_manager_test_migrate_field_info_alter(array &$definitions) {
+  if (isset($definitions['filefield'])) {
+    $definitions['filefield']['class'] = D6FileField::class;
+  }
+}
diff --git a/core/modules/migrate_drupal/tests/modules/migrate_cckfield_plugin_manager_test/src/Plugin/migrate/cckfield/D6FileField.php b/core/modules/migrate_drupal/tests/modules/migrate_cckfield_plugin_manager_test/src/Plugin/migrate/cckfield/D6FileField.php
index 3f39759..1b43724 100644
--- a/core/modules/migrate_drupal/tests/modules/migrate_cckfield_plugin_manager_test/src/Plugin/migrate/cckfield/D6FileField.php
+++ b/core/modules/migrate_drupal/tests/modules/migrate_cckfield_plugin_manager_test/src/Plugin/migrate/cckfield/D6FileField.php
@@ -19,6 +19,10 @@ class D6FileField extends CckFieldPluginBase {
   /**
    * {@inheritdoc}
    */
-  public function processCckFieldValues(MigrationInterface $migration, $field_name, $data) {}
+  public function processCckFieldValues(MigrationInterface $migration, $field_name, $data) {
+    $migration->setProcessOfProperty($field_name, [
+      'class' => static::class,
+    ]);
+  }
 
 }
diff --git a/core/modules/migrate_drupal/tests/modules/migrate_field_plugin_manager_test/migrate_field_plugin_manager_test.module b/core/modules/migrate_drupal/tests/modules/migrate_field_plugin_manager_test/migrate_field_plugin_manager_test.module
deleted file mode 100644
index 9f9da0d..0000000
--- a/core/modules/migrate_drupal/tests/modules/migrate_field_plugin_manager_test/migrate_field_plugin_manager_test.module
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-/**
- * @file
- * Module for Migrate Field Plugin Manager testing.
- */
-
-use Drupal\migrate_field_plugin_manager_test\Plugin\migrate\cckfield\d6\FileField;
-
-function migrate_field_plugin_manager_test_migrate_field_info_alter(array &$definitions) {
-  if (isset($definitions['filefield'])) {
-    $definitions['filefield']['class'] = FileField::class;
-  }
-}
diff --git a/core/modules/migrate_drupal/tests/src/Kernel/CckFieldBackwardsCompatibilityTest.php b/core/modules/migrate_drupal/tests/src/Kernel/CckFieldBackwardsCompatibilityTest.php
index 11dceec..bb314b4 100644
--- a/core/modules/migrate_drupal/tests/src/Kernel/CckFieldBackwardsCompatibilityTest.php
+++ b/core/modules/migrate_drupal/tests/src/Kernel/CckFieldBackwardsCompatibilityTest.php
@@ -2,7 +2,7 @@
 
 namespace Drupal\Tests\migrate_drupal\Kernel;
 
-use Drupal\migrate_field_plugin_manager_test\Plugin\migrate\cckfield\d6\FileField;
+use Drupal\migrate_cckfield_plugin_manager_test\Plugin\migrate\cckfield\D6FileField;
 use Drupal\Tests\migrate_drupal\Kernel\d6\MigrateDrupal6TestBase;
 
 /**
@@ -13,7 +13,7 @@ class CckFieldBackwardsCompatibilityTest extends MigrateDrupal6TestBase {
   /**
    * {@inheritdoc}
    */
-  public static $modules = ['file', 'migrate_field_plugin_manager_test'];
+  public static $modules = ['file', 'migrate_cckfield_plugin_manager_test'];
 
   /**
    * Ensures that the cckfield backwards compatibility layer is invoked.
@@ -23,7 +23,7 @@ public function testBackwardsCompatibility() {
       ->get('plugin.manager.migration')
       ->getDefinition('d6_node:story');
 
-    $this->assertSame(FileField::class, $migration['process']['field_test_filefield']['class']);
+    $this->assertSame(D6FileField::class, $migration['process']['field_test_filefield']['class']);
   }
 
 }
diff --git a/core/modules/migrate_drupal/tests/src/Kernel/MigrateCckFieldPluginManagerTest.php b/core/modules/migrate_drupal/tests/src/Kernel/MigrateCckFieldPluginManagerTest.php
index 9e30795..7eb68ba 100644
--- a/core/modules/migrate_drupal/tests/src/Kernel/MigrateCckFieldPluginManagerTest.php
+++ b/core/modules/migrate_drupal/tests/src/Kernel/MigrateCckFieldPluginManagerTest.php
@@ -22,28 +22,20 @@ class MigrateCckFieldPluginManagerTest extends MigrateDrupalTestBase {
   public function testPluginSelection() {
     $plugin_manager = \Drupal::service('plugin.manager.migrate.cckfield');
 
-    $plugin_id = $plugin_manager->getPluginIdFromFieldType('filefield', ['core' => 6]);
-    $this->assertIdentical('Drupal\\file\\Plugin\\migrate\\cckfield\\d6\\FileField', get_class($plugin_manager->createInstance($plugin_id, ['core' => 6])));
+    $this->assertSame('d6_file', $plugin_manager->getPluginIdFromFieldType('file', ['core' => 6]));
 
     try {
       // If this test passes, getPluginIdFromFieldType will raise a
       // PluginNotFoundException and we'll never reach fail().
-      $plugin_manager->getPluginIdFromFieldType('filefield', ['core' => 7]);
+      $plugin_manager->getPluginIdFromFieldType('d6_file', ['core' => 7]);
       $this->fail('Expected Drupal\Component\Plugin\Exception\PluginNotFoundException.');
     }
     catch (PluginNotFoundException $e) {
-      $this->assertIdentical($e->getMessage(), "Plugin ID 'filefield' was not found.");
+      $this->assertSame($e->getMessage(), "Plugin ID 'd6_file' was not found.");
     }
 
-    $this->assertIdentical('image', $plugin_manager->getPluginIdFromFieldType('image', ['core' => 7]));
-    $this->assertIdentical('file', $plugin_manager->getPluginIdFromFieldType('file', ['core' => 7]));
-    $this->assertIdentical('d6_file', $plugin_manager->getPluginIdFromFieldType('file', ['core' => 6]));
-
-    $this->assertIdentical('text', $plugin_manager->getPluginIdFromFieldType('text', ['core' => 6]));
-    $this->assertIdentical('text', $plugin_manager->getPluginIdFromFieldType('text', ['core' => 7]));
-
     // Test fallback when no core version is specified.
-    $this->assertIdentical('d6_no_core_version_specified', $plugin_manager->getPluginIdFromFieldType('d6_no_core_version_specified', ['core' => 6]));
+    $this->assertSame('d6_no_core_version_specified', $plugin_manager->getPluginIdFromFieldType('d6_no_core_version_specified', ['core' => 6]));
 
     try {
       // If this test passes, getPluginIdFromFieldType will raise a
@@ -52,7 +44,7 @@ public function testPluginSelection() {
       $this->fail('Expected Drupal\Component\Plugin\Exception\PluginNotFoundException.');
     }
     catch (PluginNotFoundException $e) {
-      $this->assertIdentical($e->getMessage(), "Plugin ID 'd6_no_core_version_specified' was not found.");
+      $this->assertSame($e->getMessage(), "Plugin ID 'd6_no_core_version_specified' was not found.");
     }
   }
 
diff --git a/core/modules/migrate_drupal/tests/src/Kernel/MigrateFieldPluginManagerTest.php b/core/modules/migrate_drupal/tests/src/Kernel/MigrateFieldPluginManagerTest.php
index 7c3c5a4..7e36364e 100644
--- a/core/modules/migrate_drupal/tests/src/Kernel/MigrateFieldPluginManagerTest.php
+++ b/core/modules/migrate_drupal/tests/src/Kernel/MigrateFieldPluginManagerTest.php
@@ -14,7 +14,7 @@ class MigrateFieldPluginManagerTest extends MigrateDrupalTestBase {
   /**
    * {@inheritdoc}
    */
-  public static $modules = ['system', 'user', 'field', 'migrate_drupal', 'options', 'file', 'text', 'migrate_field_plugin_manager_test'];
+  public static $modules = ['system', 'user', 'field', 'migrate_drupal', 'options', 'file', 'text', 'link', 'migrate_field_plugin_manager_test'];
 
   /**
    * Tests that the correct MigrateField plugins are used.
@@ -32,7 +32,13 @@ public function testPluginSelection() {
       $this->assertIdentical($e->getMessage(), "Plugin ID 'filefield' was not found.");
     }
 
+    $this->assertIdentical('link', $plugin_manager->getPluginIdFromFieldType('link', ['core' => 6]));
+    $this->assertIdentical('link_field', $plugin_manager->getPluginIdFromFieldType('link_field', ['core' => 7]));
+    $this->assertIdentical('image', $plugin_manager->getPluginIdFromFieldType('image', ['core' => 7]));
+    $this->assertIdentical('file', $plugin_manager->getPluginIdFromFieldType('file', ['core' => 7]));
     $this->assertIdentical('d6_file', $plugin_manager->getPluginIdFromFieldType('file', ['core' => 6]));
+    $this->assertIdentical('d6_text', $plugin_manager->getPluginIdFromFieldType('text', ['core' => 6]));
+    $this->assertIdentical('d7_text', $plugin_manager->getPluginIdFromFieldType('text', ['core' => 7]));
 
     // Test fallback when no core version is specified.
     $this->assertIdentical('d6_no_core_version_specified', $plugin_manager->getPluginIdFromFieldType('d6_no_core_version_specified', ['core' => 6]));
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 1dc81f9..9ad7e9c 100644
--- a/core/modules/node/src/Plugin/migrate/source/d6/Node.php
+++ b/core/modules/node/src/Plugin/migrate/source/d6/Node.php
@@ -178,24 +178,24 @@ public function prepareRow(Row $row) {
   }
 
   /**
-   * Gets CCK field values for a node.
+   * Gets field values for a node.
    *
    * @param \Drupal\migrate\Row $node
    *   The node.
    *
    * @return array
-   *   CCK field values, keyed by field name.
+   *   Field values, keyed by field name.
    */
   protected function getFieldValues(Row $node) {
     $values = [];
     foreach ($this->getFieldInfo($node->getSourceProperty('type')) as $field => $info) {
-      $values[$field] = $this->getCckData($info, $node);
+      $values[$field] = $this->getFieldData($info, $node);
     }
     return $values;
   }
 
   /**
-   * Gets CCK field and instance definitions from the database.
+   * Gets field and instance definitions from the database.
    *
    * @param string $node_type
    *   The node type for which to get field info.
@@ -207,7 +207,7 @@ protected function getFieldInfo($node_type) {
     if (!isset($this->fieldInfo)) {
       $this->fieldInfo = [];
 
-      // Query the database directly for all CCK field info.
+      // Query the database directly for all field info.
       $query = $this->select('content_node_field_instance', 'cnfi');
       $query->join('content_node_field', 'cnf', 'cnf.field_name = cnfi.field_name');
       $query->fields('cnfi');
@@ -232,7 +232,7 @@ protected function getFieldInfo($node_type) {
   }
 
   /**
-   * Retrieves raw CCK field data for a node.
+   * Retrieves raw field data for a node.
    *
    * @param array $field
    *   A field and instance definition from getFieldInfo().
@@ -242,7 +242,7 @@ protected function getFieldInfo($node_type) {
    * @return array
    *   The field values, keyed by delta.
    */
-  protected function getCckData(array $field, Row $node) {
+  protected function getFieldData(array $field, Row $node) {
     $field_table = 'content_' . $field['field_name'];
     $node_table = 'content_type_' . $node->getSourceProperty('type');
 
@@ -278,10 +278,9 @@ protected function getCckData(array $field, Row $node) {
 
       return $query
         // This call to isNotNull() is a kludge which relies on the convention
-        // that CCK field schemas usually define their most important
-        // column first. A better way would be to allow cckfield plugins to
-        // alter the query directly before it's run, but this will do for
-        // the time being.
+        // that field schemas usually define their most important column first.
+        // A better way would be to allow field plugins to alter the query
+        // directly before it's run, but this will do for the time being.
         ->isNotNull($field['field_name'] . '_' . $columns[0])
         ->condition('nid', $node->getSourceProperty('nid'))
         ->condition('vid', $node->getSourceProperty('vid'))
@@ -294,6 +293,24 @@ protected function getCckData(array $field, Row $node) {
   }
 
   /**
+   * Retrieves raw field data for a node.
+   *
+   * @deprecated in Drupal 8.2.x, to be removed in Drupal 9.0.x. Use
+   *   getFieldData() instead.
+   *
+   * @param array $field
+   *   A field and instance definition from getFieldInfo().
+   * @param \Drupal\migrate\Row $node
+   *   The node.
+   *
+   * @return array
+   *   The field values, keyed by delta.
+   */
+  protected function getCckData(array $field, Row $node) {
+    return $this->getFieldData($field, $node);
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function getIds() {
diff --git a/core/modules/taxonomy/src/Plugin/migrate/cckfield/TaxonomyTermReference.php b/core/modules/taxonomy/src/Plugin/migrate/cckfield/TaxonomyTermReference.php
index 886eb84..27cb8d3 100644
--- a/core/modules/taxonomy/src/Plugin/migrate/cckfield/TaxonomyTermReference.php
+++ b/core/modules/taxonomy/src/Plugin/migrate/cckfield/TaxonomyTermReference.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\taxonomy\Plugin\migrate\cckfield;
 
+@trigger_error('TaxonomyTermReference is deprecated in Drupal 8.4.x and will be removed before Drupal 9.0.x. Use \Drupal\taxonomy\Plugin\migrate\field\TaxonomyTermReference instead.', E_USER_DEPRECATED);
+
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate_drupal\Plugin\migrate\cckfield\CckFieldPluginBase;
 
@@ -13,6 +15,11 @@
  *   },
  *   core = {6,7}
  * )
+ *
+ * @deprecated in Drupal 8.4.x, to be removed before Drupal 9.0.x. Use
+ * \Drupal\taxonomy\Plugin\migrate\field\TaxonomyTermReference instead.
+ *
+ * @see https://www.drupal.org/node/2751897
  */
 class TaxonomyTermReference extends CckFieldPluginBase {
 
diff --git a/core/modules/taxonomy/src/Plugin/migrate/cckfield/TaxonomyTermReference.php b/core/modules/taxonomy/src/Plugin/migrate/field/TaxonomyTermReference.php
similarity index 60%
copy from core/modules/taxonomy/src/Plugin/migrate/cckfield/TaxonomyTermReference.php
copy to core/modules/taxonomy/src/Plugin/migrate/field/TaxonomyTermReference.php
index 886eb84..56ec20a 100644
--- a/core/modules/taxonomy/src/Plugin/migrate/cckfield/TaxonomyTermReference.php
+++ b/core/modules/taxonomy/src/Plugin/migrate/field/TaxonomyTermReference.php
@@ -1,12 +1,12 @@
 <?php
 
-namespace Drupal\taxonomy\Plugin\migrate\cckfield;
+namespace Drupal\taxonomy\Plugin\migrate\field;
 
 use Drupal\migrate\Plugin\MigrationInterface;
-use Drupal\migrate_drupal\Plugin\migrate\cckfield\CckFieldPluginBase;
+use Drupal\migrate_drupal\Plugin\migrate\field\FieldPluginBase;
 
 /**
- * @MigrateCckField(
+ * @MigrateField(
  *   id = "taxonomy_term_reference",
  *   type_map = {
  *     "taxonomy_term_reference" = "entity_reference"
@@ -14,12 +14,12 @@
  *   core = {6,7}
  * )
  */
-class TaxonomyTermReference extends CckFieldPluginBase {
+class TaxonomyTermReference extends FieldPluginBase {
 
   /**
    * {@inheritdoc}
    */
-  public function processCckFieldValues(MigrationInterface $migration, $field_name, $data) {
+  public function processFieldValues(MigrationInterface $migration, $field_name, $data) {
     $process = [
       'plugin' => 'iterator',
       'source' => $field_name,
diff --git a/core/modules/taxonomy/tests/src/Unit/Plugin/migrate/cckfield/TaxonomyTermReferenceCckTest.php b/core/modules/taxonomy/tests/src/Unit/Plugin/migrate/cckfield/TaxonomyTermReferenceCckTest.php
new file mode 100644
index 0000000..5e646e0
--- /dev/null
+++ b/core/modules/taxonomy/tests/src/Unit/Plugin/migrate/cckfield/TaxonomyTermReferenceCckTest.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace Drupal\Tests\taxonomy\Unit\Plugin\migrate\cckfield;
+
+use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\Tests\UnitTestCase;
+use Drupal\taxonomy\Plugin\migrate\cckfield\TaxonomyTermReference;
+use Prophecy\Argument;
+
+/**
+ * @coversDefaultClass \Drupal\taxonomy\Plugin\migrate\cckfield\TaxonomyTermReference
+ * @group taxonomy
+ * @group legacy
+ */
+class TaxonomyTermReferenceCckTest extends UnitTestCase {
+
+  /**
+   * @var \Drupal\migrate_drupal\Plugin\MigrateCckFieldInterface
+   */
+  protected $plugin;
+
+  /**
+   * @var \Drupal\migrate\Plugin\MigrationInterface
+   */
+  protected $migration;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    $this->plugin = new TaxonomyTermReference([], 'taxonomy', []);
+
+    $migration = $this->prophesize(MigrationInterface::class);
+
+    // The plugin's processCckFieldValues() method will call
+    // setProcessOfProperty() and return nothing. So, in order to examine the
+    // process pipeline created by the plugin, we need to ensure that
+    // getProcess() always returns the last input to setProcessOfProperty().
+    $migration->setProcessOfProperty(Argument::type('string'), Argument::type('array'))
+      ->will(function($arguments) use ($migration) {
+        $migration->getProcess()->willReturn($arguments[1]);
+      });
+
+    $this->migration = $migration->reveal();
+  }
+
+  /**
+   * @covers ::processCckFieldValues
+   */
+  public function testProcessCckFieldValues() {
+    $this->plugin->processFieldValues($this->migration, 'somefieldname', []);
+
+    $expected = [
+      'plugin' => 'iterator',
+      'source' => 'somefieldname',
+      'process' => [
+        'target_id' => 'tid',
+      ],
+    ];
+    $this->assertSame($expected, $this->migration->getProcess());
+  }
+
+}
diff --git a/core/modules/taxonomy/tests/src/Unit/Plugin/migrate/field/TaxonomyTermReferenceFieldTest.php b/core/modules/taxonomy/tests/src/Unit/Plugin/migrate/field/TaxonomyTermReferenceFieldTest.php
new file mode 100644
index 0000000..de88d7d
--- /dev/null
+++ b/core/modules/taxonomy/tests/src/Unit/Plugin/migrate/field/TaxonomyTermReferenceFieldTest.php
@@ -0,0 +1,62 @@
+<?php
+
+namespace Drupal\Tests\taxonomy\Unit\Plugin\migrate\field;
+
+use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\Tests\UnitTestCase;
+use Drupal\taxonomy\Plugin\migrate\field\TaxonomyTermReference;
+use Prophecy\Argument;
+
+/**
+ * @coversDefaultClass \Drupal\taxonomy\Plugin\migrate\field\TaxonomyTermReference
+ * @group taxonomy
+ */
+class TaxonomyTermReferenceFieldTest extends UnitTestCase {
+
+  /**
+   * @var \Drupal\migrate_drupal\Plugin\MigrateFieldInterface
+   */
+  protected $plugin;
+
+  /**
+   * @var \Drupal\migrate\Plugin\MigrationInterface
+   */
+  protected $migration;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    $this->plugin = new TaxonomyTermReference([], 'taxonomy', []);
+
+    $migration = $this->prophesize(MigrationInterface::class);
+
+    // The plugin's processFieldValues() method will call
+    // setProcessOfProperty() and return nothing. So, in order to examine the
+    // process pipeline created by the plugin, we need to ensure that
+    // getProcess() always returns the last input to setProcessOfProperty().
+    $migration->setProcessOfProperty(Argument::type('string'), Argument::type('array'))
+      ->will(function($arguments) use ($migration) {
+        $migration->getProcess()->willReturn($arguments[1]);
+      });
+
+    $this->migration = $migration->reveal();
+  }
+
+  /**
+   * @covers ::processFieldValues
+   */
+  public function testProcessFieldValues() {
+    $this->plugin->processFieldValues($this->migration, 'somefieldname', []);
+
+    $expected = [
+      'plugin' => 'iterator',
+      'source' => 'somefieldname',
+      'process' => [
+        'target_id' => 'tid',
+      ],
+    ];
+    $this->assertSame($expected, $this->migration->getProcess());
+  }
+
+}
diff --git a/core/modules/text/src/Plugin/migrate/cckfield/TextField.php b/core/modules/text/src/Plugin/migrate/cckfield/TextField.php
index 99619bb..e2511de 100644
--- a/core/modules/text/src/Plugin/migrate/cckfield/TextField.php
+++ b/core/modules/text/src/Plugin/migrate/cckfield/TextField.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\text\Plugin\migrate\cckfield;
 
+@trigger_error('TextField is deprecated in Drupal 8.3.x and will be removed before Drupal 9.0.x. Use \Drupal\text\Plugin\migrate\field\d6\TextField or \Drupal\text\Plugin\migrate\field\d7\TextField instead.', E_USER_DEPRECATED);
+
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Row;
 use Drupal\migrate_drupal\Plugin\migrate\cckfield\CckFieldPluginBase;
@@ -16,6 +18,12 @@
  *   },
  *   core = {6,7}
  * )
+ *
+ * @deprecated in Drupal 8.3.x, to be removed before Drupal 9.0.x. Use
+ * \Drupal\text\Plugin\migrate\field\d6\TextField or
+ * \Drupal\text\Plugin\migrate\field\d7\TextField instead.
+ *
+ * @see https://www.drupal.org/node/2751897
  */
 class TextField extends CckFieldPluginBase {
 
diff --git a/core/modules/text/src/Plugin/migrate/cckfield/TextField.php b/core/modules/text/src/Plugin/migrate/field/d6/TextField.php
similarity index 90%
copy from core/modules/text/src/Plugin/migrate/cckfield/TextField.php
copy to core/modules/text/src/Plugin/migrate/field/d6/TextField.php
index 99619bb..62deeee 100644
--- a/core/modules/text/src/Plugin/migrate/cckfield/TextField.php
+++ b/core/modules/text/src/Plugin/migrate/field/d6/TextField.php
@@ -1,23 +1,23 @@
 <?php
 
-namespace Drupal\text\Plugin\migrate\cckfield;
+namespace Drupal\text\Plugin\migrate\field\d6;
 
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Row;
-use Drupal\migrate_drupal\Plugin\migrate\cckfield\CckFieldPluginBase;
+use Drupal\migrate_drupal\Plugin\migrate\field\FieldPluginBase;
 
 /**
- * @MigrateCckField(
- *   id = "text",
+ * @MigrateField(
+ *   id = "d6_text",
  *   type_map = {
  *     "text" = "text",
  *     "text_long" = "text_long",
  *     "text_with_summary" = "text_with_summary"
  *   },
- *   core = {6,7}
+ *   core = {6}
  * )
  */
-class TextField extends CckFieldPluginBase {
+class TextField extends FieldPluginBase {
 
   /**
    * {@inheritdoc}
@@ -42,7 +42,7 @@ public function getFieldFormatterMap() {
   /**
    * {@inheritdoc}
    */
-  public function processCckFieldValues(MigrationInterface $migration, $field_name, $field_info) {
+  public function processFieldValues(MigrationInterface $migration, $field_name, $field_info) {
     $widget_type = isset($field_info['widget_type']) ? $field_info['widget_type'] : $field_info['widget']['type'];
 
     if ($widget_type == 'optionwidgets_onoff') {
diff --git a/core/modules/text/src/Plugin/migrate/field/d7/TextField.php b/core/modules/text/src/Plugin/migrate/field/d7/TextField.php
new file mode 100644
index 0000000..586f102
--- /dev/null
+++ b/core/modules/text/src/Plugin/migrate/field/d7/TextField.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Drupal\text\Plugin\migrate\field\d7;
+
+use Drupal\text\Plugin\migrate\field\d6\TextField as D6TextField;
+
+/**
+ * @MigrateField(
+ *   id = "d7_text",
+ *   type_map = {
+ *     "text" = "text",
+ *     "text_long" = "text_long",
+ *     "text_with_summary" = "text_with_summary"
+ *   },
+ *   core = {7}
+ * )
+ */
+class TextField extends D6TextField {}
diff --git a/core/modules/text/tests/src/Unit/Migrate/TextFieldTest.php b/core/modules/text/tests/src/Unit/Migrate/TextCckTest.php
similarity index 97%
copy from core/modules/text/tests/src/Unit/Migrate/TextFieldTest.php
copy to core/modules/text/tests/src/Unit/Migrate/TextCckTest.php
index 7f703b7..3a6949a 100644
--- a/core/modules/text/tests/src/Unit/Migrate/TextFieldTest.php
+++ b/core/modules/text/tests/src/Unit/Migrate/TextCckTest.php
@@ -13,7 +13,7 @@
  * @group text
  * @group legacy
  */
-class TextFieldTest extends UnitTestCase {
+class TextCckTest extends UnitTestCase {
 
   /**
    * @var \Drupal\migrate_drupal\Plugin\MigrateCckFieldInterface
@@ -163,8 +163,7 @@ public function getFieldTypeProvider() {
    * @dataProvider getFieldTypeProvider
    */
   public function testGetFieldType($expected_type, $widget_type, array $settings = []) {
-    $row = new Row();
-    $row->setSourceProperty('widget_type', $widget_type);
+    $row = new Row(['widget_type' => $widget_type], ['widget_type' => []]);
     $row->setSourceProperty('global_settings', $settings);
     $this->assertSame($expected_type, $this->plugin->getFieldType($row));
   }
diff --git a/core/modules/text/tests/src/Unit/Migrate/TextFieldTest.php b/core/modules/text/tests/src/Unit/Migrate/d6/TextFieldTest.php
similarity index 87%
copy from core/modules/text/tests/src/Unit/Migrate/TextFieldTest.php
copy to core/modules/text/tests/src/Unit/Migrate/d6/TextFieldTest.php
index 7f703b7..d550b40 100644
--- a/core/modules/text/tests/src/Unit/Migrate/TextFieldTest.php
+++ b/core/modules/text/tests/src/Unit/Migrate/d6/TextFieldTest.php
@@ -1,22 +1,22 @@
 <?php
 
-namespace Drupal\Tests\text\Unit\Migrate;
+namespace Drupal\Tests\text\Unit\Migrate\d6;
 
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Row;
 use Drupal\Tests\UnitTestCase;
-use Drupal\text\Plugin\migrate\cckfield\TextField;
+use Drupal\text\Plugin\migrate\field\d6\TextField;
 use Prophecy\Argument;
 
 /**
- * @coversDefaultClass \Drupal\text\Plugin\migrate\cckfield\TextField
+ * @coversDefaultClass \Drupal\text\Plugin\migrate\field\d6\TextField
  * @group text
  * @group legacy
  */
 class TextFieldTest extends UnitTestCase {
 
   /**
-   * @var \Drupal\migrate_drupal\Plugin\MigrateCckFieldInterface
+   * @var \Drupal\migrate_drupal\Plugin\MigrateFieldInterface
    */
   protected $plugin;
 
@@ -33,7 +33,7 @@ protected function setUp() {
 
     $migration = $this->prophesize(MigrationInterface::class);
 
-    // The plugin's processCckFieldValues() method will call
+    // The plugin's processFieldValues() method will call
     // setProcessOfProperty() and return nothing. So, in order to examine the
     // process pipeline created by the plugin, we need to ensure that
     // getProcess() always returns the last input to setProcessOfProperty().
@@ -46,13 +46,13 @@ protected function setUp() {
   }
 
   /**
-   * @covers ::processCckFieldValues
+   * @covers ::processFieldValues
    */
   public function testProcessFilteredTextFieldValues() {
     $field_info = [
       'widget_type' => 'text_textfield',
     ];
-    $this->plugin->processCckFieldValues($this->migration, 'body', $field_info);
+    $this->plugin->processFieldValues($this->migration, 'body', $field_info);
 
     $process = $this->migration->getProcess();
     $this->assertSame('iterator', $process['plugin']);
@@ -69,7 +69,7 @@ public function testProcessFilteredTextFieldValues() {
   }
 
   /**
-   * @covers ::processCckFieldValues
+   * @covers ::processFieldValues
    */
   public function testProcessBooleanTextImplicitValues() {
     $info = [
@@ -78,7 +78,7 @@ public function testProcessBooleanTextImplicitValues() {
         'allowed_values' => "foo\nbar",
       ]
     ];
-    $this->plugin->processCckFieldValues($this->migration, 'field', $info);
+    $this->plugin->processFieldValues($this->migration, 'field', $info);
 
     $expected = [
       'value' => [
@@ -94,7 +94,7 @@ public function testProcessBooleanTextImplicitValues() {
   }
 
   /**
-   * @covers ::processCckFieldValues
+   * @covers ::processFieldValues
    */
   public function testProcessBooleanTextExplicitValues() {
     $info = [
@@ -103,7 +103,7 @@ public function testProcessBooleanTextExplicitValues() {
         'allowed_values' => "foo|Foo\nbaz|Baz",
       ]
     ];
-    $this->plugin->processCckFieldValues($this->migration, 'field', $info);
+    $this->plugin->processFieldValues($this->migration, 'field', $info);
 
     $expected = [
       'value' => [
diff --git a/core/modules/text/tests/src/Unit/Migrate/d7/TextFieldTest.php b/core/modules/text/tests/src/Unit/Migrate/d7/TextFieldTest.php
new file mode 100644
index 0000000..5f7622f
--- /dev/null
+++ b/core/modules/text/tests/src/Unit/Migrate/d7/TextFieldTest.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace Drupal\Tests\text\Unit\Migrate\d7;
+
+use Drupal\Tests\text\Unit\Migrate\d6\TextFieldTest as D6TextFieldTest;
+
+/**
+ * @coversDefaultClass \Drupal\text\Plugin\migrate\field\d7\TextField
+ * @group text
+ * @group legacy
+ */
+class TextFieldTest extends D6TextFieldTest {}
diff --git a/core/modules/text/tests/src/Unit/Migrate/TextFieldTest.php b/core/modules/text/tests/src/Unit/Plugin/migrate/cckfield/TextCckTest.php
similarity index 96%
copy from core/modules/text/tests/src/Unit/Migrate/TextFieldTest.php
copy to core/modules/text/tests/src/Unit/Plugin/migrate/cckfield/TextCckTest.php
index 7f703b7..2a93bca 100644
--- a/core/modules/text/tests/src/Unit/Migrate/TextFieldTest.php
+++ b/core/modules/text/tests/src/Unit/Plugin/migrate/cckfield/TextCckTest.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace Drupal\Tests\text\Unit\Migrate;
+namespace Drupal\Tests\text\Unit\Plugin\migrate\cckfield;
 
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Row;
@@ -13,7 +13,7 @@
  * @group text
  * @group legacy
  */
-class TextFieldTest extends UnitTestCase {
+class TextCckTest extends UnitTestCase {
 
   /**
    * @var \Drupal\migrate_drupal\Plugin\MigrateCckFieldInterface
@@ -163,8 +163,7 @@ public function getFieldTypeProvider() {
    * @dataProvider getFieldTypeProvider
    */
   public function testGetFieldType($expected_type, $widget_type, array $settings = []) {
-    $row = new Row();
-    $row->setSourceProperty('widget_type', $widget_type);
+    $row = new Row(['widget_type' => $widget_type], ['widget_type' => []]);
     $row->setSourceProperty('global_settings', $settings);
     $this->assertSame($expected_type, $this->plugin->getFieldType($row));
   }
diff --git a/core/modules/text/tests/src/Unit/Migrate/TextFieldTest.php b/core/modules/text/tests/src/Unit/Plugin/migrate/field/d6/TextFieldTest.php
similarity index 86%
rename from core/modules/text/tests/src/Unit/Migrate/TextFieldTest.php
rename to core/modules/text/tests/src/Unit/Plugin/migrate/field/d6/TextFieldTest.php
index 7f703b7..f8e1318 100644
--- a/core/modules/text/tests/src/Unit/Migrate/TextFieldTest.php
+++ b/core/modules/text/tests/src/Unit/Plugin/migrate/field/d6/TextFieldTest.php
@@ -1,22 +1,21 @@
 <?php
 
-namespace Drupal\Tests\text\Unit\Migrate;
+namespace Drupal\Tests\text\Unit\Plugin\migrate\field\d6;
 
 use Drupal\migrate\Plugin\MigrationInterface;
 use Drupal\migrate\Row;
 use Drupal\Tests\UnitTestCase;
-use Drupal\text\Plugin\migrate\cckfield\TextField;
+use Drupal\text\Plugin\migrate\field\d6\TextField;
 use Prophecy\Argument;
 
 /**
- * @coversDefaultClass \Drupal\text\Plugin\migrate\cckfield\TextField
+ * @coversDefaultClass \Drupal\text\Plugin\migrate\field\d6\TextField
  * @group text
- * @group legacy
  */
 class TextFieldTest extends UnitTestCase {
 
   /**
-   * @var \Drupal\migrate_drupal\Plugin\MigrateCckFieldInterface
+   * @var \Drupal\migrate_drupal\Plugin\MigrateFieldInterface
    */
   protected $plugin;
 
@@ -33,7 +32,7 @@ protected function setUp() {
 
     $migration = $this->prophesize(MigrationInterface::class);
 
-    // The plugin's processCckFieldValues() method will call
+    // The plugin's processFieldValues() method will call
     // setProcessOfProperty() and return nothing. So, in order to examine the
     // process pipeline created by the plugin, we need to ensure that
     // getProcess() always returns the last input to setProcessOfProperty().
@@ -46,13 +45,13 @@ protected function setUp() {
   }
 
   /**
-   * @covers ::processCckFieldValues
+   * @covers ::processFieldValues
    */
   public function testProcessFilteredTextFieldValues() {
     $field_info = [
       'widget_type' => 'text_textfield',
     ];
-    $this->plugin->processCckFieldValues($this->migration, 'body', $field_info);
+    $this->plugin->processFieldValues($this->migration, 'body', $field_info);
 
     $process = $this->migration->getProcess();
     $this->assertSame('iterator', $process['plugin']);
@@ -69,7 +68,7 @@ public function testProcessFilteredTextFieldValues() {
   }
 
   /**
-   * @covers ::processCckFieldValues
+   * @covers ::processFieldValues
    */
   public function testProcessBooleanTextImplicitValues() {
     $info = [
@@ -78,7 +77,7 @@ public function testProcessBooleanTextImplicitValues() {
         'allowed_values' => "foo\nbar",
       ]
     ];
-    $this->plugin->processCckFieldValues($this->migration, 'field', $info);
+    $this->plugin->processFieldValues($this->migration, 'field', $info);
 
     $expected = [
       'value' => [
@@ -94,7 +93,7 @@ public function testProcessBooleanTextImplicitValues() {
   }
 
   /**
-   * @covers ::processCckFieldValues
+   * @covers ::processFieldValues
    */
   public function testProcessBooleanTextExplicitValues() {
     $info = [
@@ -103,7 +102,7 @@ public function testProcessBooleanTextExplicitValues() {
         'allowed_values' => "foo|Foo\nbaz|Baz",
       ]
     ];
-    $this->plugin->processCckFieldValues($this->migration, 'field', $info);
+    $this->plugin->processFieldValues($this->migration, 'field', $info);
 
     $expected = [
       'value' => [
diff --git a/core/modules/text/tests/src/Unit/Plugin/migrate/field/d7/TextFieldTest.php b/core/modules/text/tests/src/Unit/Plugin/migrate/field/d7/TextFieldTest.php
new file mode 100644
index 0000000..f1b2172
--- /dev/null
+++ b/core/modules/text/tests/src/Unit/Plugin/migrate/field/d7/TextFieldTest.php
@@ -0,0 +1,11 @@
+<?php
+
+namespace Drupal\Tests\text\Unit\Plugin\migrate\field\d7;
+
+use Drupal\Tests\text\Unit\Plugin\migrate\field\d6\TextFieldTest as D6TextFieldTest;
+
+/**
+ * @coversDefaultClass \Drupal\text\Plugin\migrate\field\d7\TextField
+ * @group text
+ */
+class TextFieldTest extends D6TextFieldTest {}
