diff --git a/core/lib/Drupal/Core/Extension/InfoParserInterface.php b/core/lib/Drupal/Core/Extension/InfoParserInterface.php
index 2c6e2d1..bc30be6 100644
--- a/core/lib/Drupal/Core/Extension/InfoParserInterface.php
+++ b/core/lib/Drupal/Core/Extension/InfoParserInterface.php
@@ -27,7 +27,17 @@
    * - type: whether it is for a module or theme. (Required)
    *
    * Information stored in a module .info.yml file:
-   * - dependencies: An array of shortnames of other modules this module requires.
+   * - dependencies: An array of strings of the form project:module (>x.y).
+   *   - project: Project shortname. (Recommended to ensure uniqueness.
+   *     Multiple projects may have modules with the same name which breaks
+   *     automated testing among other things.  Custom modules may not have a
+   *     project name.  in this case just the module name can be specified.)
+   *   - module: Module shortname within the project. (Required)
+   *   - (>x.y): Version requirement with operator and version. (Optional)
+   *   Example for project hosted on drupal.org:
+   *     drupal:system (>=8.22, <8.28)
+   *   Example for a custom module:
+   *     system (>=8.22, <8.28)
    * - package: The name of the package of modules this module belongs to.
    *
    * See forum.info.yml for an example of a module .info.yml file.
diff --git a/core/lib/Drupal/Core/Extension/ModuleHandler.php b/core/lib/Drupal/Core/Extension/ModuleHandler.php
index 8647029..57e074b 100644
--- a/core/lib/Drupal/Core/Extension/ModuleHandler.php
+++ b/core/lib/Drupal/Core/Extension/ModuleHandler.php
@@ -633,7 +633,7 @@ protected function verifyImplementations(&$implementations, $hook) {
    * Parses a dependency for comparison by drupal_check_incompatibility().
    *
    * @param $dependency
-   *   A dependency string, for example 'foo (>=8.x-4.5-beta5, 3.x)'.
+   *   A dependency string, for example 'project:module (>=8.x-4.5-beta5, 3.x)'.
    *
    * @return
    *   An associative array with three keys:
@@ -648,6 +648,12 @@ protected function verifyImplementations(&$implementations, $hook) {
    * @see drupal_check_incompatibility()
    */
   public static function parseDependency($dependency) {
+    $value = array();
+    // Split out the optional project name.
+    if (strpos($dependency, ':') !== FALSE) {
+      list($project_name, $dependency) = explode(':', $dependency);
+      $value['project'] = $project_name;
+    }
     // We use named subpatterns and support every op that version_compare
     // supports. Also, op is optional and defaults to equals.
     $p_op = '(?<operation>!=|==|=|<|<=|>|>=|<>)?';
@@ -656,7 +662,6 @@ public static function parseDependency($dependency) {
     $p_major = '(?<major>\d+)';
     // By setting the minor version to x, branches can be matched.
     $p_minor = '(?<minor>(?:\d+|x)(?:-[A-Za-z]+\d+)?)';
-    $value = array();
     $parts = explode('(', $dependency, 2);
     $value['name'] = trim($parts[0]);
     if (isset($parts[1])) {
diff --git a/core/tests/Drupal/Tests/Core/Extension/ModuleHandlerTest.php b/core/tests/Drupal/Tests/Core/Extension/ModuleHandlerTest.php
index 799c610..6fd555b 100644
--- a/core/tests/Drupal/Tests/Core/Extension/ModuleHandlerTest.php
+++ b/core/tests/Drupal/Tests/Core/Extension/ModuleHandlerTest.php
@@ -499,6 +499,7 @@ public function dependencyProvider() {
       array('views_ui(<= 8.x-1.x)', array('name' => 'views_ui', 'original_version' => ' (<= 8.x-1.x)', 'versions' => array(array('op' => '<=', 'version' => '2.x')))),
       array('views_ui( <=8.x-1.x)', array('name' => 'views_ui', 'original_version' => ' ( <=8.x-1.x)', 'versions' => array(array('op' => '<=', 'version' => '2.x')))),
       array('views_ui(>8.x-1.x)', array('name' => 'views_ui', 'original_version' => ' (>8.x-1.x)', 'versions' => array(array('op' => '>', 'version' => '2.x')))),
+      array('drupal:views_ui(>8.x-1.x)', array('project' => 'drupal', 'module' => 'views_ui', 'original_version' => ' (>8.x-1.x)', 'versions' => array(array('op' => '>', 'version' => '2.x')))),
     );
   }
 
