diff --git a/core/lib/Drupal/Core/Menu/MenuTreeStorage.php b/core/lib/Drupal/Core/Menu/MenuTreeStorage.php
index 7a79fc1..5c9fc12 100644
--- a/core/lib/Drupal/Core/Menu/MenuTreeStorage.php
+++ b/core/lib/Drupal/Core/Menu/MenuTreeStorage.php
@@ -174,8 +174,17 @@ public function rebuild(array $definitions) {
     // Handle any children we didn't find starting from top-level links.
     foreach ($children as $orphan_links) {
       foreach ($orphan_links as $id) {
-        // Force it to the top level.
-        $links[$id]['parent'] = '';
+        // Check for a parent that is not loaded above since only internal links
+        // are loaded above.
+        $parent = $this->loadFull($links[$id]['parent']);
+        // If there is a parent add it to the links to be used in saveRecursive.
+        if ($parent) {
+          $links[$links[$id]['parent']] = $parent;
+        }
+        else {
+          // Force it to the top level.
+          $links[$id]['parent'] = '';
+        }
         $this->saveRecursive($id, $children, $links);
       }
     }
diff --git a/core/modules/system/src/Tests/Menu/MenuTreeStorageTest.php b/core/modules/system/src/Tests/Menu/MenuTreeStorageTest.php
index 57f1f2a..482eea9 100644
--- a/core/modules/system/src/Tests/Menu/MenuTreeStorageTest.php
+++ b/core/modules/system/src/Tests/Menu/MenuTreeStorageTest.php
@@ -320,6 +320,37 @@ public function testSubtreeHeight() {
   }
 
   /**
+   * Ensure hierarchy persists after a menu rebuild.
+   */
+  public function testMenuRebuild() {
+    // root
+    // - child1
+    // -- child2
+    // --- child3
+    // ---- child4
+    $this->addMenuLink('root');
+    $this->addMenuLink('child1', 'root');
+    $this->addMenuLink('child2', 'child1');
+    $this->addMenuLink('child3', 'child2');
+    $this->addMenuLink('child4', 'child3');
+
+    $this->assertEqual($this->treeStorage->getSubtreeHeight('root'), 5);
+    $this->assertEqual($this->treeStorage->getSubtreeHeight('child1'), 4);
+    $this->assertEqual($this->treeStorage->getSubtreeHeight('child2'), 3);
+    $this->assertEqual($this->treeStorage->getSubtreeHeight('child3'), 2);
+    $this->assertEqual($this->treeStorage->getSubtreeHeight('child4'), 1);
+
+    // Intentionally leave child3 out to mimic static or external links.
+    $definitions = $this->treeStorage->loadMultiple(['root', 'child1', 'child2', 'child4']);
+    $this->treeStorage->rebuild($definitions);
+    $this->assertEqual($this->treeStorage->getSubtreeHeight('root'), 5);
+    $this->assertEqual($this->treeStorage->getSubtreeHeight('child1'), 4);
+    $this->assertEqual($this->treeStorage->getSubtreeHeight('child2'), 3);
+    $this->assertEqual($this->treeStorage->getSubtreeHeight('child3'), 2);
+    $this->assertEqual($this->treeStorage->getSubtreeHeight('child4'), 1);
+  }
+
+  /**
    * Tests MenuTreeStorage::loadByProperties().
    */
   public function testLoadByProperties() {
diff --git a/core/modules/views/src/Tests/Plugin/MenuLinkTest.php b/core/modules/views/src/Tests/Plugin/MenuLinkTest.php
new file mode 100644
index 0000000..73929df
--- /dev/null
+++ b/core/modules/views/src/Tests/Plugin/MenuLinkTest.php
@@ -0,0 +1,98 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Tests\Plugin\MenuLinkTest.
+ */
+
+namespace Drupal\views\Tests\Plugin;
+
+use Drupal\views\Tests\ViewTestBase;
+
+/**
+ * Tests the menu links created in views.
+ *
+ * @group views
+ */
+class MenuLinkTest extends ViewTestBase {
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = ['test_menu_link'];
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['views', 'views_ui', 'user', 'node', 'menu_ui', 'block'];
+
+  /**
+   * A user with permission to administer views, menus and view content.
+   *
+   * @var object
+   */
+  protected $adminUser;
+
+  protected function setUp() {
+    parent::setUp();
+
+    $this->enableViewsTestModule();
+
+    $this->adminUser = $this->drupalCreateUser(['administer views', 'administer menu']);
+
+    $this->drupalPlaceBlock('system_menu_block:main');
+
+    $this->drupalCreateContentType(['type' => 'page']);
+
+  }
+
+  /**
+   * Test that secondary level menu links for a page view are not visible.
+   */
+  public function testHierarchicalMenuLinkVisibility() {
+
+    $this->drupalLogin($this->adminUser);
+
+    $node = $this->drupalCreateNode(['type' => 'page']);
+
+    // Create a primary level menu link to the node.
+    $options = [
+      'title' => 'Primary level node',
+      'menu_name' => 'main',
+      'bundle' => 'menu_link_content',
+      'parent' => '',
+      'link' => [['uri' => 'entity:node/' . $node->id()]],
+    ];
+    $link = entity_create('menu_link_content', $options);
+    $link->save();
+
+    $parent_menu_value = 'main:menu_link_content:' . $link->uuid();
+
+    // Alter the view's menu link in view page to use the menu link from the
+    // node as parent.
+    $this->drupalPostForm("admin/structure/views/nojs/display/test_menu_link/page_1/menu", [
+      'menu[type]' => 'normal',
+      'menu[title]' => 'Secondary level view page',
+      'menu[parent]' => $parent_menu_value,
+    ], 'Apply');
+
+    // Save view which has pending changes.
+    $this->drupalPostForm(NULL, [], 'Save');
+
+    // Test if the node as parent menu item is selected in our views settings.
+    $this->drupalGet('admin/structure/views/nojs/display/test_menu_link/page_1/menu');
+    $this->assertOptionSelected('edit-menu-parent', $parent_menu_value);
+
+    $this->drupalGet('');
+
+    // Test if the primary menu item (node) is visible, and the secondary menu
+    // item (view) is hidden.
+    $this->assertText('Primary level node');
+    $this->assertNoText('Secondary level view page');
+
+  }
+}
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_menu_link.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_menu_link.yml
new file mode 100644
index 0000000..d51b920
--- /dev/null
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_menu_link.yml
@@ -0,0 +1,38 @@
+langcode: en
+status: true
+dependencies: {  }
+id: test_menu_link
+label: ''
+module: views
+description: ''
+tag: ''
+base_table: views_test_data
+base_field: nid
+core: '8'
+display:
+  default:
+    display_options:
+      defaults:
+        fields: false
+        pager: false
+        sorts: false
+      fields:
+        age:
+          field: age
+          id: age
+          relationship: none
+          table: views_test_data
+          plugin_id: numeric
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: 0
+  page_1:
+    display_plugin: page
+    display_title: 'Test page view'
+    id: page_1
+    position: 1
+    display_options:
+      display_extenders: {  }
+      path: test-menu-link
+
