diff --git a/migrations/d7_flag.yml b/migrations/d7_flag.yml
new file mode 100644
index 0000000..a31b23e
--- /dev/null
+++ b/migrations/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/migrations/d7_flagging.yml b/migrations/d7_flagging.yml
new file mode 100644
index 0000000..2d7836a
--- /dev/null
+++ b/migrations/d7_flagging.yml
@@ -0,0 +1,19 @@
+id: d7_flagging
+label: Flagging
+migration_tags:
+  - Drupal 7
+source:
+  plugin: d7_flagging
+process:
+  id: flagging_id
+  flag_id: name
+  entity_type: entity_type
+  entity_id: entity_id
+  global: global
+  uid: uid
+  created: timestamp
+destination:
+  plugin: entity:flagging
+migration_dependencies:
+  required:
+    - d7_flag
diff --git a/src/Plugin/migrate/source/d7/Flag.php b/src/Plugin/migrate/source/d7/Flag.php
new file mode 100644
index 0000000..a35c716
--- /dev/null
+++ b/src/Plugin/migrate/source/d7/Flag.php
@@ -0,0 +1,87 @@
+<?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 [
+      'fid' => $this->t('The unique ID for this particular flag.'),
+      'entity_type' => $this->t('The entity type of the flaged entity.'),
+      'name' => $this->t('The machine name of the flag.'),
+      'title' => $this->t('The human readable title of the flag.'),
+      'global' => $this->t('Whether this flag state should act as a single toggle to all users across the site.'),
+      'options' => $this->t('Flag options.'),
+      'default_weight' => $this->t('Default weight applied to new items.'),
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function prepareRow(Row $row) {
+    $source_options = unserialize($row->getSourceProperty('options'));
+    $row->setSourceProperty('options', $source_options);
+
+    $flag_entity_type = $row->getSourceProperty('entity_type');
+    $row->setSourceProperty('flag_type', 'entity:' . $flag_entity_type);
+
+    $bundles = [];
+    $d7_bundles = $this->select('flag_types', 'ft')
+      ->fields('ft', ['type'])
+      ->condition('fid', $row->getSourceProperty('fid'))
+      ->execute();
+
+    while ($bundle = $d7_bundles->fetchAssoc()) {
+      $bundles[] = $bundle['type'];
+    }
+
+    $row->setSourceProperty('bundles', $bundles);
+
+    $flagTypeConfig = [];
+    $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);
+
+    $linkTypeConfig = [];
+    $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;
+  }
+
+}
diff --git a/src/Plugin/migrate/source/d7/Flagging.php b/src/Plugin/migrate/source/d7/Flagging.php
new file mode 100644
index 0000000..cb4f0f3
--- /dev/null
+++ b/src/Plugin/migrate/source/d7/Flagging.php
@@ -0,0 +1,89 @@
+<?php
+
+namespace Drupal\flag\Plugin\migrate\source\d7;
+
+use Drupal\migrate_drupal\Plugin\migrate\source\d7\FieldableEntity;
+use Drupal\migrate\Row;
+
+/**
+ * Drupal 7 Flag source from database.
+ *
+ * @MigrateSource(
+ *   id = "d7_flagging",
+ *   source_provider = "flag"
+ * )
+ */
+class Flagging extends FieldableEntity {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    $query = $this->select('flagging', 'fi');
+
+    $query->join('flag', 'f', 'f.fid = fi.fid');
+
+    $query->fields('fi', [
+      'flagging_id',
+      'fid',
+      'entity_type',
+      'entity_id',
+      'uid',
+      'sid',
+      'timestamp',
+    ]);
+
+    $query->fields('f', [
+      'name',
+      'global',
+    ]);
+
+    // If a flag type is provided, only migrate flaggings for that flag.
+    if (isset($this->configuration['flag_type'])) {
+      $query->condition('f.name', $this->configuration['flag_type']);
+    }
+
+    $query->orderBy('fi.timestamp');
+
+    return $query;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    return [
+      'flagging_id' => $this->t('The unique ID for this particular tag.'),
+      'fid' => $this->t('The unique flag ID this object has been flagged with, from flag.'),
+      'entity_type' => $this->t('The entity type of the flagged entity.'),
+      'entity_id' => $this->t('The unique ID of the flagged entity, for example the uid, cid, or nid.'),
+      'uid' => $this->t('The user ID by whom this object was flagged.'),
+      'sid' => $this->t('The user’s numeric sid from the session_api table.'),
+      'timestamp' => $this->t('The UNIX time stamp representing when the flag was set.'),
+      'name' => $this->t('The machine name of the flag.'),
+      'global' => $this->t('If the flag is global.'),
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function prepareRow(Row $row) {
+    // Get Field API field values.
+    foreach (array_keys($this->getFields('flagging', $row->getSourceProperty('name'))) as $field) {
+      $flagging_id = $row->getSourceProperty('flagging_id');
+      $row->setSourceProperty($field, $this->getFieldValues('flagging', $field, $flagging_id));
+    }
+
+    return parent::prepareRow($row);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    $ids['flagging_id']['type'] = 'integer';
+    return $ids;
+  }
+
+}
