=== modified file 'database/database.mysql'
--- database/database.mysql	
+++ database/database.mysql	
@@ -669,7 +669,9 @@ CREATE TABLE system (
   throttle tinyint(1) DEFAULT '0' NOT NULL,
   bootstrap int(2) NOT NULL default '0',
   schema_version smallint(2) unsigned NOT NULL default 0,
-  PRIMARY KEY (filename)
+  depth int(2) NOT NULL default '0',
+  PRIMARY KEY (filename),
+  KEY (depth)
 ) TYPE=MyISAM;
 
 --
=== modified file 'database/database.pgsql'
--- database/database.pgsql	
+++ database/database.pgsql	
@@ -664,8 +664,10 @@ CREATE TABLE system (
   throttle smallint NOT NULL default '0',
   bootstrap integer NOT NULL default '0',
   schema_version smallint NOT NULL default 0,
+  depth smallint NOT NULL default 0,
   PRIMARY KEY (filename)
 );
+CREATE INDEX system_depth_idx ON system(depth);
 
 --
 -- Table structure for term_data
=== modified file 'database/updates.inc'
--- database/updates.inc	
+++ database/updates.inc	
@@ -1341,3 +1341,19 @@ function system_update_165() {
   variable_del('ping_cron_last');
   return array();
 }
+
+function system_update_166() {
+  $ret = array();
+  switch ($GLOBALS['db_type']) {
+    case 'pgsql':
+      db_add_column($ret, 'system', 'weight', 'smallint', array('not null' => TRUE, 'default' => 0));
+      $ret[] = update_sql('CREATE INDEX {system}_weight_idx ON {system} (depth)');
+      break;
+    case 'mysql':
+    case 'mysqli':
+      $ret[] = update_sql("ALTER TABLE {system} ADD weight tinyint(3) unsigned default '0' NOT NULL, ADD KEY (depth)");
+      break;
+  }
+
+  return $ret;
+}
=== modified file 'includes/module.inc'
--- includes/module.inc	
+++ includes/module.inc	
@@ -50,10 +50,10 @@ function module_list($refresh = FALSE, $
   if (!$list) {
     $list = array('filter' => 'filter', 'system' => 'system', 'user' => 'user', 'watchdog' => 'watchdog');
     if ($bootstrap) {
-      $result = db_query("SELECT name, filename, throttle, bootstrap FROM {system} WHERE type = 'module' AND status = 1 AND bootstrap = 1");
+      $result = db_query("SELECT name, filename, throttle, bootstrap FROM {system} WHERE type = 'module' AND status = 1 AND bootstrap = 1 ORDER BY weight ASC, filename ASC");
     }
     else {
-      $result = db_query("SELECT name, filename, throttle, bootstrap FROM {system} WHERE type = 'module' AND status = 1");
+      $result = db_query("SELECT name, filename, throttle, bootstrap FROM {system} WHERE type = 'module' AND status = 1 ORDER BY weight ASC, filename ASC");
     }
     while ($module = db_fetch_object($result)) {
       if (file_exists($module->filename)) {
=== modified file 'modules/system.module'
--- modules/system.module	
+++ modules/system.module	
@@ -514,7 +514,7 @@ function system_cron_settings() {
  */
 function system_get_files_database(&$files, $type) {
   // Extract current files from database.
-  $result = db_query("SELECT name, type, status, throttle, schema_version FROM {system} WHERE type = '%s'", $type);
+  $result = db_query("SELECT name, type, status, throttle, weight, schema_version FROM {system} WHERE type = '%s'", $type);
   while ($file = db_fetch_object($result)) {
     if (isset($files[$file->name]) && is_object($files[$file->name])) {
       foreach ($file as $key => $value) {
@@ -898,7 +898,7 @@ function system_modules() {
   system_get_files_database($files, 'module');
 
   ksort($files);
-
+  $form['weight']['#tree'] = TRUE;
   foreach ($files as $filename => $file) {
     drupal_get_filename('module', $file->name, $file->filename);
     drupal_load('module', $file->name);
@@ -907,6 +907,7 @@ function system_modules() {
 
     $form['name'][$file->name] = array('#value' => $file->name);
     $form['description'][$file->name] = array('#value' => $file->description);
+    $form['weight'][$file->name] = array('#type' => 'weight', '#default_value' => $file->weight, '#tree' => TRUE);
     $options[$file->name] = '';
     if ($file->status) {
       $status[] = $file->name;
@@ -926,7 +927,7 @@ function system_modules() {
 
     // Update the contents of the system table:
     if (isset($file->status)) {
-      db_query("UPDATE {system} SET description = '%s', name = '%s', bootstrap = %d WHERE filename = '%s'", $file->description, $file->name, $bootstrap, $file->filename);
+      db_query("UPDATE {system} SET description = '%s', name = '%s', bootstrap = %d WHERE filename = '%s'", $file->description, $file->name, $bootstrap,  $file->filename);
     }
     else {
       // This is a new module.
@@ -964,6 +965,7 @@ function theme_system_modules($form) {
     $row = array();
     $row[] = form_render($form['name'][$key]);
     $row[] = form_render($form['description'][$key]);
+    $row[] = form_render($form['weight'][$key]);
     $row[] = array('data' => form_render($form['status'][$key]), 'align' => 'center');
 
     if (module_exist('throttle')) {
@@ -972,7 +974,7 @@ function theme_system_modules($form) {
     $rows[] = $row;
   }
 
-  $header = array(t('Name'), t('Description'), t('Enabled'));
+  $header = array(t('Name'), t('Description'), t('Weight'), t('Enabled'));
   if (module_exist('throttle')) {
     $header[] = t('Throttle');
   }
@@ -989,7 +991,7 @@ function system_modules_submit($form_id,
   $new_modules = array();
   foreach ($edit['status'] as $key => $choice) {
     if ($choice) {
-      db_query("UPDATE {system} SET status = 1 WHERE type = 'module' AND name = '%s'", $key);
+      db_query("UPDATE {system} SET status = 1, weight = %d WHERE type = 'module' AND name = '%s'", $edit['weight'][$key], $key);
       if (!module_exist($key)) {
         $new_modules[] = $key;
       }
