diff --git bp-groups/bp-groups-classes.php bp-groups/bp-groups-classes.php
index de81785..a64d52d 100644
--- bp-groups/bp-groups-classes.php
+++ bp-groups/bp-groups-classes.php
@@ -1446,9 +1446,10 @@ class BP_Group_Member_Query extends BP_User_Query {
 			'group_id'     => 0,
 			'group_role'   => array( 'member' ),
 			'is_confirmed' => true,
+			'type'         => 'last_modified'
 		) );
 
-		$group_member_ids = $this->get_group_member_ids();
+		$group_member_ids = $this->get_group_member_ids( $this->query_vars['type'] );
 
 		// If the group member query returned no users, bail with an
 		// array that will guarantee no matches for BP_User_Query
@@ -1470,9 +1471,12 @@ class BP_Group_Member_Query extends BP_User_Query {
 	 *
 	 * @return array $ids User IDs of relevant group member ids.
 	 */
-	protected function get_group_member_ids() {
+	protected function get_group_member_ids( $type = '' ) {
 		global $wpdb;
 
+		if ( empty( $type ) )
+			$type = 'last_modified';
+
 		if ( is_array( $this->group_member_ids ) ) {
 			return $this->group_member_ids;
 		}
@@ -1547,17 +1551,27 @@ class BP_Group_Member_Query extends BP_User_Query {
 		$sql['where'] = ! empty( $sql['where'] ) ? 'WHERE ' . implode( ' AND ', $sql['where'] ) : '';
 
 		/** ORDER BY clause ***************************************************/
-
-		// @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
+		/**
+		 * The order for alphabetical type will be set in BP_Group_Member_Query->set_order_by()
+		 * In group members tables, date_modified is the 'sortable' field available
+		 * The 2 types left: last_modified and first_modified are managed here
+		 */ 
 		$sql['orderby'] = "ORDER BY date_modified";
 		$sql['order']   = "DESC";
 
+		if ( 'first_modified' == $type ) {
+			$sql['order']   = "ASC";
+		}
+
 		/** LIMIT clause ******************************************************/
 		$this->group_member_ids = $wpdb->get_col( "{$sql['select']} {$sql['where']} {$sql['orderby']} {$sql['order']} {$sql['limit']}" );
 
-		return $this->group_member_ids;
+		/**
+		 * You can filter the group member ids from here to build your custom query
+		 * if you defined a custom type using the action 'bp_groups_members_order_options'
+		 * for instance
+		 */
+		return apply_filters( 'bp_group_member_query_group_member_ids', $this->group_member_ids, $type, $this->query_vars['group_id'] );
 	}
 
 	/**
@@ -1569,16 +1583,21 @@ class BP_Group_Member_Query extends BP_User_Query {
 	 * @param BP_User_Query $query BP_User_Query object.
 	 */
 	public function set_orderby( $query ) {
-		$gm_ids = $this->get_group_member_ids();
+
+		$gm_ids = $this->get_group_member_ids( $query->query_vars['type'] );
+
 		if ( empty( $gm_ids ) ) {
 			$gm_ids = array( 0 );
 		}
 
-		// The first param in the FIELD() clause is the sort column id
-		$gm_ids = array_merge( array( 'u.id' ), wp_parse_id_list( $gm_ids ) );
-		$gm_ids_sql = implode( ',', $gm_ids );
+		// No need to change the order of BP_User_Query in case type is alphabetical
+		if ( 'alphabetical' != $query->query_vars['type'] ) {
+			// The first param in the FIELD() clause is the sort column id
+			$gm_ids = array_merge( array( 'u.id' ), wp_parse_id_list( $gm_ids ) );
+			$gm_ids_sql = implode( ',', $gm_ids );
 
-		$query->uid_clauses['orderby'] = "ORDER BY FIELD(" . $gm_ids_sql . ")";
+			$query->uid_clauses['orderby'] = "ORDER BY FIELD(" . $gm_ids_sql . ")";
+		}
 
 		// Prevent this filter from running on future BP_User_Query
 		// instances on the same page
diff --git bp-groups/bp-groups-functions.php bp-groups/bp-groups-functions.php
index a356e1d..0f78bd2 100644
--- bp-groups/bp-groups-functions.php
+++ bp-groups/bp-groups-functions.php
@@ -373,7 +373,7 @@ function groups_get_group_mods( $group_id ) {
  * @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, $search_terms = 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
@@ -398,6 +398,9 @@ function groups_get_group_members( $group_id, $limit = false, $page = false, $ex
 			}
 		}
 
+		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,
@@ -405,7 +408,8 @@ function groups_get_group_members( $group_id, $limit = false, $page = false, $ex
 			'page'           => $page,
 			'group_role'     => $group_role,
 			'exclude'        => $exclude,
-			'type'           => 'last_modified',
+			'type'           => $type,
+			'search_terms'   => $search_terms,
 		) );
 
 		// Structure the return value as expected by the template functions
diff --git bp-groups/bp-groups-template.php bp-groups/bp-groups-template.php
index 512724f..1dfa0dd 100644
--- bp-groups/bp-groups-template.php
+++ bp-groups/bp-groups-template.php
@@ -1914,11 +1914,11 @@ class BP_Groups_Group_Members_Template {
 	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, $page_number, $per_page, $max, $exclude_admins_mods, $exclude_banned, $exclude, $group_role = false, $type, $search_terms ) {
 
-		$this->pag_page = isset( $_REQUEST['mlpage'] ) ? intval( $_REQUEST['mlpage'] ) : 1;
+		$this->pag_page = isset( $_REQUEST['mlpage'] ) ? intval( $_REQUEST['mlpage'] ) : (int) $page_number;
 		$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, $search_terms );
 
 		if ( !$max || $max >= (int) $this->members['count'] )
 			$this->total_member_count = (int) $this->members['count'];
@@ -1995,16 +1995,22 @@ function bp_group_has_members( $args = '' ) {
 	global $members_template;
 
 	$r = wp_parse_args( $args, array(
-		'group_id' => bp_get_current_group_id(),
-		'per_page' => 20,
-		'max' => false,
-		'exclude' => false,
+		'group_id'            => bp_get_current_group_id(),
+		'page'                => 1,
+		'per_page'            => 20,
+		'max'                 => false,
+		'exclude'             => false,
 		'exclude_admins_mods' => 1,
-		'exclude_banned' => 1,
-		'group_role' => false,
+		'exclude_banned'      => 1,
+		'group_role'          => false,
+		'type'                => 'last_modified',
+		'search_terms'        => 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'] );
+	if ( empty( $r['search_terms'] ) && ! empty( $_REQUEST['s'] ) )
+		$r['search_terms'] = $_REQUEST['s'];
+
+	$members_template = new BP_Groups_Group_Members_Template( $r['group_id'], $r['page'], $r['per_page'], $r['max'], (int) $r['exclude_admins_mods'], (int) $r['exclude_banned'], $r['exclude'], $r['group_role'], $r['type'], $r['search_terms'] );
 	return apply_filters( 'bp_group_has_members', $members_template->has_members(), $members_template );
 }
 
@@ -2180,6 +2186,57 @@ function bp_group_member_admin_pagination() {
 		return $members_template->pag_links;
 	}
 
+/**
+ * Output the Group members template
+ * 
+ * @since BuddyPress (?)
+ * 
+ * @return string html output
+ */
+function bp_groups_members_template_part() {
+	?>
+	<div class="item-list-tabs" id="subnav" role="navigation">
+		<ul>
+			<li class="groups-members-search" role="search">
+				<?php bp_directory_members_search_form(); ?>
+			</li>
+
+			<?php bp_groups_members_filter(); ?>
+			<?php do_action( 'bp_members_directory_member_sub_types' ); ?>
+
+		</ul>
+	</div>
+
+	<div id="members-group-list" class="group_members dir-list">
+
+		<?php bp_get_template_part( 'groups/single/members' ); ?>
+
+	</div>
+	<?php
+}
+
+/**
+ * Output the Group members filters
+ * 
+ * @since BuddyPress (?)
+ * 
+ * @return string html output
+ */
+function bp_groups_members_filter() { 
+	?>
+	<li id="group_members-order-select" class="last filter">
+		<label for="group_members-order-by"><?php _e( 'Order By:', 'buddypress' ); ?></label>
+		<select id="group_members-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 do_action( 'bp_groups_members_order_options' ); ?>
+
+		</select>
+	</li>
+	<?php 
+}
 
 /***************************************************************************
  * Group Creation Process Template Tags
diff --git bp-templates/bp-legacy/buddypress-functions.php bp-templates/bp-legacy/buddypress-functions.php
index 0cb3153..eeddc24 100644
--- bp-templates/bp-legacy/buddypress-functions.php
+++ bp-templates/bp-legacy/buddypress-functions.php
@@ -448,6 +448,12 @@ function bp_legacy_theme_ajax_querystring( $query_string, $object ) {
 
 	$qs = array();
 
+	/* Single Group Members specific case */
+	if ( bp_is_group_members() ) {
+		$object = 'group_members';
+		$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.
@@ -541,8 +547,13 @@ function bp_legacy_theme_object_template_loader() {
 	if ( ! bp_current_action() )
 		bp_update_is_directory( true, bp_current_component() );
 
+	$template_part = $object . '/' . $object . '-loop';
+	
+	if ( ! empty( $_POST['template'] ) )
+		$template_part = sanitize_option( 'upload_path', $_POST['template'] );
+
 	// Locate the object template
-	bp_get_template_part( "$object/$object-loop" );
+	bp_get_template_part( $template_part );
 	exit();
 }
 
diff --git bp-templates/bp-legacy/buddypress/groups/single/home.php bp-templates/bp-legacy/buddypress/groups/single/home.php
index 55dd5b0..8499866 100644
--- bp-templates/bp-legacy/buddypress/groups/single/home.php
+++ bp-templates/bp-legacy/buddypress/groups/single/home.php
@@ -47,7 +47,7 @@
 				elseif ( bp_is_active( 'activity' ) ) : bp_get_template_part( 'groups/single/activity' );
 
 				// Otherwise show members
-				elseif ( bp_is_active( 'members'  ) ) : bp_get_template_part( 'groups/single/members'  );
+				elseif ( bp_is_active( 'members'  ) ) : bp_groups_members_template_part();
 
 				endif;
 				
@@ -61,7 +61,7 @@
 				elseif ( bp_is_group_activity()   ) : bp_get_template_part( 'groups/single/activity'     );
 
 				// Group Members
-				elseif ( bp_is_group_members()    ) : bp_get_template_part( 'groups/single/members'      );
+				elseif ( bp_is_group_members()    ) : bp_groups_members_template_part();
 
 				// Group Invitations
 				elseif ( bp_is_group_invites()    ) : bp_get_template_part( 'groups/single/send-invites' );
diff --git bp-templates/bp-legacy/buddypress/groups/single/members.php bp-templates/bp-legacy/buddypress/groups/single/members.php
index fb7b4e2..f1714a5 100644
--- bp-templates/bp-legacy/buddypress/groups/single/members.php
+++ bp-templates/bp-legacy/buddypress/groups/single/members.php
@@ -1,16 +1,8 @@
-<?php if ( bp_group_has_members( 'exclude_admins_mods=0' ) ) : ?>
+<?php if ( bp_group_has_members( bp_ajax_querystring( 'group_members' ) ) ) : ?>
 
 	<?php do_action( 'bp_before_group_members_content' ); ?>
 
-	<div class="item-list-tabs" id="subnav" role="navigation">
-		<ul>
-
-			<?php do_action( 'bp_members_directory_member_sub_types' ); ?>
-
-		</ul>
-	</div>
-
-	<div id="pag-top" class="pagination no-ajax">
+	<div id="pag-top" class="pagination">
 
 		<div class="pag-count" id="member-count-top">
 
@@ -63,7 +55,7 @@
 
 	<?php do_action( 'bp_after_group_members_list' ); ?>
 
-	<div id="pag-bottom" class="pagination no-ajax">
+	<div id="pag-bottom" class="pagination">
 
 		<div class="pag-count" id="member-count-bottom">
 
diff --git bp-templates/bp-legacy/css/buddypress.css bp-templates/bp-legacy/css/buddypress.css
index 81dd03f..995d650 100644
--- bp-templates/bp-legacy/css/buddypress.css
+++ bp-templates/bp-legacy/css/buddypress.css
@@ -486,7 +486,8 @@ body.activity-permalink #buddypress div.activity-comments div.acomment-content {
 	float: right;
 	margin: -39px 0 0 0;
 }
-#buddypress div.dir-search input[type=text] {
+#buddypress div.dir-search input[type=text],
+#buddypress li.groups-members-search input[type=text] {
 	font-size: 90%;
 	padding: 1px 3px;
 }
@@ -581,7 +582,9 @@ body.activity-permalink #buddypress div.activity-comments div.acomment-content {
 #buddypress .standard-form select,
 #buddypress .standard-form input[type=password],
 #buddypress .dir-search input[type=search],
-#buddypress .dir-search input[type=text] {
+#buddypress .dir-search input[type=text],
+#buddypress .groups-members-search input[type=search],
+#buddypress .groups-members-search input[type=text] {
 	border: 1px solid #ccc;
 	background: #fafafa;
 	border-radius: 0;
diff --git bp-templates/bp-legacy/js/buddypress.js bp-templates/bp-legacy/js/buddypress.js
index 350193e..562c734 100644
--- bp-templates/bp-legacy/js/buddypress.js
+++ bp-templates/bp-legacy/js/buddypress.js
@@ -17,7 +17,7 @@ jq(document).ready( function() {
 	bp_init_activity();
 
 	/* Object filter and scope set. */
-	var objects = [ 'members', 'groups', 'blogs', 'forums' ];
+	var objects = [ 'members', 'groups', 'blogs', 'forums', 'group_members' ];
 	bp_init_objects( objects );
 
 	/* @mention Compose Scrolling */
@@ -663,7 +663,7 @@ jq(document).ready( function() {
 	/**** Directory Search ****************************************************/
 
 	/* The search form on all directory pages */
-	jq('.dir-search').on( 'click', function(event) {
+	jq('.dir-search, .groups-members-search').on( 'click', function(event) {
 		if ( jq(this).hasClass('no-ajax') )
 			return;
 
@@ -673,7 +673,14 @@ jq(document).ready( function() {
 			var css_id = jq('.item-list-tabs li.selected').attr('id').split( '-' );
 			var object = css_id[0];
 
-			bp_filter_request( object, jq.cookie('bp-' + object + '-filter'), jq.cookie('bp-' + object + '-scope') , 'div.' + object, target.parent().children('label').children('input').val(), 1, jq.cookie('bp-' + object + '-extras') );
+			if ( 'members' == object && 'groups' == css_id[1] ) {
+				object = 'group_members';
+				var template = 'groups/single/members';
+			} else {
+				var template = null;
+			}
+
+			bp_filter_request( object, jq.cookie('bp-' + object + '-filter'), jq.cookie('bp-' + object + '-scope') , 'div.' + object, target.parent().children('label').children('input').val(), 1, jq.cookie('bp-' + object + '-extras'), null, template );
 
 			return false;
 		}
@@ -721,10 +728,20 @@ jq(document).ready( function() {
 		if ( jq('.dir-search input').length )
 			search_terms = jq('.dir-search input').val();
 
+		if ( jq( '.groups-members-search input' ).length )
+			search_terms = jq( '.groups-members-search input' ).val();
+
+		if ( 'members' == object && 'groups' == scope ) {
+			object = 'group_members';
+			var template = 'groups/single/members';
+		} else {
+			var template = null;
+		}
+
 		if ( 'friends' == object )
 			object = 'members';
 
-		bp_filter_request( object, filter, scope, 'div.' + object, search_terms, 1, jq.cookie('bp-' + object + '-extras') );
+		bp_filter_request( object, filter, scope, 'div.' + object, search_terms, 1, jq.cookie('bp-' + object + '-extras'), null, template );
 
 		return false;
 	});
@@ -754,6 +771,16 @@ jq(document).ready( function() {
 			if ( jq('div.dir-search input').length )
 				search_terms = jq('.dir-search input').val();
 
+			if ( jq( '.groups-members-search input' ).length )
+				search_terms = jq( '.groups-members-search input' ).val();
+
+			if ( 'members' == object && 'groups' == css_id[1] ) {
+				var object = 'group_members';
+				var template = 'groups/single/members';
+			} else {
+				var template = null;
+			}
+
 			if ( jq(target).hasClass('next') )
 				var page_number = Number( jq('.pagination span.current').html() ) + 1;
 			else if ( jq(target).hasClass('prev') )
@@ -767,7 +794,7 @@ jq(document).ready( function() {
 				var caller = null;
 			}
 
-			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'), caller );
+			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'), caller, template );
 
 			return false;
 		}
@@ -966,7 +993,7 @@ jq(document).ready( function() {
 	});
 
 	/* Add / Remove friendship buttons */
-	jq('#members-dir-list').on('click', '.friendship-button a', function() {
+	jq( '#members-dir-list, #members-group-list' ).on('click', '.friendship-button a', function() {
 		jq(this).parent().addClass('loading');
 		var fid = jq(this).attr('id');
 		fid = fid.split('-');
@@ -1383,7 +1410,7 @@ function bp_init_objects(objects) {
 }
 
 /* Filter the current content list (groups/members/blogs/topics) */
-function bp_filter_request( object, filter, scope, target, search_terms, page, extras, caller ) {
+function bp_filter_request( object, filter, scope, target, search_terms, page, extras, caller, template ) {
 	if ( 'activity' == object )
 		return false;
 
@@ -1412,8 +1439,9 @@ function bp_filter_request( object, filter, scope, target, search_terms, page, e
 	jq('.item-list-tabs li.selected').addClass('loading');
 	jq('.item-list-tabs select option[value="' + filter + '"]').prop( 'selected', true );
 
-	if ( 'friends' == object )
+	if ( 'friends' == object || 'group_members' == object ) {
 		object = 'members';
+	}
 
 	if ( bp_ajax_request )
 		bp_ajax_request.abort();
@@ -1426,7 +1454,8 @@ function bp_filter_request( object, filter, scope, target, search_terms, page, e
 		'search_terms': search_terms,
 		'scope': scope,
 		'page': page,
-		'extras': extras
+		'extras': extras,
+		'template':template
 	},
 	function(response)
 	{
