Index: bp-themes/bp-default/groups/single/members.php
===================================================================
--- bp-themes/bp-default/groups/single/members.php	(revision 3269)
+++ bp-themes/bp-default/groups/single/members.php	(working copy)
@@ -28,7 +28,7 @@
 
 				<?php do_action( 'bp_group_members_list_item' ) ?>
 
-				<?php if ( function_exists( 'friends_install' ) ) : ?>
+				<?php if ( bp_is_active( 'friends' ) ) : ?>
 
 					<div class="action">
 						<?php bp_add_friend_button( bp_get_group_member_id(), bp_get_group_member_is_friend() ) ?>
Index: bp-core/bp-core-classes.php
===================================================================
--- bp-core/bp-core-classes.php	(revision 3269)
+++ bp-core/bp-core-classes.php	(working copy)
@@ -111,7 +111,7 @@
 
 		$sql = array();
 
-		$sql['select_main'] = "SELECT u.ID as id, u.user_registered, u.user_nicename, u.user_login, u.display_name, u.user_email";
+		$sql['select_main'] = "SELECT DISTINCT u.ID as id, u.user_registered, u.user_nicename, u.user_login, u.display_name, u.user_email";
 
 		if ( 'active' == $type || 'online' == $type )
 			$sql['select_active'] = ", um.meta_value as last_activity";
@@ -123,9 +123,10 @@
 			$sql['select_alpha'] = ", pd.value as fullname";
 
 		$sql['from'] = "FROM " . CUSTOM_USER_TABLE . " u LEFT JOIN " . CUSTOM_USER_META_TABLE . " um ON um.user_id = u.ID";
-
-		$sql['where'] = 'WHERE ' . bp_core_get_status_sql( 'u.' );
-
+		
+		if ( $search_terms && bp_is_active( 'xprofile' ) || 'alphabetical' == $type )
+			$sql['from'] .= " LEFT JOIN {$bp->profile->table_name_data} pd ON u.ID = pd.user_id";
+		
 		if ( 'active' == $type || 'online' == $type )
 			$sql['where_active'] = "AND um.meta_key = 'last_activity'";
 
@@ -138,7 +139,7 @@
 		if ( 'alphabetical' == $type )
 			$sql['where_alpha'] = "AND pd.field_id = 1";
 
-		if ( $user_id && function_exists( 'friends_install' ) ) {
+		if ( $user_id && bp_is_active( 'friends' ) ) {
 			$friend_ids = friends_get_friend_user_ids( $user_id );
 			$friend_ids = $wpdb->escape( implode( ',', (array)$friend_ids ) );
 
Index: bp-groups.php
===================================================================
--- bp-groups.php	(revision 3269)
+++ bp-groups.php	(working copy)
@@ -136,7 +136,7 @@
 			bp_core_new_subnav_item( array( 'name' => sprintf( __( 'Members (%s)', 'buddypress' ), number_format( $bp->groups->current_group->total_member_count ) ), 'slug' => 'members', 'parent_url' => $group_link, 'parent_slug' => $bp->groups->slug, 'screen_function' => 'groups_screen_group_members', 'position' => 60, 'user_has_access' => $bp->groups->current_group->user_has_access, 'item_css_id' => 'members'  ) );
 
 			if ( is_user_logged_in() && groups_is_user_member( $bp->loggedin_user->id, $bp->groups->current_group->id ) ) {
-				if ( function_exists('friends_install') )
+				if ( bp_is_active('friends') )
 					bp_core_new_subnav_item( array( 'name' => __( 'Send Invites', 'buddypress' ), 'slug' => 'send-invites', 'parent_url' => $group_link, 'parent_slug' => $bp->groups->slug, 'screen_function' => 'groups_screen_group_invite', 'item_css_id' => 'invite', 'position' => 70, 'user_has_access' => $bp->groups->current_group->user_has_access ) );
 			}
 		}
@@ -1654,6 +1654,8 @@
 		'type' => 'active', // active, newest, alphabetical, random, popular, most-forum-topics or most-forum-posts
 		'user_id' => false, // Pass a user_id to limit to only groups that this user is a member of
 		'include' => false, // Only include these specific groups (group_ids)
+		'exclude' => false, // Do not include these specific groups (group_ids)
+		
 		'search_terms' => false, // Limit to groups that match these search terms
 
 		'per_page' => 20, // The number of results to return per page
@@ -1664,7 +1666,7 @@
 	$params = wp_parse_args( $args, $defaults );
 	extract( $params, EXTR_SKIP );
 
-	$groups = BP_Groups_Group::get( $type, $per_page, $page, $user_id, $search_terms, $include, $populate_extras );
+	$groups = BP_Groups_Group::get( $type, $per_page, $page, $user_id, $search_terms, $include, $populate_extras, $exclude );
 
 	return apply_filters( 'groups_get_groups', $groups, &$params );
 }
