Index: bp-templates/bp-legacy/buddypress-functions.php
===================================================================
--- bp-templates/bp-legacy/buddypress-functions.php	(revision 7377)
+++ bp-templates/bp-legacy/buddypress-functions.php	(working copy)
@@ -134,6 +134,7 @@
 			'forums_filter'   => 'bp_legacy_theme_object_template_loader',
 			'groups_filter'   => 'bp_legacy_theme_object_template_loader',
 			'members_filter'  => 'bp_legacy_theme_object_template_loader',
+			'groupmembers_filter'  => 'bp_legacy_theme_object_template_loader',
 			'messages_filter' => 'bp_legacy_theme_messages_template_loader',
 
 			// Friends
@@ -444,6 +445,15 @@
 
 	$qs = array();
 
+	if( 'groupmembers' == $object ) {
+		if( bp_is_group_admin_screen( 'manage-members' ) ) {
+			$qs[] = 'per_page=15';
+			$qs[] = 'exclude_banned=false';
+		} else {
+			$qs[] = 'exclude_admins_mods=0';
+		}
+	}
+
 	/**
 	 * Check if any cookie values are set. If there are then override the
 	 * default params passed to the template loop.
@@ -524,8 +534,21 @@
 	// Sanitize the object
 	$object = sanitize_title( $_POST['object'] );
 
+	$template_folder = $component = $object;
+
+	if( 'groupmembers' == $object ) {
+		$component = 'groups';
+		$template_folder = 'groups/single';
+
+		//pagination
+		if( !empty( $_POST['page'] ) ) {
+			$_REQUEST['mlpage'] = $_REQUEST['page'];
+			unset( $_REQUEST['page'] );
+		}
+	}
+
 	// Bail if object is not an active component to prevent arbitrary file inclusion
-	if ( ! bp_is_active( $object ) )
+	if ( ! bp_is_active( $component ) )
 		return;
 
  	/**
@@ -538,7 +561,7 @@
 		bp_update_is_directory( true, bp_current_component() );
 
 	// Locate the object template
-	bp_get_template_part( "$object/$object-loop" );
+	bp_get_template_part( "$template_folder/$object-loop" );
 	exit();
 }
 
Index: bp-templates/bp-legacy/buddypress/groups/single/members.php
===================================================================
--- bp-templates/bp-legacy/buddypress/groups/single/members.php	(revision 7377)
+++ bp-templates/bp-legacy/buddypress/groups/single/members.php	(working copy)
@@ -1,90 +1,19 @@
-<?php if ( bp_group_has_members( 'exclude_admins_mods=0' ) ) : ?>
+<div class="item-list-tabs" id="subnav" role="navigation">
+	<ul>
 
-	<?php do_action( 'bp_before_group_members_content' ); ?>
+		<?php do_action( 'bp_members_directory_member_sub_types' ); ?>
 
-	<div class="item-list-tabs" id="subnav" role="navigation">
-		<ul>
+		<?php bp_group_members_filter(); ?>
 
-			<?php do_action( 'bp_members_directory_member_sub_types' ); ?>
-
-		</ul>
-	</div>
-
-	<div id="pag-top" class="pagination no-ajax">
-
-		<div class="pag-count" id="member-count-top">
-
-			<?php bp_members_pagination_count(); ?>
-
-		</div>
-
-		<div class="pagination-links" id="member-pag-top">
-
-			<?php bp_members_pagination_links(); ?>
-
-		</div>
-
-	</div>
-
-	<?php do_action( 'bp_before_group_members_list' ); ?>
-
-	<ul id="member-list" class="item-list" role="main">
-
-		<?php while ( bp_group_members() ) : bp_group_the_member(); ?>
-
-			<li>
-				<a href="<?php bp_group_member_domain(); ?>">
-
-					<?php bp_group_member_avatar_thumb(); ?>
-
-				</a>
-
-				<h5><?php bp_group_member_link(); ?></h5>
-				<span class="activity"><?php bp_group_member_joined_since(); ?></span>
-
-				<?php do_action( 'bp_group_members_list_item' ); ?>
-
-				<?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() ); ?>
-
-						<?php do_action( 'bp_group_members_list_item_action' ); ?>
-
-					</div>
-
-				<?php endif; ?>
-			</li>
-
-		<?php endwhile; ?>
-
 	</ul>
+</div>
 
-	<?php do_action( 'bp_after_group_members_list' ); ?>
 
-	<div id="pag-bottom" class="pagination no-ajax">
 
-		<div class="pag-count" id="member-count-bottom">
+<?php do_action( 'bp_before_group_members_list' ); ?>
 
-			<?php bp_members_pagination_count(); ?>
+<div class="groupmembers" role="main">
 
-		</div>
+	<?php bp_get_template_part( 'groups/single/groupmembers-loop' ); ?>
 
-		<div class="pagination-links" id="member-pag-bottom">
-
-			<?php bp_members_pagination_links(); ?>
-
-		</div>
-
-	</div>
-
-	<?php do_action( 'bp_after_group_members_content' ); ?>
-
-<?php else: ?>
-
-	<div id="message" class="info">
-		<p><?php _e( 'This group has no members.', 'buddypress' ); ?></p>
-	</div>
-
-<?php endif; ?>
+</div>
Index: bp-templates/bp-legacy/buddypress/groups/single/admin.php
===================================================================
--- bp-templates/bp-legacy/buddypress/groups/single/admin.php	(revision 7377)
+++ bp-templates/bp-legacy/buddypress/groups/single/admin.php	(working copy)
@@ -230,68 +230,12 @@
 	<div class="bp-widget">
 		<h4><?php _e("Members", "buddypress"); ?></h4>
 
-		<?php if ( bp_group_has_members( 'per_page=15&exclude_banned=false' ) ) : ?>
+		<div class="groupmembers" role="main">
 
-			<?php if ( bp_group_member_needs_pagination() ) : ?>
+			<?php bp_get_template_part( 'groups/single/groupmembers-loop' ); ?>
 
-				<div class="pagination no-ajax">
+		</div>
 
-					<div id="member-count" class="pag-count">
-						<?php bp_group_member_pagination_count(); ?>
-					</div>
-
-					<div id="member-admin-pagination" class="pagination-links">
-						<?php bp_group_member_admin_pagination(); ?>
-					</div>
-
-				</div>
-
-			<?php endif; ?>
-
-			<ul id="members-list" class="item-list single-line">
-				<?php while ( bp_group_members() ) : bp_group_the_member(); ?>
-
-					<li class="<?php bp_group_member_css_class(); ?>">
-						<?php bp_group_member_avatar_mini(); ?>
-
-						<h5>
-							<?php bp_group_member_link(); ?>
-
-							<?php if ( bp_get_group_member_is_banned() ) _e( '(banned)', 'buddypress' ); ?>
-
-							<span class="small">
-
-							<?php if ( bp_get_group_member_is_banned() ) : ?>
-
-								<a href="<?php bp_group_member_unban_link(); ?>" class="button confirm member-unban" title="<?php _e( 'Unban this member', 'buddypress' ); ?>"><?php _e( 'Remove Ban', 'buddypress' ); ?></a>
-
-							<?php else : ?>
-
-								<a href="<?php bp_group_member_ban_link(); ?>" class="button confirm member-ban" title="<?php _e( 'Kick and ban this member', 'buddypress' ); ?>"><?php _e( 'Kick &amp; Ban', 'buddypress' ); ?></a>
-								<a href="<?php bp_group_member_promote_mod_link(); ?>" class="button confirm member-promote-to-mod" title="<?php _e( 'Promote to Mod', 'buddypress' ); ?>"><?php _e( 'Promote to Mod', 'buddypress' ); ?></a>
-								<a href="<?php bp_group_member_promote_admin_link(); ?>" class="button confirm member-promote-to-admin" title="<?php _e( 'Promote to Admin', 'buddypress' ); ?>"><?php _e( 'Promote to Admin', 'buddypress' ); ?></a>
-
-							<?php endif; ?>
-
-								<a href="<?php bp_group_member_remove_link(); ?>" class="button confirm" title="<?php _e( 'Remove this member', 'buddypress' ); ?>"><?php _e( 'Remove from group', 'buddypress' ); ?></a>
-
-								<?php do_action( 'bp_group_manage_members_admin_item' ); ?>
-
-							</span>
-						</h5>
-					</li>
-
-				<?php endwhile; ?>
-			</ul>
-
-		<?php else: ?>
-
-			<div id="message" class="info">
-				<p><?php _e( 'This group has no members.', 'buddypress' ); ?></p>
-			</div>
-
-		<?php endif; ?>
-
 	</div>
 
 	<?php do_action( 'bp_after_group_manage_members_admin' ); ?>
Index: bp-templates/bp-legacy/js/buddypress.js
===================================================================
--- bp-templates/bp-legacy/js/buddypress.js	(revision 7377)
+++ bp-templates/bp-legacy/js/buddypress.js	(working copy)
@@ -17,7 +17,7 @@
 	bp_init_activity();
 
 	/* Object filter and scope set. */
