diff --git modules/system/system.module modules/system/system.module
index 3eb3656..55ef184 100644
--- modules/system/system.module
+++ modules/system/system.module
@@ -1860,6 +1860,55 @@ function system_update_files_database(&$files, $type) {
 }
 
 /**
+ * Scan and collect project .project.info metadata.
+ *
+ * The file is expected to have this format:
+ *
+ * @verbatim
+ * name = Name of the project
+ * type = Module
+ * description = An example project hosted on Drupal.org
+ * modules[required] = example
+ * modules[required] = example_foo
+ * modules[suggested] = example_bar
+ * @endverbatim
+ *
+ * The file is optional and therefore this is not a complete 
+ * project listing.
+ *
+ * @return
+ *   An associative array of module information.
+ */
+function system_get_project_data() {
+  // Find project files
+  $projects = drupal_system_listing('/\/.project.info/', 'modules', 'name', 0);
+
+  // Set defaults for module info.
+  $defaults = array(
+    'description' => '',
+    'package' => 'Other',
+    'version' => NULL,
+    'type' => NULL,
+    'default_modules' => array(),
+  );
+
+  // Read info files for each project.
+  foreach ($projects as $key => $project) {
+    // Look for the info file.
+    $project->info = drupal_parse_info_file($project->uri);
+
+    // Merge in defaults and save.
+    $projects[$key]->info = $project->info + $defaults;
+
+    // Invoke hook_system_info_alter() to give installed modules a chance to
+    // modify the data in the .info files if necessary.
+    drupal_alter('system_info', $projects[$key]->info, $projects[$key]);
+  }
+
+  return $projects;
+}
+
+/**
  * Helper function to scan and collect module .info data.
  *
  * @return
