Index: wp-admin/includes/class-wp-users-list-table.php
===================================================================
--- wp-admin/includes/class-wp-users-list-table.php	(revision 17784)
+++ wp-admin/includes/class-wp-users-list-table.php	(working copy)
@@ -72,6 +72,8 @@
 			'total_items' => $wp_user_search->get_total(),
 			'per_page' => $users_per_page,
 		) );
+                
+                add_filter( 'user_role_name', array( &$this, 'wp_user_role_name' ), 1, 2 );
 	}
 
 	function no_items() {
@@ -140,10 +142,12 @@
 ?>
 	<div class="alignleft actions">
 		<label class="screen-reader-text" for="new_role"><?php _e( 'Change role to&hellip;' ) ?></label>
-		<select name="new_role" id="new_role">
-			<option value=''><?php _e( 'Change role to&hellip;' ) ?></option>
-			<?php wp_dropdown_roles(); ?>
-		</select>
+                <?php wp_user_role_selector(array(
+                    'name' => 'new_role',
+                    'id' => 'new_role',
+                    'no_role' => false,
+                    'before_list' => '<option value="" selected="true">' . __( 'Change role to&hellip;' ) . '</option>'
+                )) ?>
 		<?php submit_button( __( 'Change' ), 'secondary', 'changeit', false ); ?>
 	</div>
 <?php
@@ -192,7 +196,6 @@
 
 		$style = '';
 		foreach ( $this->items as $userid => $user_object ) {
-			$role = reset( $user_object->roles );
 
 			if ( is_multisite() && empty( $role ) )
 				continue;
@@ -260,7 +263,11 @@
 		} else {
 			$edit = '<strong>' . $user_object->user_login . '</strong>';
 		}
-		$role_name = isset( $wp_roles->role_names[$role] ) ? translate_user_role( $wp_roles->role_names[$role] ) : __( 'None' );
+                if ( !isset( $role ) || $role == '' )
+                    $role = $user_object->roles;
+                if ( !is_array($role) )
+                    $role = array( $role );
+		$role_name = apply_filters( 'user_role_name' , $role, $role );
 		$avatar = get_avatar( $user_object->ID, 32 );
 
 		$r = "<tr id='user-$user_object->ID'$style>";
@@ -314,6 +321,19 @@
 
 		return $r;
 	}
+        
+        /**
+         * Formats the role name for the WP_Users_List table role column.
+         * 
+         * @param type string $role the string that is being filtered.
+         * @param type array $roles the array of roles
+         * @return type string
+         */
+        static function wp_user_role_name( $role, $roles ) {
+            global $wp_roles;
+            return isset( $wp_roles->role_names[$roles[0]] ) ? translate_user_role( $wp_roles->role_names[$roles[0]] ) : __( 'None' );
+        }
+        
 }
 
 ?>
Index: wp-admin/includes/template.php
===================================================================
--- wp-admin/includes/template.php	(revision 17784)
+++ wp-admin/includes/template.php	(working copy)
@@ -752,29 +752,93 @@
 
 
 /**
- * Print out <option> html elements for role selectors
+ * Get the <option> html elements for role selectors
  *
  * @since 2.1.0
+ * @deprecated 3.1.2 this function is deprecated. User wp_user_role_selector instead.
+ * @uses serves as a wrapper for wp_get_dropdown_roles
+ * @param string $selected slug for the role that should be already selected
+ */
+function wp_dropdown_roles( $selected = false ) {
+	echo wp_get_dropdown_roles( $selected );
+}
+
+
+/**
+ * Get the <option> html elements for role selectors
  *
+ * @since 3.1.2
+ *
  * @param string $selected slug for the role that should be already selected
+ * @return string
  */
