diff --git a/core/modules/migrate_drupal/config/install/migrate.migration.d6_block.yml b/core/modules/migrate_drupal/config/install/migrate.migration.d6_block.yml
index 4fa9ea7..63d9873 100644
--- a/core/modules/migrate_drupal/config/install/migrate.migration.d6_block.yml
+++ b/core/modules/migrate_drupal/config/install/migrate.migration.d6_block.yml
@@ -3,6 +3,11 @@ label: Drupal 6 blocks
 source:
   plugin: d6_block
 process:
+  # Drupal 8 does not have a status but it doesn't matter; this is here to
+  # skip disabled blocks.
+  status:
+    plugin: skip_row_on_empty
+    source: status
   id:
     # We need something unique, so aggregator, aggregator_1 etc will do.
     plugin: dedupe_entity
@@ -43,8 +48,26 @@ process:
           3: views_block:who_s_online-who_s_online_block
     -
       plugin: d6_block_plugin_id
-  region: region
-  theme: theme
+  theme:
+    plugin: d6_block_theme
+    source:
+      - theme
+      - default_theme
+      - admin_theme
+  region:
+    plugin: d6_block_region
+    source:
+      - region
+      - theme
+      - @theme
+    region_map:
+      left: sidebar_first
+      right: sidebar_second
+      sidebar_first: sidebar_first
+      sidebar_second: sidebar_second
+      help: help
+      header: header
+      footer: footer
   label: title
   weight: weight
   settings:
@@ -59,7 +82,6 @@ process:
 destination:
   plugin: entity:block
 migration_dependencies:
-  required:
-    - d6_custom_block
   optional:
     - d6_menu
