diff --git a/core/modules/config_translation/migration_templates/i18n_user_profile_field_instance.yml b/core/modules/config_translation/migration_templates/i18n_user_profile_field_instance.yml
new file mode 100644
index 0000000..a3e546e
--- /dev/null
+++ b/core/modules/config_translation/migration_templates/i18n_user_profile_field_instance.yml
@@ -0,0 +1,22 @@
+id: i18n_user_profile_field_instance
+label: User profile field instance configuration
+migration_tags:
+  - Drupal 6
+source:
+  plugin: d6_i18n_profile_field
+  constants:
+    entity_type: user
+    bundle: user
+process:
+  langcode: language
+  entity_type: 'constants/entity_type'
+  bundle: 'constants/bundle'
+  label: title
+  description: explanation
+  field_name: name
+destination:
+  plugin: entity:field_config
+migration_dependencies:
+  required:
+    - user_profile_field
+    - user_profile_field_instance
diff --git a/core/modules/config_translation/src/Plugin/migrate/source/d6/i18nProfileField.php b/core/modules/config_translation/src/Plugin/migrate/source/d6/i18nProfileField.php
new file mode 100644
index 0000000..fa20cfa
--- /dev/null
+++ b/core/modules/config_translation/src/Plugin/migrate/source/d6/i18nProfileField.php
@@ -0,0 +1,119 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\config_translation\Plugin\migrate\source\d6\i18nProfileField.
+ */
+
+namespace Drupal\config_translation\Plugin\migrate\source\d6;
+
+use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+use Drupal\migrate\Row;
+
+/**
+ * Profile field source from database.
+ *
+ * @MigrateSource(
+ *   id = "d6_i18n_profile_field",
+ *   source_provider = "profile"
+ * )
+ */
+class i18nProfileField extends DrupalSqlBase {
+
+  /**
+   * The source table containing profile field info.
+   *
+   * @var string
+   */
+  protected $fieldTable;
+
+  /**
+   * The source table containing the profile values.
+   *
+   * @var string
+   */
+  protected $valueTable;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    if (empty($this->fieldTable) || empty($this->valueTable)) {
+      if ($this->getModuleSchemaVersion('system') >= 7000) {
+        $this->fieldTable = 'profile_field';
+      }
+      else {
+        $this->fieldTable = 'profile_fields';
+      }
+    }
+    $query = $this->select('i18n_strings', 'i18n')
+        ->fields('i18n', array('  property'))
+        ->fields('lt', array('translation', 'language'))
+        ->fields('pf', array('fid','name'));
+    $conditions = "i18n.lid=lt.lid AND (i18n.property='title' or i18n.property='explanation')";
+    $query->Join('locales_target', 'lt', $conditions);
+    $query->leftJoin($this->fieldTable, 'pf', 'pf.name=i18n.objectid');
+
+    return $query;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function prepareRow(Row $row) {
+    if ($row->getSourceProperty('property') === 'title') {
+      $row->setSourceProperty(('title'),$row->getSourceProperty('translation'));
+    }
+    if ($row->getSourceProperty('property') === 'explanation') {
+      $row->setSourceProperty(('explanation'),$row->getSourceProperty('translation'));
+    }
+
+    if ($row->getSourceProperty('type') == 'selection') {
+      // Get the current options.
+      $current_options = preg_split("/[\r\n]+/", $row->getSourceProperty('options'));
+      // Select the list values from the profile_values table to ensure we get
+      // them all since they can get out of sync with profile_fields.
+      $options = $this->select($this->valueTable, 'pv')
+        ->distinct()
+        ->fields('pv', ['value'])
+        ->condition('fid', $row->getSourceProperty('fid'))
+        ->execute()
+        ->fetchCol();
+      $options = array_merge($current_options, $options);
+      // array_combine() takes care of any duplicates options.
+      $row->setSourceProperty('options', array_combine($options, $options));
+    }
+
+    if ($row->getSourceProperty('type') == 'checkbox') {
+      // D6 profile checkboxes values are always 0 or 1 (with no labels), so we
+      // need to create two label-less options that will get 0 and 1 for their
+      // keys.
+      $row->setSourceProperty('options', array(NULL, NULL));
+    }
+    return parent::prepareRow($row);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    return array(
+      'fid' => $this->t('Primary Key: Unique profile field ID.'),
+      'language' => $this->t('Language for this field.'),
+      'title' => $this->t('Title of the field shown to the end user.'),
+      'explanation' => $this->t('Explanation of the field shown to end users.'),
+      'translation' => $this->t('Translation of either the title or explanation.'),
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    $ids['fid']['type'] = 'integer';
+    $ids['language']['type'] = 'string';
+    $ids['translation']['type'] = 'string';
+    return $ids;
+  }
+
+}
