diff --git a/core/modules/migrate/migrate.install b/core/modules/migrate/migrate.install
index 5044726..0504649 100644
--- a/core/modules/migrate/migrate.install
+++ b/core/modules/migrate/migrate.install
@@ -10,6 +10,8 @@
  * @{
  */
 
+use Drupal\Component\Utility\Unicode;
+
 /**
  * Remove load plugin references from existing migrations.
  */
@@ -23,5 +25,144 @@ function migrate_update_8001() {
 }
 
 /**
+ * Update existing database tables if necessary.
+ */
+function migrate_update_8009() {
+  $storage = \Drupal::service('entity_type.manager')->getStorage('migration');
+  $database = \Drupal::database();
+  $plugin_manager = \Drupal::service('plugin.manager.migrate.id_map');
+
+  foreach ($storage->loadMultiple() as $migration) {
+    // Build the source and destination identifier maps.
+    $source_id_fields = array();
+    $count = 1;
+    foreach ($migration->getSourcePlugin()->getIds() as $field => $schema) {
+      $source_id_fields[$field] = 'sourceid' . $count++;
+    }
+
+    if ($map = $plugin_manager->createInstance('sql', array(), $migration)) {
+      $machine_name = str_replace(':', '__', $migration->id());
+      $prefix_length = strlen($database->tablePrefix());
+      $map_table_name = 'migrate_map_' . Unicode::strtolower($machine_name);
+      $map_table_name = Unicode::substr($map_table_name, 0, 63 - $prefix_length);
+      $message_table_name = 'migrate_message_' . Unicode::strtolower($machine_name);
+      $message_table_name = Unicode::substr($message_table_name, 0, 63 - $prefix_length);
+
+      if ($database->schema()->tableExists($map_table_name)) {
+        if (!$database->schema()->fieldExists($map_table_name, 'rollback_action')) {
+          $database->schema()->addField($map_table_name, 'rollback_action',
+            array(
+              'type' => 'int',
+              'size' => 'tiny',
+              'unsigned' => TRUE,
+              'not null' => TRUE,
+              'default' => 0,
+              'description' => 'Flag indicating what to do for this item on rollback',
+            )
+          );
+        }
+
+        if (!$database->schema()->fieldExists($map_table_name, 'hash')) {
+          $database->schema()->addField($map_table_name, 'hash',
+            array(
+              'type' => 'varchar',
+              'length' => '64',
+              'not null' => FALSE,
+              'description' => 'Hash of source row data, for detecting changes',
+            )
+          );
+        }
+
+        if (!$database->schema()->fieldExists($map_table_name, $map::SOURCE_IDS_HASH)) {
+          // Source hash must be null for now.
+          $database->schema()->addField($map_table_name, $map::SOURCE_IDS_HASH, array(
+            'type' => 'varchar',
+            'length' => '64',
+            'not null' => FALSE,
+            'description' => 'Hash of source ids. Used as primary key',
+          ));
+
+          $result = $database->select($map_table_name, 'map')
+            ->fields('map', array_values($source_id_fields))
+            ->execute();
+
+          while ($row = $result->fetchAssoc()) {
+            $source_ids = [];
+            foreach ($source_id_fields as $key => $field) {
+              $source_ids[$key] = $row[$field];
+            }
+            $source_hash = $map->getSourceIDsHash($source_ids);
+            $query = $database->update($map_table_name)
+              ->fields([
+                'source_ids_hash' => $source_hash,
+              ]);
+            foreach (array_values($source_id_fields) as $field) {
+              $query->condition($field, $row[$field]);
+            }
+            $query->execute();
+          }
+
+          // Source hash shouldn't be null.
+          $database->schema()->changeField($map_table_name, $map::SOURCE_IDS_HASH, $map::SOURCE_IDS_HASH, array(
+            'type' => 'varchar',
+            'length' => '64',
+            'not null' => TRUE,
+            'description' => 'Hash of source ids. Used as primary key',
+          ));
+        }
+
+      }
+
+      if ($database->schema()->tableExists($message_table_name)) {
+        if (!$database->schema()->fieldExists($message_table_name, $map::SOURCE_IDS_HASH)) {
+          // Source hash must be null for now.
+          $database->schema()->addField($message_table_name, $map::SOURCE_IDS_HASH, array(
+            'type' => 'varchar',
+            'length' => '64',
+            'not null' => FALSE,
+            'description' => 'Hash of source ids. Used as primary key',
+          ));
+
+          $result = $database->select($message_table_name, 'message')
+            ->fields('message', $source_id_fields)
+            ->execute();
+
+          while ($row = $result->fetchAssoc()) {
+            $source_ids = [];
+            foreach ($source_id_fields as $key => $field) {
+              $source_ids[$key] = $row[$field];
+            }
+            $source_hash = $map->getSourceIDsHash($source_ids);
+            $query = $database->update($message_table_name)
+              ->fields([
+                'source_ids_hash' => $source_hash,
+              ]);
+            foreach ($source_id_fields as $field) {
+              $query->condition($field, $row[$field]);
+            }
+            $query->execute();
+          }
+
+          // Source hash shouldn't be null.
+          $database->schema()->changeField($message_table_name, $map::SOURCE_IDS_HASH, $map::SOURCE_IDS_HASH, array(
+            'type' => 'varchar',
+            'length' => '64',
+            'not null' => TRUE,
+            'description' => 'Hash of source ids. Used as primary key',
+          ));
+        }
+
+        // Remove the source fields from the message table.
+        foreach ($source_id_fields as $source_field) {
+          if ($database->schema()->fieldExists($message_table_name, $source_field)) {
+            $database->schema()->dropField($message_table_name, $source_field);
+          }
+        }
+      }
+    }
+  }
+}
+
+/**
  * @} End of "addtogroup updates-8.0.0-beta".
  */
diff --git a/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php b/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php
index 4a706bf..814fa11 100644
--- a/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php
+++ b/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php
@@ -406,40 +406,6 @@ protected function ensureTables() {
         $this->getDatabase()->schema()->createTable($this->messageTableName(), $schema);
       }
     }
