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 534501d527..fd54627aac 100644
--- a/core/modules/field/migration_templates/d6_field_formatter_settings.yml
+++ b/core/modules/field/migration_templates/d6_field_formatter_settings.yml
@@ -172,7 +172,7 @@ process:
             default: entity_reference_label
             plain: entity_reference_label
       -
-        plugin: field_type_defaults
+        plugin: d6_field_type_defaults
   "options/settings":
     -
       plugin: static_map
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 126fd29a20..407e17bdaf 100644
--- a/core/modules/field/migration_templates/d7_field_formatter_settings.yml
+++ b/core/modules/field/migration_templates/d7_field_formatter_settings.yml
@@ -51,19 +51,24 @@ process:
     -
       plugin: static_map
       bypass: true
-      source: formatter_type
+      source:
+        - type
+        - formatter_type
       map:
-        date_default: datetime_default
-        email_default: email_mailto
-        # 0 should cause the row to be skipped by the next plugin in the
-        # pipeline.
-        hidden: 0
-        link_default: link
-        phone: basic_string
-        taxonomy_term_reference_link: entity_reference_label
-        entityreference_label: entity_reference_label
-        entityreference_entity_id: entity_reference_entity_id
-        entityreference_entity_view: entity_reference_entity_view
+        email:
+          email_default: email_mailto
+        link_field:
+          link_default: link
+        phone:
+          phone: basic_string
+        taxonomy_term_reference:
+          taxonomy_term_reference_link: entity_reference_label
+        entityreference:
+          entityreference_label: entity_reference_label
+          entityreference_entity_id: entity_reference_entity_id
+          entityreference_entity_view: entity_reference_entity_view
+    -
+      plugin: d7_field_type_defaults
     -
       plugin: skip_on_empty
       method: row
diff --git a/core/modules/field/src/Plugin/migrate/process/FieldTypeDefaults.php b/core/modules/field/src/Plugin/migrate/process/FieldTypeDefaults.php
new file mode 100644
index 0000000000..bf507e5a7a
--- /dev/null
+++ b/core/modules/field/src/Plugin/migrate/process/FieldTypeDefaults.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Drupal\field\Plugin\migrate\process;
+
+use Drupal\field\Plugin\migrate\process\d6\FieldTypeDefaults as D6FieldTypeDefaults;
+
+/**
+ * BC Layer.
+ *
+ * @MigrateProcessPlugin(
+ *   id = "field_type_defaults"
+ * )
+ */
+class FieldTypeDefaults extends D6FieldTypeDefaults {
+}
diff --git a/core/modules/field/src/Plugin/migrate/process/d6/FieldTypeDefaults.php b/core/modules/field/src/Plugin/migrate/process/d6/FieldTypeDefaults.php
index 869e9b66ef..50d4e924a8 100644
--- a/core/modules/field/src/Plugin/migrate/process/d6/FieldTypeDefaults.php
+++ b/core/modules/field/src/Plugin/migrate/process/d6/FieldTypeDefaults.php
@@ -11,7 +11,7 @@
  * Gives us a chance to set per field defaults.
  *
  * @MigrateProcessPlugin(
- *   id = "field_type_defaults"
+ *   id = "d6_field_type_defaults"
  * )
  */
 class FieldTypeDefaults extends ProcessPluginBase {
diff --git a/core/modules/field/src/Plugin/migrate/process/d7/FieldTypeDefaults.php b/core/modules/field/src/Plugin/migrate/process/d7/FieldTypeDefaults.php
new file mode 100644
index 0000000000..de0455863b
--- /dev/null
+++ b/core/modules/field/src/Plugin/migrate/process/d7/FieldTypeDefaults.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Drupal\field\Plugin\migrate\process\d7;
+
+use Drupal\migrate\ProcessPluginBase;
+use Drupal\migrate\MigrateExecutableInterface;
+use Drupal\migrate\Row;
+
+/**
+ * Gives us a chance to set per field defaults.
+ *
+ * @MigrateProcessPlugin(
+ *   id = "d7_field_type_defaults"
+ * )
+ */
+class FieldTypeDefaults extends ProcessPluginBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
+    if (is_array($value)) {
+      if ($row->getSourceProperty('module') == 'date') {
+        $value = 'datetime_default';
+      }
+      else {
+        $value = $row->getSourceProperty('formatter_type');
+        if ($value == 'hidden') {
+          $value = 0;
+        }
+      }
+    }
+    return $value;
+  }
+
+}
diff --git a/core/modules/field/tests/src/Unit/Plugin/migrate/process/d7/FieldTypeDefaultsTest.php b/core/modules/field/tests/src/Unit/Plugin/migrate/process/d7/FieldTypeDefaultsTest.php
new file mode 100644
index 0000000000..350703448d
--- /dev/null
+++ b/core/modules/field/tests/src/Unit/Plugin/migrate/process/d7/FieldTypeDefaultsTest.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace Drupal\Tests\field\Unit\Plugin\migrate\process\d7;
+
+use Drupal\field\Plugin\migrate\process\d7\FieldTypeDefaults;
+use Drupal\Tests\migrate\Unit\process\MigrateProcessTestCase;
+
+/**
+ * Tests D7 fields defaults.
+ *
+ * @coversDefaultClass \Drupal\field\Plugin\migrate\process\d7\FieldTypeDefaults
+ * @group field
+ */
+class FieldTypeDefaultsTest extends MigrateProcessTestCase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->plugin = new FieldTypeDefaults([], 'd7_field_type_defaults', []);
+  }
+
+  /**
+   * Tests various default cases.
+   *
+   * @covers ::transform
+   */
+  public function testDefaults() {
+    $this->row->expects($this->once())
+      ->method('getSourceProperty')
+      ->willReturn('date');
+
+    // Assert common values are passed through without modification.
+    $this->assertNull($this->plugin->transform(NULL, $this->migrateExecutable, $this->row, 'property'));
+    $this->assertEquals('string', $this->plugin->transform('string', $this->migrateExecutable, $this->row, 'property'));
+    $this->assertEquals(1234, $this->plugin->transform(1234, $this->migrateExecutable, $this->row, 'property'));
+    // Assert that an array checks that this is a date field(above mock assert)
+    // and returns "datetime_default".
+    $this->assertEquals('datetime_default', $this->plugin->transform([], $this->migrateExecutable, $this->row, 'property'));
+  }
+
+  /**
+   * Tests hidden formatter.
+   *
+   * @covers ::transform
+   */
+  public function testHidden() {
+    $this->row->expects($this->exactly(2))
+      ->method('getSourceProperty')
+      ->willReturn('hidden');
+
+    $this->assertEquals(0, $this->plugin->transform(['hidden'], $this->migrateExecutable, $this->row, 'property'));
+  }
+
+  /**
+   * Tests return of field_formatter value.
+   *
+   * @covers ::transform
+   */
+  public function testFieldFormatter() {
+    $this->row->expects($this->exactly(2))
+      ->method('getSourceProperty')
+      ->willReturn('foo');
+
+    // Assert common values are passed through without modification.
+    $this->assertNull($this->plugin->transform(NULL, $this->migrateExecutable, $this->row, 'property'));
+    $this->assertEquals('string', $this->plugin->transform('string', $this->migrateExecutable, $this->row, 'property'));
+    $this->assertEquals(1234, $this->plugin->transform(1234, $this->migrateExecutable, $this->row, 'property'));
+    // Assert that an array that this is not a date field and returns
+    // the value of the field_formatter property.
+    $this->assertEquals('foo', $this->plugin->transform(['one', 'two', 'three'], $this->migrateExecutable, $this->row, 'property'));
+  }
+
+}
