Index: bb-admin/delete-user.php
===================================================================
--- bb-admin/delete-user.php	(revision 0)
+++ bb-admin/delete-user.php	(revision 0)
@@ -0,0 +1,33 @@
+<?php
+require('admin-action.php');
+
+$user_id = (int) $_GET['id'];
+
+bb_check_admin_referer( 'delete-user_' . $user_id );
+
+if ( !bb_current_user_can( 'edit_user', $user_id ) )
+	bb_die( __( 'You can\'t do that!' ) );
+
+$bb_current_id = bb_get_current_user_info( 'id' );
+$bb_user = bb_get_user( $user_id );
+
+if ( !$bb_user )
+	bb_die( __( 'There is a problem with that user.' ) );
+
+if ( $bb_current_id == $user_id )
+	bb_die( __( 'You can\'t delete yourself!' ) );
+
+if( bb_delete_user( $user_id ) )
+	$message = 'deleted';
+else
+	bb_die( __( 'There was an error deleting that user.' ) );
+
+if ( $sendto = wp_get_referer() ) {
+	$sendto = remove_query_arg( 'message', $sendto );
+	$sendto = add_query_arg( 'message', $message, $sendto );
+} else {
+	$sendto = bb_get_uri();
+}
+
+bb_safe_redirect( $sendto );
+exit;
Index: bb-admin/includes/functions.bb-admin.php
===================================================================
--- bb-admin/includes/functions.bb-admin.php	(revision 2401)
+++ bb-admin/includes/functions.bb-admin.php	(working copy)
@@ -411,17 +411,19 @@
 	return $ids;
 }
 