-    else {
-      // Add any missing columns to the map table.
-      if (!$this->getDatabase()->schema()->fieldExists($this->mapTableName,
-                                                    'rollback_action')) {
-        $this->getDatabase()->schema()->addField($this->mapTableName, 'rollback_action',
-          array(
-            'type' => 'int',
-            'size' => 'tiny',
-            'unsigned' => TRUE,
-            'not null' => TRUE,
-            'default' => 0,
-            'description' => 'Flag indicating what to do for this item on rollback',
-          )
-        );
-      }
-      if (!$this->getDatabase()->schema()->fieldExists($this->mapTableName, 'hash')) {
-        $this->getDatabase()->schema()->addField($this->mapTableName, 'hash',
-          array(
-            'type' => 'varchar',
-            'length' => '64',
-            'not null' => FALSE,
-            'description' => 'Hash of source row data, for detecting changes',
-          )
-        );
-      }
-      if (!$this->getDatabase()->schema()->fieldExists($this->mapTableName, static::SOURCE_IDS_HASH)) {
-        $this->getDatabase()->schema()->addField($this->mapTableName, static::SOURCE_IDS_HASH, array(
-          'type' => 'varchar',
-          'length' => '64',
-          'not null' => TRUE,
-          'description' => 'Hash of source ids. Used as primary key',
-        ));
-      }
-    }
   }
 
   /**
diff --git a/core/modules/migrate/tests/src/Unit/MigrateSqlIdMapEnsureTablesTest.php b/core/modules/migrate/tests/src/Unit/MigrateSqlIdMapEnsureTablesTest.php
index 59a6aba..7b3e456 100644
--- a/core/modules/migrate/tests/src/Unit/MigrateSqlIdMapEnsureTablesTest.php
+++ b/core/modules/migrate/tests/src/Unit/MigrateSqlIdMapEnsureTablesTest.php
@@ -141,48 +141,7 @@ public function testEnsureTablesExist() {
       ->method('tableExists')
       ->with('migrate_map_sql_idmap_test')
       ->will($this->returnValue(TRUE));
-    $schema->expects($this->at(1))
-      ->method('fieldExists')
-      ->with('migrate_map_sql_idmap_test', 'rollback_action')
-      ->will($this->returnValue(FALSE));
-    $field_schema = array(
-      'type' => 'int',
-      'size' => 'tiny',
-      'unsigned' => TRUE,
-      'not null' => TRUE,
-      'default' => 0,
-      'description' => 'Flag indicating what to do for this item on rollback',
-    );
-    $schema->expects($this->at(2))
-      ->method('addField')
-      ->with('migrate_map_sql_idmap_test', 'rollback_action', $field_schema);
-    $schema->expects($this->at(3))
-      ->method('fieldExists')
-      ->with('migrate_map_sql_idmap_test', 'hash')
-      ->will($this->returnValue(FALSE));
-    $field_schema = array(
-      'type' => 'varchar',
-      'length' => '64',
-      'not null' => FALSE,
-      'description' => 'Hash of source row data, for detecting changes',
-    );
-    $schema->expects($this->at(4))
-      ->method('addField')
-      ->with('migrate_map_sql_idmap_test', 'hash', $field_schema);
-    $schema->expects($this->at(5))
-      ->method('fieldExists')
-      ->with('migrate_map_sql_idmap_test', 'source_ids_hash')
-      ->will($this->returnValue(FALSE));
-    $field_schema = array(
-      'type' => 'varchar',
-      'length' => '64',
-      'not null' => TRUE,
-      'description' => 'Hash of source ids. Used as primary key',
-    );
-    $schema->expects($this->at(6))
-      ->method('addField')
-      ->with('migrate_map_sql_idmap_test', 'source_ids_hash', $field_schema);
-    $schema->expects($this->exactly(7))
+    $schema->expects($this->exactly(1))
       ->method($this->anything());
     $this->runEnsureTablesTest($schema);
   }
diff --git a/core/modules/migrate_drupal/tests/fixtures/drupal6.php b/core/modules/migrate_drupal/tests/fixtures/drupal6.php
index 3b9efe5..f7d64f3 100644
--- a/core/modules/migrate_drupal/tests/fixtures/drupal6.php
+++ b/core/modules/migrate_drupal/tests/fixtures/drupal6.php
@@ -30532,21 +30532,6 @@
   'options' => '',
 ))
 ->values(array(
-  'fid' => '13',
-  'title' => 'Blog',
-  'name' => 'profile_blog',
-  'explanation' => 'Paste the full URL, including http://, of your personal blog.',
-  'category' => 'Personal information',
-  'page' => '',
-  'type' => 'url',
-  'weight' => '3',
-  'required' => '0',
-  'register' => '0',
-  'visibility' => '3',
-  'autocomplete' => '0',
-  'options' => '',
-))
-->values(array(
   'fid' => '14',
   'title' => 'Birthdate',
   'name' => 'profile_birthdate',
@@ -30576,6 +30561,21 @@
   'autocomplete' => '0',
   'options' => '',
 ))
+->values(array(
+  'fid' => '16',
+  'title' => 'Blog',
+  'name' => 'profile_blog',
+  'explanation' => 'Paste the full URL, including http://, of your personal blog.',
+  'category' => 'Personal information',
+  'page' => '',
+  'type' => 'url',
+  'weight' => '3',
+  'required' => '0',
+  'register' => '0',
+  'visibility' => '3',
+  'autocomplete' => '0',
+  'options' => '',
+))
 ->execute();
 
 $connection->schema()->createTable('profile_values', array(
diff --git a/core/modules/user/src/Tests/Migrate/d6/MigrateUserProfileValuesTest.php b/core/modules/user/src/Tests/Migrate/d6/MigrateUserProfileValuesTest.php
index e4b5dd3..e2e4676 100644
--- a/core/modules/user/src/Tests/Migrate/d6/MigrateUserProfileValuesTest.php
+++ b/core/modules/user/src/Tests/Migrate/d6/MigrateUserProfileValuesTest.php
@@ -54,11 +54,6 @@ public function testUserProfileValues() {
     $this->assertIdentical('Queen', $user->profile_bands[5]->value);
     $this->assertIdentical('The White Stripes', $user->profile_bands[6]->value);
     $this->assertIdentical('1974-06-02', $user->profile_birthdate->value);
-    $this->assertIdentical('http://example.com/blog', $user->profile_blog->uri);
-    $this->assertNull($user->profile_blog->title);
-    $this->assertIdentical([], $user->profile_blog->options);
-    $this->assertIdentical('http://example.com/blog', $user->profile_blog->uri);
-    $this->assertNull($user->profile_love_migrations->value);
 
     $user = User::load(8);
     $this->assertIdentical('Forward/slash', $user->profile_sold_to->value);