-function wp_dropdown_roles( $selected = false ) {
+function wp_get_dropdown_roles( $selected = false ) {
 	$p = '';
 	$r = '';
 
 	$editable_roles = get_editable_roles();
+        
+        if ( is_array( $selected ) )
+            $selected = $selected[0];
 
 	foreach ( $editable_roles as $role => $details ) {
-		$name = translate_user_role($details['name'] );
+		$name = translate_user_role( $details['name'] );
 		if ( $selected == $role ) // preselect specified role
 			$p = "\n\t<option selected='selected' value='" . esc_attr($role) . "'>$name</option>";
 		else
 			$r .= "\n\t<option value='" . esc_attr($role) . "'>$name</option>";
 	}
-	echo $p . $r;
+	return $p . $r;
 }
 
+
 /**
+ * Print out the dropdown role selector
+ * 
+ * selected - (string) The role that is to be selected in the dropdown
+ * name - (string) The html name element of the selector
+ * id - (string) The html id element of the selector
+ * class - (string) The classes to be applied to the selector
+ * no_role - (bool) Whether an option should be shown to select no role
+ * before_list - (string) Html to be inserted after the <select> and
+ *      before the first option.
+ * after_list - (string) Html to be inserted after the last <option> and
+ *      before </select>
+ * 
+ * @since 3.1.2
+ *
+ * @param string $options an array of options for the dropdown
+ */
+function wp_user_role_selector( $args = array() ) {
+        $defaults = array(
+            'selected' => false,
+            'name' => 'role',
+            'id' => 'role',
+            'class' => false,
+            'no_role' => true,
+            'before_list' => false,
+            'after_list' => false
+        );
+        
+        $args = wp_parse_args( $args, $defaults );
+        extract( $args );
+        
+        $p = "<select name='$name' id='$id'" . ( $class ? '' : " class='$class'" ) . '>' . $before_list;
+	$r = '';
+
+        if ( $no_role ) {
+            if ( $selected )
+                    $r = '<option value="">' . __('&mdash; No role for this site &mdash;') . '</option>';
+            else
+                    $r = '<option value="" selected="selected">' . __('&mdash; No role for this site &mdash;') . '</option>';
+        }
+        
+        $r .= '</select>' . $after_list;
+        
+	echo apply_filters( 'user_role_selector', $p . wp_get_dropdown_roles( $selected ) . $r, $args );
+}
+
+/**
  * {@internal Missing Short Description}}
  *
  * @since 2.3.0
Index: wp-admin/options-general.php
===================================================================
--- wp-admin/options-general.php	(revision 17784)
+++ wp-admin/options-general.php	(working copy)
@@ -115,7 +115,12 @@
 <tr valign="top">
 <th scope="row"><label for="default_role"><?php _e('New User Default Role') ?></label></th>
 <td>
-<select name="default_role" id="default_role"><?php wp_dropdown_roles( get_option('default_role') ); ?></select>
+    <?php wp_user_role_selector( array( 
+            'selected' => get_option('default_role'),
+            'name' => 'default_role',
+            'id' => 'default_role',
+            'no_role' => true
+        ) ); ?>
 </td>
 </tr>
 <?php } else { ?>
Index: wp-admin/user-edit.php
===================================================================
--- wp-admin/user-edit.php	(revision 17784)
+++ wp-admin/user-edit.php	(working copy)
@@ -233,24 +233,20 @@
 
 <?php if ( !IS_PROFILE_PAGE && !is_network_admin() ) : ?>
 <tr><th><label for="role"><?php _e('Role:') ?></label></th>
-<td><select name="role" id="role">
+<td>
 <?php
 // Get the highest/primary role for this user
 // TODO: create a function that does this: wp_get_user_role()
 $user_roles = $profileuser->roles;
-$user_role = array_shift($user_roles);
 
 // print the full list of roles with the primary one selected.
-wp_dropdown_roles($user_role);
-
-// print the 'no role' option. Make it selected if the user has no role yet.
-if ( $user_role )
-	echo '<option value="">' . __('&mdash; No role for this site &mdash;') . '</option>';
-else
-	echo '<option value="" selected="selected">' . __('&mdash; No role for this site &mdash;') . '</option>';
+wp_user_role_selector(array(
+    'selected' => $user_roles
+));
 ?>
-</select>
-<?php endif; //!IS_PROFILE_PAGE
+</td>
+<?php
+endif; //!IS_PROFILE_PAGE
 
 if ( is_multisite() && is_network_admin() && ! IS_PROFILE_PAGE && current_user_can( 'manage_network_options' ) && !isset($super_admins) ) { ?>
 <tr><th><label for="role"><?php _e('Super Admin'); ?></label></th>
Index: wp-admin/user-new.php
===================================================================
--- wp-admin/user-new.php	(revision 17784)
+++ wp-admin/user-new.php	(working copy)
@@ -243,9 +243,16 @@
 	</tr>
 	<tr class="form-field">
 		<th scope="row"><label for="adduser-role"><?php _e('Role'); ?></label></th>
-		<td><select name="role" id="adduser-role">
-			<?php wp_dropdown_roles( get_option('default_role') ); ?>
-			</select>
+		<td>
+			<?php 
+                             wp_user_role_selector( array(
+                                 'selected' => get_option('default_role'),
+                                 'name' => 'role',
+                                 'id' => 'adduser-role',
+                                 'no_role' => false
+                             ));
+                        ?>
+			
 		</td>
 	</tr>
 <?php if ( is_super_admin() ) { ?>
@@ -323,13 +330,16 @@
 <?php } // !is_multisite ?>
 	<tr class="form-field">
 		<th scope="row"><label for="role"><?php _e('Role'); ?></label></th>
-		<td><select name="role" id="role">
+		<td>
 			<?php
 			if ( !$new_user_role )
 				$new_user_role = !empty($current_role) ? $current_role : get_option('default_role');
-			wp_dropdown_roles($new_user_role);
+                            wp_user_role_selector(array(
+                                'selected' => $new_user_role,
+                                'no_role' => false
+                            ));
 			?>
-			</select>
+		
 		</td>
 	</tr>
 	<?php if ( is_multisite() && is_super_admin() ) { ?>
