Index: src/bp-core/classes/class-bp-user-query.php
===================================================================
--- src/bp-core/classes/class-bp-user-query.php	(revision 9835)
+++ src/bp-core/classes/class-bp-user-query.php	(working copy)
@@ -38,6 +38,9 @@
  *                                              override all others; BP User objects will be constructed using these
  *                                              IDs only. Default: false.
  *     @type array|string      $member_type     Array or comma-separated list of member types to limit results to.
+ *     @type array|string      $member_type__in     Array or comma-separated list of member types to limit results to.
+ *     @type array|string      $member_type__not_in     Array or comma-separated list of member types that will be
+ *			       excluded from results.
  *     @type string|bool       $meta_key        Limit results to users that have usermeta associated with this meta_key.
  *                                              Usually used with $meta_value. Default: false.
  *     @type string|bool       $meta_value      When used with $meta_key, limits results to users whose usermeta value
@@ -166,6 +169,8 @@
 				'exclude'         => false,
 				'user_ids'        => false,
 				'member_type'     => '',
+				'member_type__in' => '',
+				'member_type__not_in' => '',
 				'meta_key'        => false,
 				'meta_value'      => false,
 				'xprofile_query'  => false,
@@ -418,13 +423,23 @@
 			);
 		}
 
-		// Member type.
-		if ( ! empty( $member_type ) ) {
+		// If member_type is empty and member_type__in has a value asign
+		// member_type__in to member_type
+		if ( empty( $member_type ) && ! empty( $member_type__in ) ) {
+			$member_type = $member_type__in;
+		}
+
+		// Member types.
+		if ( ! empty( $member_type ) || ! empty( $member_type__not_in ) ) {
 			$member_types = array();
+			$member_types__not_in = array();
 
 			if ( ! is_array( $member_type ) ) {
 				$member_type = preg_split( '/[,\s+]/', $member_type );
 			}
+			if ( ! is_array( $member_type__not_in ) ) {
+				$member_type__not_in = preg_split( '/[,\s+]/', $member_type__not_in );
+			}
 
 			foreach ( $member_type as $mt ) {
 				if ( ! bp_get_member_type_object( $mt ) ) {
@@ -433,15 +448,35 @@
 
 				$member_types[] = $mt;
 			}
+			foreach ( $member_type__not_in as $mtni ) {
+				if ( ! bp_get_member_type_object( $mtni ) ) {
+					continue;
+				}
 
+				$member_types__not_in[] = $mtni;
+			}
+
 			if ( ! empty( $member_types ) ) {
-				$member_type_tq = new WP_Tax_Query( array(
-					array(
-						'taxonomy' => 'bp_member_type',
-						'field'    => 'name',
-						'operator' => 'IN',
-						'terms'    => $member_types,
-					),
+				$member_type_tq = array(
+					'taxonomy' => 'bp_member_type',
+					'field'    => 'name',
+					'operator' => 'IN',
+					'terms'    => $member_types,
+				);
+			}
+			if ( ! empty( $member_types__not_in ) ) {
+				$member_type__not_in_tq = 	array(
+					'taxonomy' => 'bp_member_type',
+					'field'    => 'name',
+					'operator' => 'NOT IN',
+					'terms'    => $member_types__not_in,
+				);
+			}
+
+			if ( isset( $member_type_tq ) || isset( $member_type__not_in_tq ) ) {
+				$member_type_query = new WP_Tax_Query( array(
+					isset( $member_type_tq ) ? $member_type_tq : '',
+					isset( $member_type__not_in_tq ) ? $member_type__not_in_tq : '',
 				) );
 
 				// Switch to the root blog, where member type taxonomies live.
@@ -451,7 +486,7 @@
 					$switched = true;
 				}
 
-				$member_type_sql_clauses = $member_type_tq->get_sql( 'u', $this->uid_name );
+				$member_type_sql_clauses = $member_type_query->get_sql( 'u', $this->uid_name );
 
 				if ( $switched ) {
 					restore_current_blog();
@@ -460,9 +495,15 @@
 				// Grab the first term_relationships clause and convert to a subquery.
 				if ( preg_match( '/' . $wpdb->term_relationships . '\.term_taxonomy_id IN \([0-9, ]+\)/', $member_type_sql_clauses['where'], $matches ) ) {
 					$sql['where']['member_type'] = "u.{$this->uid_name} IN ( SELECT object_id FROM $wpdb->term_relationships WHERE {$matches[0]} )";
+
 				} elseif ( false !== strpos( $member_type_sql_clauses['where'], '0 = 1' ) ) {
 					$sql['where']['member_type'] = $this->no_results['where'];
 				}
+				if ( preg_match( '/WHERE term_taxonomy_id IN \([0-9, ]+\)/', $member_type_sql_clauses['where'], $matches ) ) {
+					$sql['where']['member_type__not_in'] = "u.{$this->uid_name} NOT IN ( SELECT object_id FROM $wpdb->term_relationships {$matches[0]} )";
+				} elseif ( false !== strpos( $member_type_sql_clauses['where'], '0 = 1' ) ) {
+					$sql['where']['member_type__not_in'] = $this->no_results['where'];
+				}
 			}
 		}
 
Index: src/bp-members/bp-members-functions.php
===================================================================
--- src/bp-members/bp-members-functions.php	(revision 9835)
+++ src/bp-members/bp-members-functions.php	(working copy)
@@ -85,6 +85,8 @@
  *     @type string       $meta_key        Limit to users with a meta_key. Default: false.
  *     @type string       $meta_value      Limit to users with a meta_value (with meta_key). Default: false.
  *     @type array|string $member_type     Array or comma-separated string of member types.
+  *     @type array|string $member_type__in     Array or comma-separated string of member types.
+ *     @type array|string $member_type__not_in     Array or comma-separated string of member types to be excluded
  *     @type mixed $include Limit results by user IDs. Default: false.
  *     @type int          $per_page        Results per page. Default: 20.
  *     @type int          $page            Page of results. Default: 1.
@@ -104,6 +106,8 @@
 		'meta_key'        => false,        // Limit to users who have this piece of usermeta
 		'meta_value'      => false,        // With meta_key, limit to users where usermeta matches this value
 		'member_type'     => '',
+		'member_type__in'     => '',
+		'member_type__not_in' => '',
 		'include'         => false,        // Pass comma separated list of user_ids to limit to only these users
 		'per_page'        => 20,           // The number of results to return per page
 		'page'            => 1,            // The page to return if limiting per page
Index: src/bp-members/bp-members-template.php
===================================================================
--- src/bp-members/bp-members-template.php	(revision 9835)
+++ src/bp-members/bp-members-template.php	(working copy)
@@ -289,8 +289,10 @@
 	 * @param array        $page_arg        Optional. The string used as a query parameter in pagination links.
 	 *                                      Default: 'upage'.
 	 * @param array|string $member_type     Array or comma-separated string of member types to limit results to.
+	 * @param array|string $member_type__in     Array or comma-separated string of member types to limit results to.
+	 * @param array|string $member_type__not_in     Array or comma-separated string of member types to exclude from results.
 	 */
-	function __construct( $type, $page_number, $per_page, $max, $user_id, $search_terms, $include, $populate_extras, $exclude, $meta_key, $meta_value, $page_arg = 'upage', $member_type = '' ) {
+	function __construct( $type, $page_number, $per_page, $max, $user_id, $search_terms, $include, $populate_extras, $exclude, $meta_key, $meta_value, $page_arg = 'upage', $member_type = '', $member_type__in = '', $member_type__not_in = '' ) {
 
 		$this->pag_arg  = sanitize_key( $page_arg );
 		$this->pag_page = bp_sanitize_pagination_arg( $this->pag_arg, $page_number );
@@ -300,7 +302,7 @@
 		if ( !empty( $_REQUEST['letter'] ) )
 			$this->members = BP_Core_User::get_users_by_letter( $_REQUEST['letter'], $this->pag_num, $this->pag_page, $populate_extras, $exclude );
 		else
-			$this->members = bp_core_get_users( array( 'type' => $this->type, 'per_page' => $this->pag_num, 'page' => $this->pag_page, 'user_id' => $user_id, 'include' => $include, 'search_terms' => $search_terms, 'populate_extras' => $populate_extras, 'exclude' => $exclude, 'meta_key' => $meta_key, 'meta_value' => $meta_value, 'member_type' => $member_type ) );
+			$this->members = bp_core_get_users( array( 'type' => $this->type, 'per_page' => $this->pag_num, 'page' => $this->pag_page, 'user_id' => $user_id, 'include' => $include, 'search_terms' => $search_terms, 'populate_extras' => $populate_extras, 'exclude' => $exclude, 'meta_key' => $meta_key, 'meta_value' => $meta_value, 'member_type' => $member_type, 'member_type__in' => $member_type__in, 'member_type__not_in' => $member_type__not_in ) );
 
 		if ( !$max || $max >= (int) $this->members['total'] )
 			$this->total_member_count = (int) $this->members['total'];
@@ -494,6 +496,8 @@
  *                                                  user. When on a user's Friends page, defaults to the ID of the
  *                                                  displayed user. Otherwise defaults to 0.
  *     @type string|array          $member_type     Array or comma-separated list of member types to limit results to.
+ *     @type string|array          $member_type__in     Array or comma-separated list of member types to limit results to.
+ *     @type string|array          $member_type__not_in     Array or comma-separated list of member types to exclude from results.
  *     @type string                $search_terms    Limit results by a search term. Default: null.
  *     @type string                $meta_key        Limit results by the presence of a usermeta key.
  *           Default: false.
@@ -539,6 +543,8 @@
 
 		'user_id'         => $user_id, // Pass a user_id to only show friends of this user
 		'member_type'     => $member_type,
+		'member_type__in'     => '',
+		'member_type__not_in'     => '',
 		'search_terms'    => null,     // Pass search_terms to filter users by their profile data
 
 		'meta_key'        => false,	   // Only return users with this usermeta
@@ -575,7 +581,9 @@
 		$r['meta_key'],
 		$r['meta_value'],
 		$r['page_arg'],
-		$r['member_type']
+		$r['member_type'],
+		$r['member_type__in'],
+		$r['member_type__not_in']
 	);
 
 	/**
