diff --git a/core/core.services.yml b/core/core.services.yml
index f070b69..6b9ed2e 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -174,7 +174,7 @@ services:
     arguments: ['@container.namespaces', '@controller_resolver', '@request', '@module_handler']
   plugin.manager.menu.local_task:
     class: Drupal\Core\Menu\LocalTaskManager
-    arguments: ['@container.namespaces', '@controller_resolver', '@request', '@router.route_provider', '@module_handler']
+    arguments: ['@controller_resolver', '@request', '@router.route_provider', '@module_handler']
   request:
     class: Symfony\Component\HttpFoundation\Request
     # @TODO the synthetic setting must be uncommented whenever drupal_session_initialize()
diff --git a/core/lib/Drupal/Core/Menu/LocalTaskDefault.php b/core/lib/Drupal/Core/Menu/LocalTaskDefault.php
new file mode 100644
index 0000000..57e32df
--- /dev/null
+++ b/core/lib/Drupal/Core/Menu/LocalTaskDefault.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Menu\LocalTaskDefault.
+ */
+
+namespace Drupal\Core\Menu;
+
+
+/**
+ * Default object used for LocalTaskPlugins.
+ */
+class LocalTaskDefault extends LocalTaskBase {
+
+}
\ No newline at end of file
diff --git a/core/lib/Drupal/Core/Menu/LocalTaskManager.php b/core/lib/Drupal/Core/Menu/LocalTaskManager.php
index 00837c5..791c639 100644
--- a/core/lib/Drupal/Core/Menu/LocalTaskManager.php
+++ b/core/lib/Drupal/Core/Menu/LocalTaskManager.php
@@ -7,8 +7,12 @@
 
 namespace Drupal\Core\Menu;
 
+use Drupal\Component\Plugin\Discovery\ProcessDecorator;
+use Drupal\Component\Plugin\PluginManagerBase;
 use Drupal\Core\Extension\ModuleHandlerInterface;
-use Drupal\Core\Plugin\DefaultPluginManager;
+use Drupal\Core\Plugin\Discovery\ContainerDerivativeDiscoveryDecorator;
+use Drupal\Core\Plugin\Discovery\YamlDiscovery;
+use Drupal\Core\Plugin\Factory\ContainerFactory;
 use Drupal\Core\Routing\RouteProviderInterface;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
@@ -20,7 +24,25 @@
  * Derivatives are supported for modules that wish to generate multiple tabs on
  * behalf of something else.
  */
