diff --git a/core/lib/Drupal/Core/Menu/LocalTaskDefault.php b/core/lib/Drupal/Core/Menu/LocalTaskDefault.php
index 058de09..cc3c009 100644
--- a/core/lib/Drupal/Core/Menu/LocalTaskDefault.php
+++ b/core/lib/Drupal/Core/Menu/LocalTaskDefault.php
@@ -88,7 +88,7 @@ public function getTitle() {
   public function getWeight() {
     // By default the weight is 0, or -10 for the root tab.
     if (!isset($this->pluginDefinition['weight'])) {
-      if ($this->pluginDefinition['tab_root_id'] == $this->pluginId) {
+      if ($this->pluginDefinition['root_id'] == $this->pluginId) {
         $this->pluginDefinition['weight'] = -10;
       }
       else {
diff --git a/core/lib/Drupal/Core/Menu/LocalTaskManager.php b/core/lib/Drupal/Core/Menu/LocalTaskManager.php
index a02b8bb..4e37454 100644
--- a/core/lib/Drupal/Core/Menu/LocalTaskManager.php
+++ b/core/lib/Drupal/Core/Menu/LocalTaskManager.php
@@ -40,9 +40,9 @@ class LocalTaskManager extends DefaultPluginManager {
     // The static title for the local task.
     'title' => '',
     // The plugin ID of the root tab.
-    'tab_root_id' => '',
+    'root_id' => '',
     // The plugin ID of the parent tab (or NULL for the top-level tab).
-    'tab_parent_id' => NULL,
+    'parent_id' => NULL,
     // The weight of the tab.
     'weight' => NULL,
     // The default link options.
@@ -123,9 +123,22 @@ public function __construct(ControllerResolverInterface $controller_resolver, Re
    */
   public function processDefinition(&$definition, $plugin_id) {
     parent::processDefinition($definition, $plugin_id);
-     // If there is no route name, this is a broken definition.
+
+    // If there is no route name, this is a broken definition.
     if (empty($definition['route_name'])) {
-      throw new PluginException(sprintf('Plugin (%s) definition must include "route_name"', $plugin_id));
+      // If plugin_id matches a route, assume that's the plugin route.
+      if ($this->routeProvider->getRouteByName($plugin_id)) {
+        $definition['route_name'] = $plugin_id;
+      }
+      else {
+        // We can't guess at a sane default so throw an exception.
+        throw new PluginException(sprintf('Local task definition (%s) must include "route_name" or match a route_name.', $plugin_id));
+      }
+    }
+
+    if (empty($definition['root_id'])) {
+      // Default tab.
+      $definition['root_id'] = $plugin_id;
     }
   }
 
@@ -160,7 +173,7 @@ public function getLocalTasksForRoute($route_name) {
     if (!isset($this->instances[$route_name])) {
       $this->instances[$route_name] = array();
       if ($cache = $this->cacheBackend->get($this->cacheKey . ':' . $route_name)) {
-        $tab_root_ids = $cache->data['tab_root_ids'];
+        $root_ids = $cache->data['root_ids'];
         $parents = $cache->data['parents'];
         $children = $cache->data['children'];
       }
@@ -168,42 +181,42 @@ public function getLocalTasksForRoute($route_name) {
         $definitions = $this->getDefinitions();
         // We build the hierarchy by finding all tabs that should
         // appear on the current route.
-        $tab_root_ids = array();
+        $root_ids = array();
         $parents = array();
         $children = array();
         foreach ($definitions as $plugin_id => $task_info) {
           if ($route_name == $task_info['route_name']) {
-            $tab_root_ids[$task_info['tab_root_id']] = $task_info['tab_root_id'];
+            $root_ids[$task_info['root_id']] = $task_info['root_id'];
             // Tabs that link to the current route are viable parents
             // and their parent and children should be visible also.
             // @todo - this only works for 2 levels of tabs.
             // instead need to iterate up.
             $parents[$plugin_id] = TRUE;
-            if (!empty($task_info['tab_parent_id'])) {
-              $parents[$task_info['tab_parent_id']] = TRUE;
+            if (!empty($task_info['parent_id'])) {
+              $parents[$task_info['parent_id']] = TRUE;
             }
           }
         }
-        if ($tab_root_ids) {
+        if ($root_ids) {
           // Find all the plugins with the same root and that are at the top
           // level or that have a visible parent.
           foreach ($definitions  as $plugin_id => $task_info) {
-            if (!empty($tab_root_ids[$task_info['tab_root_id']]) && (empty($task_info['tab_parent_id']) || !empty($parents[$task_info['tab_parent_id']]))) {
+            if (!empty($root_ids[$task_info['root_id']]) && (empty($task_info['parent_id']) || !empty($parents[$task_info['parent_id']]))) {
               // Concat '> ' with root ID for the parent of top-level tabs.
-              $parent = empty($task_info['tab_parent_id']) ? '> ' . $task_info['tab_root_id'] : $task_info['tab_parent_id'];
+              $parent = empty($task_info['parent_id']) ? '> ' . $task_info['root_id'] : $task_info['parent_id'];
               $children[$parent][$plugin_id] = $task_info;
             }
           }
         }
         $data = array(
-          'tab_root_ids' => $tab_root_ids,
+          'root_ids' => $root_ids,
           'parents' => $parents,
           'children' => $children,
         );
         $this->cacheBackend->set($this->cacheKey . ':' . $route_name, $data, CacheBackendInterface::CACHE_PERMANENT, array('local_task'));
       }
       // Create a plugin instance for each element of the hierarchy.
-      foreach ($tab_root_ids as $root_id) {
+      foreach ($root_ids as $root_id) {
         // Convert the tree keyed by plugin IDs into a simple one with
         // integer depth.  Create instances for each plugin along the way.
         $level = 0;
diff --git a/core/modules/comment/comment.local_tasks.yml b/core/modules/comment/comment.local_tasks.yml
index 3119823..797f61d 100644
--- a/core/modules/comment/comment.local_tasks.yml
+++ b/core/modules/comment/comment.local_tasks.yml
@@ -1,15 +1,14 @@
-comment.permalink_tab:
-  route_name: comment.permalink
+comment.permalink:
   title: 'View comment'
-  tab_root_id: comment.permalink_tab
-comment.edit_page_tab:
+
+comment.edit_page:
   route_name: comment.edit_page
   title: 'Edit'
-  tab_root_id: comment.permalink_tab
+  root_id: comment.permalink
   weight: 0
-comment.confirm_delete_tab:
-  route_name: comment.confirm_delete
+
+comment.confirm_delete:
   title: 'Delete'
-  tab_root_id: comment.permalink_tab
+  root_id: comment.permalink
   weight: 10
 
diff --git a/core/modules/config/tests/config_test/config_test.local_tasks.yml b/core/modules/config/tests/config_test/config_test.local_tasks.yml
index 989f131..e128ebe 100644
--- a/core/modules/config/tests/config_test/config_test.local_tasks.yml
+++ b/core/modules/config/tests/config_test/config_test.local_tasks.yml
@@ -1,4 +1,2 @@
-config_test.entity_tab:
-  route_name: config_test.entity
+config_test.entity:
   title: 'Edit'
-  tab_root_id: config_test.entity_tab
diff --git a/core/modules/content_translation/lib/Drupal/content_translation/Plugin/Derivative/ContentTranslationLocalTasks.php b/core/modules/content_translation/lib/Drupal/content_translation/Plugin/Derivative/ContentTranslationLocalTasks.php
index 1cc9e66..627f5a8 100644
--- a/core/modules/content_translation/lib/Drupal/content_translation/Plugin/Derivative/ContentTranslationLocalTasks.php
+++ b/core/modules/content_translation/lib/Drupal/content_translation/Plugin/Derivative/ContentTranslationLocalTasks.php
@@ -66,14 +66,14 @@ public function getDerivativeDefinitions(array $base_plugin_definition) {
         if ($routes = $this->routeProvider->getRoutesByPattern($path)->all()) {
           // Find the route name for the entity page.
           $entity_route_name = key($routes);
-          $entity_tab = $entity_route_name . '_tab';
+          $entity_tab = $entity_route_name;
           // Find the route name for the translation overview.
           $translation_route_name = "content_translation.translation_overview_$entity_type";
-          $translation_tab = $translation_route_name . '_tab';
+          $translation_tab = $translation_route_name;
 
           // Both tabs will have the same root and entity type.
           $common_tab_settings = array(
-            'tab_root_id' => $entity_tab,
+            'root_id' => $entity_tab,
             'entity_type' => $entity_type,
           );
           $this->derivatives[$entity_tab] = $base_plugin_definition + $common_tab_settings;
diff --git a/core/modules/filter/filter.local_tasks.yml b/core/modules/filter/filter.local_tasks.yml
index 9f7e8e9..31eee6d 100644
--- a/core/modules/filter/filter.local_tasks.yml
+++ b/core/modules/filter/filter.local_tasks.yml
@@ -1,5 +1,3 @@
-filter.format_edit_tab:
-  route_name: filter.format_edit
+filter.format_edit:
   title: 'Configure'
-  tab_root_id: filter.format_edit_tab
   weight: -10
diff --git a/core/modules/system/system.local_tasks.yml b/core/modules/system/system.local_tasks.yml
index 575e515..42f08c4 100644
--- a/core/modules/system/system.local_tasks.yml
+++ b/core/modules/system/system.local_tasks.yml
@@ -1,14 +1,8 @@
-system.rss_feeds_settings_tab:
-  route_name: system.rss_feeds_settings
+system.rss_feeds_settings:
   title: Settings
-  tab_root_id: system.rss_feeds_settings_tab
 
-system.site_maintenance_mode_tab:
-  route_name: system.site_maintenance_mode
+system.site_maintenance_mode:
   title: Settings
-  tab_root_id: system.site_maintenance_mode_tab
 
-system.site_information_settings_tab:
-  route_name: system.site_information_settings
+system.site_information_settings:
   title: Settings
-  tab_root_id: system.site_information_settings_tab
diff --git a/core/modules/system/tests/modules/menu_test/menu_test.local_tasks.yml b/core/modules/system/tests/modules/menu_test/menu_test.local_tasks.yml
index 2947bf7..b2b0f92 100644
--- a/core/modules/system/tests/modules/menu_test/menu_test.local_tasks.yml
+++ b/core/modules/system/tests/modules/menu_test/menu_test.local_tasks.yml
@@ -1,73 +1,59 @@
 menu_test.local_task_test_tasks_view:
-  route_name: menu_test.local_task_test_tasks_view
   title: View
-  tab_root_id: menu_test.local_task_test_tasks_view
 menu_test.local_task_test_tasks_edit:
-  route_name: menu_test.local_task_test_tasks_edit
   title: Edit
-  tab_root_id: menu_test.local_task_test_tasks_view
+  root_id: menu_test.local_task_test_tasks_view
 menu_test.local_task_test_tasks_settings:
-  route_name: menu_test.local_task_test_tasks_settings
   title: Settings
-  tab_root_id: menu_test.local_task_test_tasks_view
+  root_id: menu_test.local_task_test_tasks_view
 menu_test.local_task_test_tasks_settings_sub1:
-  route_name: menu_test.local_task_test_tasks_settings_sub1
   title: sub1
-  tab_root_id: menu_test.local_task_test_tasks_view
-  tab_parent_id: menu_test.local_task_test_tasks_settings
+  root_id: menu_test.local_task_test_tasks_view
+  parent_id: menu_test.local_task_test_tasks_settings
   class: Drupal\menu_test\Plugin\Menu\LocalTask\TestTasksSettingsSub1
   weight: -10
 menu_test.local_task_test_tasks_settings_sub2:
-  route_name: menu_test.local_task_test_tasks_settings_sub2
   title: sub2
-  tab_root_id: menu_test.local_task_test_tasks_view
-  tab_parent_id: menu_test.local_task_test_tasks_settings
+  root_id: menu_test.local_task_test_tasks_view
+  parent_id: menu_test.local_task_test_tasks_settings
 menu_test.local_task_test_tasks_settings_sub3:
-  route_name: menu_test.local_task_test_tasks_settings_sub3
   title: sub3
-  tab_root_id: menu_test.local_task_test_tasks_view
-  tab_parent_id: menu_test.local_task_test_tasks_settings
+  root_id: menu_test.local_task_test_tasks_view
+  parent_id: menu_test.local_task_test_tasks_settings
   weight: 20
 menu_test.local_task_test_tasks_settings_derived:
-  route_name: menu_test.local_task_test_tasks_settings_derived
   title: derived
-  tab_root_id: menu_test.local_task_test_tasks_view
-  tab_parent_id: menu_test.local_task_test_tasks_settings
+  route_name: menu_test.local_task_test_tasks_settings_derived
+  root_id: menu_test.local_task_test_tasks_view
+  parent_id: menu_test.local_task_test_tasks_settings
   derivative: Drupal\menu_test\Plugin\Derivative\LocalTaskTest
   weight: 50
-menu_test.local_task_test.placeholder_sub1:
-  route_name: menu_test.local_task_test_placeholder_sub1
-  title: 'placeholder sub1'
-  tab_root_id: menu_test.local_task_test_placeholder_sub1
-menu_test.local_task_test_placeholder_sub2:
-  route_name: menu_test.local_task_test_placeholder_sub2
-  title: 'placeholder sub2'
-  tab_root_id: menu_test.local_task_test_placeholder_sub1
+
 menu_test.local_task_test.upcasting_sub1:
   route_name: menu_test.local_task_test_upcasting_sub1
   title: 'upcasting sub1'
-  tab_root_id: menu_test.local_task_test_upcasting_sub1
+  root_id: menu_test.local_task_test_upcasting_sub1
 menu_test.local_task_test_upcasting_sub2:
   route_name: menu_test.local_task_test_upcasting_sub2
   title: 'upcasting sub2'
-  tab_root_id: menu_test.local_task_test_upcasting_sub1
+  root_id: menu_test.local_task_test_upcasting_sub1
   weight: 10
 
 menu_test.tasks_default_tab:
   route_name: menu_test.tasks_default
   title: 'View'
-  tab_root_id: menu_test.tasks_default_tab
+  root_id: menu_test.tasks_default_tab
 
 menu_test.tasks_tasks_tab:
   route_name: menu_test.tasks_tasks
   title: 'View'
-  tab_root_id: menu_test.tasks_tasks_tab
+  root_id: menu_test.tasks_tasks_tab
 menu_test.tasks_edit_tab:
   route_name: menu_test.tasks_edit
   title: 'Edit'
-  tab_root_id: menu_test.tasks_tasks_tab
+  root_id: menu_test.tasks_tasks_tab
 menu_test.tasks_settings_tab:
   route_name: menu_test.tasks_settings
   title: 'Settings'
   weight: 100
-  tab_root_id: menu_test.tasks_tasks_tab
+  root_id: menu_test.tasks_tasks_tab
diff --git a/core/modules/system/tests/modules/menu_test/menu_test.routing.yml b/core/modules/system/tests/modules/menu_test/menu_test.routing.yml
index 5ab1a94..4a86fd1 100644
--- a/core/modules/system/tests/modules/menu_test/menu_test.routing.yml
+++ b/core/modules/system/tests/modules/menu_test/menu_test.routing.yml
@@ -171,20 +171,6 @@ menu_test.local_task_test_tasks_settings_derived:
   requirements:
     _access: 'TRUE'
 
-menu_test.local_task_test_placeholder_sub1:
-  path: '/menu-local-task-test-dynamic/{placeholder}/sub1'
-  defaults:
-    _content: '\Drupal\menu_test\TestControllers::test1'
-  requirements:
-    _access: 'TRUE'
-
-menu_test.local_task_test_placeholder_sub2:
-  path: '/menu-local-task-test-dynamic/{placeholder}/sub2'
-  defaults:
-    _content: '\Drupal\menu_test\TestControllers::test1'
-  requirements:
-    _access: 'TRUE'
-
 menu_test.local_task_test_upcasting_sub1:
   path: '/menu-local-task-test-upcasting/{entity_test}/sub1'
   defaults:
diff --git a/core/modules/tracker/tracker.local_tasks.yml b/core/modules/tracker/tracker.local_tasks.yml
index 7600bd0..869e8c2 100644
--- a/core/modules/tracker/tracker.local_tasks.yml
+++ b/core/modules/tracker/tracker.local_tasks.yml
@@ -1,10 +1,7 @@
-tracker.page_tab:
-  route_name: tracker.page
+tracker.page:
   title: 'Recent content'
-  tab_root_id: tracker.page_tab
 
-tracker.users_recent_tab:
-  route_name: tracker.users_recent_content
+tracker.users_recent_content:
   title: 'My recent content'
-  tab_root_id: tracker.page_tab
+  root_id: tracker.page
   class: '\Drupal\tracker\Plugin\Menu\UserTrackerTab'
diff --git a/core/modules/user/user.local_tasks.yml b/core/modules/user/user.local_tasks.yml
index 0b40260..d1005e0 100644
--- a/core/modules/user/user.local_tasks.yml
+++ b/core/modules/user/user.local_tasks.yml
@@ -1,8 +1,5 @@
-user.role_list_tab:
-  route_name: user.role_list
+user.role_list:
   title: 'Roles'
-  tab_root_id: user.role_list_tab
-user.account_settings_tab:
-  route_name: user.account_settings
+
+user.account_settings:
   title: 'Settings'
-  tab_root_id: user.account_settings_tab
diff --git a/core/modules/views_ui/views_ui.local_tasks.yml b/core/modules/views_ui/views_ui.local_tasks.yml
index 68fc7dc..2ef46d5 100644
--- a/core/modules/views_ui/views_ui.local_tasks.yml
+++ b/core/modules/views_ui/views_ui.local_tasks.yml
@@ -1,22 +1,19 @@
-views_ui.settings_tab:
-  route_name: views_ui.settings_basic
+views_ui.list:
+  title: List
+
+views_ui.settings_basic:
   title: Settings
-  tab_root_id: views_ui.list_tab
+  root_id: views_ui.list
 
 views_ui.settings_basic_tab:
-  route_name: views_ui.settings_basic
   title: Basic
-  tab_root_id: views_ui.list_tab
-  tab_parent_id: views_ui.settings_tab
+  route_name: views_ui.settings_basic
+  root_id: views_ui.list
+  parent_id: views_ui.settings_basic
 
-views_ui.settings_advanced_tab:
-  route_name: views_ui.settings_advanced
+views_ui.settings_advanced:
   title: Advanced
-  tab_root_id: views_ui.list_tab
-  tab_parent_id: views_ui.settings_tab
+  root_id: views_ui.list
+  parent_id: views_ui.settings_basic
   weight: 10
 
-views_ui.list_tab:
-  route_name: views_ui.list
-  title: List
-  tab_root_id: views_ui.list_tab
diff --git a/core/tests/Drupal/Tests/Core/Menu/LocalTaskDefaultTest.php b/core/tests/Drupal/Tests/Core/Menu/LocalTaskDefaultTest.php
index 8cf9e96..e8c9d32 100644
--- a/core/tests/Drupal/Tests/Core/Menu/LocalTaskDefaultTest.php
+++ b/core/tests/Drupal/Tests/Core/Menu/LocalTaskDefaultTest.php
@@ -196,7 +196,7 @@ public function providerTestGetWeight() {
       // Ensure that a default tab get a lower weight.
       array(
         array(
-          'tab_root_id' => 'local_task_default',
+          'root_id' => 'local_task_default',
           'id' => 'local_task_default'
         ),
         'local_task_default',
@@ -205,7 +205,7 @@ public function providerTestGetWeight() {
       // If the root ID is different to the ID of the tab, ignore it.
       array(
         array(
-          'tab_root_id' => 'local_task_example',
+          'root_id' => 'local_task_example',
           'id' => 'local_task_default'
         ),
         'local_task_default',
diff --git a/core/tests/Drupal/Tests/Core/Menu/LocalTaskManagerTest.php b/core/tests/Drupal/Tests/Core/Menu/LocalTaskManagerTest.php
index f10bb38..e438fed 100644
--- a/core/tests/Drupal/Tests/Core/Menu/LocalTaskManagerTest.php
+++ b/core/tests/Drupal/Tests/Core/Menu/LocalTaskManagerTest.php
@@ -269,20 +269,20 @@ protected function getLocalTaskFixtures() {
       'id' => 'menu_local_task_test_tasks_settings',
       'route_name' => 'menu_local_task_test_tasks_settings',
       'title' => 'Settings',
-      'tab_root_id' => 'menu_local_task_test_tasks_view',
+      'root_id' => 'menu_local_task_test_tasks_view',
     );
     $definitions['menu_local_task_test_tasks_edit'] = array(
       'id' => 'menu_local_task_test_tasks_edit',
       'route_name' => 'menu_local_task_test_tasks_edit',
       'title' => 'Settings',
-      'tab_root_id' => 'menu_local_task_test_tasks_view',
+      'root_id' => 'menu_local_task_test_tasks_view',
       'weight' => 20,
     );
     $definitions['menu_local_task_test_tasks_view'] = array(
       'id' => 'menu_local_task_test_tasks_view',
       'route_name' => 'menu_local_task_test_tasks_view',
       'title' => 'Settings',
-      'tab_root_id' => 'menu_local_task_test_tasks_view',
+      'root_id' => 'menu_local_task_test_tasks_view',
     );
     // Add the defaults from the LocalTaskManager.
     foreach ($definitions as $id => &$info) {
@@ -291,8 +291,8 @@ protected function getLocalTaskFixtures() {
         'route_name' => '',
         'route_parameters' => array(),
         'title' => '',
-        'tab_root_id' => '',
-        'tab_parent_id' => NULL,
+        'root_id' => '',
+        'parent_id' => NULL,
         'weight' => 0,
         'options' => array(),
         'class' => 'Drupal\Core\Menu\LocalTaskDefault',
@@ -345,7 +345,7 @@ protected function getLocalTasksForRouteResult($mock_plugin) {
    */
   protected function getLocalTasksCache() {
     return array(
-      'tab_root_ids' => array(
+      'root_ids' => array(
         'menu_local_task_test_tasks_view' => 'menu_local_task_test_tasks_view',
       ),
       'parents' => array(