-	var objects = [ 'members', 'groups', 'blogs', 'forums' ];
+	var objects = [ 'members', 'groups', 'blogs', 'forums', 'groupmembers' ];
 	bp_init_objects( objects );
 
 	/* @mention Compose Scrolling */
@@ -703,6 +703,7 @@
 
 			return false;
 		}
+
 	});
 
 	/* When the filter select box is changed re-query */
@@ -724,6 +725,9 @@
 		if ( 'friends' == object )
 			object = 'members';
 
+		if( jq(this).attr('id').indexOf( 'groupmembers' ) != -1 )
+			object = 'groupmembers';
+
 		bp_filter_request( object, filter, scope, 'div.' + object, search_terms, 1, jq.cookie('bp-' + object + '-extras') );
 
 		return false;
@@ -760,6 +764,9 @@
 			else
 				var page_number = Number( jq(target).html() );
 
+			if( target.parent().attr('id').indexOf( 'groupmembers' ) != -1 )
+				object = 'groupmembers';
+
 			bp_filter_request( object, jq.cookie('bp-' + object + '-filter'), jq.cookie('bp-' + object + '-scope'), 'div.' + object, search_terms, page_number, jq.cookie('bp-' + object + '-extras') );
 
 			return false;
Index: bp-groups/bp-groups-classes.php
===================================================================
--- bp-groups/bp-groups-classes.php	(revision 7377)
+++ bp-groups/bp-groups-classes.php	(working copy)
@@ -1046,7 +1046,7 @@
 
 		$bp  = buddypress();
 		$sql = array(
-			'select'  => "SELECT user_id FROM {$bp->groups->table_name_members}",
+			'select'  => "SELECT gm.user_id FROM {$bp->groups->table_name_members} gm",
 			'where'   => array(),
 			'orderby' => '',
 			'order'   => '',
@@ -1056,11 +1056,11 @@
 		/** WHERE clauses *****************************************************/
 
 		// Group id
-		$sql['where'][] = $wpdb->prepare( "group_id = %d", $this->query_vars['group_id'] );
+		$sql['where'][] = $wpdb->prepare( "gm.group_id = %d", $this->query_vars['group_id'] );
 
 		// is_confirmed
 		$is_confirmed = ! empty( $this->query_vars['is_confirmed'] ) ? 1 : 0;
-		$sql['where'][] = $wpdb->prepare( "is_confirmed = %d", $is_confirmed );
+		$sql['where'][] = $wpdb->prepare( "gm.is_confirmed = %d", $is_confirmed );
 
 		// Role information is stored as follows: admins have
 		// is_admin = 1, mods have is_mod = 1, banned have is_banned =
@@ -1087,7 +1087,7 @@
 		if ( in_array( 'member', $roles ) ) {
 			$role_columns = array();
 			foreach ( array_diff( $allowed_roles, $roles ) as $excluded_role ) {
-				$role_columns[] = 'is_' . $excluded_role . ' = 0';
+				$role_columns[] = 'gm.is_' . $excluded_role . ' = 0';
 			}
 
 			if ( ! empty( $role_columns ) ) {
@@ -1099,7 +1099,7 @@
 		} else {
 			$role_columns = array();
 			foreach ( $roles as $role ) {
-				$role_columns[] = 'is_' . $role . ' = 1';
+				$role_columns[] = 'gm.is_' . $role . ' = 1';
 			}
 
 			if ( ! empty( $role_columns ) ) {
@@ -1111,6 +1111,65 @@
 			$sql['where'][] = $roles_sql;
 		}
 
+		$type = $this->query_vars_raw['type'];
+		$orderby = 'gm.date_modified';
+		$order   = 'DESC';
+
+		switch( $type ) {
+
+			case 'first_modified' :
+				$order   = 'ASC';
+				break;
+
+			case 'alphabetical' :
+
+				if ( ! bp_disable_profile_sync() || ! bp_is_active( 'xprofile' ) ) {
+					$sql['select']  .= " LEFT JOIN {$wpdb->users} u ON( gm.user_id = u.ID )";
+					$orderby = "u.display_name";
+					$order   = "ASC";
+
+				// When profile sync is disabled, alphabetical sorts must happen against
+				// the xprofile table
+				} else {
+					$fullname_field_id = $wpdb->get_var( $wpdb->prepare( "SELECT id FROM {$bp->profile->table_name_fields} WHERE name = %s", bp_xprofile_fullname_field_name() ) );
+
+					$sql['select']  = " LEFT JOIN {$bp->profile->table_name_data} u ON( gm.user_id = u.user_id )";
+					$sql['where'][] = "u.field_id = {$fullname_field_id}";
+					$orderby = "u.value";
+					$order   = "ASC";
+				}
+				break;
+
+			case 'last_active' :
+
+				if( bp_is_active( 'activity') ) {
+						$group_member_last_activity = $wpdb->get_results( 
+						$wpdb->prepare( "SELECT user_id, MAX(date_recorded) last_active FROM {$bp->activity->table_name} WHERE component = %s AND item_id = %d GROUP BY user_id ORDER BY last_active DESC", 'groups', $this->query_vars['group_id'] )
+					);
+
+					foreach( $group_member_last_activity as $member_last )
+						$gm_ids[] = $member_last->user_id;
+					
+					$gm_ids = array_merge( array( 'gm.user_id' ), $gm_ids );
+					
+					$orderby = "FIELD(" . implode( ',', $gm_ids ) . ")";
+					$order   = "";
+				}				
+				break;
+
+			case 'user_friends' :
+
+				if ( bp_is_active( 'friends' ) ) {
+					$friends = friends_get_friend_user_ids( bp_loggedin_user_id() );
+					if ( !empty( $friends ) )
+						$sql['where'][] = "gm.user_id IN(". implode(',', $friends ) .")";
+					else
+						$sql['where'][] = "gm.user_id IN(0)";
+				}
+					
+				break;
+		}
+
 		$sql['where'] = ! empty( $sql['where'] ) ? 'WHERE ' . implode( ' AND ', $sql['where'] ) : '';
 
 		/** ORDER BY clause ***************************************************/
@@ -1118,9 +1177,10 @@
 		// @todo For now, mimicking legacy behavior of
 		// bp_group_has_members(), which has us order by date_modified
 		// only. Should abstract it in the future
-		$sql['orderby'] = "ORDER BY date_modified";
-		$sql['order']   = "DESC";
 
+		$sql['orderby'] = "ORDER BY {$orderby}";
+		$sql['order']   = $order;
+
 		/** LIMIT clause ******************************************************/
 		$this->group_member_ids = $wpdb->get_col( "{$sql['select']} {$sql['where']} {$sql['orderby']} {$sql['order']} {$sql['limit']}" );
 
Index: bp-groups/bp-groups-functions.php
===================================================================
--- bp-groups/bp-groups-functions.php	(revision 7377)
+++ bp-groups/bp-groups-functions.php	(working copy)
@@ -391,7 +391,7 @@
  * @param array|string $exclude Array or comma-sep list of users to exclude
  * @return array Multi-d array of 'members' list and 'count'
  */
-function groups_get_group_members( $group_id, $limit = false, $page = false, $exclude_admins_mods = true, $exclude_banned = true, $exclude = false, $group_role = false ) {
+function groups_get_group_members( $group_id, $limit = false, $page = false, $exclude_admins_mods = true, $exclude_banned = true, $exclude = false, $group_role = false, $type = false ) {
 
 	// For legacy users. Use of BP_Groups_Member::get_all_for_group()
 	// is deprecated. func_get_args() can't be passed to a function in PHP
@@ -416,6 +416,9 @@
 			}
 		}
 
+		if( empty( $type ) )
+			$type = 'last_modified';
+
 		// Perform the group member query (extends BP_User_Query)
 		$members = new BP_Group_Member_Query( array(
 			'group_id'       => $group_id,
@@ -423,7 +426,7 @@
 			'page'           => $page,
 			'group_role'     => $group_role,
 			'exclude'        => $exclude,
-			'type'           => 'last_modified',
+			'type'           => $type,
 		) );
 
 		// Structure the return value as expected by the template functions
Index: bp-groups/bp-groups-template.php
===================================================================
--- bp-groups/bp-groups-template.php	(revision 7377)
+++ bp-groups/bp-groups-template.php	(working copy)
@@ -1345,9 +1345,15 @@
 	function bp_get_group_member_promote_mod_link( $args = '' ) {
 		global $members_template, $groups_template;
 
+		if ( !empty( $groups_template ) )
+			$group =& $groups_template->group;
+
+		else
+			$group = groups_get_current_group();
+
 		$defaults = array(
 			'user_id' => $members_template->member->user_id,
-			'group'   => &$groups_template->group
+			'group'   => $group
 		);
 
 		$r = wp_parse_args( $args, $defaults );
@@ -1362,9 +1368,15 @@
 	function bp_get_group_member_promote_admin_link( $args = '' ) {
 		global $members_template, $groups_template;
 
+		if ( !empty( $groups_template ) )
+			$group =& $groups_template->group;
+
+		else
+			$group = groups_get_current_group();
+
 		$defaults = array(
 			'user_id' => !empty( $members_template->member->user_id ) ? $members_template->member->user_id : false,
-			'group'   => &$groups_template->group
+			'group'   => $group
 		);
 
 		$r = wp_parse_args( $args, $defaults );
@@ -1384,9 +1396,12 @@
 	function bp_get_group_member_demote_link( $user_id = 0, $group = false ) {
 		global $members_template, $groups_template;
 
-		if ( empty( $group ) )
+		if ( empty( $group ) && !empty( $groups_template ) )
 			$group =& $groups_template->group;
 
+		else
+			$group = groups_get_current_group();
+
 		if ( !$user_id )
 			$user_id = $members_template->member->user_id;
 
@@ -1404,9 +1419,12 @@
 	function bp_get_group_member_ban_link( $user_id = 0, $group = false ) {
 		global $groups_template;
 
-		if ( empty( $group ) )
+		if ( empty( $group ) && !empty( $groups_template ) )
 			$group =& $groups_template->group;
 
+		else
+			$group = groups_get_current_group();
+
 		return apply_filters( 'bp_get_group_member_ban_link', wp_nonce_url( bp_get_group_permalink( $group ) . 'admin/manage-members/ban/' . $user_id, 'groups_ban_member' ) );
 	}
 
@@ -1424,9 +1442,12 @@
 		if ( !$user_id )
 			$user_id = $members_template->member->user_id;
 
-		if ( empty( $group ) )
+		if ( empty( $group ) && !empty( $groups_template ) )
 			$group =& $groups_template->group;
 
+		else
+			$group = groups_get_current_group();
+
 		return apply_filters( 'bp_get_group_member_unban_link', wp_nonce_url( bp_get_group_permalink( $group ) . 'admin/manage-members/unban/' . $user_id, 'groups_unban_member' ) );
 	}
 
@@ -1442,9 +1463,12 @@
 	function bp_get_group_member_remove_link( $user_id = 0, $group = false ) {
 		global $groups_template;
 
-		if ( empty( $group ) )
+		if ( empty( $group ) && !empty( $groups_template ) )
 			$group =& $groups_template->group;
 
+		else
+			$group = groups_get_current_group();
+
 		return apply_filters( 'bp_get_group_member_remove_link', wp_nonce_url( bp_get_group_permalink( $group ) . 'admin/manage-members/remove/' . $user_id, 'groups_remove_member' ) );
 	}
 
@@ -1897,11 +1921,11 @@
 	var $pag_links;
 	var $total_group_count;
 
-	function __construct( $group_id, $per_page, $max, $exclude_admins_mods, $exclude_banned, $exclude, $group_role = false ) {
+	function __construct( $group_id, $per_page, $max, $exclude_admins_mods, $exclude_banned, $exclude, $group_role = false, $type = false ) {
 
 		$this->pag_page = isset( $_REQUEST['mlpage'] ) ? intval( $_REQUEST['mlpage'] ) : 1;
 		$this->pag_num  = isset( $_REQUEST['num'] ) ? intval( $_REQUEST['num'] ) : $per_page;
-		$this->members  = groups_get_group_members( $group_id, $this->pag_num, $this->pag_page, $exclude_admins_mods, $exclude_banned, $exclude, $group_role );
+		$this->members  = groups_get_group_members( $group_id, $this->pag_num, $this->pag_page, $exclude_admins_mods, $exclude_banned, $exclude, $group_role, $type );
 
 		if ( !$max || $max >= (int) $this->members['count'] )
 			$this->total_member_count = (int) $this->members['count'];
@@ -1985,9 +2009,10 @@
 		'exclude_admins_mods' => 1,
 		'exclude_banned' => 1,
 		'group_role' => false,
+		'type' => false,
 	) );
 
-	$members_template = new BP_Groups_Group_Members_Template( $r['group_id'], $r['per_page'], $r['max'], (int) $r['exclude_admins_mods'], (int) $r['exclude_banned'], $r['exclude'], $r['group_role'] );
+	$members_template = new BP_Groups_Group_Members_Template( $r['group_id'], $r['per_page'], $r['max'], (int) $r['exclude_admins_mods'], (int) $r['exclude_banned'], $r['exclude'], $r['group_role'], $r['type'] );
 	return apply_filters( 'bp_group_has_members', $members_template->has_members(), $members_template );
 }
 
@@ -2163,7 +2188,39 @@
 		return $members_template->pag_links;
 	}
 
+/** group members filters **/
 
+function bp_group_members_filter() {
+	?>
+	<li id="groupmembers-order-select" class="last filter">
+		<label for="groupmembers-order-by"><?php _e( 'Filter By:', 'buddypress' ); ?></label>
+		<select id="groupmembers-order-by">
+			<option value="last_modified"><?php _e( 'Newest', 'buddypress' ); ?></option>
+			<option value="first_modified"><?php _e( 'Oldest', 'buddypress' ); ?></option>
+			<option value="alphabetical"><?php _e( 'Alphabetical', 'buddypress' ); ?></option>
+
+			<?php if ( bp_is_active( 'activity' ) ) : ?>
+				<option value="last_active"><?php _e( 'Active', 'buddypress' ); ?></option>
+			<?php endif; ?>
+
+			<?php if ( bp_is_active( 'friends' ) ) : ?>
+				<option value="user_friends"><?php _e( 'Friends', 'buddypress' ); ?></option>
+			<?php endif; ?>
+
+			<?php do_action( 'bp_group_members_order_options' ); ?>
+		</select>
+	</li>
+	<?php
+}
+
+function bp_group_members_admin_filter( $current_tab = '', $group_slug = '' ) {
+	if ( bp_is_group_admin_screen( 'manage-members' ) )
+		bp_group_members_filter();
+}
+
+add_action( 'groups_admin_tabs', 'bp_group_members_admin_filter', 10, 2 );
+
+
 /***************************************************************************
  * Group Creation Process Template Tags
  **/