+    - d6_custom_block
diff --git a/core/modules/migrate_drupal/config/install/migrate.migration.d6_system_theme.yml b/core/modules/migrate_drupal/config/install/migrate.migration.d6_system_theme.yml
deleted file mode 100644
index 65b10cb..0000000
--- a/core/modules/migrate_drupal/config/install/migrate.migration.d6_system_theme.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-id: d6_system_theme
-label: Drupal 6 theme configuration
-source:
-  plugin: variable
-  variables:
-    - admin_theme
-    - theme_default
-process:
-  admin: admin_theme
-  default: theme_default
-destination:
-  plugin: config
-  config_name: system.theme
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/process/d6/BlockRegion.php b/core/modules/migrate_drupal/src/Plugin/migrate/process/d6/BlockRegion.php
new file mode 100644
index 0000000..ed62183
--- /dev/null
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/process/d6/BlockRegion.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * @file
+ * Contains
+ */
+
+namespace Drupal\migrate_drupal\Plugin\migrate\Process\d6;
+
+use Drupal\Component\Utility\NestedArray;
+use Drupal\migrate\MigrateExecutable;
+use Drupal\migrate\ProcessPluginBase;
+use Drupal\migrate\Row;
+
+/**
+ * @MigrateProcessPlugin(
+ *   id = "d6_block_region"
+ * )
+ */
+class BlockRegion extends ProcessPluginBase {
+  /**
+   * {@inheritdoc}
+   *
+   * Set the destination block region, based on the source region and theme as well
+   * as the current destination default theme.
+   */
+  public function transform($value, MigrateExecutable $migrate_executable, Row $row, $destination_property) {
+    list($region, $source_theme, $destination_theme) = $value;
+
+    // Theme is the same on both source and destination, we will assume they have
+    // the same regions.
+    if (strtolower($source_theme) == strtolower($destination_theme)) {
+      return $region;
+    }
+
+    // If the source and destination theme are different, try to use the mappings
+    // defined in the configuration.
+    $region_map = $this->configuration['region_map'];
+    if (isset($region_map[$region])) {
+      return $region_map[$region];
+    }
+
+    // Oh well, we tried. Put the block in the main content region.
+    return 'content';
+  }
+
+}
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/process/d6/BlockTheme.php b/core/modules/migrate_drupal/src/Plugin/migrate/process/d6/BlockTheme.php
new file mode 100644
index 0000000..63c8551
--- /dev/null
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/process/d6/BlockTheme.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ * @file
+ * Contains
+ */
+
+namespace Drupal\migrate_drupal\Plugin\migrate\Process\d6;
+
+use Drupal\migrate\Entity\MigrationInterface;
+use Drupal\migrate\MigrateExecutable;
+use Drupal\migrate\ProcessPluginBase;
+use Drupal\migrate\Row;
+use Drupal\Core\Config\Config;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * @MigrateProcessPlugin(
+ *   id = "d6_block_theme"
+ * )
+ */
+class BlockTheme extends ProcessPluginBase implements ContainerFactoryPluginInterface {
+  /**
+   * Contains the configuration object factory.
+   *
+   * @var \Drupal\Core\Config\ConfigFactoryInterface
+   */
+  protected $configFactory;
+
+  /**
+   * Constructs a BlockTheme object.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin ID for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\migrate\Entity\MigrationInterface $migration
+   *   The migration entity.
+   * @param \Drupal\Core\Config\Config $config
+   *   The configuration factory object.
+   * @param array $themes
+   *   The list of themes available on the destination.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, Config $config, array $themes) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition, $migration);
+    $this->config = $config;
+    $this->themes = $themes;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $migration,
+      $container->get('config.factory')->get('system.theme'),
+      $container->get('theme_handler')->listInfo()
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * Set the block theme, based on the current default theme.
+   */
+  public function transform($value, MigrateExecutable $migrate_executable, Row $row, $destination_property) {
+    list($theme, $d6_default_theme, $d6_admin_theme) = $value;
+
+    // If the source theme exists on the destination, we're good.
+    if (isset($this->themes[$theme])) {
+      return $theme;
+    }
+
+    // Get the default destination themes.
+    $d8_default_theme = $this->config->get('default');
+    $d8_admin_theme = $this->config->get('admin');
+
+    // If the source block is assigned to a region in the source default theme,
+    // then assign it to the destination default theme.
+    if (strtolower($theme) == strtolower($d6_default_theme)) {
+      return $d8_default_theme;
+    }
+
+    // If the source block is assigned to a region in the source admin theme,
+    // then assign it to the destination admin theme.
+    if (strtolower($theme) == strtolower($d6_admin_theme)) {
+      return $d8_admin_theme;
+    }
+
+    // Oh well, we tried.
+    return $theme;
+  }
+
+}
diff --git a/core/modules/migrate_drupal/src/Plugin/migrate/source/d6/Block.php b/core/modules/migrate_drupal/src/Plugin/migrate/source/d6/Block.php
index dbc58a9..cc6876e 100644
--- a/core/modules/migrate_drupal/src/Plugin/migrate/source/d6/Block.php
+++ b/core/modules/migrate_drupal/src/Plugin/migrate/source/d6/Block.php
@@ -18,6 +18,19 @@
  * )
  */
 class Block extends DrupalSqlBase {
+  /**
+   * The default theme name.
+   *
+   * @var string
+   */
+  protected $defaultTheme;
+
+  /**
+   * The admin theme name.
+   *
+   * @var string
+   */
+  protected $adminTheme;
 
   /**
    * {@inheritdoc}
@@ -32,6 +45,15 @@ public function query() {
   /**
    * {@inheritdoc}
    */
+  protected function runQuery() {
+    $this->defaultTheme = $this->variableGet('theme_default', 'Garland');
+    $this->adminTheme = $this->variableGet('admin_theme', null);
+    return parent::runQuery();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function fields() {
     return array(
       'bid' => $this->t('The block numeric identifier.'),
@@ -53,6 +75,8 @@ public function fields() {
    * {@inheritdoc}
    */
   public function prepareRow(Row $row) {
+    $row->setSourceProperty('default_theme', $this->defaultTheme);
+    $row->setSourceProperty('admin_theme', $this->adminTheme);
     $module = $row->getSourceProperty('module');
     $delta = $row->getSourceProperty('delta');
     $roles = $this->select('blocks_roles', 'br')
diff --git a/core/modules/migrate_drupal/src/Tests/Dump/Drupal6SystemTheme.php b/core/modules/migrate_drupal/src/Tests/Dump/Drupal6SystemTheme.php
deleted file mode 100644
index 9b9ceb3..0000000
--- a/core/modules/migrate_drupal/src/Tests/Dump/Drupal6SystemTheme.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\migrate_drupal\Tests\Dump\Drupal6SystemTheme.
- */
-
-namespace Drupal\migrate_drupal\Tests\Dump;
-
-/**
- * Database dump for testing system.theme.yml migration.
- */
-class Drupal6SystemTheme extends Drupal6DumpBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function load() {
-    $this->createTable('variable');
-    $this->database->insert('variable')->fields(array(
-      'name',
-      'value',
-    ))
-    ->values(array(
-      'name' => 'admin_theme',
-      'value' => 'i:0;',
-    ))
-    ->values(array(
-      'name' => 'theme_default',
-      'value' => 's:7:"garland";',
-    ))
-    ->execute();
-  }
-
-}
diff --git a/core/modules/migrate_drupal/src/Tests/d6/MigrateBlockTest.php b/core/modules/migrate_drupal/src/Tests/d6/MigrateBlockTest.php
index 313e780..4590b26 100644
--- a/core/modules/migrate_drupal/src/Tests/d6/MigrateBlockTest.php
+++ b/core/modules/migrate_drupal/src/Tests/d6/MigrateBlockTest.php
@@ -61,6 +61,12 @@ public function setUp() {
         array(array(11), array(2)),
       )
     ));
+
+    $config = \Drupal::config('system.theme');
+    $config->set('default', 'bartik');
+    $config->set('admin', 'seven');
+    $config->save();
+
     /** @var \Drupal\migrate\entity\Migration $migration */
     $migration = entity_load('migration', 'd6_block');
     $dumps = array(
@@ -77,13 +83,13 @@ public function setUp() {
   public function testBlockMigration() {
     /** @var $blocks \Drupal\block\BlockInterface[] */
     $blocks = entity_load_multiple('block');
-    $this->assertEqual(count($blocks), 11);
+    $this->assertEqual(count($blocks), 6);
 
     // User blocks
     $test_block_user = $blocks['user'];
     $this->assertNotNull($test_block_user);
-    $this->assertEqual('left', $test_block_user->get('region'));
-    $this->assertEqual('garland', $test_block_user->get('theme'));
+    $this->assertEqual('sidebar_first', $test_block_user->get('region'));
+    $this->assertEqual('bartik', $test_block_user->get('theme'));
     $visibility = $test_block_user->getVisibility();
     $this->assertEqual(TRUE, $visibility['request_path']['negate']);
     $this->assertEqual('', $visibility['request_path']['pages']);
@@ -91,85 +97,38 @@ public function testBlockMigration() {
 
     $test_block_user_1 = $blocks['user_1'];
     $this->assertNotNull($test_block_user_1);
-    $this->assertEqual('left', $test_block_user_1->get('region'));
-    $this->assertEqual('garland', $test_block_user_1->get('theme'));
+    $this->assertEqual('sidebar_first', $test_block_user_1->get('region'));
+    $this->assertEqual('bartik', $test_block_user_1->get('theme'));
     $visibility = $test_block_user_1->getVisibility();
     $this->assertEqual(TRUE, $visibility['request_path']['negate']);
     $this->assertEqual('', $visibility['request_path']['pages']);
     $this->assertEqual(0, $test_block_user_1->weight);
 
-    $test_block_user_2 = $blocks['user_2'];
-    $this->assertNotNull($test_block_user_2);
-    $this->assertEqual('', $test_block_user_2->get('region'));
-    $this->assertEqual('garland', $test_block_user_2->get('theme'));
-    $visibility = $test_block_user_2->getVisibility();
-    $this->assertEqual(TRUE, $visibility['request_path']['negate']);
-    $this->assertEqual('', $visibility['request_path']['pages']);
-    $this->assertEqual(-3, $test_block_user_2->weight);
-
-    $test_block_user_3 = $blocks['user_3'];
-    $this->assertNotNull($test_block_user_3);
-    $this->assertEqual('', $test_block_user_3->get('region'));
-    $this->assertEqual('garland', $test_block_user_3->get('theme'));
-    $visibility = $test_block_user_3->getVisibility();
-    $this->assertEqual(TRUE, $visibility['request_path']['negate']);
-    $this->assertEqual('', $visibility['request_path']['pages']);
-    $this->assertEqual(-1, $test_block_user_3->weight);
-
     // Check system block
     $test_block_system = $blocks['system'];
     $this->assertNotNull($test_block_system);
     $this->assertEqual('footer', $test_block_system->get('region'));
-    $this->assertEqual('garland', $test_block_system->get('theme'));
+    $this->assertEqual('bartik', $test_block_system->get('theme'));
     $visibility = $test_block_system->getVisibility();
     $this->assertEqual(TRUE, $visibility['request_path']['negate']);
     $this->assertEqual('', $visibility['request_path']['pages']);
     $this->assertEqual(-5, $test_block_system->weight);
 
-    // Check comment block
-    $test_block_comment = $blocks['comment'];
-    $this->assertNotNull($test_block_comment);
-    $this->assertEqual('', $test_block_comment->get('region'));
-    $this->assertEqual('garland', $test_block_comment->get('theme'));
-    $visibility = $test_block_comment->getVisibility();
-    $this->assertEqual(TRUE, $visibility['request_path']['negate']);
-    $this->assertEqual('', $visibility['request_path']['pages']);
-    $this->assertEqual(-6, $test_block_comment->weight);
-
     // Check menu blocks
     $test_block_menu = $blocks['menu'];
     $this->assertNotNull($test_block_menu);
     $this->assertEqual('header', $test_block_menu->get('region'));
-    $this->assertEqual('garland', $test_block_menu->get('theme'));
+    $this->assertEqual('bartik', $test_block_menu->get('theme'));
     $visibility = $test_block_menu->getVisibility();
     $this->assertEqual(TRUE, $visibility['request_path']['negate']);
     $this->assertEqual('', $visibility['request_path']['pages']);
     $this->assertEqual(-5, $test_block_menu->weight);
 
-    $test_block_menu_1 = $blocks['menu_1'];
-    $this->assertNotNull($test_block_menu_1);
-    $this->assertEqual('', $test_block_menu_1->get('region'));
-    $this->assertEqual('garland', $test_block_menu_1->get('theme'));
-    $visibility = $test_block_menu_1->getVisibility();
-    $this->assertEqual(TRUE, $visibility['request_path']['negate']);
-    $this->assertEqual('', $visibility['request_path']['pages']);
-    $this->assertEqual(-5, $test_block_menu_1->weight);
-
-    // Check node block
-    $test_block_node = $blocks['node'];
-    $this->assertNotNull($test_block_node);
-    $this->assertEqual('', $test_block_node->get('region'));
-    $this->assertEqual('garland', $test_block_node->get('theme'));
-    $visibility = $test_block_node->getVisibility();
-    $this->assertEqual(TRUE, $visibility['request_path']['negate']);
-    $this->assertEqual('', $visibility['request_path']['pages']);
-    $this->assertEqual(-4, $test_block_node->weight);
-
     // Check custom blocks
     $test_block_block = $blocks['block'];
     $this->assertNotNull($test_block_block);
     $this->assertEqual('content', $test_block_block->get('region'));
-    $this->assertEqual('garland', $test_block_block->get('theme'));
+    $this->assertEqual('bartik', $test_block_block->get('theme'));
     $visibility = $test_block_block->getVisibility();
     $this->assertEqual(FALSE, $visibility['request_path']['negate']);
     $this->assertEqual('<front>', $visibility['request_path']['pages']);
diff --git a/core/modules/migrate_drupal/src/Tests/d6/MigrateDrupal6Test.php b/core/modules/migrate_drupal/src/Tests/d6/MigrateDrupal6Test.php
index 592992e..a11a86c 100644
--- a/core/modules/migrate_drupal/src/Tests/d6/MigrateDrupal6Test.php
+++ b/core/modules/migrate_drupal/src/Tests/d6/MigrateDrupal6Test.php
@@ -103,7 +103,6 @@ class MigrateDrupal6Test extends MigrateFullDrupalTestBase {
     'd6_system_performance',
     'd6_system_rss',
     'd6_system_site',
-    'd6_system_theme',
     'd6_taxonomy_settings',
     'd6_taxonomy_term',
     'd6_taxonomy_vocabulary',
@@ -150,6 +149,17 @@ public static function getInfo() {
   /**
    * {@inheritdoc}
    */
+  public function setUp() {
+    parent::setUp();
+    $config = \Drupal::config('system.theme');
+    $config->set('default', 'bartik');
+    $config->set('admin', 'seven');
+    $config->save();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   protected function getDumps() {
     $tests_path = $this->getDumpDirectory();
     $dumps = array(
@@ -196,7 +206,6 @@ protected function getDumps() {
       $tests_path . '/Drupal6SystemPerformance.php',
       $tests_path . '/Drupal6SystemRss.php',
       $tests_path . '/Drupal6SystemSite.php',
-      $tests_path . '/Drupal6SystemTheme.php',
       $tests_path . '/Drupal6TaxonomySettings.php',
       $tests_path . '/Drupal6TaxonomyTerm.php',
       $tests_path . '/Drupal6TaxonomyVocabulary.php',
@@ -271,7 +280,6 @@ protected function getTestClassesList() {
       __NAMESPACE__ . '\MigrateSystemPerformanceTest',
       __NAMESPACE__ . '\MigrateSystemRssTest',
       __NAMESPACE__ . '\MigrateSystemSiteTest',
-      __NAMESPACE__ . '\MigrateSystemThemeTest',
       __NAMESPACE__ . '\MigrateTaxonomyConfigsTest',
       __NAMESPACE__ . '\MigrateTaxonomyTermTest',
       __NAMESPACE__ . '\MigrateTaxonomyVocabularyTest',
diff --git a/core/modules/migrate_drupal/src/Tests/d6/MigrateSystemThemeTest.php b/core/modules/migrate_drupal/src/Tests/d6/MigrateSystemThemeTest.php
deleted file mode 100644
index 4669c12..0000000
--- a/core/modules/migrate_drupal/src/Tests/d6/MigrateSystemThemeTest.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\migrate_drupal\Tests\d6\MigrateSystemThemeTest.
- */
-
-namespace Drupal\migrate_drupal\Tests\d6;
-
-use Drupal\migrate\MigrateMessage;
-use Drupal\migrate\MigrateExecutable;
-use Drupal\migrate_drupal\Tests\MigrateDrupalTestBase;
-
-/**
- * Tests migration of system theme variables to configuration.
- */
-class MigrateSystemThemeTest extends MigrateDrupalTestBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function getInfo() {
-    return array(
-      'name'  => 'Migrate theme variables to system.*.yml',
-      'description'  => 'Upgrade theme variables to system.*.yml',
-      'group' => 'Migrate Drupal',
-    );
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    parent::setUp();
-    $migration = entity_load('migration', 'd6_system_theme');
-    $dumps = array(
-      $this->getDumpDirectory() . '/Drupal6SystemTheme.php',
-    );
-    $this->prepare($migration, $dumps);
-    $executable = new MigrateExecutable($migration, new MigrateMessage());
-    $executable->import();
-  }
-
-  /**
-   * Tests migration of system (theme) variables to system.theme.yml.
-   */
-  public function testSystemTheme() {
-    $config = \Drupal::config('system.theme');
-    $this->assertIdentical($config->get('admin'), '0');
-    $this->assertIdentical($config->get('default'), 'garland');
-  }
-
-}
