=== modified file 'misc/drupal.css'
--- misc/drupal.css	
+++ misc/drupal.css	
@@ -319,7 +319,7 @@ tr.odd .form-item, tr.even .form-item {
   font-style: normal;
   text-decoration: line-through;
 }
-#node-admin-filter ul {
+#node-admin-filter ul, #user-admin-filter ul {
   list-style-type: none;
   padding: 0;
   margin: 0;
=== modified file 'modules/user/user.module'
--- modules/user/user.module	
+++ modules/user/user.module	
@@ -1869,6 +1869,10 @@ function theme_user_admin_new_role($form
 }
 
 function user_admin_account() {
+  $output = user_filter_form();
+
+  $filter = user_build_filter_query();
+
   $header = array(
     array('data' => t('Username'), 'field' => 'u.name'),
     array('data' => t('Status'), 'field' => 'u.status'),
@@ -1876,9 +1880,9 @@ function user_admin_account() {
     array('data' => t('Last access'), 'field' => 'u.access'),
     t('Operations')
   );
-  $sql = 'SELECT u.uid, u.name, u.status, u.created, u.access FROM {users} u WHERE uid != 0';
+  $sql = 'SELECT DISTINCT u.uid, u.name, u.status, u.created, u.access FROM {users} u LEFT JOIN {users_roles} ur ON u.uid = ur.uid '. $filter['join'] .' WHERE u.uid != 0 '. $filter['where'];
   $sql .= tablesort_sql($header);
-  $result = pager_query($sql, 50);
+  $result = pager_query($sql, 50, 0, NULL, $filter['args']);
 
   $status = array(t('blocked'), t('active'));
   while ($account = db_fetch_object($result)) {
@@ -1889,7 +1893,7 @@ function user_admin_account() {
                     l(t('edit'), "user/$account->uid/edit", array()));
   }
 
-  $output = theme('table', $header, $rows);
+  $output .= theme('table', $header, $rows);
   $output .= theme('pager', NULL, 50, 0);
   return $output;
 }
@@ -2066,3 +2070,173 @@ function user_autocomplete($string) {
   print drupal_to_js($matches);
   exit();
 }
+
+function user_filters() {
+  // Regular filters
+  $filters = array();
+  $roles = user_roles(1);
+  unset($roles[2]); // Don't list authorized role.
+  $filters['role'] = array('title' => t('role'),
+                       'where' => "ur.rid = %d",
+                       'options' => $roles,
+                     );
+
+  $options = array();
+  foreach (module_list() as $module) {
+    if ($permissions = module_invoke($module, 'perm')) {
+      asort($permissions);
+      foreach ($permissions as $permission) {
+        $options[$module][$permission] = $permission;
+      }
+    }
+  }
+  $filters['permission'] = array('title' => t('permission'),
+                             'join' => 'INNER JOIN {permission} p ON ur.rid = p.rid',
+                             'where' => " (p.perm LIKE '%%%s%%' OR u.uid = 1) ",
+                             'options' => $options,
+                           );
+
+  $filters['status'] = array('title' => t('status'),
+                         'where' => 'u.status = %d',
+                         'options' => array(1 => t('active'), 0 => t('blocked')),
+                       );
+  return $filters;
+}
+
+function user_build_filter_query() {
+  $filters = user_filters();
+
+  // Build query
+  $where = $args = $join = array();
+  foreach ($_SESSION['user_overview_filter'] as $filter) {
+    list ($key, $value) = $filter;
+    // This checks to see if this permission filter is an enabled permission for either the anon or auth roles.
+    // If so, then all users would be listed, and we can skip adding it to the filter query.
+    if ($key == 'permission') {
+      $account->uid = 'user_filter';
+      $account->roles = array(1 => 1, 2 => 1);
+      if (user_access($value, $account)) {
+        continue;
+      }
+    }
+    $where[] = $filters[$key]['where'];
+    $args[] = $value;
+    $join[] = $filters[$key]['join'];
+  }
+  $where = count($where) ? 'AND '. implode(' AND ', $where) : '';
+  $join = count($join) ? ' '. implode(' ', array_unique($join)) : '';
+
+  return array('where' => $where,
+           'join' => $join,
+           'args' => $args,
+         );
+}
+
+function user_filter_form() {
+  $session = &$_SESSION['user_overview_filter'];
+  $session = is_array($session) ? $session : array();
+  $filters = user_filters();
+
+  $i = 0;
+  $form['filters'] = array('#type' => 'fieldset',
+                       '#title' => t('Show only users where'),
+                       '#theme' => 'user_filters',
+                     );
+  foreach ($session as $filter) {
+    list ($type, $value) = $filter;
+    $string = ($i++ ? '<em>and</em> where <strong>%a</strong> is <strong>%b</strong>' : '<strong>%a</strong> is <strong>%b</strong>');
+    // Merge an array of arrays into one if necessary.
+    $options = $type == 'permission' ? call_user_func_array('array_merge', $filters[$type]['options']) : $filters[$type]['options'];
+    $form['filters']['current'][] = array('#value' => t($string, array('%a' => $filters[$type]['title'] , '%b' => $options[$value])));
+  }
+
+  foreach ($filters as $key => $filter) {
+    $names[$key] = $filter['title'];
+    $form['filters']['status'][$key] = array('#type' => 'select',
+                                         '#options' => $filter['options'],
+                                       );
+  }
+
+  $form['filters']['filter'] = array('#type' => 'radios',
+                                 '#options' => $names,
+                               );
+  $form['filters']['buttons']['submit'] = array('#type' => 'submit',
+                                            '#value' => (count($session) ? t('Refine') : t('Filter'))
+                                          );
+  if (count($session)) {
+    $form['filters']['buttons']['undo'] = array('#type' => 'submit',
+                                            '#value' => t('Undo')
+                                          );
+    $form['filters']['buttons']['reset'] = array('#type' => 'submit',
+                                             '#value' => t('Reset')
+                                           );
+  }
+
+  return drupal_get_form('user_filter_form', $form);
+}
+
+function theme_user_filter_form($form) {
+  $output .= '<div id="user-admin-filter">';
+  $output .= form_render($form['filters']);
+  $output .= '</div>';
+  $output .= form_render($form);
+  return $output;
+}
+
+function theme_user_filters($form) {
+  $output .= '<ul>';
+  if (sizeof($form['current'])) {
+    foreach (element_children($form['current']) as $key) {
+      $output .= '<li>'. form_render($form['current'][$key]) .'</li>';
+    }
+  }
+
+  $output .= '<li><dl class="multiselect">'. (sizeof($form['current']) ? '<dt><em>and</em> where</dt>' : '') .'<dd class="a">';
+  $output .= '<li><dl class="multiselect"><dd class="a">';
+  foreach(element_children($form['filter']) as $key) {
+    $output .= form_render($form['filter'][$key]);
+  }
+  $output .= '</dd>';
+
+  $output .= '<dt>is</dt>'.'<dd class="b">';
+
+  foreach (element_children($form['status']) as $key) {
+    $output .= form_render($form['status'][$key]);
+  }
+  $output .= '</dd>';
+
+  $output .= '</dl>';
+  $output .= '<div class="container-inline" id="node-admin-buttons">'. form_render($form['buttons']) .'</div>';
+  $output .= '</li></ul><br class="clear" />';
+
+  return $output;
+}
+
+
+function user_filter_form_submit($form_id, $form_values) {
+  $op = $_POST['op'];
+  $filters = user_filters();
+  switch ($op) {
+    case t('Filter'): case t('Refine'):
+      if (isset($form_values['filter'])) {
+        $filter = $form_values['filter'];
+        // Merge an array of arrays into one if necessary.
+        $options = $filter == 'permission' ? call_user_func_array('array_merge', $filters[$filter]['options']) : $filters[$filter]['options'];
+        if (isset($options[$form_values[$filter]])) {
+          $_SESSION['user_overview_filter'][] = array($filter, $form_values[$filter]);
+        }
+      }
+      break;
+    case t('Undo'):
+      array_pop($_SESSION['user_overview_filter']);
+      break;
+    case t('Reset'):
+      $_SESSION['user_overview_filter'] = array();
+      break;
+    case t('Update'):
+      return;
+  }
+
+  drupal_goto('admin/user');
+}
+
