diff --git a/core/modules/migrate/src/Plugin/migrate/process/MenuLinkParent.php b/core/modules/migrate/src/Plugin/migrate/process/MenuLinkParent.php
index 0cb7c68..852c2fc 100644
--- a/core/modules/migrate/src/Plugin/migrate/process/MenuLinkParent.php
+++ b/core/modules/migrate/src/Plugin/migrate/process/MenuLinkParent.php
@@ -15,7 +15,37 @@
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
- * This plugin figures out menu link parent plugin IDs.
+ * Determines the parent of a menu link.
+ *
+ * Available configuration keys:
+ * - 'skip_row': If set, a MigrateSkipRowException is thrown if the parent
+ *   cannot be ascertained. Defaults to TRUE.
+ *
+ * The source is an array of three values:
+ * - parent_id: The numeric ID of the parent menu link, or 0 if the link is at
+ *   the top level of its menu.
+ * - menu_name: The menu name. All links with the same menu name (such as
+ *   'navigation') are part of the same menu.
+ * - parent_link_path: The Drupal path or external URL this link points to.
+ *
+ * Example:
+ *
+ * @code
+ * process:
+ *   parent:
+ *     plugin: menu_link_parent
+ *     source:
+ *       - '20'
+ *       - 'admin'
+ *       - 'admin/structure'
+ * @endcode
+ *
+ * In this example the parent_id of '20' will be looked up and returned from
+ * amongst the already migrated IDs. If it is not found then the
+ * parent_link_path of 'admin/structure' is loaded from the 'admin' menu, the
+ * given menu_name.
+ *
+ * @see \Drupal\migrate\Plugin\MigrateProcessInterface
  *
  * @MigrateProcessPlugin(
  *   id = "menu_link_parent"
@@ -24,16 +54,22 @@
 class MenuLinkParent extends ProcessPluginBase implements ContainerFactoryPluginInterface {
 
   /**
+   * The menu link plugin manager.
+   *
    * @var \Drupal\Core\Menu\MenuLinkManagerInterface
    */
   protected $menuLinkManager;
 
   /**
+   * A fully configured instance of the migration process plugin.
+   *
    * @var \Drupal\migrate\Plugin\MigrateProcessInterface
    */
   protected $migrationPlugin;
 
   /**
+   * The menu link entity storage handler.
+   *
    * @var \Drupal\Core\Entity\EntityStorageInterface
    */
   protected $menuLinkStorage;
@@ -42,6 +78,9 @@ class MenuLinkParent extends ProcessPluginBase implements ContainerFactoryPlugin
    * {@inheritdoc}
    */
   public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrateProcessInterface $migration_plugin, MenuLinkManagerInterface $menu_link_manager, EntityStorageInterface $menu_link_storage) {
+    $configuration += [
+      'skip_row' => TRUE,
+    ];
     parent::__construct($configuration, $plugin_id, $plugin_definition);
     $this->migrationPlugin = $migration_plugin;
     $this->menuLinkManager = $menu_link_manager;
@@ -52,7 +91,9 @@ public function __construct(array $configuration, $plugin_id, $plugin_definition
    * {@inheritdoc}
    */
   public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) {
-    $migration_configuration['migration'][] = $migration->id();
+    $migration_configuration = [
+      'migration' => [$migration->id()],
+    ];
     return new static(
       $configuration,
       $plugin_id,
@@ -65,39 +106,47 @@ public static function create(ContainerInterface $container, array $configuratio
 
   /**
    * {@inheritdoc}
-   *
-   * Find the parent link GUID.
    */
   public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
     $parent_id = array_shift($value);
+    // If the parent ID is empty, it's a top-level menu item.
     if (!$parent_id) {
-      // Top level item.
       return '';
     }
-    try {
-      $already_migrated_id = $this
-        ->migrationPlugin
-        ->transform($parent_id, $migrate_executable, $row, $destination_property);
-      if ($already_migrated_id && ($link = $this->menuLinkStorage->load($already_migrated_id))) {
-        return $link->getPluginId();
-      }
-    }
-    catch (MigrateSkipRowException $e) {
 
+    // Try to look up the parent menu link ID from among the ones that have
+    // already been migrated.
+    $already_migrated_id = $this
+      ->migrationPlugin
+      ->transform($parent_id, $migrate_executable, $row, $destination_property);
+
+    if ($already_migrated_id) {
+      $link = $this->menuLinkStorage->load($already_migrated_id);
     }
-    if (isset($value[1])) {
+
+    if ($value) {
       list($menu_name, $parent_link_path) = $value;
+      // Strip any leading slashes off the parent path.
+      $parent_link_path = ltrim($parent_link_path, '/');
+
       $url = Url::fromUserInput("/$parent_link_path");
       if ($url->isRouted()) {
         $links = $this->menuLinkManager->loadLinksByRoute($url->getRouteName(), $url->getRouteParameters(), $menu_name);
-        if (count($links) == 1) {
-          /** @var \Drupal\Core\Menu\MenuLinkInterface $link */
+        // If at least one link with the parent_link_path exists, use it.
+        if ($links) {
           $link = reset($links);
-          return $link->getPluginId();
         }
       }
     }
-    throw new MigrateSkipRowException();
+
+    /** @var \Drupal\Core\Menu\MenuLinkInterface $link */
+    if (isset($link)) {
+      return $link->getPluginId();
+    }
+    // TODO: Remove this behavior and the skip_row configuration option.
+    elseif (!empty($this->configuration['skip_row'])) {
+      throw new MigrateSkipRowException();
+    }
   }
 
 }
