diff --git bp-groups/bp-groups-classes.php bp-groups/bp-groups-classes.php
index 2ed7441..bed0eb7 100644
--- bp-groups/bp-groups-classes.php
+++ bp-groups/bp-groups-classes.php
@@ -1460,6 +1460,7 @@ 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();
@@ -1562,16 +1563,36 @@ class BP_Group_Member_Query extends BP_User_Query {
 
 		/** 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_orderby() In the group members
+		 * table, date_modified is the 'sortable' field available.
+		 * The two remaining types, last_modified and first_modified,
+		 * are managed here.
+		 */
+
+		if ( isset( $this->query_vars['type'] ) ) {
+			$type = $this->query_vars['type'];
+		} else {
+			$type = 'last_modified';
+		}
+
 		$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'] );
 	}
 
 	/**
@@ -1583,16 +1604,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 a27a499..9642849 100644
--- bp-groups/bp-groups-functions.php
+++ bp-groups/bp-groups-functions.php
@@ -422,6 +422,7 @@ function groups_get_group_members( $args = array() ) {
 		'exclude'             => false,
 		'group_role'          => array(),
 		'search_terms'        => false,
+		'type'                => 'last_modified'
 	) );
 
 	// For legacy users. Use of BP_Groups_Member::get_all_for_group()
@@ -455,7 +456,7 @@ function groups_get_group_members( $args = array() ) {
 			'group_role'     => $r['group_role'],
 			'exclude'        => $r['exclude'],
 			'search_terms'   => $r['search_terms'],
-			'type'           => 'last_modified',
+			'type'           => $r['type'],
 		) );
 
 		// 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 675409e..44fe89b 100644
--- bp-groups/bp-groups-template.php
+++ bp-groups/bp-groups-template.php
@@ -1982,6 +1982,7 @@ class BP_Groups_Group_Members_Template {
 			'exclude_banned'      => 1,
 			'group_role'          => false,
 			'search_terms'        => false,
+			'type'                => 'last_modified',
 		) );
 
 		// @todo No
@@ -1990,6 +1991,17 @@ class BP_Groups_Group_Members_Template {
 		$this->pag_page = isset( $_REQUEST['mlpage'] ) ? intval( $_REQUEST['mlpage'] ) : $r['page'];
 		$this->pag_num  = isset( $_REQUEST['num'] ) ? intval( $_REQUEST['num'] ) : $per_page;
 
+		/**
+		 * In themes, If 'groups/single/home' template has been updated 
+		 * but not 'groups/single/members', it prevents the pagination 
+		 * url to be messed up with admin-ajax.
+		 */
+		$base_url = trailingslashit( bp_get_group_permalink( groups_get_current_group() ) . bp_current_action() );
+
+		if ( bp_action_variable() ) {
+			$base_url = trailingslashit( $base_url . bp_action_variable() );
+		}
+
 		$members_args = $r;
 
 		$members_args['page']     = $this->pag_page;
@@ -2014,7 +2026,7 @@ class BP_Groups_Group_Members_Template {
 		}
 
 		$this->pag_links = paginate_links( array(
-			'base' => add_query_arg( 'mlpage', '%#%' ),
+			'base' => add_query_arg( array( 'mlpage' => '%#%' ), $base_url ),
 			'format' => '',
 			'total' => !empty( $this->pag_num ) ? ceil( $this->total_member_count / $this->pag_num ) : $this->total_member_count,
 			'current' => $this->pag_page,
@@ -2091,16 +2103,23 @@ class BP_Groups_Group_Members_Template {
 function bp_group_has_members( $args = '' ) {
 	global $members_template;
 
+	$exclude_admins_mods = 1;
+
+	if ( bp_is_group_members() ) {
+		$exclude_admins_mods = 0;
+	}
+
 	$r = wp_parse_args( $args, array(
 		'group_id'            => bp_get_current_group_id(),
 		'page'                => 1,
 		'per_page'            => 20,
 		'max'                 => false,
 		'exclude'             => false,
-		'exclude_admins_mods' => 1,
+		'exclude_admins_mods' => $exclude_admins_mods,
 		'exclude_banned'      => 1,
 		'group_role'          => false,
 		'search_terms'        => false,
+		'type'                => 'last_modified',
 	) );
 
 	if ( empty( $r['search_terms'] ) && ! empty( $_REQUEST['s'] ) )
@@ -2282,6 +2301,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..658ab62 100644
--- bp-templates/bp-legacy/buddypress-functions.php
+++ bp-templates/bp-legacy/buddypress-functions.php
@@ -541,8 +541,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)
 	{
