Index: modules/aggregator.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/aggregator.module,v
retrieving revision 1.289
diff -u -r1.289 aggregator.module
--- modules/aggregator.module	5 Jul 2006 11:45:51 -0000	1.289
+++ modules/aggregator.module	7 Jul 2006 08:45:15 -0000
@@ -75,6 +75,10 @@
       'title' => t('list'),
       'type' => MENU_DEFAULT_LOCAL_TASK,
       'weight' => -10);
+    $items[] = array('path' => 'admin/settings/aggregator',
+      'title' => t('RSS aggregator'),
+      'callback' => 'aggregator_admin_settings',
+      'access' => $edit);
 
     $items[] = array('path' => 'aggregator',
       'title' => t('news aggregator'),
@@ -188,10 +192,7 @@
   return $items;
 }
 
-/**
- * Implementation of hook_settings().
- */
-function aggregator_settings() {
+function aggregator_admin_settings() {
   $items = array(0 => t('none')) + drupal_map_assoc(array(3, 5, 10, 15, 20, 25), '_aggregator_items');
   $period = drupal_map_assoc(array(3600, 10800, 21600, 32400, 43200, 86400, 172800, 259200, 604800, 1209600, 2419200, 4838400, 9676800), 'format_interval');
 
@@ -218,7 +219,8 @@
     '#options' => array('checkboxes' => t('checkboxes'), 'select' => t('multiple selector')),
     '#description' => t('The type of category selection widget which is shown on categorization pages. Checkboxes are easier to use; a multiple selector is good for working with large numbers of categories.')
   );
-  return $form;
+
+  return system_settings_form('aggregator_admin_settings', $form);
 }
 
 /**
Index: modules/blogapi.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/blogapi.module,v
retrieving revision 1.84
diff -u -r1.84 blogapi.module
--- modules/blogapi.module	5 Jul 2006 11:45:51 -0000	1.84
+++ modules/blogapi.module	7 Jul 2006 08:45:15 -0000
@@ -554,9 +554,11 @@
   return $title;
 }
 
-function blogapi_settings() {
+function blogapi_admin_settings() {
   $form['blogapi_engine'] = array(
-    '#type' => 'select', '#title' => t('XML-RPC Engine'), '#default_value' => variable_get('blogapi_engine', 0),
+    '#type' => 'select',
+    '#title' => t('XML-RPC Engine'),
+    '#default_value' => variable_get('blogapi_engine', 0),
     '#options' => array(0 => 'Blogger', 1 => 'MetaWeblog', 2 => 'Movabletype'),
     '#description' => t('RSD or Really-Simple-Discovery is a mechanism which allows external blogger tools to discover the APIs they can use to interact with Drupal. Here you can set the preferred method for blogger tools to interact with your site. The common XML-RPC engines are Blogger, MetaWeblog and Movabletype. If you are not sure which is the correct setting, choose Blogger.')
   );
@@ -564,12 +566,15 @@
   $node_types = node_get_types();
   $defaults = isset($node_types['blog']) ? array('blog' => 1) : array();
   $form['blogapi_node_types'] = array(
-    '#type' => 'checkboxes', '#title' => t('Blog types'), '#required' => TRUE,
-    '#default_value' => variable_get('blogapi_node_types', $defaults), '#options' => $node_types,
+    '#type' => 'checkboxes',
+    '#title' => t('Blog types'),
+    '#required' => TRUE,
+    '#default_value' => variable_get('blogapi_node_types', $defaults),
+    '#options' => $node_types,
     '#description' => t('Select the content types for which you wish to enable posting via blogapi. Each type will appear as a different "blog" in the client application (if supported).')
   );
 
-  return $form;
+  return system_settings_form('blogapi_admin_settings', $form);
 }
 
 function blogapi_menu($may_cache) {
@@ -583,7 +588,19 @@
   }
 
   if ($may_cache) {
-    $items[] = array('path' => 'blogapi', 'title' => t('RSD'), 'callback' => 'blogapi_blogapi', 'access' => user_access('access content'), 'type' => MENU_CALLBACK);
+   $items[] = array(
+      'path' => 'blogapi',
+      'title' => t('RSD'),
+      'callback' => 'blogapi_blogapi',
+      'access' => user_access('access content'),
+      'type' => MENU_CALLBACK);
+    $items[] = array(
+      'path' => 'admin/settings/blogapi',
+      'title' => t('blog APIs'),
+      'callback' => 'blogapi_admin_settings',
+      'access' => user_access('administer site configuration'),
+      'type' => MENU_CALLBACK
+    );
   }
 
   return $items;
Index: modules/contact.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/contact.module,v
retrieving revision 1.55
diff -u -r1.55 contact.module
--- modules/contact.module	28 Jun 2006 21:47:03 -0000	1.55
+++ modules/contact.module	7 Jul 2006 08:45:15 -0000
@@ -284,9 +284,6 @@
   return 'admin/contact';
 }
 
-/**
- * Settings tab. Using a form rather than hook_settings().
- */
 function contact_admin_settings() {
   $form['contact_form_information'] = array('#type' => 'textarea',
     '#title' => t('Additional information'),
@@ -311,7 +308,7 @@
   $form['reset'] = array('#type' => 'submit',
     '#value' => t('Reset to defaults'),
   );
-  // Use system_settings_form for the callback.
+
   return drupal_get_form('contact_admin_settings', $form, 'system_settings_form');
 }
 
Index: modules/drupal.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/drupal.module,v
retrieving revision 1.122
diff -u -r1.122 drupal.module
--- modules/drupal.module	5 Jun 2006 08:53:05 -0000	1.122
+++ modules/drupal.module	7 Jul 2006 08:45:15 -0000
@@ -47,39 +47,31 @@
     case 'admin/modules#description':
       return t('Lets you register your site with a central server and improve ranking of Drupal projects by posting information on your installed modules and themes; also enables users to log in using a Drupal ID.');
     case 'admin/settings/drupal':
-      return t('<p>Using this your site can "call home" to another Drupal server. By calling home to drupal.org and sending a list of your installed modules and themes, you help rank projects on drupal.org and so assist all Drupal administrators to find the best components for meeting their needs. If you want to register with a different server, you can change the Drupal XML-RPC server setting -- but the server has to be able to handle Drupal XML. Some XML-RPC servers may present directories of all registered sites. To get all your site information listed, go to the <a href="%site-settings">settings page</a> and set the site name, the e-mail address, the slogan, and the mission statement.</p>', array('%site-settings' => url('admin/settings')));
+      return t('<p>Using this your site can "call home" to another Drupal server. By calling home to drupal.org and sending a list of your installed modules and themes, you help rank projects on drupal.org and so assist all Drupal administrators to find the best components for meeting their needs. If you want to register with a different server, you can change the Drupal XML-RPC server setting -- but the server has to be able to handle Drupal XML. Some XML-RPC servers may present directories of all registered sites. To get all your site information listed, go to the <a href="%site-settings">site information settings page</a> and set the site name, the e-mail address, the slogan, and the mission statement.</p>', array('%site-settings' => url('admin/settings/site-informationl')));
     case 'user/help#drupal':
       return variable_get('drupal_authentication_service', 0) ? t("<p><a href=\"%Drupal\">Drupal</a> is the name of the software that powers %this-site. There are Drupal web sites all over the world, and many of them share their registration databases so that users may freely log in to any Drupal site using a single <strong>Drupal ID</strong>.</p>
 <p>So please feel free to log in to your account here at %this-site with a username from another Drupal site. The format of a Drupal ID is similar to an e-mail address: <strong>username</strong>@<em>server</em>. An example of a valid Drupal ID is <strong>mwlily</strong>@<em>drupal.org</em>.</p>", array('%Drupal' => 'http://drupal.org', '%this-site' => '<em>'. variable_get('site_name', 'this web site') .'</em>')) : '';
   }
 }
 
