diff --git a/migration_templates/d7_flag.yml b/migration_templates/d7_flag.yml
new file mode 100644
index 0000000..a31b23e
--- /dev/null
+++ b/migration_templates/d7_flag.yml
@@ -0,0 +1,33 @@
+id: d7_flag
+label: Flag configuration
+migration_tags:
+  - Drupal 7
+source:
+  plugin: d7_flag
+process:
+  id: name
+  label: title
+  bundles: bundles
+  entity_type: entity_type
+  global: global
+  weight: 'options/weight'
+  flag_short: 'options/flag_short'
+  flag_long: 'options/flag_long'
+  flag_message: 'options/flag_message'
+  unflag_short: 'options/unflag_short'
+  unflag_long: 'options/unflag_long'
+  unflag_message: 'options/unflag_message'
+  unflag_denied_text: 'options/unflag_denied_text'
+  flag_type: flag_type
+  link_type:
+    plugin: static_map
+    source: 'options/link_type'
+    map:
+      toggle: ajax_link
+      normal: reload
+      confirm: confirm
+      form: field_entry
+  flagTypeConfig: flagTypeConfig
+  linkTypeConfig: linkTypeConfig
+destination:
+  plugin: entity:flag
diff --git a/src/Plugin/migrate/destination/EntityFlag.php b/src/Plugin/migrate/destination/EntityFlag.php
new file mode 100644
index 0000000..f608d9c
--- /dev/null
+++ b/src/Plugin/migrate/destination/EntityFlag.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace Drupal\flag\Plugin\migrate\destination;
+
+use Drupal\migrate\Plugin\migrate\destination\EntityConfigBase;
+use Drupal\migrate\Row;
+
+/**
+ * @MigrateDestination(
+ *   id = "entity:flag"
+ * )
+ */
+class EntityFlag extends EntityConfigBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function import(Row $row, array $old_destination_id_values = array()) {
+    $entity_ids = parent::import($row, $old_destination_id_values);
+    return $entity_ids;
+  }
+
+}
diff --git a/src/Plugin/migrate/source/d7/Flag.php b/src/Plugin/migrate/source/d7/Flag.php
new file mode 100644
index 0000000..6709eff
--- /dev/null
+++ b/src/Plugin/migrate/source/d7/Flag.php
@@ -0,0 +1,86 @@
+<?php
+
+namespace Drupal\flag\Plugin\migrate\source\d7;
+
+use Drupal\migrate\Row;
+use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+
+/**
+ * Drupal 7 Flag source from database.
+ *
+ * @MigrateSource(
+ *   id = "d7_flag",
+ *   source_provider = "flag"
+ * )
+ */
+class Flag extends DrupalSqlBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    return $this->select('flag', 'f')->fields('f');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    return array(
+      'fid' => $this->t('The unique ID for this particular flag.'),
+      'entity_type' => $this->t(''),
+      'name' => $this->t(''),
+      'title' => $this->t(''),
+      'global' => $this->t('Whether this flag state should act as a single toggle to all users across the site.'),
+      'options' => $this->t(''),
+      'default_weight' => $this->t(' Default weight applied to new items.'),
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function prepareRow(Row $row) {
+    $source_options = unserialize($row->getSourceProperty('options'));
+    // Flag: entity type
+    // @todo: Hardcoding 'entity:' for now. Should we be setting this dynamically?
+    $flag_entity_type = $row->getSourceProperty('entity_type');
+    $row->setSourceProperty('flag_type', 'entity:' . $flag_entity_type);
+    // Pull some flag config from the D7 options property.
+    $row->setSourceProperty('options', $source_options);
+    // Flag: bundles
+    $bundles = array();
+    $d7_bundles = $this->select('flag_types', 'ft')
+      ->fields('ft', array('type'))
+      ->condition('fid', $row->getSourceProperty('fid'))
+      ->execute();
+    while($bundle = $d7_bundles->fetchAssoc()) {
+      $bundles[] = $bundle['type'];
+    }
+    $row->setSourceProperty('bundles', $bundles);
+    // Flag: flagTypeConfig
+    $flagTypeConfig = array();
+    $flagTypeConfig['show_in_links'] = $source_options['show_in_links'];
+    $flagTypeConfig['show_as_field'] = $source_options['show_as_field'];
+    $flagTypeConfig['show_on_form'] = $source_options['show_on_form'];
+    $flagTypeConfig['access_author'] = $source_options['access_author'];
+    $flagTypeConfig['show_contextual_link'] = $source_options['show_contextual_link'];
+    $row->setSourceProperty('flagTypeConfig', $flagTypeConfig);
+    // Flag: linkTypeConfig
+    $linkTypeConfig = array();
+    $linkTypeConfig['flag_confirmation'] = $source_options['flag_confirmation'];
+    $linkTypeConfig['unflag_confirmation'] = $source_options['unflag_confirmation'];
+    $row->setSourceProperty('linkTypeConfig', $linkTypeConfig);
+
+    return parent::prepareRow($row);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    $ids['fid']['type'] = 'integer';
+    return $ids;
+  }
+
+}
