diff --git a/core/lib/Drupal/Core/Extension/InfoParserInterface.php b/core/lib/Drupal/Core/Extension/InfoParserInterface.php
index 2c6e2d1..7c5a5ae 100644
--- a/core/lib/Drupal/Core/Extension/InfoParserInterface.php
+++ b/core/lib/Drupal/Core/Extension/InfoParserInterface.php
@@ -27,7 +27,11 @@
    * - 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)
+   *   - module: Module shortname within the project. (Required)
+   *   - (>x.y): Version requirement with operator and version. (Optional)
+   *   Example: drupal: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 6270c8e..c4ccc20 100644
--- a/core/lib/Drupal/Core/Extension/ModuleHandler.php
+++ b/core/lib/Drupal/Core/Extension/ModuleHandler.php
@@ -217,7 +217,7 @@ public function buildModuleDependencies(array $modules) {
       if (isset($module->info['dependencies']) && is_array($module->info['dependencies'])) {
         foreach ($module->info['dependencies'] as $dependency) {
           $dependency_data = static::parseDependency($dependency);
-          $graph[$module->getName()]['edges'][$dependency_data['name']] = $dependency_data;
+          $graph[$module->getName()]['edges'][$dependency_data['module']] = $dependency_data;
         }
       }
     }
@@ -649,7 +649,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:
@@ -664,6 +664,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>!=|==|=|<|<=|>|>=|<>)?';
@@ -672,9 +678,8 @@ 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]);
+    $value['module'] = trim($parts[0]);
     if (isset($parts[1])) {
       $value['original_version'] = ' (' . $parts[1];
       foreach (explode(',', $parts[1]) as $version) {
diff --git a/core/modules/system/css/system.admin.css b/core/modules/system/css/system.admin.css
index a4024f4..54310e2 100644
--- a/core/modules/system/css/system.admin.css
+++ b/core/modules/system/css/system.admin.css
@@ -136,6 +136,9 @@ span.admin-enabled {
 span.admin-missing {
   color: #f00;
 }
+span.admin-warning {
+  color: #fb0;
+}
 a.module-link {
   display: block;
   padding: 2px 20px;
diff --git a/core/modules/system/src/Form/ModulesListForm.php b/core/modules/system/src/Form/ModulesListForm.php
index 6d9cd88..86ffc8b 100644
--- a/core/modules/system/src/Form/ModulesListForm.php
+++ b/core/modules/system/src/Form/ModulesListForm.php
@@ -24,6 +24,7 @@
 use Drupal\Core\Session\AccountInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\HttpFoundation\Request;
+use Drupal\Component\Utility\Xss;
 
 /**
  * Provides module installation interface.
@@ -355,50 +356,76 @@ protected function buildRow(array $modules, Extension $module, $distribution) {
     }
 
     // If this module requires other modules, add them to the array.
-    foreach ($module->requires as $dependency => $version) {
-      if (!isset($modules[$dependency])) {
-        $row['#requires'][$dependency] = $this->t('@module (<span class="admin-missing">missing</span>)', array('@module' => Unicode::ucfirst($dependency)));
+    foreach ($module->requires as $module_name => $dependency) {
+      if (isset($dependency['project'])) {
+        $project = l(Unicode::ucfirst($dependency['project']), 'https://www.drupal.org/project/' . $dependency['project']) . ':';
+      }
+      else {
+        $project = '';
+      }
+      if (!isset($modules[$module_name])) {
+        $row['#requires'][$module_name] = $this->t('!module (<span class="admin-missing">missing</span>)', array('!module' => Xss::filter($project . Unicode::ucfirst($module_name))));
         $row['enable']['#disabled'] = TRUE;
       }
       // Only display visible modules.
-      elseif (empty($modules[$dependency]->hidden)) {
-        $name = $modules[$dependency]->info['name'];
+      elseif (empty($modules[$module_name]->hidden)) {
+        if (isset($dependency['project'])) {
+          $project = l(Unicode::ucfirst($dependency['project']), 'https://www.drupal.org/project/' . $dependency['project']);
+          $name = $project . ':' . $modules[$module_name]->info['name'];
+        }
+        else {
+          $name = $modules[$module_name]->info['name'];
+        }
         // Disable the module's checkbox if it is incompatible with the
         // dependency's version.
-        if ($incompatible_version = drupal_check_incompatibility($version, str_replace(\Drupal::CORE_COMPATIBILITY . '-', '', $modules[$dependency]->info['version']))) {
-          $row['#requires'][$dependency] = $this->t('@module (<span class="admin-missing">incompatible with</span> version @version)', array(
-            '@module' => $name . $incompatible_version,
-            '@version' => $modules[$dependency]->info['version'],
+        if ($incompatible_version = drupal_check_incompatibility($dependency, str_replace(\Drupal::CORE_COMPATIBILITY . '-', '', $modules[$module_name]->info['version']))) {
+          $row['#requires'][$module_name] = $this->t('!module (<span class="admin-missing">incompatible with</span> version @version)', array(
+            '!module' => Xss::filter($name . $incompatible_version),
+            '@version' => $modules[$module_name]->info['version'],
           ));
           $row['enable']['#disabled'] = TRUE;
         }
         // Disable the checkbox if the dependency is incompatible with this
         // version of Drupal core.
-        elseif ($modules[$dependency]->info['core'] != \Drupal::CORE_COMPATIBILITY) {
-          $row['#requires'][$dependency] = $this->t('@module (<span class="admin-missing">incompatible with</span> this version of Drupal core)', array(
-            '@module' => $name,
+        elseif ($modules[$module_name]->info['core'] != \Drupal::CORE_COMPATIBILITY) {
+          $row['#requires'][$module_name] = $this->t('!module (<span class="admin-missing">incompatible with</span> this version of Drupal core)', array(
+            '!module' => Xss::filter($name),
           ));
           $row['enable']['#disabled'] = TRUE;
         }
-        elseif ($modules[$dependency]->status) {
-          $row['#requires'][$dependency] = $this->t('@module', array('@module' => $name));
+        elseif ($modules[$module_name]->status) {
+          if (isset($dependency['project']) &&
+            isset($modules[$module_name]->info['project']) &&
+            $dependency['project'] != $modules[$module_name]->info['project']) {
+
+            $row['#requires'][$module_name] = $this->t('!module (<span class="admin-warning">mismatch</span>)', array('!module' => Xss::filter($name)));
+          }
+          else {
+            $row['#requires'][$module_name] = $this->t('!module', array('!module' => Xss::filter($name)));
+          }
         }
         else {
-          $row['#requires'][$dependency] = $this->t('@module (<span class="admin-disabled">disabled</span>)', array('@module' => $name));
+          $row['#requires'][$module_name] = $this->t('!module (<span class="admin-disabled">disabled</span>)', array('!module' => Xss::filter($name)));
         }
       }
     }
 
     // If this module is required by other modules, list those, and then make it
     // impossible to disable this one.
-    foreach ($module->required_by as $dependent => $version) {
-      if (isset($modules[$dependent]) && empty($modules[$dependent]->info['hidden'])) {
-        if ($modules[$dependent]->status == 1 && $module->status == 1) {
-          $row['#required_by'][$dependent] = $this->t('@module', array('@module' => $modules[$dependent]->info['name']));
+    foreach ($module->required_by as $module_name => $dependent) {
+      if (isset($modules[$module_name]) && empty($modules[$module_name]->info['hidden'])) {
+        if (isset($dependent['project'])) {
+          $project = l(Unicode::ucfirst($dependent['project']), 'https://www.drupal.org/project/' . $dependent['project']) . ':';
+        }
+        else {
+          $project = '';
+        }
+        if ($modules[$module_name]->status == 1 && $module->status == 1) {
+          $row['#required_by'][$module_name] = $this->t('!module', array('!module' => Xss::filter($project . $modules[$module_name]->info['name'])));
           $row['enable']['#disabled'] = TRUE;
         }
         else {
-          $row['#required_by'][$dependent] = $this->t('@module (<span class="admin-disabled">disabled</span>)', array('@module' => $modules[$dependent]->info['name']));
+          $row['#required_by'][$module_name] = $this->t('!module (<span class="admin-disabled">disabled</span>)', array('!module' => Xss::filter($project . $modules[$module_name]->info['name'])));
         }
       }
     }
diff --git a/core/modules/system/src/Tests/Module/DependencyTest.php b/core/modules/system/src/Tests/Module/DependencyTest.php
index 6ef1fb9..c372b5d 100644
--- a/core/modules/system/src/Tests/Module/DependencyTest.php
+++ b/core/modules/system/src/Tests/Module/DependencyTest.php
@@ -14,6 +14,44 @@
  */
 class DependencyTest extends ModuleTestBase {
   /**
+   * Checks functionality of project namepaces for dependencies.
+   */
+  function testProjectNamespaceForDependencies() {
+    $this->drupalGet('admin/modules');
+    $this->assertRaw('Requires: <a href="https://www.drupal.org/project/drupal">Drupal</a>:Taxonomy', 'Project namespace appears in the requirements and is linked to the project.');
+    $this->assertRaw('Required by: <a href="https://www.drupal.org/project/project_namespace_test">Project_namespace_test</a>:System project namespace', 'Project namespace appears in the requirements and is linked to the project.');
+    $edit = array(
+      'modules[Core][filter][enable]' => TRUE,
+    );
+    $this->drupalPostForm('admin/modules', $edit, t('Save configuration'));
+    $edit = array(
+      'modules[Field types][text][enable]' => TRUE,
+    );
+    $this->drupalPostForm('admin/modules', $edit, t('Save configuration'));
+    $edit = array(
+      'modules[Field types][options][enable]' => TRUE,
+      'modules[Core][node][enable]' => TRUE,
+    );
+    $this->drupalPostForm('admin/modules', $edit, t('Save configuration'));
+    $edit = array(
+      'modules[Core][taxonomy][enable]' => TRUE,
+    );
+    $this->drupalPostForm('admin/modules', $edit, t('Save configuration'));
+    $edit = array(
+      'modules[Testing][system_project_namespace_dependency_test][enable]' => TRUE,
+    );
+    $this->drupalPostForm('admin/modules', $edit, t('Save configuration'));
+    $this->assertRaw('Requires: <a href="https://www.drupal.org/project/project_namespace_test">Project_namespace_test</a>:System project namespace dependency (<span class="admin-warning">mismatch</span>)', 'Project mismatch warning works.');
+    $this->assertModules(array('system_project_namespace_dependency_test'), TRUE);
+    $edit = array(
+      'modules[Testing][system_project_namespace_test][enable]' => TRUE,
+    );
+    $this->drupalPostForm('admin/modules', $edit, t('Save configuration'));
+    $this->assertRaw('Requires: <a href="https://www.drupal.org/project/project_namespace_test">Project_namespace_test</a>:System project namespace dependency (<span class="admin-warning">mismatch</span>)', 'Project mismatch warning works.');
+    $this->assertModules(array('system_project_namespace_test'), TRUE);
+  }
+
+  /**
    * Attempts to enable the Content Translation module without Language enabled.
    */
   function testEnableWithoutDependency() {
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index 4c94516..181343a 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -489,7 +489,7 @@ function system_requirements($phase) {
       }
       // Check the module's required modules.
       foreach ($file->requires as $requirement) {
-        $required_module = $requirement['name'];
+        $required_module = $requirement['module'];
         // Check if the module exists.
         if (!isset($files[$required_module])) {
           $requirements["$module-$required_module"] = array(
diff --git a/core/modules/system/tests/modules/system_project_namespace_test/system_project_namespace_dependency_test/system_project_namespace_dependency_test.info.yml b/core/modules/system/tests/modules/system_project_namespace_test/system_project_namespace_dependency_test/system_project_namespace_dependency_test.info.yml
new file mode 100644
index 0000000..409a66c
--- /dev/null
+++ b/core/modules/system/tests/modules/system_project_namespace_test/system_project_namespace_dependency_test/system_project_namespace_dependency_test.info.yml
@@ -0,0 +1,12 @@
+name: 'System project namespace dependency'
+type: module
+description: 'Support module for testing project namespace system dependencies.'
+package: Testing
+version: VERSION
+core: 8.x
+dependencies:
+  - drupal:taxonomy
+
+# Packaging information required for testing mismatch
+project: 'system_project_namespace_test'
+
diff --git a/core/modules/system/tests/modules/system_project_namespace_test/system_project_namespace_test.info.yml b/core/modules/system/tests/modules/system_project_namespace_test/system_project_namespace_test.info.yml
new file mode 100644
index 0000000..e15efc8
--- /dev/null
+++ b/core/modules/system/tests/modules/system_project_namespace_test/system_project_namespace_test.info.yml
@@ -0,0 +1,11 @@
+name: 'System project namespace'
+type: module
+description: 'Support module for testing project namespace system dependencies.'
+package: Testing
+version: VERSION
+core: 8.x
+dependencies:
+  - project_namespace_test:system_project_namespace_dependency_test
+
+# Packaging information required for testing mismatch
+project: 'system_project_namespace_test'
diff --git a/core/tests/Drupal/Tests/Core/Extension/ModuleHandlerTest.php b/core/tests/Drupal/Tests/Core/Extension/ModuleHandlerTest.php
index bc5da97..62ff673 100644
--- a/core/tests/Drupal/Tests/Core/Extension/ModuleHandlerTest.php
+++ b/core/tests/Drupal/Tests/Core/Extension/ModuleHandlerTest.php
@@ -481,21 +481,22 @@ public function testDependencyParsing($dependency, $expected) {
    */
   public function dependencyProvider() {
     return array(
-      array('system', array('name' => 'system')),
-      array('taxonomy', array('name' => 'taxonomy')),
-      array('views', array('name' => 'views')),
-      array('views_ui(8.x-1.0)', array('name' => 'views_ui', 'original_version' => ' (8.x-1.0)', 'versions' => array(array('op' => '=', 'version' => '1.0')))),
+      array('system', array('module' => 'system')),
+      array('taxonomy', array('module' => 'taxonomy')),
+      array('views', array('module' => 'views')),
+      array('views_ui(8.x-1.0)', array('module' => 'views_ui', 'original_version' => ' (8.x-1.0)', 'versions' => array(array('op' => '=', 'version' => '1.0')))),
       // Not supported?.
       // array('views_ui(8.x-1.1-beta)', array('name' => 'views_ui', 'original_version' => ' (8.x-1.1-beta)', 'versions' => array(array('op' => '=', 'version' => '1.1-beta')))),
-      array('views_ui(8.x-1.1-alpha12)', array('name' => 'views_ui', 'original_version' => ' (8.x-1.1-alpha12)', 'versions' => array(array('op' => '=', 'version' => '1.1-alpha12')))),
-      array('views_ui(8.x-1.1-beta8)', array('name' => 'views_ui', 'original_version' => ' (8.x-1.1-beta8)', 'versions' => array(array('op' => '=', 'version' => '1.1-beta8')))),
-      array('views_ui(8.x-1.1-rc11)', array('name' => 'views_ui', 'original_version' => ' (8.x-1.1-rc11)', 'versions' => array(array('op' => '=', 'version' => '1.1-rc11')))),
-      array('views_ui(8.x-1.12)', array('name' => 'views_ui', 'original_version' => ' (8.x-1.12)', 'versions' => array(array('op' => '=', 'version' => '1.12')))),
-      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('op' => '>=', 'version' => '1.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('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.1-alpha12)', array('module' => 'views_ui', 'original_version' => ' (8.x-1.1-alpha12)', 'versions' => array(array('op' => '=', 'version' => '1.1-alpha12')))),
+      array('views_ui(8.x-1.1-beta8)', array('module' => 'views_ui', 'original_version' => ' (8.x-1.1-beta8)', 'versions' => array(array('op' => '=', 'version' => '1.1-beta8')))),
+      array('views_ui(8.x-1.1-rc11)', array('module' => 'views_ui', 'original_version' => ' (8.x-1.1-rc11)', 'versions' => array(array('op' => '=', 'version' => '1.1-rc11')))),
+      array('views_ui(8.x-1.12)', array('module' => 'views_ui', 'original_version' => ' (8.x-1.12)', 'versions' => array(array('op' => '=', 'version' => '1.12')))),
+      array('views_ui(8.x-1.x)', array('module' => 'views_ui', 'original_version' => ' (8.x-1.x)', 'versions' => array(array('op' => '<', 'version' => '2.x'), array('op' => '>=', 'version' => '1.x')))),
+      array('views_ui( <= 8.x-1.x)', array('module' => 'views_ui', 'original_version' => ' ( <= 8.x-1.x)', 'versions' => array(array('op' => '<=', 'version' => '2.x')))),
+      array('views_ui(<= 8.x-1.x)', array('module' => 'views_ui', 'original_version' => ' (<= 8.x-1.x)', 'versions' => array(array('op' => '<=', 'version' => '2.x')))),
+      array('views_ui( <=8.x-1.x)', array('module' => 'views_ui', 'original_version' => ' ( <=8.x-1.x)', 'versions' => array(array('op' => '<=', 'version' => '2.x')))),
+      array('views_ui(>8.x-1.x)', array('module' => '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')))),
     );
   }
 