-/**
- * Implementation of hook_settings().
- */
-function drupal_settings() {
+function drupal_sites_registry_settings() {
   // Check if all required fields are present
   if ((variable_get('site_name', 'drupal') == 'drupal') || (variable_get('site_name', 'drupal') == '')) {
-    form_set_error('drupal_directory', t('You must set the name of your site on the <a href="%url">administer &raquo; settings</a> page.', array('%url' => url('admin/settings'))));
+    form_set_error('drupal_directory', t('You must set the name of your site on the <a href="%url">administer &raquo; settings</a> page.', array('%url' => url('admin/settings/site-information'))));
   }
   else if (variable_get('site_mail', ini_get('sendmail_from')) == '') {
-    form_set_error('drupal_directory', t('You must set an e-mail address for your site on the <a href="%url">administer &raquo; settings</a> page.', array('%url' => url('admin/settings'))));
+    form_set_error('drupal_directory', t('You must set an e-mail address for your site on the <a href="%url">site information settings page</a>.', array('%url' => url('admin/settings/site-information'))));
   }
   else if (variable_get('site_slogan', '') == '') {
-    form_set_error('drupal_directory', t('You must set your site slogan on the <a href="%url">administer &raquo; settings</a> page.', array('%url' => url('admin/settings'))));
+    form_set_error('drupal_directory', t('You must set your site slogan on the <a href="%url">site information settings page</a>.', array('%url' => url('admin/settings/site-information'))));
   }
   else if (variable_get('site_mission', '') == '') {
-    form_set_error('drupal_directory', t('You must set your site mission on the <a href="%url">administer &raquo; settings</a> page.' , array('%url' => url('admin/settings'))));
+    form_set_error('drupal_directory', t('You must set your site mission on the <a href="%url">site information settings page</a>.' , array('%url' => url('admin/settings/site-information'))));
   }
-  $options = array('1' => t('Enabled'), '0' => t('Disabled'));
 
-  $form['drupal'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Post data to another site'),
-    '#tree' => FALSE
-  );
+  $options = array('1' => t('Enabled'), '0' => t('Disabled'));
 
-  $form['drupal']['drupal_register'] = array(
+  $form['drupal_register'] = array(
     '#type' => 'radios',
     '#title' => t('Register with a Drupal server'),
     '#default_value' => variable_get('drupal_register', 0),
@@ -87,14 +79,14 @@
     '#description' => t("If enabled, your Drupal site will register itself with the specified Drupal XML-RPC server. For this to work properly, you must set your site's name, e-mail address, slogan and mission statement. When the \"Drupal XML-RPC server\" field is set to \"%drupal-xml-rpc\", your web site will register itself with drupal.org. Requires the cron feature to be enabled.", array("%drupal-xml-rpc" => "http://drupal.org/xmlrpc.php", "%drupal-sites" => "http://drupal.org/drupal-sites/"))
   );
 
-  $form['drupal']['drupal_server'] =  array(
+  $form['drupal_server'] =  array(
     '#type' => 'textfield',
     '#title' => t('Drupal XML-RPC server'),
     '#default_value' => variable_get('drupal_server', 'http://drupal.org/xmlrpc.php'),
     '#description' => t('The URL of the Drupal XML-RPC server you wish to register with.')
   );
 
-  $form['drupal']['drupal_system'] = array(
+  $form['drupal_system'] = array(
     '#type' => 'radios',
     '#title' => t('Send system information'),
     '#default_value' => variable_get('drupal_system', 0),
@@ -102,21 +94,16 @@
     '#description' => t("If enabled, your site will send information on its installed components (modules, themes, and theme engines). This information can help in compiling statistics on usage of Drupal projects.")
   );
 
-  $form['drupal']['drupal_statistics'] = array(
+  $form['drupal_statistics'] = array(
     '#type' => 'radios',
     '#title' => t('Send statistics'),
     '#default_value' => variable_get('drupal_statistics', 0),
     '#options' => $options,
     '#description' => t("If enabled, your site will send summary statistics on the number of registered users and the total number of posts. No private information will be sent. These data help to improve the ranking statistics of Drupal projects.")
   );
+;
 
-  $form['services'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Receive data from other sites'),
-    '#tree' => FALSE
-  );
-
-  $form['services']['drupal_client_service'] = array(
+  $form['drupal_client_service'] = array(
     '#type' => 'radios',
     '#title' => t('Allow other Drupal sites to register'),
     '#default_value' => variable_get('drupal_client_service', 0),
@@ -124,13 +111,14 @@
     '#description' => t('If enabled, your Drupal site will allow other sites to register with your site and send information to this site. This functionality can be used to maintain a list of related sites.')
   );
 
-  $form['distauth'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Distributed authentication'),
-    '#tree' => FALSE
-  );
+  return system_settings_form('drupal_sites_registry_settings', $form);
+}
+
+function drupal_distributed_authentication_settings() {
 
-  $form['distauth']['drupal_authentication_service'] = array(
+  $options = array('1' => t('Enabled'), '0' => t('Disabled'));
+
+  $form['drupal_authentication_service'] = array(
     '#type' => 'radios',
     '#title' => t('Authentication service'),
     '#default_value' => variable_get('drupal_authentication_service', 0),
@@ -138,14 +126,14 @@
     '#description' => t('If enabled, your Drupal site will accept logins with the user names of other Drupal sites, and likewise provide authentication for users logging into other Drupal sites, based on their user accounts here.')
   );
 
-  $form['distauth']['drupal_default_da_server'] =  array(
+  $form['drupal_default_da_server'] =  array(
     '#type' => 'textfield',
     '#title' => t('Default authentication server'),
     '#default_value' => variable_get('drupal_default_da_server', ''),
     '#description' => t('The URL of the default Drupal authentication server. Omit the %http prefix (e.g. drupal.org, www.example.com, etc.). If the authentication service has been enabled, users registered at the server specified here, will not need to append the server to their user name when logging into your site. This enables users to provide a briefer, more familiar username in the login form.', array('%http' => theme('placeholder', 'http')))
   );
 
-  $form['distauth']['drupal_default_da_server_only'] = array(
+  $form['drupal_default_da_server_only'] = array(
     '#type' => 'radios',
     '#title' => t('Only allow authentication from default server'),
     '#default_value' => variable_get('drupal_default_da_server_only', 0),
@@ -153,7 +141,7 @@
     '#description' => t('Only accept remote logins from the above specified default authentication server and not from any other server. Useful when an external system is the solitary authority on user accounts for this site. A common usage is to enable this setting and also enable an authentication module which talks to your company\'s directory server.')
   );
 
-  return $form;
+  return system_settings_form('drupal_distributed_authentication_settings', $form);
 }
 
 /**
@@ -359,6 +347,15 @@
 function drupal_menu($may_cache) {
   $items = array();
   if ($may_cache) {
+    $items[] = array('path' => 'admin/settings/sites-registry',
+      'title' => t('sites registry'),
+      'callback' => 'drupal_sites_registry_settings',
+      'access' => user_access('administer site configuration'));
+    $items[] = array('path' => 'admin/settings/distributed-authentication',
+      'title' => t('distributed authentication'),
+      'callback' => 'drupal_distributed_authentication_settings',
+      'access' => user_access('administer site configuration'));;
+
     if (variable_get('drupal_authentication_service', 0)) {
       $items[] = array('path' => 'drupal', 'title' => t('Drupal'),
         'callback' => 'drupal_page_help', 'access' => TRUE,
Index: modules/forum.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/forum.module,v
retrieving revision 1.336
diff -u -r1.336 forum.module
--- modules/forum.module	5 Jul 2006 11:45:51 -0000	1.336
+++ modules/forum.module	7 Jul 2006 08:45:16 -0000
@@ -172,9 +172,6 @@
   }
 }
 
-/**
- * Implementation of hook_settings
- */
 function forum_admin_configure() {
 
   $form = array();
Index: modules/path.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/path.module,v
retrieving revision 1.84
diff -u -r1.84 path.module
--- modules/path.module	7 May 2006 00:08:36 -0000	1.84
+++ modules/path.module	7 Jul 2006 08:45:16 -0000
@@ -29,9 +29,9 @@
 <li>add a URL alias: <a href="%admin-path-add">administer &gt;&gt; url aliases &gt;&gt; add alias</a>.</li>
 <li>administer the list of URL aliases: <a href="%admin-path">administer &gt;&gt; url aliases</a>.</li>
 <li>read how to <a href="%external-http-drupal-org-node-15365">configure clean URLs</a> for your webserver.
-<li>enable clean url\'s to remove the =? at <a href="%admin-settings">administer &gt;&gt; settings</a>.</li>
+<li>enable clean url\'s to remove the =? at <a href="%admin-clean-url-settings">administer &gt;&gt; settings &gt;&gt; clean URLs</a>.</li>
 </ul>
-', array('%admin-path-add' => url('admin/path/add'), '%admin-path' => url('admin/path'), '%external-http-drupal-org-node-15365' => 'http://drupal.org/node/15365', '%admin-settings' => url('admin/settings')));
+', array('%admin-path-add' => url('admin/path/add'), '%admin-path' => url('admin/path'), '%external-http-drupal-org-node-15365' => 'http://drupal.org/node/15365', '%admin-clean-url-settings' => url('admin/settings/clean-urls')));
       $output .= '<p>'. t('For more information please read the configuration and customization handbook <a href="%path">Path page</a>.', array('%path' => 'http://drupal.org/handbook/modules/path/')) .'</p>';
       return $output;
     case 'admin/modules#description':
Index: modules/profile.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/profile.module,v
retrieving revision 1.158
diff -u -r1.158 profile.module
--- modules/profile.module	5 Jul 2006 11:45:51 -0000	1.158
+++ modules/profile.module	7 Jul 2006 08:45:16 -0000
@@ -60,7 +60,7 @@
       'access' => user_access('access user profiles'),
       'type' => MENU_SUGGESTED_ITEM);
     $items[] = array('path' => 'admin/settings/profile',
-      'title' => t('profiles'),
+      'title' => t('user profiles'),
       'callback' => 'profile_admin_overview');
     $items[] = array('path' => 'admin/settings/profile/add',
       'title' => t('add field'),
Index: modules/search.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/search.module,v
retrieving revision 1.182
diff -u -r1.182 search.module
--- modules/search.module	6 Jul 2006 14:27:56 -0000	1.182
+++ modules/search.module	7 Jul 2006 08:45:16 -0000
@@ -151,11 +151,18 @@
   $items = array();
 
   if ($may_cache) {
-    $items[] = array('path' => 'search', 'title' => t('search'),
+    $items[] = array('path' => 'search',
+      'title' => t('search'),
       'callback' => 'search_view',
       'access' => user_access('search content'),
       'type' => MENU_SUGGESTED_ITEM);
-    $items[] = array('path' => 'admin/settings/search/wipe', 'title' => t('Clear index'),
+    $items[] = array('path' => 'admin/settings/search',
+      'title' => t('search'),
+      'callback' => 'search_admin_settings',
+      'access' => user_access('administer search'),
+      'type' => MENU_CALLBACK);
+    $items[] = array('path' => 'admin/settings/search/wipe',
+      'title' => t('clear index'),
       'callback' => 'search_wipe_confirm',
       'access' => user_access('administer search'),
       'type' => MENU_CALLBACK);
@@ -181,7 +188,7 @@
 /**
  * Implementation of hook_validate().
  */
-function search_settings_form_validate($form_id, &$form) {
+function search_admin_settings_validate($form_id, &$form) {
   if ($_POST['op'] == t('Re-index site')) {
     drupal_goto('admin/settings/search/wipe');
   }
@@ -196,7 +203,7 @@
 /**
  * Menu callback; displays the search module settings page.
  */
-function search_settings() {
+function search_admin_settings() {
   // Collect some stats
   $remaining = 0;
   $total = 0;
@@ -227,7 +234,8 @@
 
   // Per module settings
   $form = array_merge($form, module_invoke_all('search', 'admin'));
-  return $form;
+
+  return system_settings_form('search_admin_settings', $form);
 }
 
 /**
Index: modules/statistics.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/statistics.module,v
retrieving revision 1.229
diff -u -r1.229 statistics.module
--- modules/statistics.module	4 Jul 2006 08:59:05 -0000	1.229
+++ modules/statistics.module	7 Jul 2006 08:45:16 -0000
@@ -114,31 +114,61 @@
 
   $access = user_access('access statistics');
   if ($may_cache) {
-    $items[] = array('path' => 'admin/logs/hits', 'title' => t('recent hits'),
-      'callback' => 'statistics_recent_hits', 'access' => $access,
+    $items[] = array(
+      'path' => 'admin/logs/hits',
+      'title' => t('recent hits'),
+      'callback' => 'statistics_recent_hits',
+      'access' => $access,
       'weight' => 3);
-    $items[] = array('path' => 'admin/logs/pages', 'title' => t('top pages'),
-      'callback' => 'statistics_top_pages', 'access' => $access,
+    $items[] = array(
+      'path' => 'admin/logs/pages',
+      'title' => t('top pages'),
+      'callback' => 'statistics_top_pages',
+      'access' => $access,
       'weight' => 1);
-    $items[] = array('path' => 'admin/logs/visitors', 'title' => t('top visitors'),
-      'callback' => 'statistics_top_visitors', 'access' => $access,
+    $items[] = array(
+      'path' => 'admin/logs/visitors',
+      'title' => t('top visitors'),
+      'callback' => 'statistics_top_visitors',
+      'access' => $access,
       'weight' => 2);
-    $items[] = array('path' => 'admin/logs/referrers', 'title' => t('referrers'),
-      'callback' => 'statistics_top_referrers', 'access' => $access);
-    $items[] = array('path' => 'admin/logs/access', 'title' => t('details'),
-      'callback' => 'statistics_access_log', 'access' => $access,
+    $items[] = array(
+      'path' => 'admin/logs/referrers',
+      'title' => t('referrers'),
+      'callback' => 'statistics_top_referrers',
+      'access' => $access);
+    $items[] = array(
+      'path' => 'admin/logs/access',
+      'title' => t('details'),
+      'callback' => 'statistics_access_log',
+      'access' => $access,
       'type' => MENU_CALLBACK);
+    $items[] = array(
+      'path' => 'admin/settings/access-logging',
+      'title' => t('access logging'),
+      'callback' => 'statistics_access_logging_settings',
+      'access' => user_access('administer site configuration'),
+      'type' => MENU_CALLBACK
+    );
   }
   else {
     if (arg(0) == 'user' && is_numeric(arg(1)) && variable_get('statistics_enable_access_log', 0)) {
-      $items[] = array('path' => 'user/'. arg(1) .'/track/navigation', 'title' => t('track page visits'),
-        'callback' => 'statistics_user_tracker', 'access' => $access,
-        'type' => MENU_LOCAL_TASK, 'weight' => 2);
+      $items[] = array(
+        'path' => 'user/'. arg(1) .'/track/navigation',
+        'title' => t('track page visits'),
+        'callback' => 'statistics_user_tracker',
+        'access' => $access,
+        'type' => MENU_LOCAL_TASK,
+        'weight' => 2);
     }
     if (arg(0) == 'node' && is_numeric(arg(1)) && variable_get('statistics_enable_access_log', 0)) {
-      $items[] = array('path' => 'node/'. arg(1) .'/track', 'title' => t('track'),
-        'callback' => 'statistics_node_tracker', 'access' => $access,
-        'type' => MENU_LOCAL_TASK, 'weight' => 2);
+      $items[] = array(
+        'path' => 'node/'. arg(1) .'/track',
+        'title' => t('track'),
+        'callback' => 'statistics_node_tracker',
+        'access' => $access,
+        'type' => MENU_LOCAL_TASK,
+        'weight' => 2);
     }
   }
 
@@ -333,22 +363,38 @@
   return $output;
 }
 
-/**
- * Implementation of hook_settings().
- */
-function statistics_settings() {
-  // access log settings:
+function statistics_access_logging_settings() {
+  // Access log settings:
   $options = array('1' => t('Enabled'), '0' => t('Disabled'));
-  $form['access'] = array('#type' => 'fieldset', '#title' => t('Access log settings'));
-  $form['access']['statistics_enable_access_log'] = array('#type' => 'radios', '#title' => t('Enable access log'), '#default_value' =>  variable_get('statistics_enable_access_log', 0), '#options' => $options, '#description' => t('Log each page access. Required for referrer statistics.'));
+  $form['access'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Access log settings'));
+  $form['access']['statistics_enable_access_log'] = array(
+    '#type' => 'radios',
+    '#title' => t('Enable access log'),
+    '#default_value' =>  variable_get('statistics_enable_access_log', 0),
+    '#options' => $options,
+    '#description' => t('Log each page access. Required for referrer statistics.'));
   $period = drupal_map_assoc(array(3600, 10800, 21600, 32400, 43200, 86400, 172800, 259200, 604800, 1209600, 2419200, 4838400, 9676800), 'format_interval');
-  $form['access']['statistics_flush_accesslog_timer'] = array('#type' => 'select', '#title' => t('Discard access logs older than'), '#default_value'   => variable_get('statistics_flush_accesslog_timer', 259200), '#options' => $period, '#description' => t('Older access log entries (including referrer statistics) will be automatically discarded. Requires crontab.'));
+  $form['access']['statistics_flush_accesslog_timer'] = array(
+    '#type' => 'select',
+    '#title' => t('Discard access logs older than'),
+    '#default_value'   => variable_get('statistics_flush_accesslog_timer', 259200),
+    '#options' => $period,
+    '#description' => t('Older access log entries (including referrer statistics) will be automatically discarded. Requires crontab.'));
 
   // count content views settings
-  $form['content'] = array('#type' => 'fieldset', '#title' => t('Content viewing counter settings'));
-  $form['content']['statistics_count_content_views'] = array('#type' => 'radios', '#title' => t('Count content views'), '#default_value' =>  variable_get('statistics_count_content_views', 0), '#options' => $options, '#description' => t('Increment a counter each time content is viewed.'));
+  $form['content'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Content viewing counter settings'));
+  $form['content']['statistics_count_content_views'] = array(
+    '#type' => 'radios',
+    '#title' => t('Count content views'),
+    '#default_value' => variable_get('statistics_count_content_views', 0),
+    '#options' => $options,
+    '#description' => t('Increment a counter each time content is viewed.'));
 
-  return $form;
+  return system_settings_form('statistics_access_logging_settings', $form);
 }
 
 /**
Index: modules/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system.module,v
retrieving revision 1.330
diff -u -r1.330 system.module
--- modules/system.module	5 Jul 2006 11:45:51 -0000	1.330
+++ modules/system.module	7 Jul 2006 08:45:16 -0000
@@ -23,17 +23,15 @@
 <ul>
 <li>activate your cron job on the cron page <a href="%file-cron">cron.php</a>.</li>
 <li>read how to <a href="%external-http-drupal-org-cron">configure cron jobs</a>.</li>
-<li>administer cache settings in <a href="%admin-settings">administer &gt;&gt; settings</a>.</li>
+<li>administer cache settings in <a href="%admin-settings">administer &gt;&gt; settings &gt;&gt; caching</a>.</li>
 </ul>
-', array('%file-cron' => 'cron.php', '%external-http-drupal-org-cron' => 'http://drupal.org/cron', '%admin-settings' => url('admin/settings')));
+', array('%file-cron' => 'cron.php', '%external-http-drupal-org-cron' => 'http://drupal.org/cron', '%admin-settings' => url('admin/settings/caching')));
       $output .= '<p>'. t('For more information please read the configuration and customization handbook <a href="%system">System page</a>.', array('%system' => 'http://drupal.org/handbook/modules/system/')) .'</p>';
       return $output;
     case 'admin/modules#description':
       return t('Handles general site configuration for administrators.');
     case 'admin':
       return t('<p>Welcome to the administration section. Below are the most recent system events.</p>');
-    case 'admin/settings':
-      return t('<p>General configuration options for your site. Set up the name of the site, e-mail address used in mail-outs, clean URL options, caching, etc.</p>');
     case 'admin/themes':
       return t('<p>Select which themes are available to your users and specify the default theme. To configure site-wide display settings, click the "configure" task above. Alternately, to override these settings in a specific theme, click the "configure" link for the corresponding theme. Note that different themes may have different regions available for rendering content like blocks. If you want consistency in what your users see, you may wish to enable only one theme.</p>');
     case 'admin/themes/settings':
@@ -132,15 +130,59 @@
     }
 
     // Modules:
-    $items[] = array('path' => 'admin/settings', 'title' => t('settings'),
-      'callback' => 'system_site_settings', 'access' => $access);
-    foreach (module_list() as $name) {
-      if (module_hook($name, 'settings')) {
-        $items[] = array('path' => 'admin/settings/'. $name, 'title' => t($name));
-      }
-    }
     $items[] = array('path' => 'admin/modules', 'title' => t('modules'),
       'callback' => 'system_modules', 'access' => $access);
+
+    // Settings:
+    $items[] = array(
+      'path' => 'admin/settings',
+      'title' => t('settings'),
+      'callback' => 'system_settings_overview',
+      'access' => $access);
+    $items[] = array(
+      'path' => 'admin/settings/site-information',
+      'title' => t('site information'),
+      'callback' => 'system_site_information_settings');
+    $items[] = array(
+      'path' => 'admin/settings/error-reporting',
+      'title' => t('error reporting'),
+      'callback' => 'system_error_reporting_settings');
+    $items[] = array(
+      'path' => 'admin/settings/page-caching',
+      'title' => t('page caching'),
+      'callback' => 'system_page_caching_settings');
+    $items[] = array(
+      'path' => 'admin/settings/file-system',
+      'title' => t('file system'),
+      'callback' => 'system_file_system_settings');
+    $items[] = array(
+      'path' => 'admin/settings/image-toolkit',
+      'title' => t('image toolkit'),
+      'callback' => 'system_image_toolkit_settings');
+    $items[] = array(
+      'path' => 'admin/settings/rss-feed',
+      'title' => t('RSS feeds'),
+      'callback' => 'system_rss_feeds_settings');
+    $items[] = array(
+      'path' => 'admin/settings/date-time',
+      'title' => t('date and time'),
+      'callback' => 'system_date_time_settings');
+    $items[] = array(
+      'path' => 'admin/settings/site-status',
+      'title' => t('site status'),
+      'callback' => 'system_site_status_settings');
+    $items[] = array(
+      'path' => 'admin/settings/unicode',
+      'title' => t('unicode'),
+      'callback' => 'system_unicode_settings');
+    $items[] = array(
+      'path' => 'admin/settings/cron-status',
+      'title' => t('cron status'),
+      'callback' => 'system_cron_status');
+    $items[] = array(
+      'path' => 'admin/settings/clean-urls',
+      'title' => t('clean URLs'),
+      'callback' => 'system_clean_url_settings');
   }
 
   return $items;
@@ -245,44 +287,58 @@
   return $zones;
 }
 
-function system_view_general() {
-  // General settings:
-  $form['general'] = array(
-    '#type' => 'fieldset', '#title' => t('General settings'),
-    '#collapsible' => TRUE, '#collapsed' => TRUE
-  );
-  $form['general']['site_name'] = array(
-    '#type' => 'textfield', '#title' => t('Name'), '#default_value' => variable_get('site_name', 'drupal'),
-    '#description' => t('The name of this web site.'), '#required' => TRUE
+function system_site_information_settings() {
+  $form['site_name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Name'),
+    '#default_value' => variable_get('site_name', 'drupal'),
+    '#description' => t('The name of this web site.'),
+    '#required' => TRUE
   );
-  $form['general']['site_mail'] = array(
-    '#type' => 'textfield', '#title' => t('E-mail address'), '#default_value' => variable_get('site_mail', ini_get('sendmail_from')),
+  $form['site_mail'] = array(
+    '#type' => 'textfield',
+    '#title' => t('E-mail address'),
+    '#default_value' => variable_get('site_mail', ini_get('sendmail_from')),
     '#description' => t('A valid e-mail address for this website, used by the auto-mailer during registration, new password requests, notifications, etc.')
   );
-  $form['general']['site_slogan'] = array(
-    '#type' => 'textfield', '#title' => t('Slogan'), '#default_value' => variable_get('site_slogan', ''),
+  $form['site_slogan'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Slogan'),
+    '#default_value' => variable_get('site_slogan', ''),
     '#description' => t('The slogan of this website. Some themes display a slogan when available.')
   );
 
-  $form['general']['site_mission'] = array(
-    '#type' => 'textarea', '#title' => t('Mission'), '#default_value' => variable_get('site_mission', ''),
+  $form['site_mission'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Mission'),
+    '#default_value' => variable_get('site_mission', ''),
     '#description' => t('Your site\'s mission statement or focus.')
   );
-  $form['general']['site_footer'] = array(
-    '#type' => 'textarea', '#title' => t('Footer message'), '#default_value' => variable_get('site_footer', ''),
+  $form['site_footer'] = array(
+    '#type' => 'textarea',
+    '#title' => t('Footer message'),
+    '#default_value' => variable_get('site_footer', ''),
     '#description' => t('This text will be displayed at the bottom of each page. Useful for adding a copyright notice to your pages.')
   );
-  $form['general']['anonymous'] = array(
-    '#type' => 'textfield', '#title' => t('Anonymous user'), '#default_value' => variable_get('anonymous', 'Anonymous'),
+  $form['anonymous'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Anonymous user'),
+    '#default_value' => variable_get('anonymous', 'Anonymous'),
     '#description' => t('The name used to indicate anonymous users.')
   );
-  $form['general']['site_frontpage'] = array(
-    '#type' => 'textfield', '#title' => t('Default front page'), '#default_value' => variable_get('site_frontpage', 'node'),
+  $form['site_frontpage'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Default front page'),
+    '#default_value' => variable_get('site_frontpage', 'node'),
     '#description' => t('The home page displays content from this relative URL. If you are not using clean URLs, specify the part after "?q=". If unsure, specify "node".')
   );
 
+  return system_settings_form('system_site_information_settings', $form);
+}
+
+function system_clean_url_settings() {
   // We check for clean URL support using an image on the client side.
-  $form['general']['clean_url'] = array(
+  $form['clean_url'] = array(
     '#type' => 'radios',
     '#title' => t('Clean URLs'),
     '#default_value' => variable_get('clean_url', 0),
@@ -292,29 +348,35 @@
 
   if (!variable_get('clean_url', 0)) {
     if (strpos(request_uri(), '?q=') !== FALSE) {
-      $form['general']['clean_url']['#description'] .= t(' Before enabling clean URLs, you must perform a test to determine if your server is properly configured. If you are able to see this page again after clicking the "Run the clean URL test" link, the test has succeeded and the radio buttons above will be available. If instead you are directed to a "Page not found" error, you will need to change the configuration of your server. The <a href="%handbook">handbook page on Clean URLs</a> has additional troubleshooting information. %run-test', array('%handbook' => 'http://drupal.org/node/15365', '%run-test' => '<a href ="'. base_path() . 'admin/settings">'. t('Run the clean URL test') .'</a>'));
-      $form['general']['clean_url']['#attributes'] = array('disabled' => 'disabled');
+      $form['clean_url']['#description'] .= t(' Before enabling clean URLs, you must perform a test to determine if your server is properly configured. If you are able to see this page again after clicking the "Run the clean URL test" link, the test has succeeded and the radio buttons above will be available. If instead you are directed to a "Page not found" error, you will need to change the configuration of your server. The <a href="%handbook">handbook page on Clean URLs</a> has additional troubleshooting information. %run-test', array('%handbook' => 'http://drupal.org/node/15365', '%run-test' => '<a href ="'. base_path() . 'admin/settings">'. t('Run the clean URL test') .'</a>'));
+      $form['clean_url']['#attributes'] = array('disabled' => 'disabled');
     }
     else {
-      $form['general']['clean_url']['#description'] .= t(' You have successfully demonstrated that clean URLs work on your server. You are welcome to enable/disable them as you wish.');
-      $form['general']['#collapsed'] = FALSE;
+      $form['clean_url']['#description'] .= t(' You have successfully demonstrated that clean URLs work on your server. You are welcome to enable/disable them as you wish.');
+      $form['#collapsed'] = FALSE;
     }
   }
 
-  // Error handling:
+  return system_settings_form('system_clean_url_settings', $form);
+}
+
+function system_error_reporting_settings() {
 
-  $form['errors'] = array( '#type' => 'fieldset', '#title' =>t('Error handling'), '#collapsible' => TRUE, '#collapsed' => TRUE );
-  $form['errors']['site_403'] = array(
-    '#type' => 'textfield', '#title' => t('Default 403 (access denied) page'), '#default_value' => variable_get('site_403', ''),
+  $form['site_403'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Default 403 (access denied) page'),
+    '#default_value' => variable_get('site_403', ''),
     '#description' => t('This page is displayed when the requested document is denied to the current user. If you are not using clean URLs, specify the part after "?q=". If unsure, specify nothing.')
   );
 
-  $form['errors']['site_404'] = array(
-    '#type' => 'textfield', '#title' => t('Default 404 (not found) page'), '#default_value' =>  variable_get('site_404', ''),
+  $form['site_404'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Default 404 (not found) page'),
+    '#default_value' =>  variable_get('site_404', ''),
     '#description' => t('This page is displayed when no other content matches the requested document. If you are not using clean URLs, specify the part after "?q=". If unsure, specify nothing.')
   );
 
-  $form['errors']['error_level'] = array(
+  $form['error_level'] = array(
     '#type' => 'select', '#title' => t('Error reporting'), '#default_value' => variable_get('error_level', 1),
     '#options' => array(t('Write errors to the log'), t('Write errors to the log and to the screen')),
     '#description' =>  t('Where Drupal, PHP and SQL errors are logged. On a production server it is recommended that errors are only written to the error log. On a test server it can be helpful to write logs to the screen.')
@@ -322,33 +384,43 @@
 
   $period = drupal_map_assoc(array(3600, 10800, 21600, 32400, 43200, 86400, 172800, 259200, 604800, 1209600, 2419200), 'format_interval');
   $period['1000000000'] = t('Never');
-  $form['errors']['watchdog_clear'] = array(
-    '#type' => 'select', '#title' => t('Discard log entries older than'), '#default_value' => variable_get('watchdog_clear', 604800), '#options' => $period,
+  $form['watchdog_clear'] = array(
+    '#type' => 'select',
+    '#title' => t('Discard log entries older than'),
+    '#default_value' => variable_get('watchdog_clear', 604800),
+    '#options' => $period,
     '#description' => t('The time log entries should be kept. Older entries will be automatically discarded. Requires crontab.')
   );
 
+  return system_settings_form('system_error_reporting_settings', $form);
+}
 
-  // Caching:
-  $form['cache'] = array('#type' => 'fieldset', '#title' => t('Cache settings'), '#collapsible' => TRUE, '#collapsed' => TRUE);
+function system_page_caching_settings() {
 
-  $form['cache']['cache']  = array(
-    '#type' => 'radios',  '#title' => t('Page cache'), '#default_value' => variable_get('cache', CACHE_DISABLED),
+  $form['cache'] = array(
+    '#type' => 'radios',
+    '#title' => t('Page cache'),
+    '#default_value' => variable_get('cache', CACHE_DISABLED),
     '#options' => array(CACHE_DISABLED => t('Disabled'), CACHE_ENABLED => t('Enabled')),
     '#description' => t("Drupal has a caching mechanism which stores dynamically generated web pages in a database. By caching a web page, Drupal does not have to create the page each time someone wants to view it, instead it takes only one SQL query to display it, reducing response time and the server's load. Only pages requested by \"anonymous\" users are cached. In order to reduce server load and save bandwidth, Drupal stores and sends compressed cached pages.")
   );
 
   $period = drupal_map_assoc(array(0, 60, 180, 300, 600, 900, 1800, 2700, 3600, 10800, 21600, 32400, 43200, 86400), 'format_interval');
   $period[0] = t('none');
-  $form['cache']['cache_lifetime'] = array(
-    '#type' => 'select', '#title' => t('Minimum cache lifetime'), '#default_value' => variable_get('cache_lifetime', 0), '#options' => $period,
+  $form['cache_lifetime'] = array(
+    '#type' => 'select',
+    '#title' => t('Minimum cache lifetime'),
+    '#default_value' => variable_get('cache_lifetime', 0),
+    '#options' => $period,
     '#description' => t('Enabling the cache will offer a sufficient performance boost for most low-traffic and medium-traffic sites. On high-traffic sites it can become necessary to enforce a minimum cache lifetime. The minimum cache lifetime is the minimum amount of time that will go by before the cache is emptied and recreated. A larger minimum cache lifetime offers better performance, but users will not see new content for a longer period of time.')
   );
 
+  return system_settings_form('system_page_caching_settings', $form);
+}
 
-  // File system:
-  $form['files'] = array('#type' => 'fieldset', '#title' => t('File system settings'), '#collapsible' => TRUE, '#collapsed' => TRUE);
+function system_file_system_settings() {
 
-  $form['files']['file_directory_path'] = array(
+  $form['file_directory_path'] = array(
     '#type' => 'textfield',
     '#title' => t('File system path'),
     '#default_value' => file_directory_path(),
@@ -357,7 +429,7 @@
     '#after_build' => array('system_check_directory'),
   );
 
-  $form['files']['file_directory_temp'] = array(
+  $form['file_directory_temp'] = array(
     '#type' => 'textfield',
     '#title' => t('Temporary directory'),
     '#default_value' => file_directory_temp(),
@@ -366,35 +438,52 @@
     '#after_build' => array('system_check_directory'),
   );
 
-  $form['files']['file_downloads'] = array(
-    '#type' => 'radios', '#title' => t('Download method'), '#default_value' => variable_get('file_downloads', FILE_DOWNLOADS_PUBLIC),
+  $form['file_downloads'] = array(
+    '#type' => 'radios',
+    '#title' => t('Download method'),
+    '#default_value' => variable_get('file_downloads', FILE_DOWNLOADS_PUBLIC),
     '#options' => array(FILE_DOWNLOADS_PUBLIC => t('Public - files are available using http directly.'), FILE_DOWNLOADS_PRIVATE => t('Private - files are transferred by Drupal.')),
     '#description' => t('If you want any sort of access control on the downloading of files, this needs to be set to <em>private</em>. You can change this at any time, however all download URLs will change and there may be unexpected problems so it is not recommended.')
   );
 
-  // Image handling:
+  return system_settings_form('system_file_system_settings', $form);
+}
+
+function system_image_toolkit_settings() {
   $toolkits_available = image_get_available_toolkits();
   if (count($toolkits_available) > 1) {
-    $form['image'] = array('#type' => 'fieldset', '#title' => t('Image handling'), '#collapsible' => TRUE, '#collapsed' => TRUE);
-    $form['image']['image_toolkit'] = array(
-      '#type' => 'radios', '#title' => t('Select an image processing toolkit'),
-      '#default_value' => variable_get('image_toolkit', image_get_toolkit()), '#options' => $toolkits_available
+    $form['image_toolkit'] = array(
+      '#type' => 'radios',
+      '#title' => t('Select an image processing toolkit'),
+      '#default_value' => variable_get('image_toolkit', image_get_toolkit()),
+      '#options' => $toolkits_available
     );
   }
 
-  // Feed settings
-  $form['feed'] = array('#type' => 'fieldset', '#title' => t('RSS feed settings'), '#collapsible' => TRUE, '#collapsed' => TRUE);
-  $form['feed']['feed_default_items'] = array(
-    '#type' => 'select', '#title' => t('Number of items per feed'), '#default_value' => variable_get('feed_default_items', 10),
+  return system_settings_form('system_image_toolkit_settings', $form);
+}
+
+function system_rss_feeds_settings() {
+
+  $form['feed_default_items'] = array(
+    '#type' => 'select',
+    '#title' => t('Number of items per feed'),
+    '#default_value' => variable_get('feed_default_items', 10),
     '#options' => drupal_map_assoc(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30)),
     '#description' => t('The default number of items to include in a feed.')
   );
-  $form['feed']['feed_item_length'] = array(
-    '#type' => 'select', '#title' => t('Display of XML feed items'), '#default_value' => variable_get('feed_item_length','teaser'),
+  $form['feed_item_length'] = array(
+    '#type' => 'select',
+    '#title' => t('Display of XML feed items'),
+    '#default_value' => variable_get('feed_item_length','teaser'),
     '#options' => array('title' => t('Titles only'), 'teaser' => t('Titles plus teaser'), 'fulltext' => t('Full text')),
     '#description' => t('Global setting for the length of XML feed items that are output by default.')
   );
 
+  return system_settings_form('system_rss_feeds_settings', $form);
+}
+
+function system_date_time_settings() {
   // Date settings:
   $zones = _system_zonelist();
 
@@ -421,47 +510,60 @@
     $datelongchoices[$f] = format_date(time(), 'custom', $f);
   }
 
-  $form['dates'] = array('#type' => 'fieldset', '#title' => t('Date settings'), '#collapsible' => TRUE, '#collapsed' => TRUE);
-  $form['dates']['date_default_timezone'] = array(
-    '#type' => 'select', '#title' => t('Default time zone'), '#default_value' => variable_get('date_default_timezone', 0),
-    '#options' => $zones, '#description' => t('Select the default site time zone.')
+  $form['date_default_timezone'] = array(
+    '#type' => 'select',
+    '#title' => t('Default time zone'),
+    '#default_value' => variable_get('date_default_timezone', 0),
+    '#options' => $zones,
+    '#description' => t('Select the default site time zone.')
   );
 
-  $form['dates']['configurable_timezones'] = array(
-    '#type' => 'radios', '#title' => t('Configurable time zones'), '#default_value' => variable_get('configurable_timezones', 1), '#options' => array(t('Disabled'), t('Enabled')),
+  $form['configurable_timezones'] = array(
+    '#type' => 'radios',
+    '#title' => t('Configurable time zones'),
+    '#default_value' => variable_get('configurable_timezones', 1),
+    '#options' => array(t('Disabled'), t('Enabled')),
     '#description' => t('Enable or disable user-configurable time zones. When enabled, users can set their own time zone and dates will be updated accordingly.')
   );
 
-  $form['dates']['date_format_short'] = array(
-    '#type' => 'select', '#title' => t('Short date format'), '#default_value' => variable_get('date_format_short', $dateshort[0]),
-    '#options' => $dateshortchoices,  '#description' => t('The short format of date display.')
-  );
-
-  $form['dates']['date_format_medium'] = array(
-    '#type' => 'select', '#title' => t('Medium date format'), '#default_value' => variable_get('date_format_medium', $datemedium[0]),
-    '#options' => $datemediumchoices, '#description' => t('The medium sized date display.')
-  );
-
-  $form['dates']['date_format_long'] = array(
-    '#type' => 'select', '#title' => t('Long date format'), '#default_value' => variable_get('date_format_long', $datelong[0]),
-    '#options' => $datelongchoices, '#description' => t('Longer date format used for detailed display.')
-  );
-
-  $form['dates']['date_first_day'] = array(
-    '#type' => 'select', '#title' => t('First day of week'), '#default_value' => variable_get('date_first_day', 0),
+  $form['date_format_short'] = array(
+    '#type' => 'select',
+    '#title' => t('Short date format'),
+    '#default_value' => variable_get('date_format_short', $dateshort[0]),
+    '#options' => $dateshortchoices,
+    '#description' => t('The short format of date display.')
+  );
+
+  $form['date_format_medium'] = array(
+    '#type' => 'select',
+    '#title' => t('Medium date format'),
+    '#default_value' => variable_get('date_format_medium', $datemedium[0]),
+    '#options' => $datemediumchoices,
+    '#description' => t('The medium sized date display.')
+  );
+
+  $form['date_format_long'] = array(
+    '#type' => 'select',
+    '#title' => t('Long date format'),
+    '#default_value' => variable_get('date_format_long', $datelong[0]),
+    '#options' => $datelongchoices,
+    '#description' => t('Longer date format used for detailed display.')
+  );
+
+  $form['date_first_day'] = array(
+    '#type' => 'select',
+    '#title' => t('First day of week'),
+    '#default_value' => variable_get('date_first_day', 0),
     '#options' => array(0 => t('Sunday'), 1 => t('Monday'), 2 => t('Tuesday'), 3 => t('Wednesday'), 4 => t('Thursday'), 5 => t('Friday'), 6 => t('Saturday')),
     '#description' => t('The first day of the week for calendar views.')
   );
 
+  return system_settings_form('system_date_time_settings', $form);
+}
 
-  // Site off-line/maintenance settings
-  $form['site_status'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Site maintenance'),
-    '#collapsible' => TRUE,
-    '#collapsed' => TRUE);
+function system_site_status_settings() {
 
-  $form['site_status']['site_offline'] = array(
+  $form['site_offline'] = array(
     '#type' => 'radios',
     '#title' => t('Site status'),
     '#default_value' => variable_get('site_offline', 0),
@@ -469,31 +571,36 @@
     '#description' => t('When set to "Online", all visitors will be able to browse your site normally. When set to "Off-line", only users with the "administer site configuration" permission will be able to access your site to perform maintenance; all other visitors will see the site off-line message configured below. Authorized users can log in during "Off-line" mode directly via the <a href="%user-login">user login</a> page.', array('%user-login' => url('user'))),
   );
 
-  $form['site_status']['site_offline_message'] = array(
+  $form['site_offline_message'] = array(
     '#type' => 'textarea',
     '#title' => t('Site off-line message'),
     '#default_value' => variable_get('site_offline_message', t('%site is currently under maintenance. We should be back shortly. Thank you for your patience.', array('%site' => variable_get('site_name', t('This Drupal site'))))),
     '#description' => t('Message to show visitors when the site is in off-line mode.')
   );
 
-  // String handling: report status and errors.
-  $form['strings'] = array('#type' => 'fieldset', '#title' => t('String handling'), '#collapsible' => TRUE, '#collapsed' => TRUE);
-  $form['strings'] = array_merge($form['strings'], unicode_settings());
-
-  // Cron: report status and errors.
-  $form['cron'] = array('#type' => 'fieldset', '#title' => t('Cron jobs'), '#collapsible' => TRUE, '#collapsed' => TRUE);
-  $form['cron'] = array_merge($form['cron'], system_cron_settings());
-
-  // Check database setup if necessary
-  if (function_exists('db_check_setup') && empty($_POST)) {
-    db_check_setup();
+  return system_settings_form('system_site_status_settings', $form);
+}
+
+function system_unicode_settings() {
+  return system_settings_form('system_unicode_settings', unicode_settings());
+}
+
+function system_cron_status() {
+  $cron_last = variable_get('cron_last', NULL);
+
+  if (is_numeric($cron_last)) {
+    $status = t('Cron is running. The last cron job ran %time ago.', array('%time' => format_interval(time() - $cron_last)));
   }
-  return $form;
+  else {
+    $status = t('Cron has not run. It appears cron jobs have not been setup on your system. Please check the help pages for <a href="%url">configuring cron jobs</a>.', array('%url' => 'http://drupal.org/cron'));
+  }
+
+  return $status;
 }
 
 /**
  * Checks the existence of the directory specified in $form_element. This
- * function is called from the system_view_general form to check both the
+ * function is called from the system_settings form to check both the
  * file_directory_path and file_directory_temp directories. If validation
  * fails, the form element is flagged with an error from within the
  * file_check_directory function.
@@ -507,23 +614,6 @@
 }
 
 /**
- * Return the cron status and errors for admin/settings.
- */
-function system_cron_settings() {
-  $cron_last = variable_get('cron_last', NULL);
-
-  if (is_numeric($cron_last)) {
-    $status = t('Cron is running. The last cron job ran %time ago.', array('%time' => format_interval(time() - $cron_last)));
-  }
-  else {
-    $status = t('Cron has not run. It appears cron jobs have not been setup on your system. Please check the help pages for <a href="%url">configuring cron jobs</a>.', array('%url' => 'http://drupal.org/cron'));
-  }
-
-  $form['settings'] = array('#type' => 'item', '#value' => $status);
-  return $form;
-}
-
-/**
  * Retrieves the current status of an array of files in the system table.
  */
 function system_get_files_database(&$files, $type) {
@@ -1029,17 +1119,26 @@
 /**
  * Menu callback; displays a module's settings page.
  */
-function system_site_settings($module = NULL) {
+function system_settings_overview() {
 
-  if ($module) {
-    $form = module_invoke($module, 'settings');
-  }
-  else {
-    $form = system_view_general();
-    $module = 'system';
-  }
+    // Check database setup if necessary
+    if (function_exists('db_check_setup') && empty($_POST)) {
+      db_check_setup();
+    }
+
+    $output = '<ul>';
+    $menu = menu_get_item(NULL, 'admin/settings');
+    foreach ($menu['children'] as $mid) {
+      $output .= ' <li>'. menu_item_link($mid) .'</li>';
+    }
+    $output .= '</ul>';
+
+    // TODO: remove this:
+    foreach (module_implements('settings') as $module) {
+      $output .= "$module settings inaccessible: module needs updating because the _settings hook has been deprecated.<br />\n";
+    }
 
-  return system_settings_form($module . '_settings_form', $form);
+    return $output;
 }
 
 /**
Index: modules/throttle.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/throttle.module,v
retrieving revision 1.60
diff -u -r1.60 throttle.module
--- modules/throttle.module	7 May 2006 00:08:36 -0000	1.60
+++ modules/throttle.module	7 Jul 2006 08:45:16 -0000
@@ -6,6 +6,22 @@
  * Allows configuration of congestion control auto-throttle mechanism.
  */
 
+function throttle_menu($may_cache) {
+  $items = array();
+
+  if ($may_cache) {
+    $items[] = array(
+      'path' => 'admin/settings/throttle',
+      'title' => t('throttle'),
+      'callback' => 'throttle_admin_settings',
+      'access' => user_access('administer site configuration'),
+      'type' => MENU_CALLBACK
+    );
+  }
+
+  return $items;
+}
+
 /**
  * Determine the current load on the site.
  *
@@ -122,10 +138,7 @@
   }
 }
 
-/**
- * Implementation of hook_settings().
- */
-function throttle_settings() {
+function throttle_admin_settings() {
   _throttle_validate(variable_get('throttle_anonymous', ''), 'throttle_anonymous');
   _throttle_validate(variable_get('throttle_user', ''), 'throttle_user');
   $probabilities = array(0 => '100%', 1 => '50%', 2 => '33.3%', 3 => '25%', 4 => '20%', 5 => '16.6%', 7 => '12.5%', 9 => '10%', 19 => '5%', 99 => '1%', 199 => '.5%', 399 => '.25%', 989 => '.1%');
@@ -154,5 +167,5 @@
     '#description' => t('The auto-throttle probability limiter is an efficiency mechanism to statistically reduce the overhead of the auto-throttle. The limiter is expressed as a percentage of page views, so for example if set to the default of 10% we only perform the extra database queries to update the throttle status 1 out of every 10 page views. The busier your site, the lower you should set the limiter value.')
   );
 
-  return $form;
+  return system_settings_form('throttle_admin_settings', $form);
 }
Index: modules/upload.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/upload.module,v
retrieving revision 1.111
diff -u -r1.111 upload.module
--- modules/upload.module	5 Jul 2006 11:45:51 -0000	1.111
+++ modules/upload.module	7 Jul 2006 08:45:16 -0000
@@ -78,6 +78,11 @@
       'access' => user_access('upload files'),
       'type' => MENU_CALLBACK
     );
+    $items[] = array('path' => 'admin/settings/search',
+      'title' => t('uploads'),
+      'callback' => 'upload_admin_settings',
+      'access' => user_access('administer site configuration'),
+      'type' => MENU_CALLBACK);
   }
   else {
     // Add handlers for previewing new uploads.
@@ -106,7 +111,7 @@
   return $items;
 }
 
-function upload_settings() {
+function upload_admin_settings() {
   $upload_extensions_default = variable_get('upload_extensions_default', 'jpg jpeg gif png txt html doc xls pdf ppt pps');
   $upload_uploadsize_default = variable_get('upload_uploadsize_default', 1);
   $upload_usersize_default = variable_get('upload_usersize_default', 10);
@@ -190,7 +195,7 @@
     );
   }
 
-  return $form;
+  return system_settings_form('upload_admin_settings', $form);
 }
 
 function upload_download() {
Index: modules/user.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/user.module,v
retrieving revision 1.633
diff -u -r1.633 user.module
--- modules/user.module	5 Jul 2006 11:45:51 -0000	1.633
+++ modules/user.module	7 Jul 2006 08:45:17 -0000
@@ -1257,7 +1257,7 @@
   // The first user may login immediately, and receives a customized welcome e-mail.
   if ($account->uid == 1) {
     user_mail($mail, t('Drupal user account details for %s', array('%s' => $name)), strtr(t("%username,\n\nYou may now login to %uri using the following username and password:\n\n  username: %username\n  password: %password\n\n%edit_uri\n\n--drupal"), $variables), "From: $from\nReply-to: $from\nX-Mailer: Drupal\nReturn-path: $from\nErrors-to: $from");
-    drupal_set_message(t('<p>Welcome to Drupal. You are user #1, which gives you full and immediate access. All future registrants will receive their passwords via e-mail, so please make sure your website e-mail address is set properly under the general settings on the <a href="%settings">settings page</a>.</p><p> Your password is <strong>%pass</strong>. You may change your password below.</p>', array('%pass' => $pass, '%settings' => url('admin/settings'))));
+    drupal_set_message(t('<p>Welcome to Drupal. You are user #1, which gives you full and immediate access. All future registrants will receive their passwords via e-mail, so please make sure your website e-mail address is set properly at the <a href="%settings">site information settings page</a>.</p><p> Your password is <strong>%pass</strong>. You may change your password below.</p>', array('%pass' => $pass, '%settings' => url('admin/settings/site-information'))));
     user_authenticate($account->name, trim($pass));
 
     // Set the installed schema version of the system module to the most recent version.