@@ -1995,13 +1997,13 @@
 
 /*** Group Invitations *********************************************************/
 
-function groups_get_invites_for_user( $user_id = false, $limit = false, $page = false ) {
+function groups_get_invites_for_user( $user_id = false, $limit = false, $page = false, $exclude = false ) {
 	global $bp;
 
 	if ( !$user_id )
 		$user_id = $bp->loggedin_user->id;
 
-	return BP_Groups_Member::get_invites( $user_id, $limit, $page );
+	return BP_Groups_Member::get_invites( $user_id, $limit, $page, $exclude );
 }
 
 function groups_invite_user( $args = '' ) {
Index: bp-groups/bp-groups-classes.php
===================================================================
--- bp-groups/bp-groups-classes.php	(revision 3269)
+++ bp-groups/bp-groups-classes.php	(working copy)
@@ -255,7 +255,7 @@
 		return array( 'requests' => $paged_requests, 'total' => $total_requests );
 	}
 
-	function get( $type = 'newest', $per_page = null, $page = null, $user_id = false, $search_terms = false, $include = false, $populate_extras = true ) {
+	function get( $type = 'newest', $per_page = null, $page = null, $user_id = false, $search_terms = false, $include = false, $populate_extras = true, $exclude = false ) {
 		global $wpdb, $bp;
 
 		$sql = array();
@@ -288,6 +288,11 @@
 			$include = $wpdb->escape( $include );
 			$sql['include'] = " AND g.id IN ({$include})";
 		}
+		
+		if ( !empty( $exclude ) ) {
+			$exclude = $wpdb->escape( $exclude );
+			$sql['exclude'] = " AND g.id NOT IN ({$exclude})";
+		}
 
 		switch ( $type ) {
 			case 'newest': default:
@@ -327,6 +332,11 @@
 		if ( !empty( $user_id ) )
 			$total_sql['where'][] = "m.group_id = g.id AND m.user_id = {$user_id} AND m.is_confirmed = 1 AND m.is_banned = 0";
 
+		if ( !empty( $exclude ) ) {
+			$exclude = $wpdb->escape( $exclude );
+			$total_sql['where'][] = " g.id NOT IN ({$exclude})";
+		}
+
 		$t_sql = $total_sql['select'];
 
 		if ( !empty( $total_sql['where'] ) )
@@ -781,14 +791,17 @@
 		}
 	}
 
-	function get_invites( $user_id, $limit = false, $page = false ) {
+	function get_invites( $user_id, $limit = false, $page = false, $exclude = false ) {
 		global $wpdb, $bp;
 
 		if ( $limit && $page )
 			$pag_sql = $wpdb->prepare( " LIMIT %d, %d", intval( ( $page - 1 ) * $limit), intval( $limit ) );
+		
+		if ( $exclude )
+			$exclude_sql = $wpdb->prepare( " AND g.id NOT IN (%s)", $exclude );
 
-		$paged_groups = $wpdb->get_results( $wpdb->prepare( "SELECT g.*, gm1.meta_value as total_member_count, gm2.meta_value as last_activity FROM {$bp->groups->table_name_groupmeta} gm1, {$bp->groups->table_name_groupmeta} gm2, {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE g.id = m.group_id AND g.id = gm1.group_id AND g.id = gm2.group_id AND gm2.meta_key = 'last_activity' AND gm1.meta_key = 'total_member_count' AND m.is_confirmed = 0 AND m.inviter_id != 0 AND m.invite_sent = 1 AND m.user_id = %d ORDER BY m.date_modified ASC {$pag_sql}", $user_id ) );
-		$total_groups = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(DISTINCT m.group_id) FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE m.group_id = g.id AND m.is_confirmed = 0 AND m.inviter_id != 0 AND m.invite_sent = 1 AND m.user_id = %d ORDER BY date_modified ASC", $user_id ) );
+		$paged_groups = $wpdb->get_results( $wpdb->prepare( "SELECT g.*, gm1.meta_value as total_member_count, gm2.meta_value as last_activity FROM {$bp->groups->table_name_groupmeta} gm1, {$bp->groups->table_name_groupmeta} gm2, {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE g.id = m.group_id AND g.id = gm1.group_id AND g.id = gm2.group_id AND gm2.meta_key = 'last_activity' AND gm1.meta_key = 'total_member_count' AND m.is_confirmed = 0 AND m.inviter_id != 0 AND m.invite_sent = 1 AND m.user_id = %d {$exclude_sql} ORDER BY m.date_modified ASC {$pag_sql}", $user_id ) );
+		$total_groups = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(DISTINCT m.group_id) FROM {$bp->groups->table_name_members} m, {$bp->groups->table_name} g WHERE m.group_id = g.id AND m.is_confirmed = 0 AND m.inviter_id != 0 AND m.invite_sent = 1 AND m.user_id = %d {$exclude_sql} ORDER BY date_modified ASC", $user_id ) );
 
 		return array( 'groups' => $paged_groups, 'total' => $total_groups );
 	}
@@ -947,7 +960,7 @@
 		foreach ( (array)$members as $user ) $user_ids[] = $user->user_id;
 		$user_ids = $wpdb->escape( join( ',', (array)$user_ids ) );
 
-		if ( function_exists( 'friends_install' ) ) {
+		if ( bp_is_active( 'friends' ) ) {
 			$friend_status = $wpdb->get_results( $wpdb->prepare( "SELECT initiator_user_id, friend_user_id, is_confirmed FROM {$bp->friends->table_name} WHERE (initiator_user_id = %d AND friend_user_id IN ( {$user_ids} ) ) OR (initiator_user_id IN ( {$user_ids} ) AND friend_user_id = %d )", $bp->loggedin_user->id, $bp->loggedin_user->id ) );
 			for ( $i = 0; $i < count( $members ); $i++ ) {
 				foreach ( (array)$friend_status as $status ) {
Index: bp-groups/bp-groups-templatetags.php
===================================================================
--- bp-groups/bp-groups-templatetags.php	(revision 3269)
+++ bp-groups/bp-groups-templatetags.php	(working copy)
@@ -19,20 +19,20 @@
 
 	var $single_group = false;
 
-	function bp_groups_template( $user_id, $type, $page, $per_page, $max, $slug, $search_terms, $include, $populate_extras ) {
+	function bp_groups_template( $user_id, $type, $page, $per_page, $max, $slug, $search_terms, $include, $populate_extras, $exclude ) {
 		global $bp;
 
 		$this->pag_page = isset( $_REQUEST['grpage'] ) ? intval( $_REQUEST['grpage'] ) : $page;
 		$this->pag_num  = isset( $_REQUEST['num'] ) ? intval( $_REQUEST['num'] ) : $per_page;
 
 		if ( 'invites' == $type ) {
-			$this->groups = groups_get_invites_for_user( $user_id, $this->pag_num, $this->pag_page );
+			$this->groups = groups_get_invites_for_user( $user_id, $this->pag_num, $this->pag_page, $exclude );
 		} else if ( 'single-group' == $type ) {
 			$group = new stdClass;
 			$group->group_id = BP_Groups_Group::get_id_from_slug($slug);
 			$this->groups    = array( $group );
 		} else {
-			$this->groups = groups_get_groups( array( 'type' => $type, 'per_page' => $this->pag_num, 'page' => $this->pag_page, 'user_id' => $user_id, 'search_terms' => $search_terms, 'include' => $include, 'populate_extras' => $populate_extras ) );
+			$this->groups = groups_get_groups( array( 'type' => $type, 'per_page' => $this->pag_num, 'page' => $this->pag_page, 'user_id' => $user_id, 'search_terms' => $search_terms, 'include' => $include, 'exclude' => $exclude, 'populate_extras' => $populate_extras ) );
 		}
 
 		if ( 'invites' == $type ) {
@@ -172,6 +172,7 @@
 		'slug' => $slug, // Pass a group slug to only return that group
 		'search_terms' => $search_terms, // Pass search terms to return only matching groups
 		'include' => false, // Pass comma separated list of group ID's to return only these groups
+		'exclude' => false, // Pass comma separated list of group ID's to exclude these groups
 
 		'populate_extras' => true // Get extra meta - is_member, is_banned
 	);
@@ -179,7 +180,7 @@
 	$r = wp_parse_args( $args, $defaults );
 	extract( $r );
 
-	$groups_template = new BP_Groups_Template( (int)$user_id, $type, (int)$page, (int)$per_page, (int)$max, $slug, $search_terms, $include, (bool)$populate_extras );
+	$groups_template = new BP_Groups_Template( (int)$user_id, $type, (int)$page, (int)$per_page, (int)$max, $slug, $search_terms, $include, (bool)$populate_extras, $exclude );
 	return apply_filters( 'bp_has_groups', $groups_template->has_groups(), &$groups_template );
 }
 
