diff --git a/core/modules/language/migration_templates/default_language.yml b/core/modules/language/migration_templates/default_language.yml
new file mode 100644
index 0000000..d7e52ad
--- /dev/null
+++ b/core/modules/language/migration_templates/default_language.yml
@@ -0,0 +1,25 @@
+id: default_language
+label: Default language
+migration_tags:
+  - Drupal 6
+  - Drupal 7
+source:
+  plugin: variable
+  variables:
+    - language_default
+process:
+  default_langcode:
+    -
+      plugin: callback
+      callable: get_object_vars
+      source: language_default
+    -
+      plugin: extract
+      index:
+        - language
+destination:
+  plugin: default_langcode
+  config_name: system.site
+migration_dependencies:
+  required:
+    - language
diff --git a/core/modules/language/src/Plugin/migrate/destination/DefaultLangcode.php b/core/modules/language/src/Plugin/migrate/destination/DefaultLangcode.php
new file mode 100644
index 0000000..47c44c0
--- /dev/null
+++ b/core/modules/language/src/Plugin/migrate/destination/DefaultLangcode.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Drupal\language\Plugin\migrate\destination;
+
+use Drupal\language\Entity\ConfigurableLanguage;
+use Drupal\migrate\MigrateException;
+use Drupal\migrate\Plugin\migrate\destination\Config;
+use Drupal\migrate\Row;
+
+/**
+ * Provides a destination plugin for the default langcode config.
+ *
+ * @MigrateDestination(
+ *   id = "default_langcode"
+ * )
+ */
+class DefaultLangcode extends Config {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function import(Row $row, array $old_destination_id_values = array()) {
+    $destination = $row->getDestination();
+
+    // Check if the language exists.
+    if (ConfigurableLanguage::load($destination['default_langcode']) === NULL) {
+      throw new MigrateException(sprintf("The language '%s' does not exist on this site.", $destination['default_langcode']));
+    }
+
+    $this->config->set('default_langcode', $destination['default_langcode']);
+    $this->config->save();
+    return [$this->config->getName()];
+  }
+
+}
diff --git a/core/modules/language/tests/src/Kernel/Migrate/d6/MigrateDefaultLanguageTest.php b/core/modules/language/tests/src/Kernel/Migrate/d6/MigrateDefaultLanguageTest.php
new file mode 100644
index 0000000..4f408e2
--- /dev/null
+++ b/core/modules/language/tests/src/Kernel/Migrate/d6/MigrateDefaultLanguageTest.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace Drupal\Tests\language\Kernel\Migrate\d6;
+
+use Drupal\language\Entity\ConfigurableLanguage;
+use Drupal\Tests\migrate_drupal\Kernel\d6\MigrateDrupal6TestBase;
+
+/**
+ * Tests the default language variable migration.
+ *
+ * @group migrate_drupal_6
+ */
+class MigrateDefaultLanguageTest extends MigrateDrupal6TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['language'];
+
+  /**
+   * Tests the migration of the language_default variable to the
+   * system.site.default_langcode config key, with an existing language.
+   */
+  public function testMigrationWithExistingLanguage() {
+    $this->doTestMigration('fr');
+  }
+
+  /**
+   * Tests the migration of the language_default variable to the
+   * system.site.default_langcode config key, with a non-existent language.
+   */
+  public function testMigrationWithNonExistentLanguage() {
+    $this->doTestMigration('tv');
+  }
+
+  /**
+   * Helper method to test the migration.
+   */
+  protected function doTestMigration($langcode) {
+    // The default language of the test fixture is English. Change it to
+    // something else before migrating, to be sure that the source site
+    // default language is migrated.
+    $value = 'O:8:"stdClass":11:{s:8:"language";s:2:"' . $langcode . '";s:4:"name";s:6:"French";s:6:"native";s:6:"French";s:9:"direction";s:1:"0";s:7:"enabled";i:1;s:7:"plurals";s:1:"0";s:7:"formula";s:0:"";s:6:"domain";s:0:"";s:6:"prefix";s:0:"";s:6:"weight";s:1:"0";s:10:"javascript";s:0:"";}';
+    $this->sourceDatabase->update('variable')
+      ->fields(array(
+        'value' => $value
+      ))
+      ->condition('name', 'language_default' )
+      ->execute();
+    $this->executeMigrations(['language', 'default_language']);
+    $default_language = ConfigurableLanguage::load($langcode);
+    $this->assertNotNull($default_language);
+    $this->assertIdentical($langcode, $this->config('system.site')->get('default_langcode'));
+  }
+
+}
diff --git a/core/modules/language/tests/src/Kernel/Migrate/d7/MigrateDefaultLanguageTest.php b/core/modules/language/tests/src/Kernel/Migrate/d7/MigrateDefaultLanguageTest.php
new file mode 100644
index 0000000..7867652
--- /dev/null
+++ b/core/modules/language/tests/src/Kernel/Migrate/d7/MigrateDefaultLanguageTest.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace Drupal\Tests\language\Kernel\Migrate\d7;
+
+use Drupal\language\Entity\ConfigurableLanguage;
+use Drupal\Tests\migrate_drupal\Kernel\d7\MigrateDrupal7TestBase;
+
+/**
+ * Tests the default language variable migration.
+ *
+ * @group migrate_drupal_7
+ */
+class MigrateDefaultLanguageTest extends MigrateDrupal7TestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['language'];
+
+  /**
+   * Tests the migration of the language_default variable to the
+   * system.site.default_langcode config key, with an existing language.
+   */
+  public function testMigrationWithExistingLanguage() {
+    $this->doTestMigration('is');
+  }
+
+  /**
+   * Tests the migration of the language_default variable to the
+   * system.site.default_langcode config key, with a non-existent language.
+   */
+  public function testMigrationWithNonExistentLanguage() {
+    $this->doTestMigration('tv');
+  }
+
+  /**
+   * Helper method to test the migration.
+   */
+  protected function doTestMigration($langcode) {
+    // The default language of the test fixture is English. Change it to
+    // something else before migrating, to be sure that the source site
+    // default language is migrated.
+    $value = 'O:8:"stdClass":11:{s:8:"language";s:2:"' . $langcode . '";s:4:"name";s:9:"Icelandic";s:6:"native";s:9:"Icelandic";s:9:"direction";s:1:"0";s:7:"enabled";i:1;s:7:"plurals";s:1:"0";s:7:"formula";s:0:"";s:6:"domain";s:0:"";s:6:"prefix";s:0:"";s:6:"weight";s:1:"0";s:10:"javascript";s:0:"";}';
+    $this->sourceDatabase->update('variable')
+      ->fields(array(
+        'value' => $value
+      ))
+      ->condition('name', 'language_default' )
+      ->execute();
+    $this->executeMigrations(['language', 'default_language']);
+    $default_language = ConfigurableLanguage::load($langcode);
+    $this->assertNotNull($default_language);
+    $this->assertIdentical($langcode, $this->config('system.site')->get('default_langcode'));
+  }
+
+}
diff --git a/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php b/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php
index fdcb26e..4c1f4d3 100644
--- a/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php
+++ b/core/modules/migrate_drupal_ui/src/Form/MigrateUpgradeForm.php
@@ -170,6 +170,10 @@ class MigrateUpgradeForm extends ConfirmFormBase {
       'source_module' => 'dblog',
       'destination_module' => 'dblog',
     ],
+    'default_language' => [
+      'source_module' => 'locale',
+      'destination_module' => 'language',
+    ],
     'd6_field' => [
       'source_module' => 'content',
       'destination_module' => 'field',
