Index: bp-friends/bp-friends-loader.php
===================================================================
--- bp-friends/bp-friends-loader.php	(revision 7391)
+++ bp-friends/bp-friends-loader.php	(working copy)
@@ -39,6 +39,7 @@
 			'template',
 			'functions',
 			'notifications',
+			'widgets'
 		);
 
 		parent::includes( $includes );
Index: bp-friends/bp-friends-widgets.php
===================================================================
--- bp-friends/bp-friends-widgets.php	(revision 0)
+++ bp-friends/bp-friends-widgets.php	(revision 0)
@@ -0,0 +1,209 @@
+<?php
+/**
+ * BuddyPress Widgets
+ *
+ * @package BuddyPress
+ * @subpackage Friends
+ * @since 1.9.0
+ */
+
+// Exit if accessed directly
+if ( ! defined( 'ABSPATH' ) ) exit;
+
+/* Register widgets for the core component */
+function bp_friends_register_widgets() {
+	
+	if( bp_is_active( 'friends' ) )
+		add_action( 'widgets_init', create_function( '', 'return register_widget("BP_Core_Friends_Widget");' ) );
+}
+
+add_action( 'bp_register_widgets', 'bp_friends_register_widgets' );
+
+/*** MEMBER FRIENDS WIDGET *****************/
+
+class BP_Core_Friends_Widget extends WP_Widget {
+
+	function __construct() {
+		$widget_ops = array(
+			'description' => __( 'A dynamic list of recently active, popular, and newest Friends of the displayed member.  Widget is only shown when viewing a member profile.', 'buddypress' ),
+			'classname' => 'widget_bp_core_friends_widget buddypress widget',
+		);
+		parent::__construct( false, $name = _x( '(BuddyPress) Friends', 'widget name', 'buddypress' ), $widget_ops );
+
+	}
+
+	function widget( $args, $instance ) {
+
+		
+  		global $bp;
+		extract( $args );
+
+		if ( bp_displayed_user_domain() ) {
+			
+			$min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
+			wp_enqueue_script( 'bp_core_widget_friends-js', BP_PLUGIN_URL . "bp-friends/js/widget-friends{$min}.js", array( 'jquery' ), bp_get_version() );
+
+			$user_id = bp_displayed_user_id();
+			$link = bp_displayed_user_domain() .bp_get_friends_slug();
+			$instance['title'] = sprintf( __( '%s friends', 'buddypress' ), bp_get_displayed_user_fullname() );
+			
+		} else {
+			return;
+		}
+
+		if ( ! $instance['friend_default'] )
+			$instance['friend_default'] = 'active';
+
+		$title = apply_filters( 'widget_title', $instance['title'] );
+
+		echo $before_widget;
+
+		$title = $instance['link_title'] ? '<a href="' . esc_url( $link ) . '">' . esc_html( $title ) . '</a>' : esc_html( $title );
+
+		echo $before_title . $title .$after_title; 
+		?>
+
+		<?php if ( bp_has_members( 'user_id=' . absint( $user_id ) . '&type=' . sanitize_text_field( $instance['friend_default'] ) . '&max=' . absint( $instance['max_friends'] ) . '&populate_extras=1' ) ) : ?>
+			<div class="item-options" id="friends-list-options">
+				<a href="<?php bp_members_directory_permalink(); ?>" id="newest-friends" <?php if ( $instance['friend_default'] == 'newest' ) : ?>class="selected"<?php endif; ?>><?php _e( 'Newest', 'buddypress' ) ?></a>
+				| <a href="<?php bp_members_directory_permalink(); ?>" id="recently-active-friends" <?php if ( $instance['friend_default'] == 'active' ) : ?>class="selected"<?php endif; ?>><?php _e( 'Active', 'buddypress' ) ?></a>
+				| <a href="<?php bp_members_directory_permalink(); ?>" id="popular-friends" <?php if ( $instance['friend_default'] == 'popular' ) : ?>class="selected"<?php endif; ?>><?php _e( 'Popular', 'buddypress' ) ?></a>
+			</div>
+
+			<ul id="friends-list" class="item-list">
+				<?php while ( bp_members() ) : bp_the_member(); ?>
+					<li class="vcard">
+						<div class="item-avatar">
+							<a href="<?php bp_member_permalink() ?>" title="<?php bp_member_name() ?>"><?php bp_member_avatar() ?></a>
+						</div>
+
+						<div class="item">
+							<div class="item-title fn"><a href="<?php bp_member_permalink() ?>" title="<?php bp_member_name() ?>"><?php bp_member_name() ?></a></div>
+							<div class="item-meta">
+								<span class="activity">
+								<?php
+									if ( 'newest' == $instance['friend_default'] )
+										bp_member_registered();
+									if ( 'active' == $instance['friend_default'] )
+										bp_member_last_active();
+									if ( 'popular' == $instance['friend_default'] )
+										bp_member_total_friend_count();
+								?>
+								</span>
+							</div>
+						</div>
+					</li>
+
+				<?php endwhile; ?>
+			</ul>
+			<?php wp_nonce_field( 'bp_core_widget_friends', '_wpnonce-friends' ); ?>
+			<input type="hidden" name="friends_widget_max" id="friends_widget_max" value="<?php echo absint( $instance['max_friends'] ); ?>" />
+
+		<?php else: ?>
+
+			<div class="widget-error">
+				<?php _e( 'Sorry, no members were found.', 'buddypress' ); ?>
+			</div>
+
+		<?php endif; ?>
+
+		<?php echo $after_widget; ?>
+	<?php
+	}
+
+	function update( $new_instance, $old_instance ) {
+		$instance = $old_instance;
+
+		$instance['max_friends']    = absint( $new_instance['max_friends'] );
+		$instance['friend_default'] = sanitize_text_field( $new_instance['friend_default'] );
+		$instance['link_title']	    = (bool)$new_instance['link_title'];
+
+		return $instance;
+	}
+
+	function form( $instance ) {
+		$defaults = array(
+			'max_friends' 	 => 5,
+			'friend_default' => 'active',
+			'link_title' 	 => false
+		);
+		$instance = wp_parse_args( (array) $instance, $defaults );
+
+		$max_friends 	= $instance['max_friends'];
+		$friend_default = $instance['friend_default'];
+		$link_title	= (bool)$instance['link_title'];
+		?>
+
+		<p><label for="<?php echo $this->get_field_name('link_title') ?>"><input type="checkbox" name="<?php echo $this->get_field_name('link_title') ?>" value="1" <?php checked( $link_title ) ?> /> <?php _e( 'Link widget title to Members directory', 'buddypress' ) ?></label></p>
+
+		<p><label for="bp-core-widget-friends-max"><?php _e( 'Max friends to show:', 'buddypress' ); ?> <input class="widefat" id="<?php echo $this->get_field_id( 'max_friends' ); ?>" name="<?php echo $this->get_field_name( 'max_friends' ); ?>" type="text" value="<?php echo absint( $max_friends ); ?>" style="width: 30%" /></label></p>
+
+		<p>
+			<label for="bp-core-widget-friends-default"><?php _e( 'Default friends to show:', 'buddypress' ); ?>
+			<select name="<?php echo $this->get_field_name( 'friend_default' ) ?>">
+				<option value="newest" <?php selected( $friend_default, 'newest' ); ?>><?php _e( 'Newest', 'buddypress' ) ?></option>
+				<option value="active" <?php selected( $friend_default, 'active' );?>><?php _e( 'Active', 'buddypress' ) ?></option>
+				<option value="popular"  <?php selected( $friend_default, 'popular' ); ?>><?php _e( 'Popular', 'buddypress' ) ?></option>
+			</select>
+			</label>
+		</p>
+
+	<?php
+	}
+}
+
+/** Widget AJAX ******************/
+
+function bp_core_ajax_widget_friends() {
+
+	global $bp;
+	check_ajax_referer( 'bp_core_widget_friends' );
+
+	switch ( $_POST['filter'] ) {
+		case 'newest-friends':
+			$type = 'newest';
+			break;
+
+		case 'recently-active-friends':
+			$type = 'active';
+			break;
+
+		case 'popular-friends':
+			$type = 'popular';
+			break;
+	}
+
+
+	$user_id = bp_displayed_user_id();
+
+	if ( bp_has_members( 'user_id=' . absint( $user_id ) . '&type=' . $type . '&per_page=' . absint( $_POST['max-friends'] ) . '&max=' . absint( $_POST['max-friends'] ) . '&populate_extras=1' ) ) : ?>
+		<?php echo '0[[SPLIT]]'; // return valid result. TODO: remove this. ?>
+		<?php while ( bp_members() ) : bp_the_member(); ?>
+			<li class="vcard">
+				<div class="item-avatar">
+					<a href="<?php bp_member_permalink() ?>"><?php bp_member_avatar() ?></a>
+				</div>
+
+				<div class="item">
+					<div class="item-title fn"><a href="<?php bp_member_permalink() ?>" title="<?php bp_member_name() ?>"><?php bp_member_name() ?></a></div>
+					<?php if ( 'active' == $type ) : ?>
+						<div class="item-meta"><span class="activity"><?php bp_member_last_active() ?></span></div>
+					<?php elseif ( 'newest' == $type ) : ?>
+						<div class="item-meta"><span class="activity"><?php bp_member_registered() ?></span></div>
+					<?php elseif ( bp_is_active( 'friends' ) ) : ?>
+						<div class="item-meta"><span class="activity"><?php bp_member_total_friend_count() ?></span></div>
+					<?php endif; ?>
+				</div>
+			</li>
+		<?php endwhile; ?>
+
+	<?php else: ?>
+		<?php echo "-1[[SPLIT]]<li>"; ?>
+		<?php _e( 'There were no members found, please try another filter.', 'buddypress' ) ?>
+		<?php echo "</li>"; ?>
+	<?php endif;
+}
+
+add_action( 'wp_ajax_widget_friends', 'bp_core_ajax_widget_friends' );
+add_action( 'wp_ajax_nopriv_widget_friends', 'bp_core_ajax_widget_friends' );
+
Index: bp-friends/js/widget-friends.js
===================================================================
--- bp-friends/js/widget-friends.js	(revision 0)
+++ bp-friends/js/widget-friends.js	(revision 0)
@@ -0,0 +1,49 @@
+jQuery(document).ready( function() {
+	jQuery(".widget div#friends-list-options a").on('click',
+		function() {
+			var link = this;
+			jQuery(link).addClass('loading');
+
+			jQuery(".widget div#friends-list-options a").removeClass("selected");
+			jQuery(this).addClass('selected');
+
+			jQuery.post( ajaxurl, {
+				action: 'widget_friends',
+				'cookie': encodeURIComponent(document.cookie),
+				'_wpnonce': jQuery("input#_wpnonce-friends").val(),
+				'max-friends': jQuery("input#friends_widget_max").val(),
+				'filter': jQuery(this).attr('id')
+			},
+			function(response)
+			{
+				jQuery(link).removeClass('loading');
+				friend_wiget_response(response);
+			});
+
+			return false;
+		}
+	);
+});
+
+function friend_wiget_response(response) {
+	response = response.substr(0, response.length-1);
+	response = response.split('[[SPLIT]]');
+
+	if ( response[0] != "-1" ) {
+		jQuery(".widget ul#friends-list").fadeOut(200,
+			function() {
+				jQuery(".widget ul#friends-list").html(response[1]);
+				jQuery(".widget ul#friends-list").fadeIn(200);
+			}
+		);
+
+	} else {
+		jQuery(".widget ul#friends-list").fadeOut(200,
+			function() {
+				var message = '<p>' + response[1] + '</p>';
+				jQuery(".widget ul#friends-list").html(message);
+				jQuery(".widget ul#friends-list").fadeIn(200);
+			}
+		);
+	}
+}
\ No newline at end of file
Index: bp-groups/bp-groups-widgets.php
===================================================================
--- bp-groups/bp-groups-widgets.php	(revision 7391)
+++ bp-groups/bp-groups-widgets.php	(working copy)
@@ -13,6 +13,7 @@
 /* Register widgets for groups component */
 function groups_register_widgets() {
 	add_action('widgets_init', create_function('', 'return register_widget("BP_Groups_Widget");') );
+	add_action('widgets_init', create_function('', 'return register_widget("BP_Member_Groups_Widget");') );
 }
 add_action( 'bp_register_widgets', 'groups_register_widgets' );
 
