diff --git a/metatag_migrate/metatag_migrate.info.yml b/metatag_migrate/metatag_migrate.info.yml
new file mode 100644
index 0000000..22d1edf
--- /dev/null
+++ b/metatag_migrate/metatag_migrate.info.yml
@@ -0,0 +1,8 @@
+name: 'Metatag Migrate'
+type: module
+description: Provides support for migrating meta tags.
+core: 8.x
+package: Migrate
+dependencies:
+  - metatag
+  - migrate
diff --git a/metatag_migrate/metatag_migrate.module b/metatag_migrate/metatag_migrate.module
new file mode 100644
index 0000000..61d0131
--- /dev/null
+++ b/metatag_migrate/metatag_migrate.module
@@ -0,0 +1,71 @@
+<?php
+
+/**
+ * @file
+ * Contains metatag_migrate.module.
+ */
+
+use Drupal\Core\Database\Query\SelectInterface;
+use Drupal\migrate\Plugin\migrate\destination\EntityContentBase;
+use Drupal\migrate\Plugin\migrate\source\SqlBase;
+use Drupal\migrate\Plugin\MigrateSourceInterface;
+use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\migrate\Row;
+
+/**
+ * Implement hook_migrate_prepare_row().
+ *
+ * @param Row $row
+ * @param MigrateSourceInterface $source
+ * @param MigrationInterface $migration
+ * @return bool
+ */
+function metatag_migrate_migrate_prepare_row(Row $row, MigrateSourceInterface $source, MigrationInterface $migration) {
+  // @todo Write a more general version rather than hard-coded.
+  $source_can_have_metatags = in_array($source->getPluginId(), [
+    'd7_node',
+    'd7_node_revision',
+    'taxonomy_term',
+    'd7_user'
+  ]);
+  if ($source_can_have_metatags && $migration->getDestinationPlugin() instanceof EntityContentBase) {
+    $entity_type = NULL;
+    $entity_id = NULL;
+    $revision_id = NULL;
+
+    // @todo Write a more general version rather than switch statement.
+    switch ($source->getPluginId()) {
+      case 'd7_node':
+      case 'd7_node_revision':
+        $entity_type = 'node';
+        $entity_id = $row->getSourceProperty('nid');
+        $revision_id = $row->getSourceProperty('vid');
+        break;
+
+      case 'taxonomy_term':
+        $entity_type = 'taxonomy_term';
+        $entity_id = $row->getSourceProperty('tid');
+        break;
+
+      case 'd7_user':
+        $entity_type = 'user';
+        $entity_id = $row->getSourceProperty('uid');
+        break;
+    }
+
+    /** @var SqlBase $source */
+    /** @var SelectInterface $query */
+    $query = $source->getDatabase()->select('metatag', 'm')
+      ->fields('m', ['data'])
+      ->condition('entity_type', $entity_type)
+      ->condition('entity_id', $entity_id);
+    if (!is_null($revision_id)) {
+      $query->condition('revision_id', $revision_id);
+    }
+    $metatag_value = [];
+    foreach ($query->execute() as $metatag_row) {
+      $metatag_value[]['value'] = $metatag_row->data;
+    }
+    $row->setSourceProperty('field_metatag', $metatag_value);
+  }
+}
diff --git a/metatag_migrate/metatag_migrate.services.yml b/metatag_migrate/metatag_migrate.services.yml
new file mode 100644
index 0000000..255c87e
--- /dev/null
+++ b/metatag_migrate/metatag_migrate.services.yml
@@ -0,0 +1,5 @@
+services:
+  metatag_migrate.migration_subscriber:
+    class: Drupal\metatag_migrate\EventSubscriber\MigrationSubscriber
+    tags:
+      - { name: event_subscriber }
diff --git a/metatag_migrate/migration_templates/d7_metatag_field.yml b/metatag_migrate/migration_templates/d7_metatag_field.yml
new file mode 100644
index 0000000..db2d65a
--- /dev/null
+++ b/metatag_migrate/migration_templates/d7_metatag_field.yml
@@ -0,0 +1,19 @@
+id: d7_metatag_field
+label: Metatag field
+migration_tags:
+  - Drupal 7
+source:
+  plugin: d7_metatag_field
+  constants:
+    status: true
+    langcode: und
+    field_name: field_metatag
+    type: metatag
+process:
+  entity_type: entity_type
+  status: 'constants/status'
+  langcode: 'constants/langcode'
+  field_name: 'constants/field_name'
+  type: 'constants/type'
+destination:
+  plugin: entity:field_storage_config
diff --git a/metatag_migrate/migration_templates/d7_metatag_field_instance.yml b/metatag_migrate/migration_templates/d7_metatag_field_instance.yml
new file mode 100644
index 0000000..40ffd17
--- /dev/null
+++ b/metatag_migrate/migration_templates/d7_metatag_field_instance.yml
@@ -0,0 +1,20 @@
+id: d7_metatag_field_instance
+label: Metatag field instance
+migration_tags:
+  - Drupal 7
+source:
+  plugin: d7_metatag_field_instance
+  constants:
+    field_name: field_metatag
+    label: Metatags
+process:
+  entity_type: entity_type
+  field_name: 'constants/field_name'
+  bundle: bundle
+  label: 'constants/label'
+destination:
+  plugin: entity:field_config
+migration_dependencies:
+  required:
+    - d7_metatag_field
+    - d7_node_type
diff --git a/metatag_migrate/migration_templates/d7_metatag_field_instance_widget_settings.yml b/metatag_migrate/migration_templates/d7_metatag_field_instance_widget_settings.yml
new file mode 100644
index 0000000..e8d78b7
--- /dev/null
+++ b/metatag_migrate/migration_templates/d7_metatag_field_instance_widget_settings.yml
@@ -0,0 +1,20 @@
+id: d7_metatag_field_instance_widget_settings
+label: Metatag field instance widget settings
+migration_tags:
+  - Drupal 7
+source:
+  plugin: d7_metatag_field_instance
+  constants:
+    form_mode: default
+    field_name: field_metatag
+    entity_type: node
+process:
+  bundle: bundle
+  form_mode: 'constants/form_mode'
+  field_name: 'constants/field_name'
+  entity_type: 'constants/entity_type'
+destination:
+  plugin: component_entity_form_display
+migration_dependencies:
+  required:
+    - d7_metatag_field_instance
diff --git a/metatag_migrate/src/EventSubscriber/MigrationSubscriber.php b/metatag_migrate/src/EventSubscriber/MigrationSubscriber.php
new file mode 100644
index 0000000..2833489
--- /dev/null
+++ b/metatag_migrate/src/EventSubscriber/MigrationSubscriber.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\metatag_migrate\EventSubscriber\MigrationSubscriber.
+ */
+
+namespace Drupal\metatag_migrate\EventSubscriber;
+
+use Drupal\migrate\Event\MigrateEvents;
+use Drupal\migrate\Event\MigrateImportEvent;
+use Drupal\migrate\Plugin\migrate\destination\EntityContentBase;
+use Drupal\migrate\Plugin\Migration;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * Code to run in conjunction with migrations.
+ */
+class MigrationSubscriber implements EventSubscriberInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents() {
+    $events[MigrateEvents::PRE_IMPORT] = 'onMigrationPreImport';
+    return $events;
+  }
+
+  /**
+   * Edits migrations prior to import.
+   *
+   * @param \Drupal\migrate\Event\MigrateImportEvent $event
+   *   The event to process.
+   */
+  public function onMigrationPreImport(MigrateImportEvent $event) {
+    /** @var Migration $migration */
+    $migration = $event->getMigration();
+    if ($migration->getDestinationPlugin() instanceof EntityContentBase) {
+      $process = $migration->getProcess();
+      $process['field_metatag'] = 'field_metatag';
+      $migration->setProcess($process);
+
+      $migration_dependencies = $migration->getMigrationDependencies();
+      $migration_dependencies['required'][] = 'd7_metatag_field_instance';
+      $migration->set('migration_dependencies', $migration_dependencies);
+    }
+  }
+
+}
diff --git a/metatag_migrate/src/Plugin/migrate/source/d7/MetatagField.php b/metatag_migrate/src/Plugin/migrate/source/d7/MetatagField.php
new file mode 100644
index 0000000..4709be1
--- /dev/null
+++ b/metatag_migrate/src/Plugin/migrate/source/d7/MetatagField.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\metatag_migrate\Plugin\migrate\source\d7\MetatagField.
+ */
+
+namespace Drupal\metatag_migrate\Plugin\migrate\source\d7;
+
+use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+
+/**
+ * Drupal 7 metatag field.
+ *
+ * @MigrateSource(
+ *   id = "d7_metatag_field"
+ * )
+ */
+class MetatagField extends DrupalSqlBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    return $this->select('metatag', 'm')
+      ->fields('m', ['entity_type'])
+      ->groupBy('entity_type');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    $fields = array('entity_type' => $this->t('Entity type'));
+    return $fields;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    $ids['entity_type']['type'] = 'string';
+    return $ids;
+  }
+
+}
diff --git a/metatag_migrate/src/Plugin/migrate/source/d7/MetatagFieldInstance.php b/metatag_migrate/src/Plugin/migrate/source/d7/MetatagFieldInstance.php
new file mode 100644
index 0000000..5962bbe
--- /dev/null
+++ b/metatag_migrate/src/Plugin/migrate/source/d7/MetatagFieldInstance.php
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\metatag_migrate\Plugin\migrate\source\d7\MetatagFieldInstance.
+ */
+
+namespace Drupal\metatag_migrate\Plugin\migrate\source\d7;
+
+use Drupal\Core\Entity\Entity;
+use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+
+/**
+ * Drupal 7 metatag field instances.
+ *
+ * @MigrateSource(
+ *   id = "d7_metatag_field_instance"
+ * )
+ */
+class MetatagFieldInstance extends DrupalSqlBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    return $this->select('metatag', 'm')
+      ->fields('m', ['entity_type'])
+      ->groupBy('entity_type');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    return array(
+      'entity_type' => $this->t('Entity type'),
+      'bundle' => $this->t('Bundle'),
+    );
+  }
+
+  /**
+   * Returns each entity_type/bundle pair.
+   */
+  public function initializeIterator() {
+    $bundles = [];
+    foreach (parent::initializeIterator() as $instance) {
+      $bundle_info = \Drupal::getContainer()
+        ->get('entity_type.bundle.info')
+        ->getBundleInfo($instance['entity_type']);
+      foreach (array_keys($bundle_info) as $bundle) {
+        $bundles[] = [
+          'entity_type' => $instance['entity_type'],
+          'bundle' => $bundle
+        ];
+      }
+    }
+    return new \ArrayIterator($bundles);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    $ids['entity_type']['type'] = 'string';
+    $ids['bundle']['type'] = 'string';
+    return $ids;
+  }
+
+}
