diff --git a/core/modules/shortcut/migration_templates/d7_shortcut.yml b/core/modules/shortcut/migration_templates/d7_shortcut.yml
new file mode 100644
index 0000000..3600156
--- /dev/null
+++ b/core/modules/shortcut/migration_templates/d7_shortcut.yml
@@ -0,0 +1,31 @@
+id: d7_shortcut
+label: Drupal 7 shortcut links
+migration_tags:
+  - Drupal 7
+source:
+  plugin: d7_shortcut
+  constants:
+    uri_scheme: 'internal:/'
+process:
+  shortcut_set:
+    -
+      plugin: static_map
+      bypass: true
+      source: menu_name
+      map:
+        shortcut-set-1: default
+    -
+      plugin: machine_name
+      field: shortcut_set
+  title: link_title
+  weight: weight
+  link:
+    plugin: concat
+    source:
+      - constants/uri_scheme
+      - link_path
+destination:
+  plugin: entity:shortcut
+migration_dependencies:
+  required:
+    - d7_shortcut_set
\ No newline at end of file
diff --git a/core/modules/shortcut/migration_templates/d7_shortcut_set.yml b/core/modules/shortcut/migration_templates/d7_shortcut_set.yml
new file mode 100644
index 0000000..f60a95d
--- /dev/null
+++ b/core/modules/shortcut/migration_templates/d7_shortcut_set.yml
@@ -0,0 +1,20 @@
+id: d7_shortcut_set
+label: Drupal 7 shortcut sets
+migration_tags:
+  - Drupal 7
+source:
+  plugin: d7_shortcut_set
+process:
+  id:
+    -
+      plugin: static_map
+      bypass: true
+      source: set_name
+      map:
+        shortcut-set-1: default
+    -
+      plugin: machine_name
+      field: id
+  label: title
+destination:
+  plugin: entity:shortcut_set
\ No newline at end of file
diff --git a/core/modules/shortcut/migration_templates/d7_shortcut_set_users.yml b/core/modules/shortcut/migration_templates/d7_shortcut_set_users.yml
new file mode 100644
index 0000000..284d64a
--- /dev/null
+++ b/core/modules/shortcut/migration_templates/d7_shortcut_set_users.yml
@@ -0,0 +1,24 @@
+id: d7_shortcut_set_users
+label: Drupal 7 Shortcut set user mapping
+migration_tags:
+  - Drupal 7
+source:
+  plugin: d7_shortcut_set_users
+process:
+  uid: uid
+  set_name:
+    -
+      plugin: static_map
+      bypass: true
+      source: set_name
+      map:
+        shortcut-set-1: default
+    -
+      plugin: machine_name
+      field: set_name
+destination:
+  plugin: shortcut_set_users
+migration_dependencies:
+  required:
+    - d7_shortcut_set
+    - d7_user
\ No newline at end of file
diff --git a/core/modules/shortcut/src/Plugin/migrate/destination/EntityShortcutSet.php b/core/modules/shortcut/src/Plugin/migrate/destination/EntityShortcutSet.php
new file mode 100644
index 0000000..e93699e
--- /dev/null
+++ b/core/modules/shortcut/src/Plugin/migrate/destination/EntityShortcutSet.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\shortcut\Plugin\migrate\destination\EntityShortcutSet.
+ */
+
+namespace Drupal\shortcut\Plugin\migrate\destination;
+
+use Drupal\migrate\Row;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\migrate\Plugin\migrate\destination\EntityConfigBase;
+
+/**
+ * @MigrateDestination(
+ *   id = "entity:shortcut_set"
+ * )
+ */
+class EntityShortcutSet extends EntityConfigBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEntity(Row $row, array $old_destination_id_values) {
+    $entity = parent::getEntity($row, $old_destination_id_values);
+    // Set the "syncing" flag to TRUE, to avoid duplication of default shortcut links
+    $entity->setSyncing(TRUE);
+    return $entity;
+  }
+}
diff --git a/core/modules/shortcut/src/Plugin/migrate/destination/ShortcutSetUsers.php b/core/modules/shortcut/src/Plugin/migrate/destination/ShortcutSetUsers.php
new file mode 100644
index 0000000..6d56ffd
--- /dev/null
+++ b/core/modules/shortcut/src/Plugin/migrate/destination/ShortcutSetUsers.php
@@ -0,0 +1,105 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\shortcut\Plugin\migrate\destination\ShortcutSetUsers.
+ */
+
+namespace Drupal\shortcut\Plugin\migrate\destination;
+
+use Drupal\shortcut\ShortcutSetStorageInterface;
+use Drupal\shortcut\ShortcutSetInterface;
+use Drupal\Core\Database\Connection;
+use Drupal\user\Entity\User;
+use Drupal\migrate\Entity\MigrationInterface;
+use Drupal\migrate\Row;
+use Drupal\migrate\Plugin\migrate\destination\DestinationBase;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+
+/**
+ * @MigrateDestination(
+ *   id = "shortcut_set_users"
+ * )
+ */
+class ShortcutSetUsers extends DestinationBase implements ContainerFactoryPluginInterface {
+  /**
+   * Active database connection.
+   *
+   * @var \Drupal\Core\Database\Connection
+   */
+  protected $database;
+
+  /**
+   * The shortcut_set storage.
+   *
+   * @var \Drupal\shortcut\ShortcutSetStorageInterface
+   */
+  protected $shortcutSetStorage;
+
+  /**
+   * Constructs an entity destination plugin.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param MigrationInterface $migration
+   *   The migration.
+   * @param \Drupal\Core\Path\AliasStorage $alias_storage
+   *   The alias storage service.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, Connection $database, ShortcutSetStorageInterface $shortcut_set_storage) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition, $migration);
+    $this->database = $database;
+    $this->shortcutSetStorage = $shortcut_set_storage;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $migration,
+      $container->get('database'),
+      $container->get('entity.manager')->getStorage('shortcut_set')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    $ids['uid']['type'] = 'integer';
+    return $ids;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields(MigrationInterface $migration = NULL) {
+    return [
+      'uid' => 'The users.uid for this set.',
+      'source' => 'The shortcut_set.set_name that will be displayed for this user.',
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function import(Row $row, array $old_destination_id_values = array()) {
+    $set = $this->shortcutSetStorage->load($row->getDestinationProperty('set_name'));
+    if ($set) {
+      $account = User::load($row->getDestinationProperty('uid'));
+      if ($account) {
+        $this->shortcutSetStorage->assignUser($set, $account);
+      }
+    }
+    return TRUE;
+  }
+}
\ No newline at end of file
diff --git a/core/modules/shortcut/src/Plugin/migrate/source/d7/Shortcut.php b/core/modules/shortcut/src/Plugin/migrate/source/d7/Shortcut.php
new file mode 100644
index 0000000..ba4e778
--- /dev/null
+++ b/core/modules/shortcut/src/Plugin/migrate/source/d7/Shortcut.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\shortcut\Plugin\migrate\source\d7\Shortcut.
+ */
+
+namespace Drupal\shortcut\Plugin\migrate\source\d7;
+
+use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+
+/**
+ * Drupal 7 shortcut links source from database.
+ *
+ * @MigrateSource(
+ *   id = "d7_shortcut"
+ * )
+ */
+class Shortcut extends DrupalSqlBase {
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    $query = $this->select('menu_links', 'ml')
+      ->fields('ml', array('mlid', 'menu_name', 'link_path', 'link_title', 'weight'))
+      ->condition('hidden', '0')
+      ->condition('menu_name', 'shortcut-set-%', 'LIKE');
+    return $query;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    return array(
+      'mlid' => $this->t("The menu.mlid primary key for this menu item (= shortcut link)."),
+      'menu_name' => $this->t("The menu_name (= set name) for this shortcut link."),
+      'link_path' => $this->t("The link for this shortcut."),
+      'link_title' => $this->t("The title for this shortcut."),
+      'weight' => $this->t("The weight for this shortcut"),
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    $ids['mlid']['type'] = 'integer';
+    return $ids;
+  }
+}
\ No newline at end of file
diff --git a/core/modules/shortcut/src/Plugin/migrate/source/d7/ShortcutSet.php b/core/modules/shortcut/src/Plugin/migrate/source/d7/ShortcutSet.php
new file mode 100644
index 0000000..bfb627b
--- /dev/null
+++ b/core/modules/shortcut/src/Plugin/migrate/source/d7/ShortcutSet.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\shortcut\Plugin\migrate\source\d7\ShortcutSet.
+ */
+
+namespace Drupal\shortcut\Plugin\migrate\source\d7;
+
+use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+
+/**
+ * Drupal 7 shortcut_set source from database.
+ *
+ * @MigrateSource(
+ *   id = "d7_shortcut_set"
+ * )
+ */
+class ShortcutSet extends DrupalSqlBase {
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    $query = $this->select('shortcut_set', 'ss')
+      ->fields('ss', array('set_name', 'title'));
+    return $query;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    return array(
+      'set_name' => $this->t("The name under which the set's links are stored."),
+      'title' => $this->t("The title of the set."),
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    $ids['set_name']['type'] = 'string';
+    return $ids;
+  }
+}
\ No newline at end of file
diff --git a/core/modules/shortcut/src/Plugin/migrate/source/d7/ShortcutSetUsers.php b/core/modules/shortcut/src/Plugin/migrate/source/d7/ShortcutSetUsers.php
new file mode 100644
index 0000000..847f533
--- /dev/null
+++ b/core/modules/shortcut/src/Plugin/migrate/source/d7/ShortcutSetUsers.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\shortcut\Plugin\migrate\source\d7\ShortcutSetUsers.
+ */
+
+namespace Drupal\shortcut\Plugin\migrate\source\d7;
+
+use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase;
+
+/**
+ * Drupal 7 shortcut_set_users source from database.
+ *
+ * @MigrateSource(
+ *   id = "d7_shortcut_set_users"
+ * )
+ */
+class ShortcutSetUsers extends DrupalSqlBase {
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    $query = $this->select('shortcut_set_users', 'ssu')
+      ->fields('ssu', array('uid', 'set_name'));
+    return $query;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields() {
+    return array(
+      'uid' => $this->t('The users.uid for this set.'),
+      'set_name' => $this->t('The shortcut_set.set_name that will be displayed for this user.'),
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIds() {
+    $ids['uid']['type'] = 'integer';
+    return $ids;
+  }
+}
\ No newline at end of file