-function bb_user_row( $user, $role = '', $email = false ) {
+function bb_user_row( $user, $role = '', $ed = false ) {
 	$actions = "<a href='" . esc_attr( get_user_profile_link( $user->ID ) ) . "'>" . __('View') . "</a>";
 	$title = '';
-	if ( bb_current_user_can( 'edit_user', $user_id ) ) {
-		$actions .= " | <a href='" . esc_attr( get_profile_tab_link( $user->ID, 'edit' ) ) . "'>" . __('Edit') . "</a>";
+	$r  = "\t<tr id='user-$user->ID'" . get_alt_class("user-$role") . ">\n";
+	if ( bb_current_user_can( 'edit_user', $user_id ) && $ed ) {
+		$actions .= " | <a href='" . esc_attr( get_profile_tab_link( $user->ID, 'edit' ) ) . "'>" . __( 'Edit' ) . "</a>";
+		$actions .= bb_get_user_delete_link( array( 'id' => $user->ID, 'before' => ' | ', 'after' => '', 'delete_text' => __( 'Delete' ) ) );
 		$title = " title='" . esc_attr( sprintf( __( 'User ID: %d' ), $user->ID ) ) . "'";
+		$r .= "\t\t<td class=\"check-column\"><input type=\"checkbox\" name=\"user[]\" value=\"" . $user->ID . "\" /></td> \n";
 	}
-	$r  = "\t<tr id='user-$user->ID'" . get_alt_class("user-$role") . ">\n";
 	$r .= "\t\t<td class=\"user\">" . bb_get_avatar( $user->ID, 32 ) . "<span class=\"row-title\"><a href='" . get_user_profile_link( $user->ID ) . "'" . $title . ">" . get_user_name( $user->ID ) . "</a></span><div><span class=\"row-actions\">$actions</span>&nbsp;</div></td>\n";
 	$r .= "\t\t<td><a href='" . get_user_profile_link( $user->ID ) . "'>" . get_user_display_name( $user->ID ) . "</a></td>\n";
-	if ( $email ) {
+	if ( $ed ) {
 		$email = bb_get_user_email( $user->ID );
 		$r .= "\t\t<td><a href='mailto:$email'>$email</a></td>\n";
 	}
@@ -446,7 +448,7 @@
 		$_roles = $wp_roles->get_names();
 		$role = array();
 		foreach ( $user->capabilities as $cap => $cap_set ) {
-			if (!$cap_set) {
+			if ( !$cap_set || !$_roles[$cap] ) {
 				continue;
 			}
 			$role[] = $_roles[$cap];
@@ -563,7 +565,13 @@
 		return false;
 	}
 
-	function display( $show_search = true, $show_email = false ) {
+	/**
+	 * Displays the controls for users
+	 *
+	 * @param bool $show_search Show Search or not. Default true
+	 * @param bool $show_ed Show Email of the user and delete options or not. Default false. Probable input could be `bb_current_user_can('edit_users')
+	 */
+	function display( $show_search = true, $show_ed = false ) {
 		global $wp_roles;
 
 		$r = '';
@@ -627,7 +635,36 @@
 			$r .= "</fieldset>\n";
 			$r .= "</form>\n\n";
 		}
-
+		
+		if( $show_ed ) {
+			$bulk_actions = array(
+				'delete' => __( 'Delete' ),
+			);
+		}else{
+			$bulk_actions = array(); //for plugins
+		}
+		
+		do_action_ref_array( 'bulk_user_actions', array( &$bulk_actions, &$bb_user_search ) );
+		
+		$show_bulk = ( is_array( $bulk_actions ) && count( $bulk_actions ) > 0 ) ? true : false;
+		
+		if( $show_bulk ){
+			$r .= "<div class='clear'></div>\n\n";
+			$r .= "<form class='table-form bulk-form' method='post' action=''>\n";
+			$r .= "\t<fieldset>\n";
+			$r .= "\t\t<select name='action'>\n";
+			$r .= "\t\t\t<option>" . __( 'Bulk Actions' ) . "</option>\n";
+			
+			foreach ( $bulk_actions as $value => $label ) {
+				$r .= "\t\t\t<option value='" . esc_attr( $value ) . "'>" . esc_html( $label ) . "</option>\n";
+			}
+			
+			$r .= "\t\t</select>\n";
+			$r .= "\t\t<input type='submit' value='" . esc_attr__( 'Apply' ) . "' class='button submit-input' />\n";
+			$r .= "\t\t" . bb_nonce_field( 'user-bulk', '_wpnonce', true, false ) . "\n";
+			$r .= "\t</fieldset>\n";
+		}
+		
 		if ( $this->get_results() ) {
 			if ( $this->results_are_paged() )
 				$r .= "<div class='tablenav'>\n" . $this->paging_text . "</div><div class=\"clear\"></div>\n\n";
@@ -641,7 +678,10 @@
 				$r .= "<table class='widefat'>\n";
 				$r .= "<thead>\n";
 				$r .= "\t<tr>\n";
-				if ( $show_email ) {
+				if ( $show_bulk ) {
+					$r .= "\t\t<th scope='col' class='check-column'><input type='checkbox' /></th>\n";
+				}
+				if ( $show_ed ) {
 					$r .= "\t\t<th style='width:30%;'>" . __('Username') . "</th>\n";
 					$r .= "\t\t<th style='width:20%;'>" . __('Name') . "</th>\n";
 					$r .= "\t\t<th style='width:20%;'>" . __('E-mail') . "</th>\n";
@@ -655,7 +695,10 @@
 				$r .= "</thead>\n\n";
 				$r .= "<tfoot>\n";
 				$r .= "\t<tr>\n";
-				if ( $show_email ) {
+				if ( $show_bulk ) {
+					$r .= "\t\t<th scope='col' class='check-column'><input type='checkbox' /></th>\n";
+				}
+				if ( $show_ed ) {
 					$r .= "\t\t<th style='width:30%;'>" . __('Username') . "</th>\n";
 					$r .= "\t\t<th style='width:20%;'>" . __('Name') . "</th>\n";
 					$r .= "\t\t<th style='width:20%;'>" . __('E-mail') . "</th>\n";
@@ -670,9 +713,10 @@
 
 				$r .= "<tbody id='role-$role'>\n";
 				foreach ( (array) $this->get_results() as $user_object )
-					$r .= bb_user_row($user_object, $role, $show_email);
+					$r .= bb_user_row( $user_object, $role, $show_ed );
 				$r .= "</tbody>\n";
 				$r .= "</table>\n\n";
+				$r .= "</form>\n\n";
 			//}
 
 			if ( $this->results_are_paged() )
Index: bb-admin/users.php
===================================================================
--- bb-admin/users.php	(revision 2401)
+++ bb-admin/users.php	(working copy)
@@ -1,6 +1,43 @@
 <?php
 require_once('admin.php');
 
+if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) ) {
+
+	bb_check_admin_referer( 'user-bulk' );
+	$user_ids = array_map( 'absint', $_POST['user'] );
+	$count = 0;
+        $bb_current_id = bb_get_current_user_info( 'id' );
+        
+	$action = trim( $_POST['action'] );
+        
+	switch ( $action ) {
+	case 'delete' :
+		foreach ( $user_ids as $user_id ) {
+                    if ( $bb_current_id != $user_id )
+			$count += (int) (bool) bb_delete_user( $user_id );
+		}
+		$query_vars = array( 'message' => 'deleted', 'count' => $count );
+		break;
+	default :
+		if ( $action )
+			$query_vars = apply_filters( "bulk_user__$action", array(), $user_ids, $action );
+		break;
+	}
+
+	bb_safe_redirect( add_query_arg( $query_vars ) );
+	exit;
+}
+
+if ( !empty( $_GET['message'] ) ) {
+	$message_count = isset( $_GET['count'] ) ? (int) $_GET['count'] : 1;
+
+	switch ( (string) $_GET['message'] ) {
+		case 'deleted':
+			bb_admin_notice( sprintf( _n( '<strong>User deleted.</strong>', '<strong>%s users deleted.</strong>', $message_count ), bb_number_format_i18n( $message_count ) ) );
+			break;
+	}
+}
+
 // Query the users
 $bb_user_search = new BB_User_Search(@$_GET['usersearch'], @$_GET['page'], @$_GET['userrole']);
 
Index: bb-includes/functions.bb-template.php
===================================================================
--- bb-includes/functions.bb-template.php	(revision 2401)
+++ bb-includes/functions.bb-template.php	(working copy)
@@ -2247,6 +2247,36 @@
 	return apply_filters( 'get_user_delete_button', $r);
 }
 
+function bb_user_delete_link( $args = '' ) {
+	echo bb_get_user_delete_link( $args );
+}
+
+function bb_get_user_delete_link( $args = '' ) {
+	$defaults = array( 'id' => 0, 'before' => '[', 'after' => ']', 'delete_text' => false, 'redirect' => true );
+	extract(wp_parse_args( $args, $defaults ), EXTR_SKIP);
+	$id = (int) $id;
+
+	$user = bb_get_user( bb_get_user_id( $id ) );
+
+	if ( !$user || !bb_current_user_can( 'edit_user', $user->ID ) )
+		return;
+	
+	$bb_current_id = bb_get_current_user_info( 'id' );
+	if ( $bb_current_id == $user->ID )
+		return;
+
+	if ( true === $redirect )
+		$redirect = add_query_arg( bb_is_admin() ? array() : array( 'view' => 'all'  ) );
+
+	$query   = array( 'id' => $user->ID, '_wp_http_referer' => $redirect ? rawurlencode( $redirect ) : false );
+	$confirm = __( 'Are you sure you wanna delete that user?' );
+	$display = esc_html( $delete_text ? $delete_text : __( 'Delete user' ) );
+	$uri = bb_get_uri('bb-admin/delete-user.php', $query, BB_URI_CONTEXT_A_HREF + BB_URI_CONTEXT_BB_ADMIN);
+	$uri = esc_url( bb_nonce_url( $uri, 'delete-user_' . $user->ID ) );
+	
+	return $before . '<a href="' . $uri . '" onclick="return confirm(\'' . esc_js( $confirm ) . '\');">' . $display . '</a>' . $after;
+}
+
 function profile_tab_link( $id = 0, $tab, $page = 1 ) {
 	echo apply_filters( 'profile_tab_link', get_profile_tab_link( $id, $tab ) );
 }

