diff --git a/core/modules/aggregator/config/optional/views.view.aggregator_sources.yml b/core/modules/aggregator/config/optional/views.view.aggregator_sources.yml
index 643a794..6dc1670 100644
--- a/core/modules/aggregator/config/optional/views.view.aggregator_sources.yml
+++ b/core/modules/aggregator/config/optional/views.view.aggregator_sources.yml
@@ -412,9 +412,11 @@ display:
     display_options:
       path: aggregator/sources
       menu:
-        type: normal
+        type:
+          normal: normal
         title: Sources
         description: ''
+        parent: ''
         weight: 0
         context: '0'
         menu_name: tools
diff --git a/core/modules/block_content/config/optional/views.view.block_content.yml b/core/modules/block_content/config/optional/views.view.block_content.yml
index 20fe0bf..15b462a 100644
--- a/core/modules/block_content/config/optional/views.view.block_content.yml
+++ b/core/modules/block_content/config/optional/views.view.block_content.yml
@@ -479,7 +479,8 @@ display:
       display_extenders: {  }
       path: admin/structure/block/block-content
       menu:
-        type: tab
+        type:
+          tab: tab
         title: 'Custom block library'
         description: ''
         parent: block.admin_display
diff --git a/core/modules/comment/config/optional/views.view.comment.yml b/core/modules/comment/config/optional/views.view.comment.yml
index 4dbfb66..80a4e12 100644
--- a/core/modules/comment/config/optional/views.view.comment.yml
+++ b/core/modules/comment/config/optional/views.view.comment.yml
@@ -862,7 +862,8 @@ display:
     display_options:
       path: admin/content/comment
       menu:
-        type: tab
+        type:
+          tab: tab
         title: Comments
         description: 'Comments published'
         parent: ''
@@ -891,7 +892,8 @@ display:
     display_options:
       path: admin/content/comment/approval
       menu:
-        type: tab
+        type:
+          tab: tab
         title: 'Unapproved comments'
         description: 'Comments unapproved'
         parent: ''
diff --git a/core/modules/content_moderation/tests/modules/content_moderation_test_views/config/install/views.view.latest.yml b/core/modules/content_moderation/tests/modules/content_moderation_test_views/config/install/views.view.latest.yml
index 62e972e..0efca35 100644
--- a/core/modules/content_moderation/tests/modules/content_moderation_test_views/config/install/views.view.latest.yml
+++ b/core/modules/content_moderation/tests/modules/content_moderation_test_views/config/install/views.view.latest.yml
@@ -388,7 +388,8 @@ display:
       display_extenders: {  }
       path: latest
       menu:
-        type: normal
+        type:
+          normal: normal
         title: Drafts
         description: ''
         expanded: false
diff --git a/core/modules/file/config/optional/views.view.files.yml b/core/modules/file/config/optional/views.view.files.yml
index 053b72d..e2dd4a8 100644
--- a/core/modules/file/config/optional/views.view.files.yml
+++ b/core/modules/file/config/optional/views.view.files.yml
@@ -733,12 +733,14 @@ display:
     display_options:
       path: admin/content/files
       menu:
-        type: tab
+        type:
+          tab: tab
         title: Files
         description: ''
-        menu_name: admin
+        parent: ''
         weight: 0
-        context: ''
+        context: '0'
+        menu_name: admin
       display_description: ''
       defaults:
         pager: true
diff --git a/core/modules/media/config/optional/views.view.media.yml b/core/modules/media/config/optional/views.view.media.yml
index 88e9fef..32e2141 100644
--- a/core/modules/media/config/optional/views.view.media.yml
+++ b/core/modules/media/config/optional/views.view.media.yml
@@ -781,7 +781,8 @@ display:
       display_extenders: {  }
       path: admin/content/media
       menu:
-        type: tab
+        type:
+          tab: tab
         title: Media
         description: ''
         expanded: false
diff --git a/core/modules/node/config/optional/views.view.content.yml b/core/modules/node/config/optional/views.view.content.yml
index cef43c7..b34045b 100644
--- a/core/modules/node/config/optional/views.view.content.yml
+++ b/core/modules/node/config/optional/views.view.content.yml
@@ -574,17 +574,18 @@ display:
     display_options:
       path: admin/content/node
       menu:
-        type: 'default tab'
+        type:
+          'default tab': 'default tab'
         title: Content
         description: ''
-        menu_name: admin
+        parent: ''
         weight: -10
-        context: ''
+        context: '0'
+        menu_name: admin
       tab_options:
-        type: normal
+        type: tab
         title: Content
         description: 'Find and manage content'
-        menu_name: admin
         weight: -10
       display_extenders: {  }
     display_plugin: page
diff --git a/core/modules/node/config/optional/views.view.glossary.yml b/core/modules/node/config/optional/views.view.glossary.yml
index 10f6d55..b0dcf82 100644
--- a/core/modules/node/config/optional/views.view.glossary.yml
+++ b/core/modules/node/config/optional/views.view.glossary.yml
@@ -438,9 +438,12 @@ display:
         options: {  }
       path: glossary
       menu:
-        type: normal
+        type:
+          normal: normal
         title: Glossary
+        description: ''
         weight: 0
+        context: '0'
         menu_name: main
         parent: ''
       display_extenders: {  }
diff --git a/core/modules/node/tests/modules/node_test_views/test_views/views.view.test_contextual_links.yml b/core/modules/node/tests/modules/node_test_views/test_views/views.view.test_contextual_links.yml
index 37b3f8d..e3d343a 100644
--- a/core/modules/node/tests/modules/node_test_views/test_views/views.view.test_contextual_links.yml
+++ b/core/modules/node/tests/modules/node_test_views/test_views/views.view.test_contextual_links.yml
@@ -87,12 +87,14 @@ display:
           entity_type: node
           entity_field: nid
       menu:
-        type: tab
+        type:
+          tab: tab
         title: 'Test contextual link'
         description: ''
-        menu_name: tools
+        parent: ''
         weight: 0
         context: '1'
+        menu_name: tools
     display_plugin: page
     display_title: Page
     id: page_1
diff --git a/core/modules/user/config/optional/views.view.user_admin_people.yml b/core/modules/user/config/optional/views.view.user_admin_people.yml
index e829a20..a681ae1 100644
--- a/core/modules/user/config/optional/views.view.user_admin_people.yml
+++ b/core/modules/user/config/optional/views.view.user_admin_people.yml
@@ -886,17 +886,18 @@ display:
       path: admin/people/list
       show_admin_links: false
       menu:
-        type: 'default tab'
+        type:
+          'default tab': 'default tab'
         title: List
         description: 'Find and manage people interacting with your site.'
-        menu_name: admin
+        parent: ''
         weight: -10
-        context: ''
+        context: '0'
+        menu_name: admin
       tab_options:
         type: normal
         title: People
         description: 'Manage user accounts, roles, and permissions.'
-        menu_name: admin
         weight: 0
       defaults:
         show_admin_links: false
diff --git a/core/modules/views/config/schema/views.display.schema.yml b/core/modules/views/config/schema/views.display.schema.yml
index 3e69614..871bb3c 100644
--- a/core/modules/views/config/schema/views.display.schema.yml
+++ b/core/modules/views/config/schema/views.display.schema.yml
@@ -23,8 +23,11 @@ views.display.page:
       label: 'Menu'
       mapping:
         type:
-          type: string
+          type: sequence
           label: 'Type'
+          sequence:
+            - type: string
+              label: 'Menu type'
         title:
           type: text
           label: 'Title'
