diff --git bp-groups/bp-groups-classes.php bp-groups/bp-groups-classes.php
index 6744aba..121d21a 100644
--- bp-groups/bp-groups-classes.php
+++ bp-groups/bp-groups-classes.php
@@ -332,7 +332,7 @@ class BP_Groups_Group {
 		}
 
 		$defaults = array(
-			'type'            => 'newest',
+			'type'            => null,
 			'per_page'        => null,
 			'page'            => null,
 			'user_id'         => 0,
@@ -341,7 +341,9 @@ class BP_Groups_Group {
 			'include'         => false,
 			'populate_extras' => true,
 			'exclude'         => false,
-			'show_hidden'     => false
+			'show_hidden'     => false,
+			'orderby'         => 'date_created',
+			'order'           => 'DESC',
 		);
 
 		$r = wp_parse_args( $args, $defaults );
@@ -400,23 +402,37 @@ class BP_Groups_Group {
 			$sql['exclude'] = " AND g.id NOT IN ({$exclude})";
 		}
 
-		switch ( $r['type'] ) {
-			case 'newest':
-			default:
-				$sql['order'] = " ORDER BY g.date_created DESC";
-				break;
-			case 'active':
-				$sql[] = "ORDER BY last_activity DESC";
-				break;
-			case 'popular':
-				$sql[] = "ORDER BY CONVERT(gm1.meta_value, SIGNED) DESC";
-				break;
-			case 'alphabetical':
-				$sql[] = "ORDER BY g.name ASC";
-				break;
-			case 'random':
-				$sql[] = "ORDER BY rand()";
-				break;
+		/** Order/orderby ********************************************/
+
+		$order   = $r['order'];
+		$orderby = $r['orderby'];
+
+		// If a 'type' parameter was passed, parse it and overwrite
+		// 'order' and 'orderby' params passed to the function
+		if (  ! empty( $r['type'] ) ) {
+			$order_orderby = self::convert_type_to_order_orderby( $r['type'] );
+
+			// If an invalid type is passed, fall back on defaults
+			if ( ! empty( $order_orderby['order'] ) ) {
+				$order = $order_orderby['order'];
+			}
+
+			if ( ! empty( $order_orderby['orderby'] ) ) {
+				$orderby = $order_orderby['orderby'];
+			}
+		}
+
+		// Sanitize 'order'
+		$order = bp_esc_sql_order( $order );
+
+		// Convert 'orderby' into the proper ORDER BY term
+		$orderby = self::convert_orderby_to_order_by_term( $orderby );
+
+		// Random order is a special case
+		if ( 'rand()' === $orderby ) {
+			$sql[] = "ORDER BY rand()";
+		} else {
+			$sql[] = "ORDER BY {$orderby} {$order}";
 		}
 
 		if ( ! empty( $r['per_page'] ) && ! empty( $r['page'] ) ) {
@@ -497,13 +513,14 @@ class BP_Groups_Group {
 	 * WP_Query, we have to alter the return value (stripping the leading
 	 * AND keyword from the 'where' clause).
 	 *
-	 * @since 1.8
+	 * @since BuddyPress (1.8)
+	 * @access protected
 	 *
 	 * @param array $meta_query An array of meta_query filters. See the
 	 *   documentation for WP_Meta_Query for details.
 	 * @return array $sql_array 'join' and 'where' clauses
 	 */
-	public static function get_meta_query_sql( $meta_query = array() ) {
+	protected static function get_meta_query_sql( $meta_query = array() ) {
 		global $wpdb;
 
 		$sql_array = array(
@@ -539,6 +556,83 @@ class BP_Groups_Group {
 		return $sql_array;
 	}
 
+	/**
+	 * Convert the 'type' parameter to 'order' and 'orderby'
+	 *
+	 * @since BuddyPress (1.8)
+	 * @access protected
+	 * @param string $type The 'type' shorthand param
+	 * @return array 'order' and 'orderby'
+	 */
+	protected function convert_type_to_order_orderby( $type = '' ) {
+		$order = $orderby = '';
+
+		switch ( $type ) {
+			case 'newest' :
+				$order   = 'DESC';
+				$orderby = 'date_created';
+				break;
+
+			case 'active' :
+				$order   = 'DESC';
+				$orderby = 'last_activity';
+				break;
+
+			case 'popular' :
+				$order   = 'DESC';
+				$orderby = 'total_member_count';
+				break;
+
+			case 'alphabetical' :
+				$order   = 'ASC';
+				$orderby = 'name';
+				break;
+
+			case 'random' :
+				$order   = 'DESC';
+				$orderby = 'random';
+				break;
+		}
+
+		return array( 'order' => $order, 'orderby' => $orderby );
+	}
+
+	/**
+	 * Convert the 'orderby' param to get() into a proper SQL term/column
+	 *
+	 * @since BuddyPress (1.8)
+	 * @access protected
+	 * @param string $orderby
+	 * @return string $order_by_term
+	 */
+	protected function convert_orderby_to_order_by_term( $orderby ) {
+		$order_by_term = '';
+
+		switch ( $orderby ) {
+			case 'date_created' :
+			default :
+				$order_by_term = 'g.date_created';
+				break;
+
+			case 'last_activity' :
+				$order_by_term = 'last_activity';
+				break;
+
+			case 'total_group_members' :
+				$order_by_term = 'CONVERT(gm1.meta_value, SIGNED)';
+				break;
+
+			case 'name' :
+				$order_by_term = 'g.name';
+				break;
+
+			case 'random' :
+				$order_by_term = 'rand()';
+				break;
+		}
+
+		return $order_by_term;
+	}
 
 	function get_by_most_forum_topics( $limit = null, $page = null, $user_id = 0, $search_terms = false, $populate_extras = true, $exclude = false ) {
 		global $wpdb, $bp, $bbdb;
diff --git bp-groups/bp-groups-functions.php bp-groups/bp-groups-functions.php
index f56567a..d53502b 100644
--- bp-groups/bp-groups-functions.php
+++ bp-groups/bp-groups-functions.php
@@ -413,7 +413,7 @@ function groups_get_total_member_count( $group_id ) {
 function groups_get_groups( $args = '' ) {
 
 	$defaults = array(
-		'type'            => 'active', // active, newest, alphabetical, random, popular, most-forum-topics or most-forum-posts
+		'type'            => false, // 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)
@@ -423,6 +423,8 @@ function groups_get_groups( $args = '' ) {
 		'per_page'        => 20,       // The number of results to return per page
 		'page'            => 1,        // The page to return if limiting per page
 		'populate_extras' => true,     // Fetch meta such as is_banned and is_member
+		'order'           => 'DESC',   // 'ASC' or 'DESC'
+		'orderby'         => 'date_created' // date_created, last_activity, total_member_count, name, random
 	);
 
 	$r = wp_parse_args( $args, $defaults );
@@ -437,7 +439,9 @@ function groups_get_groups( $args = '' ) {
 		'show_hidden'     => $r['show_hidden'],
 		'per_page'        => $r['per_page'],
 		'page'            => $r['page'],
-		'populate_extras' => $r['populate_extras']
+		'populate_extras' => $r['populate_extras'],
+		'order'           => $r['order'],
+		'orderby'         => $r['orderby'],
 	) );
 
 	return apply_filters_ref_array( 'groups_get_groups', array( &$groups, &$r ) );
diff --git bp-groups/bp-groups-template.php bp-groups/bp-groups-template.php
index 9be763f..656d91b 100644
--- bp-groups/bp-groups-template.php
+++ bp-groups/bp-groups-template.php
@@ -166,6 +166,8 @@ class BP_Groups_Template {
 		} else {
 			$this->groups = groups_get_groups( array(
 				'type'            => $type,
+				'order'           => $order,
+				'orderby'         => $orderby,
 				'per_page'        => $this->pag_num,
 				'page'            => $this->pag_page,
 				'user_id'         => $user_id,
@@ -266,6 +268,18 @@ class BP_Groups_Template {
 	}
 }
 
+/**
+ * Start the Groups Template Loop
+ *
+ * See the $defaults definition below for a description of parameters.
+ *
+ * Note that the 'type' parameter overrides 'order' and 'orderby'. See
+ * BP_Groups_Group::get() for more details. To use 'order' and 'orderby'
+ * parameters, pass null for 'type'.
+ *
+ * @param array $args
+ * @return bool True if there are groups to display that match the params
+ */
 function bp_has_groups( $args = '' ) {
 	global $groups_template, $bp;
 
@@ -275,7 +289,7 @@ function bp_has_groups( $args = '' ) {
 	 * pass their parameters directly to the loop.
 	 */
 	$slug    = false;
-	$type    = 'active';
+	$type    = '';
 	$user_id = 0;
 	$order   = '';
 
@@ -284,6 +298,7 @@ function bp_has_groups( $args = '' ) {
 		$user_id = bp_displayed_user_id();
 
 	// Type
+	// @todo What is $order? At some point it was removed incompletely?
 	if ( bp_is_current_action( 'my-groups' ) ) {
 		if ( 'most-popular' == $order ) {
 			$type = 'popular';
@@ -298,7 +313,9 @@ function bp_has_groups( $args = '' ) {
 	}
 
 	$defaults = array(
-		'type'            => $type,
+		'type'            => $type, // 'type' is an override for 'order' and 'orderby'. See docblock.
+		'order'           => 'DESC',
+		'orderby'         => 'last_activity',
 		'page'            => 1,
 		'per_page'        => 20,
 		'max'             => false,
@@ -313,7 +330,7 @@ function bp_has_groups( $args = '' ) {
 		'include'         => false,    // Pass comma separated list or array of group ID's to return only these groups
 		'exclude'         => false,    // Pass comma separated list or array of group ID's to exclude these groups
 
-		'populate_extras' => true      // Get extra meta - is_member, is_banned
+		'populate_extras' => true,     // Get extra meta - is_member, is_banned
 	);
 
 	$r = wp_parse_args( $args, $defaults );
@@ -329,6 +346,8 @@ function bp_has_groups( $args = '' ) {
 
 	$groups_template = new BP_Groups_Template( array(
 		'type'            => $r['type'],
+		'order'           => $r['order'],
+		'orderby'         => $r['orderby'],
 		'page'            => (int) $r['page'],
 		'per_page'        => (int) $r['per_page'],
 		'max'             => (int) $r['max'],
diff --git tests/includes/factory.php tests/includes/factory.php
index baf5f47..98a6d19 100644
--- tests/includes/factory.php
+++ tests/includes/factory.php
@@ -73,7 +73,9 @@ class BP_UnitTest_Factory_For_Group extends WP_UnitTest_Factory_For_Thing {
 		$group_id = groups_create_group( $args );
 
 		groups_update_groupmeta( $group_id, 'total_member_count', 1 );
-		groups_update_groupmeta( $group_id, 'last_activity', bp_core_current_time() );
+
+		$last_activity = isset( $args['last_activity'] ) ? $args['last_activity'] : bp_core_current_time();
+		groups_update_groupmeta( $group_id, 'last_activity', $last_activity );
 
 		return $group_id;
 	}
diff --git tests/testcases/groups/class-bp-groups-group.php tests/testcases/groups/class-bp-groups-group.php
index 2893e1b..33dc20c 100644
--- tests/testcases/groups/class-bp-groups-group.php
+++ tests/testcases/groups/class-bp-groups-group.php
@@ -83,6 +83,9 @@ class BP_Tests_BP_Groups_Group_TestCases extends BP_UnitTestCase {
 		$this->assertEquals( $ids, array( $g1 ) );
 	}
 
+	/**
+	 * @group get
+	 */
 	public function test_get_empty_meta_query() {
 		$g1 = $this->factory->group->create();
 		$g2 = $this->factory->group->create();
@@ -113,6 +116,9 @@ class BP_Tests_BP_Groups_Group_TestCases extends BP_UnitTestCase {
 		$this->assertEquals( array( $g1 ), $found );
 	}
 
+	/**
+	 * @group get
+	 */
 	public function test_get_search_with_underscores() {
 		$g1 = $this->factory->group->create( array(
 			'name' => 'Cool Group',
@@ -165,6 +171,180 @@ class BP_Tests_BP_Groups_Group_TestCases extends BP_UnitTestCase {
 		$this->assertEquals( array( $g1 ), $found );
 	}
 
+	/**
+	 * BP 1.8 will change the default 'type' param in favor of default
+	 * 'order' and 'orderby'. This is to make sure that existing plugins
+	 * will work appropriately
+	 *
+	 * @group get
+	 */
+	public function test_get_with_default_type_value_should_be_newest() {
+		$g1 = $this->factory->group->create( array(
+			'name' => 'A Group',
+			'date_created' => bp_core_current_time(),
+		) );
+		$g2 = $this->factory->group->create( array(
+			'name' => 'D Group',
+			'date_created' => gmdate( 'Y-m-d H:i:s', time() - 100 ),
+		) );
+		$g3 = $this->factory->group->create( array(
+			'name' => 'B Group',
+			'date_created' => gmdate( 'Y-m-d H:i:s', time() - 100000 ),
+		) );
+		$g4 = $this->factory->group->create( array(
+			'name' => 'C Group',
+			'date_created' => gmdate( 'Y-m-d H:i:s', time() - 1000 ),
+		) );
+
+		$found = BP_Groups_Group::get();
+
+		$this->assertEquals( BP_Groups_Group::get( array( 'type' => 'newest' ) ), $found );
+	}
+
+	/**
+	 * @group get
+	 */
+	public function test_get_with_type_newest() {
+		$g1 = $this->factory->group->create( array(
+			'name' => 'A Group',
+			'date_created' => bp_core_current_time(),
+		) );
+		$g2 = $this->factory->group->create( array(
+			'name' => 'D Group',
+			'date_created' => gmdate( 'Y-m-d H:i:s', $time - 100 ),
+		) );
+		$g3 = $this->factory->group->create( array(
+			'name' => 'B Group',
+			'date_created' => gmdate( 'Y-m-d H:i:s', $time - 100000 ),
+		) );
+		$g4 = $this->factory->group->create( array(
+			'name' => 'C Group',
+			'date_created' => gmdate( 'Y-m-d H:i:s', $time - 1000 ),
+		) );
+
+		$groups = BP_Groups_Group::get( array( 'type' => 'newest' ) );
+		$found = wp_parse_id_list( wp_list_pluck( $groups['groups'], 'id' ) );
+		$this->assertEquals( array( $g1, $g2, $g4, $g3 ), $found );
+	}
+
+	/** convert_type_to_order_orderby() **********************************/
+
+	/**
+	 * @group convert_type_to_order_orderby
+	 */
+	public function test_convert_type_to_order_orderby_newest() {
+		$expected = array(
+			'order' => 'DESC',
+			'orderby' => 'date_created',
+		);
+		$this->assertEquals( $expected, _BP_Groups_Group::_convert_type_to_order_orderby( 'newest' ) );
+	}
+
+	/**
+	 * @group convert_type_to_order_orderby
+	 */
+	public function test_convert_type_to_order_orderby_active() {
+		$expected = array(
+			'order' => 'DESC',
+			'orderby' => 'last_activity',
+		);
+		$this->assertEquals( $expected, _BP_Groups_Group::_convert_type_to_order_orderby( 'active' ) );
+	}
+
+	/**
+	 * @group convert_type_to_order_orderby
+	 */
+	public function test_convert_type_to_order_orderby_popular() {
+		$expected = array(
+			'order' => 'DESC',
+			'orderby' => 'total_member_count',
+		);
+		$this->assertEquals( $expected, _BP_Groups_Group::_convert_type_to_order_orderby( 'popular' ) );
+	}
+
+	/**
+	 * @group convert_type_to_order_orderby
+	 */
+	public function test_convert_type_to_order_orderby_alphabetical() {
+		$expected = array(
+			'order' => 'ASC',
+			'orderby' => 'name',
+		);
+		$this->assertEquals( $expected, _BP_Groups_Group::_convert_type_to_order_orderby( 'alphabetical' ) );
+	}
+
+	/**
+	 * @group convert_type_to_order_orderby
+	 */
+	public function test_convert_type_to_order_orderby_random() {
+		$expected = array(
+			// order gets thrown out
+			'order' => 'DESC',
+			'orderby' => 'random',
+		);
+		$this->assertEquals( $expected, _BP_Groups_Group::_convert_type_to_order_orderby( 'random' ) );
+	}
+
+	/**
+	 * @group convert_type_to_order_orderby
+	 */
+	public function test_convert_type_to_order_orderby_invalid() {
+		$expected = array(
+			'order' => '',
+			'orderby' => '',
+		);
+		$this->assertEquals( $expected, _BP_Groups_Group::_convert_type_to_order_orderby( 'foooooooooooooooobar' ) );
+	}
+
+	/** convert_orderby_to_order_by_term() **********************************/
+
+	/**
+	 * @group convert_orderby_to_order_by_term
+	 */
+	public function test_convert_orderby_to_order_by_term_date_created() {
+		$this->assertEquals( 'g.date_created', _BP_Groups_Group::_convert_orderby_to_order_by_term( 'date_created' ) );
+	}
+
+	/**
+	 * @group convert_orderby_to_order_by_term
+	 */
+	public function test_convert_orderby_to_order_by_term_last_activity() {
+		$c = new _BP_Groups_Group();
+		$this->assertEquals( 'last_activity', _BP_Groups_Group::_convert_orderby_to_order_by_term( 'last_activity' ) );
+	}
+
+	/**
+	 * @group convert_orderby_to_order_by_term
+	 */
+	public function test_convert_orderby_to_order_by_term_total_group_members() {
+		$c = new _BP_Groups_Group();
+		$this->assertEquals( 'CONVERT(gm1.meta_value, SIGNED)', _BP_Groups_Group::_convert_orderby_to_order_by_term( 'total_group_members' ) );
+	}
+
+	/**
+	 * @group convert_orderby_to_order_by_term
+	 */
+	public function test_convert_orderby_to_order_by_term_name() {
+		$c = new _BP_Groups_Group();
+		$this->assertEquals( 'g.name', _BP_Groups_Group::_convert_orderby_to_order_by_term( 'name' ) );
+	}
+
+	/**
+	 * @group convert_orderby_to_order_by_term
+	 */
+	public function test_convert_orderby_to_order_by_term_random() {
+		$c = new _BP_Groups_Group();
+		$this->assertEquals( 'rand()', _BP_Groups_Group::_convert_orderby_to_order_by_term( 'random' ) );
+	}
+
+	/**
+	 * @group convert_orderby_to_order_by_term
+	 */
+	public function test_convert_orderby_to_order_by_term_invalid_fallback_to_date_created() {
+		$c = new _BP_Groups_Group();
+		$this->assertEquals( _BP_Groups_Group::_convert_orderby_to_order_by_term( 'date_created' ), _BP_Groups_Group::_convert_orderby_to_order_by_term( 'I am a bad boy' ) );
+	}
+
 	public function test_filter_user_groups_normal_search() {
 		$g1 = $this->factory->group->create( array(
 			'name' => 'Cool Group',
@@ -351,3 +531,16 @@ class BP_Tests_BP_Groups_Group_TestCases extends BP_UnitTestCase {
 		$this->assertEquals( array( $g1 ), $found );
 	}
 }
+
+/**
+ * Stub class for accessing protected methods
+ */
+class _BP_Groups_Group extends BP_Groups_Group {
+	public function _convert_type_to_order_orderby( $type ) {
+		return self::convert_type_to_order_orderby( $type );
+	}
+
+	public function _convert_orderby_to_order_by_term( $term ) {
+		return self::convert_orderby_to_order_by_term( $term );
+	}
+}
diff --git tests/testcases/groups/template.php tests/testcases/groups/template.php
index a3e3260..c7511c5 100644
--- tests/testcases/groups/template.php
+++ tests/testcases/groups/template.php
@@ -11,6 +11,11 @@ class BP_Tests_Groups_Template extends BP_UnitTestCase {
 		parent::tearDown();
 	}
 
+	/**
+	 * Integration test to make sure meta_query is getting passed through
+	 *
+	 * @group bp_has_groups
+	 */
 	public function test_bp_has_groups_with_meta_query() {
 		$g1 = $this->factory->group->create();
 		$g2 = $this->factory->group->create();
@@ -29,4 +34,67 @@ class BP_Tests_Groups_Template extends BP_UnitTestCase {
 		$ids = wp_list_pluck( $groups_template->groups, 'id' );
 		$this->assertEquals( $ids, array( $g1, ) );
 	}
+
+	/**
+	 * Integration test to make sure order and orderby are interpreted when
+	 * no 'type' value has been passed
+	 *
+	 * @group bp_has_groups
+	 */
+	public function test_bp_has_groups_with_order_orderby_with_null_type() {
+		$g1 = $this->factory->group->create( array(
+			'name' => 'AAAAA',
+			'date_created' => gmdate( 'Y-m-d H:i:s', time() - 100 ),
+			'last_activity' => gmdate( 'Y-m-d H:i:s', time() - 1000000 ),
+		) );
+		$g2 = $this->factory->group->create( array(
+			'name' => 'BBBBB',
+			'date_created' => gmdate( 'Y-m-d H:i:s', time() - 1000000 ),
+			'last_activity' => gmdate( 'Y-m-d H:i:s', time() - 10000 ),
+		) );
+		$g3 = $this->factory->group->create( array(
+			'name' => 'CCCCC',
+			'date_created' => gmdate( 'Y-m-d H:i:s', time() - 10000 ),
+			'last_activity' => gmdate( 'Y-m-d H:i:s', time() - 10 ),
+		) );
+
+		global $groups_template;
+		bp_has_groups( array(
+			'order' => 'ASC',
+			'orderby' => 'name',
+		) );
+
+		$ids = wp_parse_id_list( wp_list_pluck( $groups_template->groups, 'id' ) );
+		$this->assertEquals( array( $g1, $g2, $g3, ), $ids );
+	}
+
+	/**
+	 * Integration test to make sure 'order' is set to 'DESC' and 'orderby'
+	 * to 'last_activity' when no type or order/orderby params are passed.
+	 * This ensures backpat with the old system, where 'active' was the
+	 * default type param, and there were no order/orderby params.
+	 *
+	 * @group bp_has_groups
+	 */
+	public function test_bp_has_groups_defaults_to_DESC_last_activity_for_default_type_active_backpat() {
+		$g1 = $this->factory->group->create( array(
+			'name' => 'AAAAA',
+			'last_activity' => gmdate( 'Y-m-d H:i:s', time() - 100 ),
+		) );
+		$g2 = $this->factory->group->create( array(
+			'name' => 'BBBBB',
+			'last_activity' => gmdate( 'Y-m-d H:i:s', time() - 1000000 ),
+		) );
+		$g3 = $this->factory->group->create( array(
+			'name' => 'CCCCC',
+			'last_activity' => gmdate( 'Y-m-d H:i:s', time() - 10000 ),
+		) );
+
+		global $groups_template;
+		bp_has_groups();
+
+		$ids = wp_parse_id_list( wp_list_pluck( $groups_template->groups, 'id' ) );
+		$this->assertEquals( array( $g1, $g3, $g2, ), $ids );
+	}
+
 }