-class LocalTaskManager extends DefaultPluginManager {
+class LocalTaskManager extends PluginManagerBase {
+
+  protected $defaults = array(
+    // The ID.
+    'title' => '',
+    // The static title for the local task.
+    'id' => '',
+    'route_name' => '',
+    // The plugin ID of the root tab.
+    'tab_root_id' => '',
+    // The plugin ID of the parent tab (or NULL for the top-level tab).
+    'tab_parent_id' => NULL,
+    // The weight of the tab.
+    'weight' => NULL,
+    // The default link options.
+    'options' => array(),
+    // Default class for local task implementations.
+    'class' => 'Drupal\Core\Menu\LocalTaskDefault',
+  );
 
   /**
    * A controller resolver object.
@@ -53,9 +75,6 @@ class LocalTaskManager extends DefaultPluginManager {
   /**
    * Constructs a \Drupal\Core\Menu\LocalTaskManager object.
    *
-   * @param \Traversable $namespaces
-   *   An object that implements \Traversable which contains the root paths
-   *   keyed by the corresponding namespace to look for plugin implementations,
    * @param \Symfony\Component\HttpKernel\Controller\ControllerResolverInterface $controller_resolver
    *   An object to use in introspecting route methods.
    * @param \Symfony\Component\HttpFoundation\Request $request
@@ -63,14 +82,20 @@ class LocalTaskManager extends DefaultPluginManager {
    * @param \Drupal\Core\Routing\RouteProviderInterface $route_provider
    *   The route provider to load routes by name.
    * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
-   *   The module handler.u
+   *   The module handler.
    */
-  public function __construct(\Traversable $namespaces, ControllerResolverInterface $controller_resolver, Request $request, RouteProviderInterface $route_provider, ModuleHandlerInterface $module_handler) {
-    parent::__construct('Plugin/Menu/LocalTask', $namespaces, array(), 'Drupal\Core\Annotation\Menu\LocalTask');
+  public function __construct(ControllerResolverInterface $controller_resolver, Request $request, RouteProviderInterface $route_provider, ModuleHandlerInterface $module_handler) {
+
     $this->controllerResolver = $controller_resolver;
     $this->request = $request;
     $this->routeProvider = $route_provider;
-    $this->alterInfo($module_handler, 'local_tasks');
+
+    // @todo caching/compiling, translations and altering.
+    // $this->alterInfo($module_handler, 'local_tasks');
+    $this->discovery = new YamlDiscovery('local_tasks', array_values($module_handler->getModuleDirectories()));
+    $this->discovery = new ContainerDerivativeDiscoveryDecorator($this->discovery);
+    $this->discovery = new ProcessDecorator($this->discovery, array($this, 'processDefinition'));
+    $this->factory = new ContainerFactory($this);
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Plugin/Discovery/YamlDiscovery.php b/core/lib/Drupal/Core/Plugin/Discovery/YamlDiscovery.php
new file mode 100644
index 0000000..b802dfc
--- /dev/null
+++ b/core/lib/Drupal/Core/Plugin/Discovery/YamlDiscovery.php
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Core\Plugin\Discovery\YamlDiscovery.
+ */
+
+namespace Drupal\Core\Plugin\Discovery;
+
+use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
+use Drupal\Component\Discovery\YamlDiscovery as DrupalYamlDiscovery;
+
+/**
+ * Allows YAML files to define plugin definitions.
+ */
+class YamlDiscovery implements DiscoveryInterface {
+
+  /**
+   * Internal YAML parsing handler.
+   *
+   * @var \Drupal\Component\Discovery\YamlDiscovery
+   */
+  protected $discovery;
+
+  /**
+   * Construct a YamlDiscovery object.
+   *
+   * @param string $name
+   *   The
+   * @param array $directories
+   *   An array of directories to scan.
+   */
+  function __construct($name, array $directories) {
+    $this->discovery = new DrupalYamlDiscovery($name, $directories);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefinition($plugin_id) {
+    $definitions = $this->getDefinitions();
+    return isset($definitions[$plugin_id]) ? $definitions[$plugin_id] : NULL;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefinitions() {
+
+    $plugins = $this->discovery->findAll();
+
+    // Flatten definitions into what's expected from plugins.
+    $definitions = array();
+    foreach ($plugins as $provider => $list) {
+      foreach ($list as $id => $tmp) {
+        $tmp['provider'] = $provider;
+        $definitions[$id] = $tmp;
+      }
+    }
+
+    return $definitions;
+  }
+}
\ No newline at end of file
diff --git a/core/modules/system/lib/Drupal/system/Tests/Menu/LocalTasksTest.php b/core/modules/system/lib/Drupal/system/Tests/Menu/LocalTasksTest.php
index 1a32725..d3e481a 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Menu/LocalTasksTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Menu/LocalTasksTest.php
@@ -165,6 +165,7 @@ public function testPluginLocalTask() {
     $this->assertLocalTasks(array(
       'menu-local-task-test/tasks/settings/sub1',
       'menu-local-task-test/tasks/settings/sub2',
+      'menu-local-task-test/tasks/settings/sub3',
     ), 1);
 
     $result = $this->xpath('//ul[contains(@class, "tabs")]//a[contains(@class, "active")]');
@@ -176,12 +177,13 @@ public function testPluginLocalTask() {
     $this->assertLocalTasks(array(
       'menu-local-task-test/tasks/settings/sub1',
       'menu-local-task-test/tasks/settings/sub2',
+      'menu-local-task-test/tasks/settings/sub3',
     ), 1);
 
     $result = $this->xpath('//ul[contains(@class, "tabs")]//a[contains(@class, "active")]');
     $this->assertEqual(2, count($result), 'There are tabs active on both levels.');
     $this->assertEqual('Settings', (string) $result[0], 'The settings tab is active.');
-    $this->assertEqual('sub1', (string) $result[1], 'The sub1 tab is active.');
+    $this->assertEqual('Dynamic title', (string) $result[1], 'The sub1 tab is active.');
   }
 
 }
diff --git a/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Menu/LocalTask/TestTasksEdit.php b/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Menu/LocalTask/TestTasksEdit.php
deleted file mode 100644
index 40996c8..0000000
--- a/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Menu/LocalTask/TestTasksEdit.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\menu_test\Plugin\Menu\LocalTask\TestTasksEdit.
- */
-
-namespace Drupal\menu_test\Plugin\Menu\LocalTask;
-
-use Drupal\Core\Annotation\Menu\LocalTask;
-use Drupal\Core\Menu\LocalTaskBase;
-use Drupal\Core\Annotation\Translation;
-
-/**
- * @LocalTask(
- *   id = "menu_local_task_test_tasks_edit",
- *   route_name = "menu_local_task_test_tasks_edit",
- *   title = @Translation("Edit"),
- *   tab_root_id = "menu_local_task_test_tasks_view",
- *   weight = "10"
- * )
- */
-class TestTasksEdit extends LocalTaskBase {
-
-}
diff --git a/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Menu/LocalTask/TestTasksSettings.php b/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Menu/LocalTask/TestTasksSettings.php
deleted file mode 100644
index 67b2f65..0000000
--- a/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Menu/LocalTask/TestTasksSettings.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\menu_test\Plugin\Menu\LocalTask\TestTasksSettings.
- */
-
-namespace Drupal\menu_test\Plugin\Menu\LocalTask;
-
-use Drupal\Core\Annotation\Menu\LocalTask;
-use Drupal\Core\Menu\LocalTaskBase;
-use Drupal\Core\Annotation\Translation;
-
-/**
- * @LocalTask(
- *   id = "menu_local_task_test_tasks_settings",
- *   route_name = "menu_local_task_test_tasks_settings",
- *   title = @Translation("Settings"),
- *   tab_root_id = "menu_local_task_test_tasks_view"
- * )
- */
-class TestTasksSettings extends LocalTaskBase {
-
-}
diff --git a/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Menu/LocalTask/TestTasksSettingsSub1.php b/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Menu/LocalTask/TestTasksSettingsSub1.php
index 2b0729a..eba9fc4 100644
--- a/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Menu/LocalTask/TestTasksSettingsSub1.php
+++ b/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Menu/LocalTask/TestTasksSettingsSub1.php
@@ -11,16 +11,13 @@
 use Drupal\Core\Menu\LocalTaskBase;
 use Drupal\Core\Annotation\Translation;
 
-/**
- * @LocalTask(
- *   id = "menu_local_task_test_tasks_settings_sub1",
- *   route_name = "menu_local_task_test_tasks_settings_sub1",
- *   title = @Translation("sub1"),
- *   tab_root_id = "menu_local_task_test_tasks_view",
- *   tab_parent_id = "menu_local_task_test_tasks_settings",
- *   weight = "-10"
- * )
- */
 class TestTasksSettingsSub1 extends LocalTaskBase {
 
+  /**
+   * {@inheritdoc}
+   */
+  function getTitle() {
+    return 'Dynamic title';
+  }
+
 }
diff --git a/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Menu/LocalTask/TestTasksSettingsSub2.php b/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Menu/LocalTask/TestTasksSettingsSub2.php
deleted file mode 100644
index f3cedfe..0000000
--- a/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Menu/LocalTask/TestTasksSettingsSub2.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\menu_test\Plugin\Menu\LocalTask\TestTasksSettingsSub2.
- */
-
-namespace Drupal\menu_test\Plugin\Menu\LocalTask;
-
-use Drupal\Core\Annotation\Menu\LocalTask;
-use Drupal\Core\Menu\LocalTaskBase;
-use Drupal\Core\Annotation\Translation;
-
-/**
- * @LocalTask(
- *   id = "menu_local_task_test_tasks_settings_sub2",
- *   route_name = "menu_local_task_test_tasks_settings_sub2",
- *   title = @Translation("sub2"),
- *   tab_root_id = "menu_local_task_test_tasks_view",
- *   tab_parent_id = "menu_local_task_test_tasks_settings"
- * )
- */
-class TestTasksSettingsSub2 extends LocalTaskBase {
-
-}
diff --git a/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Menu/LocalTask/TestTasksView.php b/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Menu/LocalTask/TestTasksView.php
deleted file mode 100644
index 76bf0a3..0000000
--- a/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/Plugin/Menu/LocalTask/TestTasksView.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\menu_test\Plugin\Menu\LocalTask\TestTasksView.
- */
-
-namespace Drupal\menu_test\Plugin\Menu\LocalTask;
-
-use Drupal\Core\Menu\LocalTaskBase;
-use Drupal\Core\Annotation\Menu\LocalTask;
-use Drupal\Core\Annotation\Translation;
-
-/**
- * @LocalTask(
- *   id = "menu_local_task_test_tasks_view",
- *   route_name = "menu_local_task_test_tasks_view",
- *   title = @Translation("View"),
- *   tab_root_id = "menu_local_task_test_tasks_view"
- * )
- */
-class TestTasksView extends LocalTaskBase {
-
-}
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
new file mode 100644
index 0000000..0121d0a
--- /dev/null
+++ b/core/modules/system/tests/modules/menu_test/menu_test.local_tasks.yml
@@ -0,0 +1,27 @@
+menu_local_task_test_tasks_edit:
+  route_name: menu_local_task_test_tasks_edit
+  title: Edit
+  tab_root_id: menu_local_task_test_tasks_view
+  weight: 10
+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
+menu_local_task_test_tasks_settings_sub1:
+  route_name: menu_local_task_test_tasks_settings_sub1
+  title: sub1
+  tab_root_id: menu_local_task_test_tasks_view
+  tab_parent_id: menu_local_task_test_tasks_settings
+  class: Drupal\menu_test\Plugin\Menu\LocalTask\TestTasksSettingsSub1
+  weight: -10
+menu_local_task_test_tasks_settings_sub2:
+  route_name: menu_local_task_test_tasks_settings_sub2
+  title: sub2
+  tab_root_id: menu_local_task_test_tasks_view
+  tab_parent_id: menu_local_task_test_tasks_settings
+menu_local_task_test_tasks_settings_sub3:
+  route_name: menu_local_task_test_tasks_settings_sub3
+  title: sub3
+  tab_root_id: menu_local_task_test_tasks_view
+  tab_parent_id: menu_local_task_test_tasks_settings
+  weight: 20
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 2d701dc..43f008d 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
@@ -100,6 +100,13 @@ menu_local_task_test_tasks_settings_sub2:
   requirements:
     _access: 'TRUE'
 
+menu_local_task_test_tasks_settings_sub3:
+  pattern: '/menu-local-task-test/tasks/settings/sub3'
+  defaults:
+    _content: '\Drupal\menu_test\TestControllers::test1'
+  requirements:
+    _access: 'TRUE'
+
 menu_test_optional_placeholder:
   pattern: '/menu-test/optional/{placeholder}'
   defaults:
diff --git a/core/modules/views_ui/lib/Drupal/views_ui/Plugin/Menu/LocalTask/ViewsListTask.php b/core/modules/views_ui/lib/Drupal/views_ui/Plugin/Menu/LocalTask/ViewsListTask.php
deleted file mode 100644
index f1237fc..0000000
--- a/core/modules/views_ui/lib/Drupal/views_ui/Plugin/Menu/LocalTask/ViewsListTask.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\views_ui\Plugin\Menu\LocalTask\ViewsListTask.
- */
-
-namespace Drupal\views_ui\Plugin\Menu\LocalTask;
-
-use Drupal\Core\Annotation\Translation;
-use Drupal\Core\Menu\LocalTaskBase;
-use Drupal\Core\Annotation\Menu\LocalTask;
-
-
-/**
- * @LocalTask(
- *   id = "views_ui_list_tab",
- *   route_name = "views_ui.list",
- *   title = @Translation("List"),
- *   tab_root_id = "views_ui_list_tab"
- * )
- */
-class ViewsListTask extends LocalTaskBase {
-
-}
diff --git a/core/modules/views_ui/lib/Drupal/views_ui/Plugin/Menu/LocalTask/ViewsSettingsAdvancedTask.php b/core/modules/views_ui/lib/Drupal/views_ui/Plugin/Menu/LocalTask/ViewsSettingsAdvancedTask.php
deleted file mode 100644
index 4ab9b77..0000000
--- a/core/modules/views_ui/lib/Drupal/views_ui/Plugin/Menu/LocalTask/ViewsSettingsAdvancedTask.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\views_ui\Plugin\Menu\LocalTask\ViewsSettingsAdvancedTas.
- */
-
-namespace Drupal\views_ui\Plugin\Menu\LocalTask;
-
-use Drupal\Core\Annotation\Translation;
-use Drupal\Core\Menu\LocalTaskBase;
-use Drupal\Core\Annotation\Menu\LocalTask;
-
-/**
- * @LocalTask(
- *   id = "views_ui_settings_advanced_tab",
- *   route_name = "views_ui.settings.advanced",
- *   title = @Translation("Advanced"),
- *   tab_root_id = "views_ui_list_tab",
- *   tab_parent_id = "views_ui_settings_tab",
- *   weight = "10"
- * )
- */
-class ViewsSettingsAdvancedTask extends LocalTaskBase {
-
-}
diff --git a/core/modules/views_ui/lib/Drupal/views_ui/Plugin/Menu/LocalTask/ViewsSettingsBasicTask.php b/core/modules/views_ui/lib/Drupal/views_ui/Plugin/Menu/LocalTask/ViewsSettingsBasicTask.php
deleted file mode 100644
index c8d454f..0000000
--- a/core/modules/views_ui/lib/Drupal/views_ui/Plugin/Menu/LocalTask/ViewsSettingsBasicTask.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\views_ui\Plugin\Menu\LocalTask\ViewsSettingsBasicTask.
- */
-
-namespace Drupal\views_ui\Plugin\Menu\LocalTask;
-
-use Drupal\Core\Annotation\Translation;
-use Drupal\Core\Menu\LocalTaskBase;
-use Drupal\Core\Annotation\Menu\LocalTask;
-
-/**
- * @LocalTask(
- *   id = "views_ui_settings_basic_tab",
- *   route_name = "views_ui.settings.basic",
- *   title = @Translation("Basic"),
- *   tab_root_id = "views_ui_list_tab",
- *   tab_parent_id = "views_ui_settings_tab"
- * )
- */
-class ViewsSettingsBasicTask extends LocalTaskBase {
-
-}
diff --git a/core/modules/views_ui/lib/Drupal/views_ui/Plugin/Menu/LocalTask/ViewsSettingsTask.php b/core/modules/views_ui/lib/Drupal/views_ui/Plugin/Menu/LocalTask/ViewsSettingsTask.php
deleted file mode 100644
index 9dddf80..0000000
--- a/core/modules/views_ui/lib/Drupal/views_ui/Plugin/Menu/LocalTask/ViewsSettingsTask.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\views_ui\Plugin\Menu\LocalTask\ViewsSettingsTask.
- */
-
-namespace Drupal\views_ui\Plugin\Menu\LocalTask;
-
-use Drupal\Core\Annotation\Translation;
-use Drupal\Core\Menu\LocalTaskBase;
-use Drupal\Core\Annotation\Menu\LocalTask;
-
-/**
- * @LocalTask(
- *   id = "views_ui_settings_tab",
- *   route_name = "views_ui.settings.basic",
- *   title = @Translation("Settings"),
- *   tab_root_id = "views_ui_list_tab"
- * )
- */
-class ViewsSettingsTask extends LocalTaskBase {
-
-}
diff --git a/core/modules/views_ui/views_ui.local_tasks.yml b/core/modules/views_ui/views_ui.local_tasks.yml
new file mode 100644
index 0000000..7475569
--- /dev/null
+++ b/core/modules/views_ui/views_ui.local_tasks.yml
@@ -0,0 +1,22 @@
+views_ui_settings_tab:
+  route_name: views_ui.settings.basic
+  title: Settings
+  tab_root_id: views_ui_list_tab
+
+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
+
+views_ui_settings_advanced_tab:
+  route_name: views_ui.settings.advanced
+  title: Advanced
+  tab_root_id: views_ui_list_tab
+  tab_parent_id: views_ui_settings_tab
+  weight: 10
+
+views_ui_list_tab:
+  route_name: views_ui.list
+  title: List
+  tab_root_id: views_ui_list_tab