@@ -208,3 +209,192 @@
 }
 add_action( 'wp_ajax_widget_groups_list',        'groups_ajax_widget_groups_list' );
 add_action( 'wp_ajax_nopriv_widget_groups_list', 'groups_ajax_widget_groups_list' );
+
+class BP_Member_Groups_Widget extends WP_Widget {
+
+	function __construct() {
+		$widget_ops = array(
+			'description' => __( 'A dynamic list of recently active, popular, and newest groups of a loggedin/displayed member', 'buddypress' ),
+			'classname' => 'widget_bp_member_groups_widget buddypress widget',
+		);
+		parent::__construct( false, _x( '(BuddyPress) My Groups', 'widget name', 'buddypress' ), $widget_ops );
+
+		if ( is_active_widget( false, false, $this->id_base ) && !is_admin() && !is_network_admin() ) {
+			$min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
+			wp_enqueue_script( 'groups_widget_member_groups_list-js', BP_PLUGIN_URL . "bp-groups/js/widget-member-groups{$min}.js", array( 'jquery' ), bp_get_version() );
+		}
+	}
+
+	function widget( $args, $instance ) {
+
+		global $bp;
+		extract( $args );
+
+		if ( bp_displayed_user_domain() ) {
+			$user_id = $bp->displayed_user->id;
+			$link = str_replace( bp_displayed_user_domain(), bp_displayed_user_domain(), bp_get_groups_slug() );
+			$instance['title'] = sprintf( __( '%s Groups', 'buddypress' ), bp_get_displayed_user_fullname() );
+
+		} elseif ( bp_loggedin_user_domain() ) {
+			$user_id = $bp->loggedin_user->id;
+			$link = trailingslashit( bp_loggedin_user_domain() . bp_get_groups_slug() );
+			$instance['title'] = __( 'My Groups', 'buddypress' );
+
+		} else {
+			return;
+		}
+
+		if ( empty( $instance['member_group_default'] ) )
+			$instance['member_group_default'] = 'popular';
+
+		$title = apply_filters( 'widget_title', $instance['title'] );
+
+		echo $before_widget;
+
+		$title = !empty( $instance['link_title'] ) ? '<a href="' . $link . '">' . $title . '</a>' : $title;
+
+		echo $before_title . $title . $after_title; ?>
+
+		<?php if ( bp_has_groups( 'user_id=' . $user_id . '&type=' . $instance['member_group_default'] . '&max=' . $instance['max_member_groups'] ) ) : ?>
+			<div class="item-options" id="member-groups-list-options">
+				<a href="<?php bp_groups_directory_permalink(); ?>" id="newest-groups"<?php if ( $instance['member_group_default'] == 'newest' ) : ?> class="selected"<?php endif; ?>><?php _e("Newest", 'buddypress') ?></a> |
+				<a href="<?php bp_groups_directory_permalink(); ?>" id="recently-active-groups"<?php if ( $instance['member_group_default'] == 'active' ) : ?> class="selected"<?php endif; ?>><?php _e("Active", 'buddypress') ?></a> |
+				<a href="<?php bp_groups_directory_permalink(); ?>" id="popular-groups" <?php if ( $instance['member_group_default'] == 'popular' ) : ?> class="selected"<?php endif; ?>><?php _e("Popular", 'buddypress') ?></a>
+			</div>
+
+			<ul id="member-groups-list" class="item-list">
+				<?php while ( bp_groups() ) : bp_the_group(); ?>
+					<li>
+						<div class="item-avatar">
+							<a href="<?php bp_group_permalink() ?>" title="<?php bp_group_name() ?>"><?php bp_group_avatar_thumb() ?></a>
+						</div>
+
+						<div class="item">
+							<div class="item-title"><a href="<?php bp_group_permalink() ?>" title="<?php bp_group_name() ?>"><?php bp_group_name() ?></a></div>
+							<div class="item-meta">
+								<span class="activity">
+								<?php
+									if ( 'newest' == $instance['member_group_default'] )
+										printf( __( 'created %s', 'buddypress' ), bp_get_group_date_created() );
+									if ( 'active' == $instance['member_group_default'] )
+										printf( __( 'active %s', 'buddypress' ), bp_get_group_last_active() );
+									else if ( 'popular' == $instance['member_group_default'] )
+										bp_group_member_count();
+								?>
+								</span>
+							</div>
+						</div>
+					</li>
+
+				<?php endwhile; ?>
+			</ul>
+			<?php wp_nonce_field( 'groups_widget_member_groups_list', '_wpnonce-member-groups' ); ?>
+			<input type="hidden" name="member_groups_widget_max" id="member_groups_widget_max" value="<?php echo esc_attr( $instance['max_member_groups'] ); ?>" />
+
+		<?php else: ?>
+
+			<div class="widget-error">
+				<?php _e('There are no groups to display.', 'buddypress') ?>
+			</div>
+
+		<?php endif; ?>
+
+		<?php echo $after_widget; ?>
+	<?php
+	}
+
+	function update( $new_instance, $old_instance ) {
+		$instance = $old_instance;
+
+		$instance['max_member_groups']    = strip_tags( $new_instance['max_member_groups'] );
+		$instance['member_group_default'] = strip_tags( $new_instance['member_group_default'] );
+		$instance['link_title']    = (bool)$new_instance['link_title'];
+
+		return $instance;
+	}
+
+	function form( $instance ) {
+		$defaults = array(
+			'max_member_groups'    => 5,
+			'member_group_default' => 'active',
+			'link_title'    => false
+		);
+		$instance = wp_parse_args( (array) $instance, $defaults );
+	
+		$max_member_groups    = strip_tags( $instance['max_member_groups'] );
+		$member_group_default = strip_tags( $instance['member_group_default'] );
+		$link_title    = (bool)$instance['link_title'];
+		?>
+
+		<p><label for="<?php echo $this->get_field_name('link_title') ?>"><input type="checkbox" name="<?php echo $this->get_field_name('link_title') ?>" value="1" <?php checked( $link_title ) ?> /> <?php _e( 'Link widget title to Groups directory', 'buddypress' ) ?></label></p>
+
+		<p><label for="bp-groups-widget-member-groups-max"><?php _e('Max groups to show:', 'buddypress'); ?> <input class="widefat" id="<?php echo $this->get_field_id( 'max_member_groups' ); ?>" name="<?php echo $this->get_field_name( 'max_member_groups' ); ?>" type="text" value="<?php echo esc_attr( $max_member_groups ); ?>" style="width: 30%" /></label></p>
+
+		<p>
+			<label for="bp-groups-widget-member-groups-default"><?php _e('Default groups to show:', 'buddypress'); ?>
+			<select name="<?php echo $this->get_field_name( 'member_group_default' ); ?>">
+				<option value="newest" <?php if ( $member_group_default == 'newest' ) : ?>selected="selected"<?php endif; ?>><?php _e( 'Newest', 'buddypress' ) ?></option>
+				<option value="active" <?php if ( $member_group_default == 'active' ) : ?>selected="selected"<?php endif; ?>><?php _e( 'Active', 'buddypress' ) ?></option>
+				<option value="popular"  <?php if ( $member_group_default == 'popular' ) : ?>selected="selected"<?php endif; ?>><?php _e( 'Popular', 'buddypress' ) ?></option>
+			</select>
+			</label>
+		</p>
+	<?php
+	}
+}
+
+function groups_ajax_widget_member_groups_list() {
+
+	check_ajax_referer('groups_widget_member_groups_list');
+
+	switch ( $_POST['filter'] ) {
+		case 'newest-groups':
+			$type = 'newest';
+		break;
+		case 'recently-active-groups':
+			$type = 'active';
+		break;
+		case 'popular-groups':
+			$type = 'popular';
+		break;
+	}
+
+	if ( bp_has_groups( 'type=' . $type . '&per_page=' . $_POST['max_member_groups'] . '&max=' . $_POST['max_member_groups'] ) ) : ?>
+		<?php echo "0[[SPLIT]]"; ?>
+		<?php while ( bp_groups() ) : bp_the_group(); ?>
+			<li>
+				<div class="item-avatar">
+					<a href="<?php bp_group_permalink() ?>"><?php bp_group_avatar_thumb() ?></a>
+				</div>
+
+				<div class="item">
+					<div class="item-title"><a href="<?php bp_group_permalink() ?>" title="<?php bp_group_name() ?>"><?php bp_group_name() ?></a></div>
+					<div class="item-meta">
+						<span class="activity">
+							<?php
+							if ( 'newest-groups' == $_POST['filter'] ) {
+								printf( __( 'created %s', 'buddypress' ), bp_get_group_date_created() );
+							} else if ( 'recently-active-groups' == $_POST['filter'] ) {
+								printf( __( 'active %s', 'buddypress' ), bp_get_group_last_active() );
+							} else if ( 'popular-groups' == $_POST['filter'] ) {
+								bp_group_member_count();
+							}
+							?>
+						</span>
+					</div>
+				</div>
+			</li>
+		<?php endwhile; ?>
+
+		<?php wp_nonce_field( 'groups_widget_member_groups_list', '_wpnonce-member-groups' ); ?>
+		<input type="hidden" name="member_groups_widget_max" id="member_groups_widget_max" value="<?php echo esc_attr( $_POST['max_member_groups'] ); ?>" />
+
+	<?php else: ?>
+
+		<?php echo "-1[[SPLIT]]<li>" . __("No groups matched the current filter.", 'buddypress'); ?>
+
+	<?php endif;
+
+}
+add_action( 'wp_ajax_widget_member_groups_list',        'groups_ajax_widget_member_groups_list' );
+add_action( 'wp_ajax_nopriv_widget_member_groups_list', 'groups_ajax_widget_member_groups_list' );
\ No newline at end of file
