diff --git a/core/modules/migrate/src/Plugin/migrate/destination/Config.php b/core/modules/migrate/src/Plugin/migrate/destination/Config.php
index 0dd9fd3774468d4f94510a6b94d108bd45389dc6..b3c07c971447c7dadb38f47f0f9803cd3ad2edb2 100644
--- a/core/modules/migrate/src/Plugin/migrate/destination/Config.php
+++ b/core/modules/migrate/src/Plugin/migrate/destination/Config.php
@@ -10,6 +10,7 @@
 use Drupal\Component\Plugin\DependentPluginInterface;
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Entity\DependencyTrait;
+use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\migrate\Entity\MigrationInterface;
 use Drupal\migrate\Row;
@@ -38,6 +39,13 @@ class Config extends DestinationBase implements ContainerFactoryPluginInterface,
    */
   protected $config;
 
+  /**
+   * The language manager.
+   *
+   * @var \Drupal\Core\Language\LanguageManagerInterface
+   */
+  protected $language_manager;
+
   /**
    * Constructs a Config destination object.
    *
@@ -51,10 +59,13 @@ class Config extends DestinationBase implements ContainerFactoryPluginInterface,
    *   The migration entity.
    * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
    *   The configuration factory.
+   * @param \Drupal\Core\Language\ConfigurableLanguageManagerInterface $language_manager
+   *   The language manager.
    */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, ConfigFactoryInterface $config_factory) {
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, ConfigFactoryInterface $config_factory, LanguageManagerInterface $language_manager) {
     parent::__construct($configuration, $plugin_id, $plugin_definition, $migration);
     $this->config = $config_factory->getEditable($configuration['config_name']);
+    $this->language_manager = $language_manager;
   }
 
   /**
@@ -66,7 +77,8 @@ public static function create(ContainerInterface $container, array $configuratio
       $plugin_id,
       $plugin_definition,
       $migration,
-      $container->get('config.factory')
+      $container->get('config.factory'),
+      $container->get('language_manager')
     );
   }
 
@@ -74,6 +86,10 @@ public static function create(ContainerInterface $container, array $configuratio
    * {@inheritdoc}
    */
   public function import(Row $row, array $old_destination_id_values = array()) {
+    if ($row->hasDestinationProperty('langcode')) {
+      $this->config = $this->language_manager->getLanguageConfigOverride($row->getDestinationProperty('langcode'), $this->config->getName());
+    }
+
     foreach ($row->getRawDestination() as $key => $value) {
       if (isset($value) || !empty($this->configuration['store null'])) {
         $this->config->set(str_replace(Row::PROPERTY_SEPARATOR, '.', $key), $value);
diff --git a/core/modules/migrate/tests/src/Unit/destination/ConfigTest.php b/core/modules/migrate/tests/src/Unit/destination/ConfigTest.php
index 363e4f16e0277623629a8d3f06df5539f00c7095..f5e1c33185e3970b3780970dad23ad10b477ea78 100644
--- a/core/modules/migrate/tests/src/Unit/destination/ConfigTest.php
+++ b/core/modules/migrate/tests/src/Unit/destination/ConfigTest.php
@@ -49,9 +49,72 @@ public function testImport() {
       ->disableOriginalConstructor()
       ->getMock();
     $row->expects($this->once())
+      ->method('hasDestinationProperty')
+      ->will($this->returnValue(FALSE));
+    $row->expects($this->any())
       ->method('getRawDestination')
       ->will($this->returnValue($source));
-    $destination = new Config(array('config_name' => 'd8_config'), 'd8_config', array('pluginId' => 'd8_config'), $migration, $config_factory);
+    $language_manager = $this->getMockBuilder('Drupal\language\ConfigurableLanguageManagerInterface')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $language_manager->expects($this->never())
+      ->method('getLanguageConfigOverride')
+      ->with('fr', 'd8_config')
+      ->will($this->returnValue($config));
+    $destination = new Config(array('config_name' => 'd8_config'), 'd8_config', array('pluginId' => 'd8_config'), $migration, $config_factory, $language_manager);
+    $destination_id = $destination->import($row);
+    $this->assertEquals($destination_id, ['d8_config']);
+  }
+
+  /**
+   * Test the import method.
+   */
+  public function testLanguageImport() {
+    $source = array(
+      'langcode' => 'mi',
+    );
+    $migration = $this->getMockBuilder('Drupal\migrate\Entity\Migration')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $config = $this->getMockBuilder('Drupal\Core\Config\Config')
+      ->disableOriginalConstructor()
+      ->getMock();
+    foreach ($source as $key => $val) {
+      $config->expects($this->once())
+        ->method('set')
+        ->with($this->equalTo($key), $this->equalTo($val))
+        ->will($this->returnValue($config));
+    }
+    $config->expects($this->once())
+      ->method('save');
+    $config->expects($this->any())
+      ->method('getName')
+      ->willReturn('d8_config');
+    $config_factory = $this->getMock('Drupal\Core\Config\ConfigFactoryInterface');
+    $config_factory->expects($this->once())
+      ->method('getEditable')
+      ->with('d8_config')
+      ->will($this->returnValue($config));
+    $row = $this->getMockBuilder('Drupal\migrate\Row')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $row->expects($this->once())
+      ->method('hasDestinationProperty')
+      ->will($this->returnValue($source));
+    $row->expects($this->any())
+      ->method('getRawDestination')
+      ->will($this->returnValue($source));
+    $row->expects($this->any())
+      ->method('getDestinationProperty')
+      ->will($this->returnValue($source['langcode']));
+    $language_manager = $this->getMockBuilder('Drupal\language\ConfigurableLanguageManagerInterface')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $language_manager->expects($this->any())
+      ->method('getLanguageConfigOverride')
+      ->with('mi', 'd8_config')
+      ->will($this->returnValue($config));
+    $destination = new Config(array('config_name' => 'd8_config'), 'd8_config', array('pluginId' => 'd8_config'), $migration, $config_factory, $language_manager);
     $destination_id = $destination->import($row);
     $this->assertEquals($destination_id, ['d8_config']);
   }
diff --git a/core/modules/migrate_drupal/config/schema/migrate_drupal.source.schema.yml b/core/modules/migrate_drupal/config/schema/migrate_drupal.source.schema.yml
index 6152f9e4578d19af1f09c22c6753f2de45733b8d..96f5e651f52076e06e89310ca7627403aa851853 100644
--- a/core/modules/migrate_drupal/config/schema/migrate_drupal.source.schema.yml
+++ b/core/modules/migrate_drupal/config/schema/migrate_drupal.source.schema.yml
@@ -151,3 +151,42 @@ migrate_entity_constant:
 migrate.source.md_empty:
   type: migrate.source.empty
   label: 'Empty source for migrate_drupal migrations'
+
+migrate.source.i18n_variable:
+  type: migrate_source_sql
+  label: 'i18n Variable'
+  mapping:
+    variables:
+      type: sequence
+      label: 'Variables'
+      sequence:
+        type: string
+        label: 'Variable'
+    constants:
+      type: mapping
+      label: 'Constants'
+      mapping:
+        entity_type:
+          type: string
+          label: 'Entity type'
+        id:
+          type: string
+          label: 'ID'
+        label:
+          type: label
+          label: 'Label'
+        description:
+          type: text
+          label: 'Description'
+        path:
+          type: string
+          label: 'Path'
+        plugin:
+          type: string
+          label: 'Plugin'
+        status:
+          type: boolean
+          label: 'Status'
+        slash:
+          type: string
+          label: 'Slash'
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/source/d6/i18nVariable.php b/core/modules/migrate_drupal/src/Plugin/migrate/source/d6/i18nVariable.php
new file mode 100644
index 0000000000000000000000000000000000000000..ca5184063f807a78190bb495cdc3e01c62051eef
--- /dev/null
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/source/d6/i18nVariable.php
@@ -0,0 +1,105 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\migrate_drupal\Plugin\migrate\source\d6\i18nVariable.
+ */
+
+namespace Drupal\migrate_drupal\Plugin\migrate\source\d6;
+
+use Drupal\Core\Entity\EntityManagerInterface;
+use Drupal\Core\State\StateInterface;
+use Drupal\migrate\Entity\MigrationInterface;
+use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+
+/**
+ * Drupal i18n_variable source from database.
+ *
+ * @MigrateSource(
+ *   id = "i18n_variable"
+ * )
+ */
+class i18nVariable extends DrupalSqlBase {
+
+  /**
+   * The variable names to fetch.
+   *
+   * @var array
+   */
+  protected $variables;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, StateInterface $state, EntityManagerInterface $entity_manager) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $state, $entity_manager);
+    $this->variables = $this->configuration['variables'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function initializeIterator() {
+    return new \ArrayIterator($this->values());
+  }
+
+  /**
+   * Return the values of the variables specified in the plugin configuration.
+   *
+   * @return array
+   *   An associative array where the keys are the variables specified in the
+   *   plugin configuration and the values are the values found in the source.
+   *   A key/value pair is added for the language code. Only those values are
+   *   returned that are actually in the database.
+   */
+  protected function values() {
+    $values = [];
+    $result = $this->prepareQuery()->execute()->FetchAllAssoc('language');
+    foreach ($result as $i18n_variable) {
+      $values[]['language'] = $i18n_variable->language;
+    }
+    $result = $this->prepareQuery()->execute()->FetchAll();
+    foreach ($result as $i18n_variable) {
+      foreach ($values as $key => $value) {
+        if ($values[$key]['language'] === $i18n_variable->language) {
+          $values[$key][$i18n_variable->name] = unserialize($i18n_variable->value);
+          break;
+        }
+      }
+    }
+    return $values;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function count() {
+    return $this->initializeIterator()->count();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    return array_combine($this->variables, $this->variables);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    return $this->getDatabase()
+      ->select('i18n_variable', 'v')
+      ->fields('v')
+      ->condition('name', (array) $this->configuration['variables'], 'IN');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    $ids['language']['type'] = 'string';
+    return $ids;
+  }
+
+}
diff --git a/core/modules/migrate_drupal/tests/src/Unit/source/d6/i18nVariableTest.php b/core/modules/migrate_drupal/tests/src/Unit/source/d6/i18nVariableTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b9bcb99c73a8448ed5aa1df0720a5cc094e72789
--- /dev/null
+++ b/core/modules/migrate_drupal/tests/src/Unit/source/d6/i18nVariableTest.php
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\migrate_drupal\Unit\source\d6\i18nVariableTest.
+ */
+
+namespace Drupal\Tests\migrate_drupal\Unit\source\d6;
+
+use Drupal\Tests\migrate\Unit\MigrateSqlSourceTestCase;
+
+/**
+ * Tests the variable source plugin.
+ *
+ * @group migrate_drupal
+ */
+class i18nVariableTest extends MigrateSqlSourceTestCase {
+
+  // The plugin system is not working during unit testing so the source plugin
+  // class needs to be manually specified.
+  const PLUGIN_CLASS = 'Drupal\migrate_drupal\Plugin\migrate\source\d6\i18nVariable';
+
+  /**
+   * Define bare minimum migration configuration.
+   */
+  protected $migrationConfiguration = [
+    'id' => 'test',
+    'highWaterProperty' => array('field' => 'test'),
+    'source' => [
+      'plugin' => 'i18n_variable',
+      'variables' => [
+        'site_slogan',
+        'site_name',
+      ],
+    ],
+  ];
+
+  /**
+   * Expected results from the source.
+   */
+  protected $expectedResults = [
+    [
+      'language' => 'fr',
+      'site_slogan' => 'Migrate est génial',
+      'site_name' => 'nom de site',
+    ],
+    [
+      'language' => 'mi',
+      'site_slogan' => 'Ko whakamataku heke',
+      'site_name' => 'ingoa_pae',
+    ]
+  ];
+
+  /**
+   * Database contents for tests.
+   */
+  protected $databaseContents = [
+    'i18n_variable' => [
+      array('name' => 'site_slogan', 'language' => 'fr', 'value' => 's:19:"Migrate est génial";'),
+      array('name' => 'site_name', 'language' => 'fr', 'value' => 's:11:"nom de site";'),
+      array('name' => 'site_slogan', 'language' => 'mi', 'value' => 's:19:"Ko whakamataku heke";'),
+      array('name' => 'site_name', 'language' => 'mi', 'value' => 's:9:"ingoa_pae";'),
+    ],
+  ];
+
+}