diff --git a/core/modules/migrate/src/Plugin/migrate/process/DefaultConfigValue.php b/core/modules/migrate/src/Plugin/migrate/process/DefaultConfigValue.php
new file mode 100644
index 0000000..b8d2e49
--- /dev/null
+++ b/core/modules/migrate/src/Plugin/migrate/process/DefaultConfigValue.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\migrate\Plugin\migrate\process\DefaultConfigValue.
+ */
+
+namespace Drupal\migrate\Plugin\migrate\process;
+
+use Drupal\migrate\ProcessPluginBase;
+use Drupal\migrate\MigrateExecutableInterface;
+use Drupal\migrate\Row;
+
+/**
+ * This plugin sets missing values on the destination using a value from configuration.
+ *
+ * @MigrateProcessPlugin(
+ *   id = "default_config_value"
+ * )
+ */
+class DefaultConfigValue extends ProcessPluginBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
+    $config_object = $this->configuration['config_object'];
+    $config_key = $this->configuration['config_key'];
+    $config_value = \Drupal::config($config_object)->get($config_key);
+    if (!empty($this->configuration['strict'])) {
+      return isset($value) ? $value : $config_value;
+    }
+    return $value ?: $config_value;
+  }
+
+}
diff --git a/core/modules/user/migration_templates/d7_user.yml b/core/modules/user/migration_templates/d7_user.yml
index 12147f8..93a4394 100644
--- a/core/modules/user/migration_templates/d7_user.yml
+++ b/core/modules/user/migration_templates/d7_user.yml
@@ -15,9 +15,21 @@ process:
   login: login
   status: status
   timezone: timezone
-  langcode: language
-  preferred_langcode: language
-  preferred_admin_langcode: language
+  langcode:
+    plugin: default_config_value
+    source: language
+    config_object: system.site
+    config_key: default_langcode
+  preferred_langcode:
+    plugin: default_config_value
+    source: language
+    config_object: system.site
+    config_key: default_langcode
+  preferred_admin_langcode:
+    plugin: default_config_value
+    source: language
+    config_object: system.site
+    config_key: default_langcode
   init: init
   roles:
     plugin: migration
diff --git a/core/modules/user/tests/src/Kernel/Migrate/d7/MigrateUserTest.php b/core/modules/user/tests/src/Kernel/Migrate/d7/MigrateUserTest.php
index 61ff800..1713ea4 100644
--- a/core/modules/user/tests/src/Kernel/Migrate/d7/MigrateUserTest.php
+++ b/core/modules/user/tests/src/Kernel/Migrate/d7/MigrateUserTest.php
@@ -71,6 +71,7 @@ protected function assertEntity($id, $label, $mail, $access, $login, $blocked, $
     // $user->getPreferredLangcode() might fallback to default language if the
     // user preferred language is not configured on the site. We just want to
     // test if the value was imported correctly.
+    $langcode = $langcode ?: \Drupal::config('system.site')->get('default_langcode');
     $this->assertIdentical($langcode, $user->langcode->value);
     $this->assertIdentical($langcode, $user->preferred_langcode->value);
     $this->assertIdentical($langcode, $user->preferred_admin_langcode->value);
