diff --git a/modules/profile.module b/modules/profile.module
index 2e4ef4e6544f1fd4b9b6146074f0442b484d8750..7e35367abe6e01318d27034d569ce674b0d990b4 100644
--- a/modules/profile.module
+++ b/modules/profile.module
@@ -20,6 +20,8 @@ function profile_help($section) {
   switch ($section) {
     case 'admin/modules#description':
       return t('Support for configurable user profiles.');
+    case 'admin/settings/profile':
+      return t('Here you can define custom fields that users can fill in in their user profile (such as <em>country</em>, <em>real name</em>, <em>age</em>, ...).');
   }
 }
 
@@ -35,19 +37,18 @@ function profile_menu($may_cache) {
       'callback' => 'profile_browse',
       'access' => TRUE,
       'type' => MENU_SUGGESTED_ITEM);
-    $items[] = array('path' => 'admin/user/configure/profile', 'title' => t('profiles'),
+    $items[] = array('path' => 'admin/settings/profile', 'title' => t('profiles'),
       'callback' => 'profile_admin_overview',
-      'access' => user_access('administer users'),
-      'type' => MENU_LOCAL_TASK);
-    $items[] = array('path' => 'admin/user/configure/profile/add', 'title' => t('add field'),
+      'access' => user_access('administer users'));
+    $items[] = array('path' => 'admin/settings/profile/add', 'title' => t('add field'),
       'callback' => 'profile_admin_add',
       'access' => user_access('administer users'),
       'type' => MENU_CALLBACK);
-    $items[] = array('path' => 'admin/user/configure/profile/edit', 'title' => t('edit field'),
+    $items[] = array('path' => 'admin/settings/profile/edit', 'title' => t('edit field'),
       'callback' => 'profile_admin_edit',
       'access' => user_access('administer users'),
       'type' => MENU_CALLBACK);
-    $items[] = array('path' => 'admin/user/configure/profile/delete', 'title' => t('delete field'),
+    $items[] = array('path' => 'admin/settings/profile/delete', 'title' => t('delete field'),
       'callback' => 'profile_admin_delete',
       'access' => user_access('administer users'),
       'type' => MENU_CALLBACK);
@@ -452,7 +453,7 @@ function profile_admin_add($type) {
       cache_clear_all();
 
       drupal_set_message(t('The field has been created.'));
-      drupal_goto('admin/user/configure/profile');
+      drupal_goto('admin/settings/profile');
     }
   }
   else {
@@ -480,7 +481,7 @@ function profile_admin_edit($fid) {
       cache_clear_all();
 
       drupal_set_message(t('The field has been updated.'));
-      drupal_goto('admin/user/configure/profile');
+      drupal_goto('admin/settings/profile');
     }
   }
   else {
@@ -500,7 +501,7 @@ function profile_admin_delete($fid) {
   cache_clear_all();
 
   drupal_set_message(t('The field has been deleted.'));
-  drupal_goto('admin/user/configure/profile');
+  drupal_goto('admin/settings/profile');
 }
 
 function _profile_field_form($type, $edit = array()) {
@@ -538,7 +539,7 @@ function profile_admin_overview() {
   $result = db_query('SELECT * FROM {profile_fields} ORDER BY category, weight');
   $rows = array();
   while ($field = db_fetch_object($result)) {
-    $rows[] = array($field->title, $field->name, _profile_field_types($field->type), $field->category, l(t('edit'), "admin/user/configure/profile/edit/$field->fid"), l(t('delete'), "admin/user/configure/profile/delete/$field->fid"));
+    $rows[] = array($field->title, $field->name, _profile_field_types($field->type), $field->category, l(t('edit'), "admin/settings/profile/edit/$field->fid"), l(t('delete'), "admin/settings/profile/delete/$field->fid"));
   }
   if (count($rows) == 0) {
     $rows[] = array(array('data' => t('No fields defined.'), 'colspan' => '6'));
@@ -550,7 +551,7 @@ function profile_admin_overview() {
   $output .= '<h2>'. t('Add new field') .'</h2>';
   $output .= '<ul>';
   foreach (_profile_field_types() as $key => $value) {
-    $output .= '<li>'. l($value, "admin/user/configure/profile/add/$key") .'</li>';
+    $output .= '<li>'. l($value, "admin/settings/profile/add/$key") .'</li>';
   }
   $output .= '</ul>';
 
diff --git a/modules/profile/profile.module b/modules/profile/profile.module
index 2e4ef4e6544f1fd4b9b6146074f0442b484d8750..7e35367abe6e01318d27034d569ce674b0d990b4 100644
--- a/modules/profile/profile.module
+++ b/modules/profile/profile.module
@@ -20,6 +20,8 @@ function profile_help($section) {
   switch ($section) {
     case 'admin/modules#description':
       return t('Support for configurable user profiles.');
+    case 'admin/settings/profile':
+      return t('Here you can define custom fields that users can fill in in their user profile (such as <em>country</em>, <em>real name</em>, <em>age</em>, ...).');
   }
 }
 
@@ -35,19 +37,18 @@ function profile_menu($may_cache) {
       'callback' => 'profile_browse',
       'access' => TRUE,
       'type' => MENU_SUGGESTED_ITEM);
-    $items[] = array('path' => 'admin/user/configure/profile', 'title' => t('profiles'),
+    $items[] = array('path' => 'admin/settings/profile', 'title' => t('profiles'),
       'callback' => 'profile_admin_overview',
-      'access' => user_access('administer users'),
-      'type' => MENU_LOCAL_TASK);
-    $items[] = array('path' => 'admin/user/configure/profile/add', 'title' => t('add field'),
+      'access' => user_access('administer users'));
+    $items[] = array('path' => 'admin/settings/profile/add', 'title' => t('add field'),
       'callback' => 'profile_admin_add',
       'access' => user_access('administer users'),
       'type' => MENU_CALLBACK);
-    $items[] = array('path' => 'admin/user/configure/profile/edit', 'title' => t('edit field'),
+    $items[] = array('path' => 'admin/settings/profile/edit', 'title' => t('edit field'),
       'callback' => 'profile_admin_edit',
       'access' => user_access('administer users'),
       'type' => MENU_CALLBACK);
-    $items[] = array('path' => 'admin/user/configure/profile/delete', 'title' => t('delete field'),
+    $items[] = array('path' => 'admin/settings/profile/delete', 'title' => t('delete field'),
       'callback' => 'profile_admin_delete',
       'access' => user_access('administer users'),
       'type' => MENU_CALLBACK);
@@ -452,7 +453,7 @@ function profile_admin_add($type) {
       cache_clear_all();
 
       drupal_set_message(t('The field has been created.'));
-      drupal_goto('admin/user/configure/profile');
+      drupal_goto('admin/settings/profile');
     }
   }
   else {
@@ -480,7 +481,7 @@ function profile_admin_edit($fid) {
       cache_clear_all();
 
       drupal_set_message(t('The field has been updated.'));
-      drupal_goto('admin/user/configure/profile');
+      drupal_goto('admin/settings/profile');
     }
   }
   else {
@@ -500,7 +501,7 @@ function profile_admin_delete($fid) {
   cache_clear_all();
 
   drupal_set_message(t('The field has been deleted.'));
-  drupal_goto('admin/user/configure/profile');
+  drupal_goto('admin/settings/profile');
 }
 
 function _profile_field_form($type, $edit = array()) {
@@ -538,7 +539,7 @@ function profile_admin_overview() {
   $result = db_query('SELECT * FROM {profile_fields} ORDER BY category, weight');
   $rows = array();
   while ($field = db_fetch_object($result)) {
-    $rows[] = array($field->title, $field->name, _profile_field_types($field->type), $field->category, l(t('edit'), "admin/user/configure/profile/edit/$field->fid"), l(t('delete'), "admin/user/configure/profile/delete/$field->fid"));
+    $rows[] = array($field->title, $field->name, _profile_field_types($field->type), $field->category, l(t('edit'), "admin/settings/profile/edit/$field->fid"), l(t('delete'), "admin/settings/profile/delete/$field->fid"));
   }
   if (count($rows) == 0) {
     $rows[] = array(array('data' => t('No fields defined.'), 'colspan' => '6'));
@@ -550,7 +551,7 @@ function profile_admin_overview() {
   $output .= '<h2>'. t('Add new field') .'</h2>';
   $output .= '<ul>';
   foreach (_profile_field_types() as $key => $value) {
-    $output .= '<li>'. l($value, "admin/user/configure/profile/add/$key") .'</li>';
+    $output .= '<li>'. l($value, "admin/settings/profile/add/$key") .'</li>';
   }
   $output .= '</ul>';
 
diff --git a/modules/user.module b/modules/user.module
index cf2f07a988e4bd44a61b31ca46eacf7b222c92b2..3764827d6981ab8845161cfc1cd06bc0d8d2215c 100644
--- a/modules/user.module
+++ b/modules/user.module
@@ -664,17 +664,36 @@ function user_menu($may_cache) {
     $items[] = array('path' => 'admin/user/configure', 'title' => t('configure'),
       'callback' => 'user_configure', 'access' => $access,
       'type' => MENU_LOCAL_TASK);
-    $items[] = array('path' => 'admin/user/configure/settings', 'title' => t('settings'),
+
+    $items[] = array('path' => 'admin/access', 'title' => t('access control'),
+      'callback' => 'user_admin_perm', 'access' => $access);
+    $items[] = array('path' => 'admin/access/perms', 'title' => t('permissions'),
+      'callback' => 'user_admin_perm', 'access' => $access,
       'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10);
-    $items[] = array('path' => 'admin/user/configure/access', 'title' => t('access rules'),
-      'callback' => 'user_admin_access', 'access' => $access,
+    $items[] = array('path' => 'admin/access/roles', 'title' => t('roles'),
+      'callback' => 'user_admin_role', 'access' => $access,
       'type' => MENU_LOCAL_TASK);
-    $items[] = array('path' => 'admin/user/configure/role', 'title' => t('roles'),
-      'callback' => 'user_configure', 'access' => $access,
+    $items[] = array('path' => 'admin/access/roles/edit', 'title' => t('edit role'),
+      'callback' => 'user_admin_role', 'access' => $access,
+      'type' => MENU_CALLBACK);
+
+    $items[] = array('path' => 'admin/access/rules', 'title' => t('account rules'),
+      'callback' => 'user_admin_access', 'access' => $access,
+      'type' => MENU_LOCAL_TASK, 'weight' => 10);
+    $items[] = array('path' => 'admin/access/rules/list', 'title' => t('list'),
+      'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10);
+    $items[] = array('path' => 'admin/access/rules/add', 'title' => t('add rule'),
+      'callback' => 'user_admin_access_edit', 'access' => $access,
       'type' => MENU_LOCAL_TASK);
-    $items[] = array('path' => 'admin/user/configure/permission', 'title' => t('permissions'),
-      'callback' => 'user_configure', 'access' => $access,
+    $items[] = array('path' => 'admin/access/rules/check', 'title' => t('check rules'),
+      'callback' => 'user_admin_access_check', 'access' => $access,
       'type' => MENU_LOCAL_TASK);
+    $items[] = array('path' => 'admin/access/rules/edit', 'title' => t('edit rule'),
+      'callback' => 'user_admin_access_edit', 'access' => $access,
+      'type' => MENU_CALLBACK, 'callback arguments' => array('edit'));
+    $items[] = array('path' => 'admin/access/rules/delete', 'title' => t('delete rule'),
+      'callback' => 'user_admin_access_edit', 'access' => $access,
+      'type' => MENU_CALLBACK, 'callback arguments' => array('delete'));
 
     if (module_exist('search')) {
       $items[] = array('path' => 'admin/user/search', 'title' => t('search'),
@@ -1306,38 +1325,83 @@ function user_admin_create($edit = array()) {
   return form($output);
 }
 
-function user_admin_access($op = NULL, $aid = 0) {
+/**
+ * Menu callback: check an access rule
+ */
+function user_admin_access_check() {
   if ($_POST['op']) {
     $op = $_POST['op'];
   }
   $edit = $_POST['edit'];
 
-  // If a non-checking form was submitted, then it needs to have a mask.
-  if ($edit && !$edit['test'] && !$edit['mask']) {
-    form_set_error('mask', t('You must enter a mask.'));
+  if ($op) {
+    if (user_deny($edit['type'], $edit['test'])) {
+      drupal_set_message(t('%test is not allowed.', array('%test' => '<em>'. $edit['test'] .'</em>')));
+    }
+    else {
+      drupal_set_message(t('%test is allowed.', array('%test' => '<em>'. $edit['test'] .'</em>')));
+    }
   }
 
+  $form = form_textfield(t('Username'), 'test', '', 32, 64, t('Enter a username to check if it will be denied or allowed.'));
+  $form .= form_hidden('type', 'user');
+  $form .= form_submit('Check username');
+  $output .= form($form);
+
+  $form = form_textfield(t('E-mail'), 'test', '', 32, 64, t('Enter an e-mail address to check if it will be denied or allowed.'));
+  $form .= form_hidden('type', 'mail');
+  $form .= form_submit('Check e-mail');
+  $output .= form($form);
+
+  print theme('page', $output);
+}
+
+/**
+ * Menu callback: add/edit an access rule
+ */
+function user_admin_access_edit($op = NULL, $aid = 0) {
+  if ($_POST['op']) {
+    $op = $_POST['op'];
+  }
+  $edit = $_POST['edit'];
+
   switch ($op) {
     case t('Add rule'):
-      if (!form_get_errors()) {
+      if (!$edit['mask']) {
+        form_set_error('mask', t('You must enter a mask.'));
+      }
+      else {
         $aid = db_next_id('{access}_aid');
         db_query("INSERT INTO {access} (aid, mask, type, status) VALUES ('%s', '%s', '%s', %d)", $aid, $edit['mask'], $edit['type'], $edit['status']);
         drupal_set_message(t('The access rule has been added.'));
-        // Since we are not refreshing the page we need to clear out $edit.
-        $edit = array();
+        drupal_goto('admin/access/rules');
       }
       break;
 
+    case t('Delete'):
     case 'delete':
-      db_query('DELETE FROM {access} WHERE aid = %d', $aid);
-      drupal_set_message(t('The access rule has been deleted.'));
-      drupal_goto('admin/user/configure/access');
+      if ($edit['confirm']) {
+        db_query('DELETE FROM {access} WHERE aid = %d', $aid);
+        drupal_set_message(t('The access rule has been deleted.'));
+        drupal_goto('admin/access/rules');
+      }
+      else {
+        $access_types = array('user' => t('username'), 'mail' => t('e-mail'));
+        $edit = db_fetch_object(db_query('SELECT aid, type, status, mask FROM {access} WHERE aid = %d', $aid));
+        $output .= form_item(t('Confirm deletion'), $edit->mask .' ('. $access_types[$edit->type] .')');
+        $output .= form_hidden('aid', $edit->aid);
+        $output .= form_hidden('confirm', 1);
+        $output .= form_submit(t('Delete'));
+        $output = form($output); 
+        print theme('page', $output);
+      }
+      return;
 
     case t('Save rule'):
       if (!form_get_errors()) {
         db_query("UPDATE {access} SET mask = '%s', type = '%s', status = '%s' WHERE aid = %d", $edit['mask'], $edit['type'], $edit['status'], $aid);
         drupal_set_message(t('The access rule has been saved.'));
-        drupal_goto('admin/user/configure/access');
+        drupal_goto('admin/access/rules');
       }
       // Fall through to the edit form if there are errors.
     case 'edit':
@@ -1347,49 +1411,12 @@ function user_admin_access($op = NULL, $aid = 0) {
       $form = _user_admin_access_form($edit);
       $form .= form_submit(t('Save rule'));
       print theme('page', form($form, 'post', NULL, array('id' => 'access-rules')));
-      return;
-
-    case t('Check username'):
-    case t('Check e-mail'):
-      if (user_deny($edit['type'], $edit['test'])) {
-        drupal_set_message(t('%test is not allowed.', array('%test' => '<em>'. $edit['test'] .'</em>')));
-      }
-      else {
-        drupal_set_message(t('%test is allowed.', array('%test' => '<em>'. $edit['test'] .'</em>')));
-      }
-      break;
   }
 
-  $header = array(array('data' => t('Access type'), 'field' => 'status'), array('data' => t('Rule type'), 'field' => 'type'), array('data' =>t('Mask'), 'field' => 'mask'), array('data' => t('Operations'), 'colspan' => 2));
-  $result = db_query("SELECT aid, type, status, mask FROM {access}". tablesort_sql($header));
-  $access_types = array('user' => t('username'), 'mail' => t('e-mail'));
-  $rows = array();
-  while ($rule = db_fetch_object($result)) {
-    $rows[] = array($rule->status ? t('allow') : t('deny'), $access_types[$rule->type], $rule->mask, l(t('edit'), 'admin/user/configure/access/edit/'. $rule->aid), l(t('delete'), 'admin/user/configure/access/delete/'. $rule->aid));
-  }
-  if (count($rows) == 0) {
-    $rows[] = array(array('data' => '<em>'. t('There are currently no access rules.') .'</em>', 'colspan' => 5));
-  }
-  $output .= theme('table', $header, $rows);
-
-  $output .= '<h3>'. t('Add new rule') ."</h3>\n";
-
   $form = _user_admin_access_form($edit);
   $form .= form_submit(t('Add rule'));
   $output .= form($form, 'post', NULL, array('id' => 'access-rules'));
 
-  $output .= '<h3>'. t('Check rules') .'</h3>';
-
-  $form = form_textfield(t('Username'), 'test', '', 32, 64, t('Enter a username to check if it will be denied or allowed.'));
-  $form .= form_hidden('type', 'user');
-  $form .= form_submit('Check username');
-  $output .= form($form);
-
-  $form = form_textfield(t('E-mail'), 'test', '', 32, 64, t('Enter an e-mail address to check if it will be denied or allowed.'));
-  $form .= form_hidden('type', 'mail');
-  $form .= form_submit('Check e-mail');
-  $output .= form($form);
-
   print theme('page', $output);
 }
 
@@ -1401,6 +1428,25 @@ function _user_admin_access_form($edit) {
   return $output;
 }
 
+/**
+ * Menu callback: list all access rules
+ */
+function user_admin_access() {
+  $header = array(array('data' => t('Access type'), 'field' => 'status'), array('data' => t('Rule type'), 'field' => 'type'), array('data' =>t('Mask'), 'field' => 'mask'), array('data' => t('Operations'), 'colspan' => 2));
+  $result = db_query("SELECT aid, type, status, mask FROM {access}". tablesort_sql($header));
+  $access_types = array('user' => t('username'), 'mail' => t('e-mail'));
+  $rows = array();
+  while ($rule = db_fetch_object($result)) {
+    $rows[] = array($rule->status ? t('allow') : t('deny'), $access_types[$rule->type], $rule->mask, l(t('edit'), 'admin/access/rules/edit/'. $rule->aid), l(t('delete'), 'admin/access/rules/delete/'. $rule->aid));
+  }
+  if (count($rows) == 0) {
+    $rows[] = array(array('data' => '<em>'. t('There are currently no access rules.') .'</em>', 'colspan' => 5));
+  }
+  $output .= theme('table', $header, $rows);
+
+  print theme('page', $output);
+}
+
 function user_roles($membersonly = 0, $permission = 0) {
   $roles = array();
 
@@ -1418,10 +1464,14 @@ function user_roles($membersonly = 0, $permission = 0) {
   return $roles;
 }
 
-function user_admin_perm($edit = array()) {
+/**
+ * Menu callback: administer permissions.
+ */
+function user_admin_perm() {
+  $edit = $_POST['edit'];
   if ($edit) {
     // Save permissions:
-    $result = db_query('SELECT * FROM {role} ');
+    $result = db_query('SELECT * FROM {role}');
     while ($role = db_fetch_object($result)) {
       // Delete, so if we clear every checkbox we reset that role;
       // otherwise permissions are active and denied everywhere.
@@ -1479,10 +1529,14 @@ function user_admin_perm($edit = array()) {
   $output = theme('table', $header, $rows, array('id' => 'permissions'));
   $output .= form_submit(t('Save permissions'));
 
-  return form($output);
+  print theme('page', form($output));
 }
 
-function user_admin_role($edit = array()) {
+/**
+ * Menu callback: administer roles.
+ */
+function user_admin_role() {
+  $edit = $_POST['edit'];
   $op = $_POST['op'];
   $id = arg(4);
 
@@ -1515,11 +1569,13 @@ function user_admin_role($edit = array()) {
     db_query('UPDATE {users_roles} SET rid = %d WHERE rid = %d', _user_authenticated_id(), $id);
 
     drupal_set_message(t('The role has been deleted.'));
+    drupal_goto('admin/access/roles');
   }
   else if ($op == t('Add role')) {
     if ($edit['name']) {
       db_query("INSERT INTO {role} (name) VALUES ('%s')", $edit['name']);
       drupal_set_message(t('The role has been added.'));
+      drupal_goto('admin/access/roles');
     }
     else {
       form_set_error('name', t('You must specify a valid role name.'));
@@ -1543,7 +1599,7 @@ function user_admin_role($edit = array()) {
     $header = array(t('Name'), t('Operations'));
     while ($role = db_fetch_object($result)) {
       if ($role->name != 'anonymous user' && $role->name != 'authenticated user') {
-        $rows[] = array($role->name, array('data' => l(t('edit'), "admin/user/configure/role/$role->rid"), 'align' => 'center'));
+        $rows[] = array($role->name, array('data' => l(t('edit'), "admin/access/roles/edit/$role->rid"), 'align' => 'center'));
       }
       else {
         $rows[] = array($role->name, array('data' => '<span class="disabled">'. t('locked') .'</span>', 'align' => 'center'));
@@ -1555,7 +1611,7 @@ function user_admin_role($edit = array()) {
     $output = form($output);
   }
 
-  return $output;
+  print theme('page', $output);
 }
 
 function user_admin_account() {
@@ -1598,21 +1654,10 @@ function user_configure() {
     $op = arg(3);
   }
 
-  switch ($op) {
-    case t('Save permissions'):
-    case 'permission':
-      $output = user_admin_perm($edit);
-      break;
-    case t('Add role'):
-    case t('Delete role'):
-    case t('Save role'):
-    case 'role':
-      $output = user_admin_role($edit);
-      break;
-    default:
-      if ($_POST) system_settings_save();
-      $output = system_settings_form(user_configure_settings());
+  if ($_POST) {
+    system_settings_save();
   }
+  $output = system_settings_form(user_configure_settings());
 
   print theme('page', $output);
 }
@@ -1651,17 +1696,17 @@ function user_help($section) {
     case 'admin/user/create':
     case 'admin/user/account/create':
       return t('<p>This web page allows the administrators to register a new users by hand.  Note that you cannot have a user where either the e-mail address or the username match another user in the system.</p>');
-    case 'admin/user/configure/access':
+    case 'admin/access/rules':
       return '<p>'. t('Set up username and e-mail address access rules for new accounts. If a username or email address for a new account matches any deny rule, but not an allow rule, then the new account will not be allowed to be created.') .'</p>';
-    case 'admin/user/configure/permission':
-      return t('<p>In this area you will define the permissions for each user role (role names are defined on the <a href="%role">user roles page</a>). Each permission describes a fine-grained logical operation, such as being able to access the administration pages, or adding/modifying a user account. You could say a permission represents access granted to a user to perform a set of operations.</p>', array('%role' => url('admin/user/configure/role')));
-    case 'admin/user/configure/role':
+    case 'admin/access':
+      return t('<p>In this area you will define the permissions for each user role (role names are defined on the <a href="%role">user roles page</a>). Each permission describes a fine-grained logical operation, such as being able to access the administration pages, or adding/modifying a user account. You could say a permission represents access granted to a user to perform a set of operations.</p>', array('%role' => url('admin/access/roles')));
+    case 'admin/access/roles':
       return t('
       Roles allow you to fine tune the security and administration of drupal.  A role defines a group of users that have certain privileges as defined in <a href="%permission">user permissions</a>.  Examples of roles include: anonymous user, authenticated user, moderator, administrator and so on. In this area you will define the <em>role names</em> of the various roles. To delete a role choose "edit".<br />By default, Drupal comes with two user roles:
       <ul>
       <li>Anonymous user: this role is used for users that don\'t have a user account or that are not authenticated.</li>
       <li>Authenticated user: this role is assigned automatically to authenticated users.  Most registered users will belong to this user role unless specified otherwise.</li>
-      </ul>', array('%permission' => url('admin/user/configure/permission')));
+      </ul>', array('%permission' => url('admin/access')));
     case 'admin/user/search':
       return t('<p>Enter a simple pattern ("*" may be user as a wildcard match) to search for a username.  For example, one may search for "br" and Drupal might return "brian", "brad", and "brenda".</p>');
     case 'admin/modules#description':
diff --git a/modules/user/user.module b/modules/user/user.module
index cf2f07a988e4bd44a61b31ca46eacf7b222c92b2..3764827d6981ab8845161cfc1cd06bc0d8d2215c 100644
--- a/modules/user/user.module
+++ b/modules/user/user.module
@@ -664,17 +664,36 @@ function user_menu($may_cache) {
     $items[] = array('path' => 'admin/user/configure', 'title' => t('configure'),
       'callback' => 'user_configure', 'access' => $access,
       'type' => MENU_LOCAL_TASK);
-    $items[] = array('path' => 'admin/user/configure/settings', 'title' => t('settings'),
+
+    $items[] = array('path' => 'admin/access', 'title' => t('access control'),
+      'callback' => 'user_admin_perm', 'access' => $access);
+    $items[] = array('path' => 'admin/access/perms', 'title' => t('permissions'),
+      'callback' => 'user_admin_perm', 'access' => $access,
       'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10);
-    $items[] = array('path' => 'admin/user/configure/access', 'title' => t('access rules'),
-      'callback' => 'user_admin_access', 'access' => $access,
+    $items[] = array('path' => 'admin/access/roles', 'title' => t('roles'),
+      'callback' => 'user_admin_role', 'access' => $access,
       'type' => MENU_LOCAL_TASK);
-    $items[] = array('path' => 'admin/user/configure/role', 'title' => t('roles'),
-      'callback' => 'user_configure', 'access' => $access,
+    $items[] = array('path' => 'admin/access/roles/edit', 'title' => t('edit role'),
+      'callback' => 'user_admin_role', 'access' => $access,
+      'type' => MENU_CALLBACK);
+
+    $items[] = array('path' => 'admin/access/rules', 'title' => t('account rules'),
+      'callback' => 'user_admin_access', 'access' => $access,
+      'type' => MENU_LOCAL_TASK, 'weight' => 10);
+    $items[] = array('path' => 'admin/access/rules/list', 'title' => t('list'),
+      'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10);
+    $items[] = array('path' => 'admin/access/rules/add', 'title' => t('add rule'),
+      'callback' => 'user_admin_access_edit', 'access' => $access,
       'type' => MENU_LOCAL_TASK);
-    $items[] = array('path' => 'admin/user/configure/permission', 'title' => t('permissions'),
-      'callback' => 'user_configure', 'access' => $access,
+    $items[] = array('path' => 'admin/access/rules/check', 'title' => t('check rules'),
+      'callback' => 'user_admin_access_check', 'access' => $access,
       'type' => MENU_LOCAL_TASK);
+    $items[] = array('path' => 'admin/access/rules/edit', 'title' => t('edit rule'),
+      'callback' => 'user_admin_access_edit', 'access' => $access,
+      'type' => MENU_CALLBACK, 'callback arguments' => array('edit'));
+    $items[] = array('path' => 'admin/access/rules/delete', 'title' => t('delete rule'),
+      'callback' => 'user_admin_access_edit', 'access' => $access,
+      'type' => MENU_CALLBACK, 'callback arguments' => array('delete'));
 
     if (module_exist('search')) {
       $items[] = array('path' => 'admin/user/search', 'title' => t('search'),
@@ -1306,38 +1325,83 @@ function user_admin_create($edit = array()) {
   return form($output);
 }
 
-function user_admin_access($op = NULL, $aid = 0) {
+/**
+ * Menu callback: check an access rule
+ */
+function user_admin_access_check() {
   if ($_POST['op']) {
     $op = $_POST['op'];
   }
   $edit = $_POST['edit'];
 
-  // If a non-checking form was submitted, then it needs to have a mask.
-  if ($edit && !$edit['test'] && !$edit['mask']) {
-    form_set_error('mask', t('You must enter a mask.'));
+  if ($op) {
+    if (user_deny($edit['type'], $edit['test'])) {
+      drupal_set_message(t('%test is not allowed.', array('%test' => '<em>'. $edit['test'] .'</em>')));
+    }
+    else {
+      drupal_set_message(t('%test is allowed.', array('%test' => '<em>'. $edit['test'] .'</em>')));
+    }
   }
 
+  $form = form_textfield(t('Username'), 'test', '', 32, 64, t('Enter a username to check if it will be denied or allowed.'));
+  $form .= form_hidden('type', 'user');
+  $form .= form_submit('Check username');
+  $output .= form($form);
+
+  $form = form_textfield(t('E-mail'), 'test', '', 32, 64, t('Enter an e-mail address to check if it will be denied or allowed.'));
+  $form .= form_hidden('type', 'mail');
+  $form .= form_submit('Check e-mail');
+  $output .= form($form);
+
+  print theme('page', $output);
+}
+
+/**
+ * Menu callback: add/edit an access rule
+ */
+function user_admin_access_edit($op = NULL, $aid = 0) {
+  if ($_POST['op']) {
+    $op = $_POST['op'];
+  }
+  $edit = $_POST['edit'];
+
   switch ($op) {
     case t('Add rule'):
-      if (!form_get_errors()) {
+      if (!$edit['mask']) {
+        form_set_error('mask', t('You must enter a mask.'));
+      }
+      else {
         $aid = db_next_id('{access}_aid');
         db_query("INSERT INTO {access} (aid, mask, type, status) VALUES ('%s', '%s', '%s', %d)", $aid, $edit['mask'], $edit['type'], $edit['status']);
         drupal_set_message(t('The access rule has been added.'));
-        // Since we are not refreshing the page we need to clear out $edit.
-        $edit = array();
+        drupal_goto('admin/access/rules');
       }
       break;
 
+    case t('Delete'):
     case 'delete':
-      db_query('DELETE FROM {access} WHERE aid = %d', $aid);
-      drupal_set_message(t('The access rule has been deleted.'));
-      drupal_goto('admin/user/configure/access');
+      if ($edit['confirm']) {
+        db_query('DELETE FROM {access} WHERE aid = %d', $aid);
+        drupal_set_message(t('The access rule has been deleted.'));
+        drupal_goto('admin/access/rules');
+      }
+      else {
+        $access_types = array('user' => t('username'), 'mail' => t('e-mail'));
+        $edit = db_fetch_object(db_query('SELECT aid, type, status, mask FROM {access} WHERE aid = %d', $aid));
+        $output .= form_item(t('Confirm deletion'), $edit->mask .' ('. $access_types[$edit->type] .')');
+        $output .= form_hidden('aid', $edit->aid);
+        $output .= form_hidden('confirm', 1);
+        $output .= form_submit(t('Delete'));
+        $output = form($output); 
+        print theme('page', $output);
+      }
+      return;
 
     case t('Save rule'):
       if (!form_get_errors()) {
         db_query("UPDATE {access} SET mask = '%s', type = '%s', status = '%s' WHERE aid = %d", $edit['mask'], $edit['type'], $edit['status'], $aid);
         drupal_set_message(t('The access rule has been saved.'));
-        drupal_goto('admin/user/configure/access');
+        drupal_goto('admin/access/rules');
       }
       // Fall through to the edit form if there are errors.
     case 'edit':
@@ -1347,49 +1411,12 @@ function user_admin_access($op = NULL, $aid = 0) {
       $form = _user_admin_access_form($edit);
       $form .= form_submit(t('Save rule'));
       print theme('page', form($form, 'post', NULL, array('id' => 'access-rules')));
-      return;
-
-    case t('Check username'):
-    case t('Check e-mail'):
-      if (user_deny($edit['type'], $edit['test'])) {
-        drupal_set_message(t('%test is not allowed.', array('%test' => '<em>'. $edit['test'] .'</em>')));
-      }
-      else {
-        drupal_set_message(t('%test is allowed.', array('%test' => '<em>'. $edit['test'] .'</em>')));
-      }
-      break;
   }
 
-  $header = array(array('data' => t('Access type'), 'field' => 'status'), array('data' => t('Rule type'), 'field' => 'type'), array('data' =>t('Mask'), 'field' => 'mask'), array('data' => t('Operations'), 'colspan' => 2));
-  $result = db_query("SELECT aid, type, status, mask FROM {access}". tablesort_sql($header));
-  $access_types = array('user' => t('username'), 'mail' => t('e-mail'));
-  $rows = array();
-  while ($rule = db_fetch_object($result)) {
-    $rows[] = array($rule->status ? t('allow') : t('deny'), $access_types[$rule->type], $rule->mask, l(t('edit'), 'admin/user/configure/access/edit/'. $rule->aid), l(t('delete'), 'admin/user/configure/access/delete/'. $rule->aid));
-  }
-  if (count($rows) == 0) {
-    $rows[] = array(array('data' => '<em>'. t('There are currently no access rules.') .'</em>', 'colspan' => 5));
-  }
-  $output .= theme('table', $header, $rows);
-
-  $output .= '<h3>'. t('Add new rule') ."</h3>\n";
-
   $form = _user_admin_access_form($edit);
   $form .= form_submit(t('Add rule'));
   $output .= form($form, 'post', NULL, array('id' => 'access-rules'));
 
-  $output .= '<h3>'. t('Check rules') .'</h3>';
-
-  $form = form_textfield(t('Username'), 'test', '', 32, 64, t('Enter a username to check if it will be denied or allowed.'));
-  $form .= form_hidden('type', 'user');
-  $form .= form_submit('Check username');
-  $output .= form($form);
-
-  $form = form_textfield(t('E-mail'), 'test', '', 32, 64, t('Enter an e-mail address to check if it will be denied or allowed.'));
-  $form .= form_hidden('type', 'mail');
-  $form .= form_submit('Check e-mail');
-  $output .= form($form);
-
   print theme('page', $output);
 }
 
@@ -1401,6 +1428,25 @@ function _user_admin_access_form($edit) {
   return $output;
 }
 
+/**
+ * Menu callback: list all access rules
+ */
+function user_admin_access() {
+  $header = array(array('data' => t('Access type'), 'field' => 'status'), array('data' => t('Rule type'), 'field' => 'type'), array('data' =>t('Mask'), 'field' => 'mask'), array('data' => t('Operations'), 'colspan' => 2));
+  $result = db_query("SELECT aid, type, status, mask FROM {access}". tablesort_sql($header));
+  $access_types = array('user' => t('username'), 'mail' => t('e-mail'));
+  $rows = array();
+  while ($rule = db_fetch_object($result)) {
+    $rows[] = array($rule->status ? t('allow') : t('deny'), $access_types[$rule->type], $rule->mask, l(t('edit'), 'admin/access/rules/edit/'. $rule->aid), l(t('delete'), 'admin/access/rules/delete/'. $rule->aid));
+  }
+  if (count($rows) == 0) {
+    $rows[] = array(array('data' => '<em>'. t('There are currently no access rules.') .'</em>', 'colspan' => 5));
+  }
+  $output .= theme('table', $header, $rows);
+
+  print theme('page', $output);
+}
+
 function user_roles($membersonly = 0, $permission = 0) {
   $roles = array();
 
@@ -1418,10 +1464,14 @@ function user_roles($membersonly = 0, $permission = 0) {
   return $roles;
 }
 
-function user_admin_perm($edit = array()) {
+/**
+ * Menu callback: administer permissions.
+ */
+function user_admin_perm() {
+  $edit = $_POST['edit'];
   if ($edit) {
     // Save permissions:
-    $result = db_query('SELECT * FROM {role} ');
+    $result = db_query('SELECT * FROM {role}');
     while ($role = db_fetch_object($result)) {
       // Delete, so if we clear every checkbox we reset that role;
       // otherwise permissions are active and denied everywhere.
@@ -1479,10 +1529,14 @@ function user_admin_perm($edit = array()) {
   $output = theme('table', $header, $rows, array('id' => 'permissions'));
   $output .= form_submit(t('Save permissions'));
 
-  return form($output);
+  print theme('page', form($output));
 }
 
-function user_admin_role($edit = array()) {
+/**
+ * Menu callback: administer roles.
+ */
+function user_admin_role() {
+  $edit = $_POST['edit'];
   $op = $_POST['op'];
   $id = arg(4);
 
@@ -1515,11 +1569,13 @@ function user_admin_role($edit = array()) {
     db_query('UPDATE {users_roles} SET rid = %d WHERE rid = %d', _user_authenticated_id(), $id);
 
     drupal_set_message(t('The role has been deleted.'));
+    drupal_goto('admin/access/roles');
   }
   else if ($op == t('Add role')) {
     if ($edit['name']) {
       db_query("INSERT INTO {role} (name) VALUES ('%s')", $edit['name']);
       drupal_set_message(t('The role has been added.'));
+      drupal_goto('admin/access/roles');
     }
     else {
       form_set_error('name', t('You must specify a valid role name.'));
@@ -1543,7 +1599,7 @@ function user_admin_role($edit = array()) {
     $header = array(t('Name'), t('Operations'));
     while ($role = db_fetch_object($result)) {
       if ($role->name != 'anonymous user' && $role->name != 'authenticated user') {
-        $rows[] = array($role->name, array('data' => l(t('edit'), "admin/user/configure/role/$role->rid"), 'align' => 'center'));
+        $rows[] = array($role->name, array('data' => l(t('edit'), "admin/access/roles/edit/$role->rid"), 'align' => 'center'));
       }
       else {
         $rows[] = array($role->name, array('data' => '<span class="disabled">'. t('locked') .'</span>', 'align' => 'center'));
@@ -1555,7 +1611,7 @@ function user_admin_role($edit = array()) {
     $output = form($output);
   }
 
-  return $output;
+  print theme('page', $output);
 }
 
 function user_admin_account() {
@@ -1598,21 +1654,10 @@ function user_configure() {
     $op = arg(3);
   }
 
-  switch ($op) {
-    case t('Save permissions'):
-    case 'permission':
-      $output = user_admin_perm($edit);
-      break;
-    case t('Add role'):
-    case t('Delete role'):
-    case t('Save role'):
-    case 'role':
-      $output = user_admin_role($edit);
-      break;
-    default:
-      if ($_POST) system_settings_save();
-      $output = system_settings_form(user_configure_settings());
+  if ($_POST) {
+    system_settings_save();
   }
+  $output = system_settings_form(user_configure_settings());
 
   print theme('page', $output);
 }
@@ -1651,17 +1696,17 @@ function user_help($section) {
     case 'admin/user/create':
     case 'admin/user/account/create':
       return t('<p>This web page allows the administrators to register a new users by hand.  Note that you cannot have a user where either the e-mail address or the username match another user in the system.</p>');
-    case 'admin/user/configure/access':
+    case 'admin/access/rules':
       return '<p>'. t('Set up username and e-mail address access rules for new accounts. If a username or email address for a new account matches any deny rule, but not an allow rule, then the new account will not be allowed to be created.') .'</p>';
-    case 'admin/user/configure/permission':
-      return t('<p>In this area you will define the permissions for each user role (role names are defined on the <a href="%role">user roles page</a>). Each permission describes a fine-grained logical operation, such as being able to access the administration pages, or adding/modifying a user account. You could say a permission represents access granted to a user to perform a set of operations.</p>', array('%role' => url('admin/user/configure/role')));
-    case 'admin/user/configure/role':
+    case 'admin/access':
+      return t('<p>In this area you will define the permissions for each user role (role names are defined on the <a href="%role">user roles page</a>). Each permission describes a fine-grained logical operation, such as being able to access the administration pages, or adding/modifying a user account. You could say a permission represents access granted to a user to perform a set of operations.</p>', array('%role' => url('admin/access/roles')));
+    case 'admin/access/roles':
       return t('
       Roles allow you to fine tune the security and administration of drupal.  A role defines a group of users that have certain privileges as defined in <a href="%permission">user permissions</a>.  Examples of roles include: anonymous user, authenticated user, moderator, administrator and so on. In this area you will define the <em>role names</em> of the various roles. To delete a role choose "edit".<br />By default, Drupal comes with two user roles:
       <ul>
       <li>Anonymous user: this role is used for users that don\'t have a user account or that are not authenticated.</li>
       <li>Authenticated user: this role is assigned automatically to authenticated users.  Most registered users will belong to this user role unless specified otherwise.</li>
-      </ul>', array('%permission' => url('admin/user/configure/permission')));
+      </ul>', array('%permission' => url('admin/access')));
     case 'admin/user/search':
       return t('<p>Enter a simple pattern ("*" may be user as a wildcard match) to search for a username.  For example, one may search for "br" and Drupal might return "brian", "brad", and "brenda".</p>');
     case 'admin/modules#description':