diff --git a/core/lib/Drupal/Core/Discovery/DiscoverableInterface.php b/core/lib/Drupal/Core/Discovery/DiscoverableInterface.php
new file mode 100644
index 0000000..6fef6b6
--- /dev/null
+++ b/core/lib/Drupal/Core/Discovery/DiscoverableInterface.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Discovery\DiscoverableInterface.
+ */
+
+namespace Drupal\Core\Discovery;
+
+/**
+ * Interface for classes providing a type of discovery.
+ */
+interface DiscoverableInterface {
+
+  /**
+   * Returns an array of discoverable items.
+   *
+   * @return array
+   */
+  public function findAll();
+
+}
diff --git a/core/lib/Drupal/Core/Discovery/YamlDiscovery.php b/core/lib/Drupal/Core/Discovery/YamlDiscovery.php
new file mode 100644
index 0000000..1afdb36
--- /dev/null
+++ b/core/lib/Drupal/Core/Discovery/YamlDiscovery.php
@@ -0,0 +1,62 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Discovery\YamlDiscovery.
+ */
+
+namespace Drupal\Core\Discovery;
+
+use Symfony\Component\Yaml\Parser;
+
+/**
+ * Provides discovery of yaml files within a given set of directories.
+ */
+class YamlDiscovery implements DiscoverableInterface {
+
+  /**
+   * @param string $name
+   * @param array $directories
+   */
+  public function __construct($name, array $directories) {
+    $this->name = $name;
+    $this->directories = $directories;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function findAll() {
+    $parser = $this->parser();
+    $all = array_map(function($file) use ($parser) {
+      return $parser->parse(file_get_contents($file));
+    }, $this->findFiles());
+    return $all;
+  }
+
+  /**
+   * @return \Symfony\Component\Yaml\Parser
+   */
+  protected function parser() {
+    if (!isset($this->parser)) {
+      $this->parser = new Parser();
+    }
+    return $this->parser;
+  }
+
+  /**
+   * @return array
+   */
+  protected function findFiles() {
+    $files = array();
+    foreach ($this->directories as $directory) {
+      $file = $directory . '/' . basename($directory) . '.' . $this->name . '.yml';
+      if (file_exists($file)) {
+        $files[] = $file;
+      }
+    }
+    return $files;
+  }
+
+}
+
diff --git a/core/lib/Drupal/Core/Extension/ModuleHandler.php b/core/lib/Drupal/Core/Extension/ModuleHandler.php
index c510192..da68a94 100644
--- a/core/lib/Drupal/Core/Extension/ModuleHandler.php
+++ b/core/lib/Drupal/Core/Extension/ModuleHandler.php
@@ -900,4 +900,14 @@ public function uninstall($module_list = array(), $uninstall_dependents = TRUE)
     return TRUE;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getModuleDirectories() {
+    $dirs = array();
+    foreach ($this->getModuleList() as $module => $filename) {
+      $dirs[$module] = dirname($filename);
+    }
+    return $dirs;
+  }
 }
diff --git a/core/lib/Drupal/Core/Extension/ModuleHandlerInterface.php b/core/lib/Drupal/Core/Extension/ModuleHandlerInterface.php
index 44284b9..83566b4 100644
--- a/core/lib/Drupal/Core/Extension/ModuleHandlerInterface.php
+++ b/core/lib/Drupal/Core/Extension/ModuleHandlerInterface.php
@@ -335,4 +335,12 @@ public function disable($module_list, $disable_dependents = TRUE);
    */
   public function uninstall($module_list = array(), $uninstall_dependents = TRUE);
 
+  /**
+   * Returns an array of directories for all enabled modules. Useful for
+   * tasks such as finding a file that exists in all module directories.
+   *
+   * @return array
+   */
+  public function getModuleDirectories();
+
 }