diff --git a/core/modules/views/src/Plugin/Derivative/ViewsLocalTask.php b/core/modules/views/src/Plugin/Derivative/ViewsLocalTask.php
index bc6400c..9987209 100644
--- a/core/modules/views/src/Plugin/Derivative/ViewsLocalTask.php
+++ b/core/modules/views/src/Plugin/Derivative/ViewsLocalTask.php
@@ -77,25 +77,27 @@ public function getDerivativeDefinitions($base_plugin_definition) {
 
       $executable->setDisplay($display_id);
       $menu = $executable->display_handler->getOption('menu');
-      if (in_array($menu['type'], ['tab', 'default tab'])) {
-        $plugin_id = 'view.' . $executable->storage->id() . '.' . $display_id;
-        $route_name = $view_route_names[$executable->storage->id() . '.' . $display_id];
-
-        // Don't add a local task for views which override existing routes.
-        // @todo Alternative it could just change the existing entry.
-        if ($route_name != $plugin_id) {
-          continue;
-        }
+      foreach ($menu['type'] as $type) {
+        if (in_array($menu['type'], ['tab', 'default tab'])) {
+          $plugin_id = 'view.' . $executable->storage->id() . '.' . $display_id;
+          $route_name = $view_route_names[$executable->storage->id() . '.' . $display_id];
+
+          // Don't add a local task for views which override existing routes.
+          // @todo Alternative it could just change the existing entry.
+          if ($route_name != $plugin_id) {
+            continue;
+          }
 
-        $this->derivatives[$plugin_id] = [
-          'route_name' => $route_name,
-          'weight' => $menu['weight'],
-          'title' => $menu['title'],
-        ] + $base_plugin_definition;
+          $this->derivatives[$plugin_id] = [
+              'route_name' => $route_name,
+              'weight' => $menu['weight'],
+              'title' => $menu['title'],
+            ] + $base_plugin_definition;
 
-        // Default local tasks have themselves as root tab.
-        if ($menu['type'] == 'default tab') {
-          $this->derivatives[$plugin_id]['base_route'] = $route_name;
+          // Default local tasks have themselves as root tab.
+          if ($menu['type'] == 'default tab') {
+            $this->derivatives[$plugin_id]['base_route'] = $route_name;
+          }
         }
       }
     }
@@ -117,7 +119,7 @@ public function alterLocalTasks(&$local_tasks) {
       $menu = $executable->display_handler->getOption('menu');
 
       // We already have set the base_route for default tabs.
-      if (in_array($menu['type'], ['tab'])) {
+      if (in_array('tab', array_filter($menu['type']))) {
         $plugin_id = 'view.' . $executable->storage->id() . '.' . $display_id;
         $view_route_name = $view_route_names[$executable->storage->id() . '.' . $display_id];
 
diff --git a/core/modules/views/src/Plugin/views/display/Page.php b/core/modules/views/src/Plugin/views/display/Page.php
index aca0683..ab607d3 100644
--- a/core/modules/views/src/Plugin/views/display/Page.php
+++ b/core/modules/views/src/Plugin/views/display/Page.php
@@ -120,7 +120,8 @@ protected function defineOptions() {
 
     $options['menu'] = [
       'contains' => [
-        'type' => ['default' => 'none'],
+        'type' => ['default' => []],
+        // Do not translate menu and title as menu system will.
         'title' => ['default' => ''],
         'description' => ['default' => ''],
         'weight' => ['default' => 0],
@@ -189,23 +190,27 @@ public function optionsSummary(&$categories, &$options) {
     parent::optionsSummary($categories, $options);
 
     $menu = $this->getOption('menu');
-    if (!is_array($menu)) {
-      $menu = ['type' => 'none'];
+    if (!is_array($menu) || empty($menu['type'])) {
+      $menu = ['type' => ['none']];
     }
-    switch ($menu['type']) {
-      case 'none':
-      default:
-        $menu_str = $this->t('No menu');
-        break;
-      case 'normal':
-        $menu_str = $this->t('Normal: @title', ['@title' => $menu['title']]);
-        break;
-      case 'tab':
-      case 'default tab':
-        $menu_str = $this->t('Tab: @title', ['@title' => $menu['title']]);
-        break;
+    $menus = [];
+    foreach (array_filter($menu['type']) as $type) {
+      switch ($type) {
+        case 'none':
+          $menus[] = $this->t('No menu');
+          break;
+        case 'normal':
+          $menus[] = $this->t('Normal: @title', ['@title' => $menu['title']]);
+          break;
+        case 'tab':
+        case 'default tab':
+          $menus[] = $this->t('Tab: @title', ['@title' => $menu['title']]);
+          break;
+      }
     }
 
+    $menu_str = implode(' | ', $menus);
+
     $options['menu'] = [
       'category' => 'page',
       'title' => $this->t('Menu'),
@@ -214,7 +219,7 @@ public function optionsSummary(&$categories, &$options) {
 
     // This adds a 'Settings' link to the style_options setting if the style
     // has options.
-    if ($menu['type'] == 'default tab') {
+    if (!empty($menu['type']['default tab'])) {
       $options['menu']['setting'] = $this->t('Parent menu item');
       $options['menu']['links']['tab_options'] = $this->t('Change settings for the parent menu');
     }
@@ -235,14 +240,20 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
           '#tree' => TRUE,
         ];
         $menu = $this->getOption('menu');
-        if (empty($menu)) {
-          $menu = ['type' => 'none', 'title' => '', 'weight' => 0, 'expanded' => FALSE];
-        }
+        $menu += [
+          'type' => ['none'],
+          'title' => '',
+          'description' => '',
+          'weight' => 0,
+          'menu_name' => '',
+          'parent' => '',
+        ];
         $form['menu']['type'] = [
           '#prefix' => '<div class="views-left-30">',
           '#suffix' => '</div>',
-          '#title' => $this->t('Type'),
-          '#type' => 'radios',
+          '#title' => $this->t('Menu Link Types'),
+          '#type' => 'checkboxes',
+          '#multiple' => TRUE,
           '#options' => [
             'none' => $this->t('No menu entry'),
             'normal' => $this->t('Normal menu entry'),
@@ -260,13 +271,13 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
           '#states' => [
             'visible' => [
               [
-                ':input[name="menu[type]"]' => ['value' => 'normal'],
+                ':input[name="menu[type][normal]"]' => ['checked' => TRUE],
               ],
               [
-                ':input[name="menu[type]"]' => ['value' => 'tab'],
+                ':input[name="menu[type][tab]"]' => ['checked' => TRUE],
               ],
               [
-                ':input[name="menu[type]"]' => ['value' => 'default tab'],
+                ':input[name="menu[type][default tab]"]' => ['checked' => TRUE],
               ],
             ],
           ],
@@ -279,13 +290,13 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
           '#states' => [
             'visible' => [
               [
-                ':input[name="menu[type]"]' => ['value' => 'normal'],
+                ':input[name="menu[type][normal]"]' => ['checked' => TRUE],
               ],
               [
-                ':input[name="menu[type]"]' => ['value' => 'tab'],
+                ':input[name="menu[type][tab]"]' => ['checked' => TRUE],
               ],
               [
-                ':input[name="menu[type]"]' => ['value' => 'default tab'],
+                ':input[name="menu[type][default tab]"]' => ['checked' => TRUE],
               ],
             ],
           ],
@@ -309,10 +320,10 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
             '#states' => [
               'visible' => [
                 [
-                  ':input[name="menu[type]"]' => ['value' => 'normal'],
+                  ':input[name="menu[type][normal]"]' => ['checked' => TRUE],
                 ],
                 [
-                  ':input[name="menu[type]"]' => ['value' => 'tab'],
+                  ':input[name="menu[type][tab]"]' => ['checked' => TRUE],
                 ],
               ],
             ],
@@ -335,13 +346,13 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
           '#states' => [
             'visible' => [
               [
-                ':input[name="menu[type]"]' => ['value' => 'normal'],
+                ':input[name="menu[type][normal]"]' => ['checked' => TRUE],
               ],
               [
-                ':input[name="menu[type]"]' => ['value' => 'tab'],
+                ':input[name="menu[type][tab]"]' => ['checked' => TRUE],
               ],
               [
-                ':input[name="menu[type]"]' => ['value' => 'default tab'],
+                ':input[name="menu[type][default tab]"]' => ['checked' => TRUE],
               ],
             ],
           ],
@@ -354,7 +365,7 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
           '#description' => $this->t('Displays the link in contextual links'),
           '#states' => [
             'visible' => [
-              ':input[name="menu[type]"]' => ['value' => 'tab'],
+              ':input[name="menu[type][tab]"]' => ['checked' => TRUE],
             ],
           ],
         ];
@@ -441,12 +452,14 @@ public function validateOptionsForm(&$form, FormStateInterface $form_state) {
 
     if ($form_state->get('section') == 'menu') {
       $path = $this->getOption('path');
-      $menu_type = $form_state->getValue(['menu', 'type']);
-      if ($menu_type == 'normal' && strpos($path, '%') !== FALSE) {
+      $menu_types = array_filter($form_state->getValue(['menu', 'type']));
+      $form_state->setValueForElement($form['menu']['type'], $menu_types);
+
+      if (in_array('normal', $menu_types) && strpos($path, '%') !== FALSE) {
         $form_state->setError($form['menu']['type'], $this->t('Views cannot create normal menu items for paths with a % in them.'));
       }
 
-      if ($menu_type == 'default tab' || $menu_type == 'tab') {
+      if (in_array('default tab', $menu_types) || in_array('tab', $menu_types)) {
         $bits = explode('/', $path);
         $last = array_pop($bits);
         if ($last == '%') {
@@ -454,7 +467,7 @@ public function validateOptionsForm(&$form, FormStateInterface $form_state) {
         }
       }
 
-      if ($menu_type != 'none' && $form_state->isValueEmpty(['menu', 'title'])) {
+      if (!in_array('none', $menu_types) &&  $form_state->isValueEmpty(array('menu', 'title'))) {
         $form_state->setError($form['menu']['title'], $this->t('Title is required for this menu type.'));
       }
     }
@@ -472,7 +485,7 @@ public function submitOptionsForm(&$form, FormStateInterface $form_state) {
         list($menu['menu_name'], $menu['parent']) = explode(':', $menu['parent'], 2);
         $this->setOption('menu', $menu);
         // send ajax form to options page if we use it.
-        if ($form_state->getValue(['menu', 'type']) == 'default tab') {
+        if ($form_state->getValue(['menu', 'type', 'default tab'])) {
           $form_state->get('view')->addFormToStack('display', $this->display['id'], 'tab_options');
         }
         break;
@@ -489,11 +502,11 @@ public function validate() {
     $errors = parent::validate();
 
     $menu = $this->getOption('menu');
-    if (!empty($menu['type']) && $menu['type'] != 'none' && empty($menu['title'])) {
+    if (!empty($menu['type']) && empty($menu['title'])) {
       $errors[] = $this->t('Display @display is set to use a menu but the menu link text is not set.', ['@display' => $this->display['display_title']]);
     }
 
-    if ($menu['type'] == 'default tab') {
+    if (!empty($menu['type']['default tab'])) {
       $tab_options = $this->getOption('tab_options');
       if (!empty($tab_options['type']) && $tab_options['type'] != 'none' && empty($tab_options['title'])) {
         $errors[] = $this->t('Display @display is set to use a parent menu but the parent menu link text is not set.', ['@display' => $this->display['display_title']]);
@@ -531,7 +544,7 @@ public function calculateDependencies() {
     $dependencies = parent::calculateDependencies();
 
     $menu = $this->getOption('menu');
-    if ($menu['type'] === 'normal' && ($menu_entity = $this->menuStorage->load($menu['menu_name']))) {
+    if (in_array('normal', $menu['type']) && ($menu_entity = $this->menuStorage->load($menu['menu_name']))) {
       $dependencies[$menu_entity->getConfigDependencyKey()][] = $menu_entity->getConfigDependencyName();
     }
 
diff --git a/core/modules/views/src/Plugin/views/display/PathPluginBase.php b/core/modules/views/src/Plugin/views/display/PathPluginBase.php
index 17d8663..5cf8842 100644
--- a/core/modules/views/src/Plugin/views/display/PathPluginBase.php
+++ b/core/modules/views/src/Plugin/views/display/PathPluginBase.php
@@ -101,7 +101,7 @@ public function getPath() {
   protected function isDefaultTabPath() {
     $menu = $this->getOption('menu');
     $tab_options = $this->getOption('tab_options');
-    return $menu['type'] == 'default tab' && !empty($tab_options['type']) && $tab_options['type'] != 'none';
+    return !empty($menu['type']['default tab']) && !empty($tab_options['type']) && $tab_options['type'] != 'none';
   }
 
   /**
@@ -346,35 +346,40 @@ public function getMenuLinks() {
     $view_id_display = "{$view_id}.{$display_id}";
     $menu_link_id = 'views.' . str_replace('/', '.', $view_id_display);
 
-    if ($path) {
-      $menu = $this->getOption('menu');
-      if (!empty($menu['type']) && $menu['type'] == 'normal') {
-        $links[$menu_link_id] = [];
-        // Some views might override existing paths, so we have to set the route
-        // name based upon the altering.
-        $links[$menu_link_id] = [
-          'route_name' => $this->getRouteName(),
-          // Identify URL embedded arguments and correlate them to a handler.
-          'load arguments'  => [$this->view->storage->id(), $this->display['id'], '%index'],
-          'id' => $menu_link_id,
-        ];
-        $links[$menu_link_id]['title'] = $menu['title'];
-        $links[$menu_link_id]['description'] = $menu['description'];
-        $links[$menu_link_id]['parent'] = $menu['parent'];
-        $links[$menu_link_id]['enabled'] = $menu['enabled'];
-        $links[$menu_link_id]['expanded'] = $menu['expanded'];
-
-        if (isset($menu['weight'])) {
-          $links[$menu_link_id]['weight'] = intval($menu['weight']);
+    if ($path && ($menu = $this->getOption('menu')) && !empty($menu['type'])) {
+      foreach ($menu['type'] as $type) {
+        if ($type == 'normal') {
+          $links[$menu_link_id] = [];
+          // Some views might override existing paths, so we have to set the
+          // route name based upon the altering.
+          $links[$menu_link_id] = [
+            'route_name' => $this->getRouteName(),
+            // Identify URL embedded arguments and correlate them to a handler.
+            'load arguments' => [
+              $this->view->storage->id(),
+              $this->display['id'],
+              '%index'
+            ],
+            'id' => $menu_link_id,
+          ];
+          $links[$menu_link_id]['title'] = $menu['title'];
+          $links[$menu_link_id]['description'] = $menu['description'];
+          $links[$menu_link_id]['parent'] = $menu['parent'];
+          $links[$menu_link_id]['enabled'] = $menu['enabled'];
+          $links[$menu_link_id]['expanded'] = $menu['expanded'];
+
+          if (isset($menu['weight'])) {
+            $links[$menu_link_id]['weight'] = intval($menu['weight']);
+          }
+
+          // Insert item into the proper menu.
+          $links[$menu_link_id]['menu_name'] = $menu['menu_name'];
+          // Keep track of where we came from.
+          $links[$menu_link_id]['metadata'] = [
+            'view_id' => $view_id,
+            'display_id' => $display_id,
+          ];
         }
-
-        // Insert item into the proper menu.
-        $links[$menu_link_id]['menu_name'] = $menu['menu_name'];
-        // Keep track of where we came from.
-        $links[$menu_link_id]['metadata'] = [
-          'view_id' => $view_id,
-          'display_id' => $display_id,
-        ];
       }
     }
 
diff --git a/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php b/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php
index 0b3dcc9..9ee9516 100644
--- a/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php
+++ b/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php
@@ -1084,7 +1084,7 @@ protected function pageDisplayOptions(array $form, FormStateInterface $form_stat
 
     // Generate the menu links settings if the user checked the link checkbox.
     if (!empty($page['link'])) {
-      $display_options['menu']['type'] = 'normal';
+      $display_options['menu']['type'] = array('normal' => 'normal');
       $display_options['menu']['title'] = $page['link_properties']['title'];
       $display_options['menu']['menu_name'] = $page['link_properties']['menu_name'];
     }
diff --git a/core/modules/views/tests/fixtures/update/views.view.test_boolean_filter_values.yml b/core/modules/views/tests/fixtures/update/views.view.test_boolean_filter_values.yml
index 65c2847..585632c 100644
--- a/core/modules/views/tests/fixtures/update/views.view.test_boolean_filter_values.yml
+++ b/core/modules/views/tests/fixtures/update/views.view.test_boolean_filter_values.yml
@@ -574,7 +574,8 @@ display:
     display_options:
       path: admin/content/node
       menu:
-        type: 'default tab'
+        type:
+          'default tab': 'default tab'
         title: Content
         description: ''
         menu_name: admin
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_content_ajax.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_content_ajax.yml
index 0ac2abb..e7025c8 100644
--- a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_content_ajax.yml
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_content_ajax.yml
@@ -586,7 +586,8 @@ display:
     display_options:
       path: test-content-ajax
       menu:
-        type: 'default tab'
+        type:
+          'default tab': 'default tab'
         title: Content
         description: ''
         menu_name: admin
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_glossary.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_glossary.yml
index e2e143e..f21e76a 100644
--- a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_glossary.yml
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_glossary.yml
@@ -436,7 +436,8 @@ display:
         options: {  }
       path: test-glossary
       menu:
-        type: normal
+        type:
+          normal: normal
         title: Glossary
         weight: 0
         menu_name: main
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_page_display_menu.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_page_display_menu.yml
index a1eb3b5..eb48b16 100644
--- a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_page_display_menu.yml
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_page_display_menu.yml
@@ -31,17 +31,18 @@ display:
       path: test_page_display_menu/default
       title: 'Test default page'
       menu:
-        type: 'default tab'
+        type:
+          'default tab': 'default tab'
         title: 'Test default tab'
         description: ''
-        menu_name: tools
+        parent: ''
         weight: -10
         context: '0'
+        menu_name: tools
       tab_options:
         type: normal
         title: 'Test parent path'
         description: ''
-        menu_name: tools
         weight: 0
       defaults:
         title: false
@@ -54,12 +55,14 @@ display:
       path: test_page_display_menu/local
       title: 'Test local page'
       menu:
-        type: tab
+        type:
+          tab: tab
         title: 'Test local tab'
         description: ''
-        menu_name: tools
+        parent: ''
         weight: 0
         context: '0'
+        menu_name: tools
       defaults:
         title: false
     display_plugin: page
@@ -71,12 +74,14 @@ display:
       path: test_page_display_menu_link
       title: 'Test menu link'
       menu:
-        type: normal
+        type:
+          normal: normal
         title: 'Test menu link'
         description: ''
-        menu_name: tools
+        parent: ''
         weight: 0
         context: '0'
+        menu_name: tools
       defaults:
         title: false
     display_plugin: page
@@ -88,7 +93,8 @@ display:
       path: test_page_display_menu/child
       title: 'Test page as child'
       menu:
-        type: normal
+        type:
+          normal: normal
         title: 'Test child (with parent)'
         parent: system.admin
         description: 'Sample description.'
@@ -107,13 +113,14 @@ display:
       path: test-path
       title: 'Tests a menu with a non-existing parent'
       menu:
-        type: normal
+        type:
+          normal: normal
         title: 'Test child with non-existing parent'
-        parent: llamasarelame
         description: ''
-        menu_name: admin
+        parent: llamasarelame
         weight: 0
         context: '0'
+        menu_name: admin
       defaults:
         title: false
     display_plugin: page
diff --git a/core/modules/views/tests/src/Unit/Plugin/Derivative/ViewsLocalTaskTest.php b/core/modules/views/tests/src/Unit/Plugin/Derivative/ViewsLocalTaskTest.php
index 7ecf9ef..22e057b 100644
--- a/core/modules/views/tests/src/Unit/Plugin/Derivative/ViewsLocalTaskTest.php
+++ b/core/modules/views/tests/src/Unit/Plugin/Derivative/ViewsLocalTaskTest.php
@@ -84,7 +84,7 @@ public function testGetDerivativeDefinitionsWithoutLocalTask() {
     $display_plugin->expects($this->once())
       ->method('getOption')
       ->with('menu')
-      ->will($this->returnValue(['type' => 'normal']));
+      ->will($this->returnValue(['type' => ['normal' => 'normal']]));
     $executable->display_handler = $display_plugin;
 
     $storage = $this->getMockBuilder('Drupal\views\Entity\View')
@@ -139,7 +139,7 @@ public function testGetDerivativeDefinitionsWithLocalTask() {
     $display_plugin->expects($this->once())
       ->method('getOption')
       ->with('menu')
-      ->will($this->returnValue(['type' => 'tab', 'weight' => 12, 'title' => 'Example title']));
+      ->will($this->returnValue(['type' => ['tab' => 'tab'], 'weight' => 12, 'title' => 'Example title']));
     $executable->display_handler = $display_plugin;
 
     $result = [['example_view', 'page_1']];
@@ -192,7 +192,7 @@ public function testGetDerivativeDefinitionsWithOverrideRoute() {
     $display_plugin->expects($this->once())
       ->method('getOption')
       ->with('menu')
-      ->will($this->returnValue(['type' => 'tab', 'weight' => 12]));
+      ->will($this->returnValue(['type' => ['tab' => 'tab'], 'weight' => 12]));
     $executable->display_handler = $display_plugin;
 
     $result = [['example_view', 'page_1']];
@@ -241,7 +241,7 @@ public function testGetDerivativeDefinitionsWithDefaultLocalTask() {
     $display_plugin->expects($this->exactly(2))
       ->method('getOption')
       ->with('menu')
-      ->will($this->returnValue(['type' => 'default tab', 'weight' => 12, 'title' => 'Example title']));
+      ->will($this->returnValue(['type' => ['default tab' => 'default tab'], 'weight' => 12, 'title' => 'Example title']));
     $executable->display_handler = $display_plugin;
 
     $result = [['example_view', 'page_1']];
@@ -310,7 +310,7 @@ public function testGetDerivativeDefinitionsWithExistingLocalTask() {
     $display_plugin->expects($this->exactly(2))
       ->method('getOption')
       ->with('menu')
-      ->will($this->returnValue(['type' => 'tab', 'weight' => 12, 'title' => 'Example title']));
+      ->will($this->returnValue(['type' => ['tab' => 'tab'], 'weight' => 12, 'title' => 'Example title']));
     $display_plugin->expects($this->once())
       ->method('getPath')
       ->will($this->returnValue('path/example'));
diff --git a/core/modules/views_ui/tests/src/Functional/DisplayPathTest.php b/core/modules/views_ui/tests/src/Functional/DisplayPathTest.php
index af2c4e2..a131bda 100644
--- a/core/modules/views_ui/tests/src/Functional/DisplayPathTest.php
+++ b/core/modules/views_ui/tests/src/Functional/DisplayPathTest.php
@@ -145,19 +145,26 @@ public function testMenuOptions() {
     $this->drupalPostForm('admin/structure/views/nojs/display/test_view/page_1/path', ['path' => $random_string], t('Apply'));
     $this->drupalGet('admin/structure/views/view/test_view');
 
-    $this->drupalPostForm('admin/structure/views/nojs/display/test_view/page_1/menu', ['menu[type]' => 'default tab', 'menu[title]' => 'Test tab title'], t('Apply'));
+    $this->drupalPostForm('admin/structure/views/nojs/display/test_view/page_1/menu', ['menu[type][default tab]' => 'default tab', 'menu[title]' => 'Test tab title'], t('Apply'));
     $this->assertResponse(200);
     $this->assertUrl('admin/structure/views/nojs/display/test_view/page_1/tab_options');
 
-    $this->drupalPostForm(NULL, ['tab_options[type]' => 'tab', 'tab_options[title]' => $this->randomString()], t('Apply'));
+    $this->drupalPostForm(NULL, ['tab_options[type]' => 'normal', 'tab_options[title]' => 'Test tab title'], t('Apply'));
     $this->assertResponse(200);
     $this->assertUrl('admin/structure/views/view/test_view/edit/page_1');
-
-    $this->drupalGet('admin/structure/views/view/test_view');
     $this->assertLink(t('Tab: @title', ['@title' => 'Test tab title']));
     // If it's a default tab, it should also have an additional settings link.
     $this->assertLinkByHref('admin/structure/views/nojs/display/test_view/page_1/tab_options');
 
+    // It can be default tab and normal menu item as well.
+    $this->drupalPostForm('admin/structure/views/nojs/display/test_view/page_1/menu', ['menu[type][normal]' => 'normal', 'menu[title]' => 'Test'], t('Apply'));
+    $this->assertResponse(200);
+    $this->assertUrl('admin/structure/views/nojs/display/test_view/page_1/tab_options');
+    $this->drupalPostForm(NULL, ['tab_options[type]' => 'normal', 'tab_options[title]' => 'Test tab title'], t('Apply'));
+    $this->assertResponse(200);
+    $this->assertUrl('admin/structure/views/view/test_view/edit/page_1');
+    $this->assertLink(t('Normal: @title | Tab: @title', ['@title' => 'Test']));
+
     // Ensure that you can select a parent in case the parent does not exist.
     $this->drupalGet('admin/structure/views/nojs/display/test_page_display_menu/page_5/menu');
     $this->assertResponse(200);
