diff --git a/flag.info b/flag.info
index 426fc47..d97fe74 100644
--- a/flag.info
+++ b/flag.info
@@ -18,6 +18,7 @@ files[] = includes/flag.cookie_storage.inc
 
 files[] = includes/flag.entity.inc
 files[] = flag.rules.inc
+files[] = flag.migrate.inc
 
 ; Views
 files[] = includes/views/flag_handler_argument_entity_id.inc
diff --git a/flag.migrate.inc b/flag.migrate.inc
new file mode 100644
index 0000000..93bb4d2
--- /dev/null
+++ b/flag.migrate.inc
@@ -0,0 +1,171 @@
+<?php
+
+/**
+ * @file
+ * Support for processing Flag in Migrate.
+ */
+
+/**
+ * Destination class implementing migration into flaggings.
+ */
+class MigrateDestinationFlag extends MigrateDestinationEntity {
+
+  /**
+   * @var flag_flag The flag object.
+   */
+  protected $flag;
+
+  /**
+   * Assigns the object fid.
+   *
+   * @param string $flag_name
+   *    Flag machine name.
+   */
+  public function __construct($flag_name) {
+    parent::__construct('flagging', $flag_name);
+    $this->flag = flag_get_flag($flag_name);
+  }
+
+  /**
+   * Description of the destination being migrated into.
+   *
+   * @return string
+   *   Returns "flag [flag_machine_name]".
+   */
+  public function __toString() {
+    return t('flag (!flag)', array('!flag' => $this->flag->name));
+  }
+
+  /**
+   * Static provides the destination table schema.
+   *
+   * @return array
+   *    Returns the destination table schema as an array.
+   */
+  static public function getKeySchema() {
+    return array(
+      'flagging_id' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+      ),
+    );
+  }
+
+  /**
+   * Delete each matching flagging_id.
+   *
+   * @param array $key
+   *   ID to be deleted.
+   */
+  public function rollback(array $key) {
+    $flagging_id = reset($key);
+
+    migrate_instrument_start(__METHOD__);
+
+    migrate_instrument_start('flagging_load');
+    $flagging = flagging_load($flagging_id);
+    migrate_instrument_stop('flagging_load');
+
+    migrate_instrument_start('flag_flag::unflag');
+    $this->flag->flag('unflag', $flagging->entity_id, $flagging->uid, TRUE, $flagging);
+    migrate_instrument_stop('flag_flag::unflag');
+
+    migrate_instrument_stop(__METHOD__);
+  }
+
+  /**
+   * Import a single flagging record.
+   *
+   * @param object $entity
+   *   Object to build. Pre-filled with any fields mapped in the
+   *   Migration.
+   * @param object $row
+   *   Raw source data object - passed through to prepare/complete handlers.
+   *
+   * @return array
+   *   Array of key fields of the object that was saved if
+   *   successful. FALSE on failure.
+   */
+  public function import(stdClass $entity, stdClass $row) {
+    // Updating previously-migrated content?
+    if (isset($row->migrate_map_destid1)) {
+      $updating = TRUE;
+      if (isset($entity->flagging_id)) {
+        if ($entity->flagging_id != $row->migrate_map_destid1) {
+          throw new MigrateException(t("Incoming id !id and map destination id !destid don't match.",
+            array('!id' => $entity->flagging_id, '!destid' => $row->migrate_map_destid1)));
+        }
+      }
+      else {
+        $entity->flagging_id = $row->migrate_map_destid1;
+      }
+
+      $flagging = flagging_load($entity->flagging_id);
+    }
+    else {
+      $updating = FALSE;
+
+      $uid = isset($entity->uid) ? $entity->uid : NULL;
+      $sid = isset($entity->sid) ? $entity->sid : NULL;
+
+      // The entity could still have been flagged though.
+      $flagging = $this->flag->get_flagging_record($entity->entity_id, $uid, $sid);
+
+      // If it's not, clear out the flagging_id, just to be safe.
+      if (!$flagging) {
+        unset($entity->flagging_id);
+        $flagging = $this->flag->new_flagging($entity->entity_id, $uid, $sid);
+      }
+    }
+
+    // Ensure the bundle name is present.
+    $flagging->flag_name = $this->flag->name;
+    $account = (!empty($entity->uid)) ? user_load($entity->uid) : NULL;
+
+    $this->prepare($flagging, $row);
+
+    migrate_instrument_start('flagging_save');
+    $return = $this->flag->flag('flag', $entity->entity_id, $account, TRUE, $flagging);
+    migrate_instrument_stop('flagging_save');
+    if ($return) {
+      if ($updating) {
+        $this->numUpdated++;
+      }
+      else {
+        $this->numCreated++;
+      }
+    }
+    else {
+      return FALSE;
+    }
+
+    $this->complete($flagging, $row);
+
+    return array($flagging->flagging_id);
+  }
+
+  /**
+   * List of available destination fields.
+   *
+   * @return array
+   *    Returns the list as an array.
+   */
+  public function fields($migration = NULL) {
+    $fields = array(
+      'flagging_id' => t('Flagging ID'),
+      'fid' => t('Flag ID'),
+      'entity_type' => t('Entity Type'),
+      'entity_id' => t('Entity ID'),
+      'uid' => t('User ID'),
+      'sid' => t('Session ID'),
+      'timestamp' => t('Timestamp'),
+    );
+
+    // Then add in anything provided by handlers
+    $fields += migrate_handler_invoke_all('Entity', 'fields', $this->entityType, $this->bundle, $migration);
+    $fields += migrate_handler_invoke_all('Flag', 'fields', $this->entityType, $this->bundle, $migration);
+
+    return $fields;
+  }
+
+}
