diff --git a/core/lib/Drupal/Core/Menu/LocalActionBase.php b/core/lib/Drupal/Core/Menu/LocalActionBase.php
index e1eba91..ef6bc5c 100644
--- a/core/lib/Drupal/Core/Menu/LocalActionBase.php
+++ b/core/lib/Drupal/Core/Menu/LocalActionBase.php
@@ -81,7 +81,6 @@ public function getRouteName() {
    * {@inheritdoc}
    */
   public function getTitle() {
-    // Subclasses may pull in the request or specific attributes as parameters.
     return $this->pluginDefinition['title'];
   }
 
diff --git a/core/lib/Drupal/Core/Menu/Plugin/Derivative/StaticLocalActionDeriver.php b/core/lib/Drupal/Core/Menu/Plugin/Derivative/StaticLocalActionDeriver.php
new file mode 100644
index 0000000..3b6a2c2
--- /dev/null
+++ b/core/lib/Drupal/Core/Menu/Plugin/Derivative/StaticLocalActionDeriver.php
@@ -0,0 +1,117 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Menu\Plugin\Derivative\StaticLocalActionDeriver.
+ */
+
+namespace Drupal\Core\Menu\Plugin\Derivative;
+
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Plugin\Discovery\ContainerDerivativeInterface;
+use Drupal\Core\StringTranslation\Translator\TranslatorInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\Yaml\Parser;
+
+/**
+ * Provides plugin derivatives for local actions provided in YAML files.
+ */
+class StaticLocalActionDeriver implements ContainerDerivativeInterface {
+
+  /**
+   * List of derivative definitions.
+   *
+   * @var array
+   */
+  protected $derivatives = array();
+
+  /**
+   * The base plugin ID.
+   *
+   * @var string
+   */
+  protected $base_plugin_id;
+
+  /**
+   * The module handler.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
+   * The translation manager.
+   *
+   * @var \Drupal\Core\StringTranslation\Translator\TranslatorInterface
+   */
+  protected $translationManager;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, $base_plugin_id) {
+    return new static(
+      $base_plugin_id,
+      $container->get('module_handler'),
+      $container->get('string_translation')
+    );
+  }
+
+  /**
+   * Constructs a StaticLocalActionDeriver object.
+   *
+   * @param string $base_plugin_id
+   *   The base plugin ID.
+   * @param\Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler.
+   * @param \Drupal\Core\StringTranslation\Translator\TranslatorInterface translation_manager
+   *   The translation manager.
+   */
+  public function __construct($base_plugin_id, ModuleHandlerInterface $module_handler, TranslatorInterface $translation_manager) {
+    $this->basePluginId = $base_plugin_id;
+    $this->moduleHandler = $module_handler;
+    $this->translationManager = $translation_manager;
+  }
+
+  /**
+   * Implements \Drupal\Component\Plugin\Derivative\DerivativeInterface::getDerivativeDefinition().
+   */
+  public function getDerivativeDefinition($derivative_id, array $base_plugin_definition) {
+    if (!empty($this->derivatives) && !empty($this->derivatives[$derivative_id])) {
+      return $this->derivatives[$derivative_id];
+    }
+    $this->getDerivativeDefinitions($base_plugin_definition);
+    return $this->derivatives[$derivative_id];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDerivativeDefinitions(array $base_plugin_definition) {
+    $parser = new Parser();
+
+    // @todo Replace with a generic YAML discovery solution when we have one.
+    foreach ($this->moduleHandler->getModuleList() as $module => $filename) {
+      $local_actions_file = DRUPAL_ROOT . '/' . dirname($filename) . '/' . $module . '.local_actions.yml';
+      if (file_exists($local_actions_file)) {
+        $local_actions = $parser->parse(file_get_contents($local_actions_file));
+
+        if (!empty($local_actions)) {
+          foreach ($local_actions as $name => $info) {
+            $this->derivatives[$name] = array(
+              'route_name' => isset($info['route_name']) ? $info['route_name'] : '',
+              'title' => isset($info['title']) ? $this->translationManager->translate($info['title']) : '',
+              'appears_on' => isset($info['appears_on']) ? $info['appears_on'] : array(),
+              'provider' => $module,
+            );
+
+            $this->derivatives[$name] += $base_plugin_definition;
+          }
+        }
+      }
+    }
+
+    return $this->derivatives;
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Menu/Plugin/Menu/LocalAction/StaticLocalAction.php b/core/lib/Drupal/Core/Menu/Plugin/Menu/LocalAction/StaticLocalAction.php
new file mode 100644
index 0000000..b0e0e9d
--- /dev/null
+++ b/core/lib/Drupal/Core/Menu/Plugin/Menu/LocalAction/StaticLocalAction.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Annotation\StaticLocalAction.
+ */
+
+namespace Drupal\Core\Menu\Plugin\Menu\LocalAction;
+
+use Drupal\Core\Annotation\Menu\LocalAction;
+use Drupal\Core\Menu\LocalActionBase;
+
+/**
+ * @LocalAction(
+ *   id = "local_action_static",
+ *   derivative = "Drupal\Core\Menu\Plugin\Derivative\StaticLocalActionDeriver"
+ * )
+ */
+class StaticLocalAction extends LocalActionBase {
+
+}
diff --git a/core/modules/views_ui/lib/Drupal/views_ui/Plugin/Menu/LocalAction/AddViewLocalAction.php b/core/modules/views_ui/lib/Drupal/views_ui/Plugin/Menu/LocalAction/AddViewLocalAction.php
deleted file mode 100644
index 406107f..0000000
--- a/core/modules/views_ui/lib/Drupal/views_ui/Plugin/Menu/LocalAction/AddViewLocalAction.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\views_ui\Plugin\Menu\AddViewLocalAction.
- */
-
-namespace Drupal\views_ui\Plugin\Menu\LocalAction;
-
-use Drupal\Core\Annotation\Translation;
-use Drupal\Core\Menu\LocalActionBase;
-use Drupal\Core\Annotation\Menu\LocalAction;
-
-/**
- * @LocalAction(
- *   id = "views_add_local_action",
- *   route_name = "views_ui.add",
- *   title = @Translation("Add new view"),
- *   appears_on = {"views_ui.list"}
- * )
- */
-class AddViewLocalAction extends LocalActionBase {
-
-}
diff --git a/core/modules/views_ui/views_ui.local_actions.yml b/core/modules/views_ui/views_ui.local_actions.yml
new file mode 100644
index 0000000..6a0ded0
--- /dev/null
+++ b/core/modules/views_ui/views_ui.local_actions.yml
@@ -0,0 +1,5 @@
+views_add_local_action:
+  route_name: views_ui.add
+  title: 'Add new view'
+  appears_on:
+    - views_ui.list
