diff --git src/bp-activity/bp-activity-classes.php src/bp-activity/bp-activity-classes.php
index f1e6054..08baf50 100644
--- src/bp-activity/bp-activity-classes.php
+++ src/bp-activity/bp-activity-classes.php
@@ -337,6 +337,24 @@ class BP_Activity_Activity {
 			$where_conditions['search_sql'] = "a.content LIKE '%%" . esc_sql( like_escape( $search_terms ) ) . "%%'";
 		}
 
+		// User Favorites
+		if ( ! empty( $filter['action'] ) && 'user_favorites' == $filter['action'] ) {
+			$meta_query_args = array(
+					'key'     => 'user_favorites',
+					'compare' => 'EXISTS'
+			);
+
+			if ( ! empty( $filter['user_id'] ) ) {
+				$meta_query_args['compare'] = '=';
+				$meta_query_args['value'] = absint( $filter['user_id'] );
+				unset( $filter['user_id'] );
+			}
+
+			$meta_query = array( $meta_query_args );
+
+			unset( $filter['action'] );
+		}
+
 		// Filtering
 		if ( $filter && $filter_sql = BP_Activity_Activity::get_filter_sql( $filter ) )
 			$where_conditions['filter_sql'] = $filter_sql;
@@ -465,6 +483,9 @@ class BP_Activity_Activity {
 		// Generate action strings
 		$activities = BP_Activity_Activity::generate_action_strings( $activities );
 
+		// Append favorites
+		$activities = self::append_favorites( $activities );
+
 		// If $max is set, only return up to the max results
 		if ( !empty( $max ) ) {
 			if ( (int) $total_activities > (int) $max )
@@ -644,13 +665,32 @@ class BP_Activity_Activity {
 
 			// WP_Meta_Query expects the table name at
 			// $wpdb->activitymeta
-			$wpdb->activitymeta = buddypress()->activity->table_name_meta;
+			if( ! empty( $activity_meta_query->queries[0]['key'] ) && 'user_favorites' == $activity_meta_query->queries[0]['key'] ) {
+				$wpdb->activitymeta = buddypress()->activity->table_name_favorites;
+			} else {
+				$wpdb->activitymeta = buddypress()->activity->table_name_meta;
+			}
 
 			$meta_sql = $activity_meta_query->get_sql( 'activity', 'a', 'id' );
 
 			// Strip the leading AND - BP handles it in get()
 			$sql_array['where'] = preg_replace( '/^\sAND/', '', $meta_sql['where'] );
 			$sql_array['join']  = $meta_sql['join'];
+
+			if ( buddypress()->activity->table_name_favorites == $wpdb->activitymeta ) {
+				if ( 'EXISTS' == strtoupper( $activity_meta_query->queries[0]['compare'] ) ) {
+					$sql_array['where'] = str_replace( "meta_key = 'user_favorites'", "user_id IS NOT NULL", $sql_array['where'] );
+				} else {
+					
+					$user_id = $activity_meta_query->queries[0]['value'];
+					
+					preg_match( '/CAST\((.*)meta_value(.*)[' .$user_id. ']\'\)/', $sql_array['where'], $matches );
+					
+					if ( ! empty( $matches[1] ) ) {
+						$sql_array['where'] = $wpdb->prepare( "({$matches[1]}user_id = %d)", $user_id );
+					}
+				}
+			}
 		}
 
 		return $sql_array;
@@ -837,6 +877,9 @@ class BP_Activity_Activity {
 
 			// Delete all activity meta entries for activity items and activity comments
 			BP_Activity_Activity::delete_activity_meta_entries( $activity_ids );
+
+			// Delete all activity favorite entries for activity items and activity comments
+			BP_Activity_Activity::delete_activity_favorites( $activity_ids );
 		}
 
 		return $activity_ids;
@@ -1283,10 +1326,12 @@ class BP_Activity_Activity {
 	 * @return int A count of the user's favorites.
 	 */
 	public static function total_favorite_count( $user_id ) {
-		if ( !$favorite_activity_entries = bp_get_user_meta( $user_id, 'bp_favorite_activities', true ) )
+		$favorite_activity_entries = self::get_favorites_by_user( $user_id );
+		
+		if ( empty( $favorite_activity_entries ) )
 			return 0;
 
-		return count( maybe_unserialize( $favorite_activity_entries ) );
+		return count( $favorite_activity_entries );
 	}
 
 	/**
@@ -1312,6 +1357,138 @@ class BP_Activity_Activity {
 
 		return $wpdb->get_var( $wpdb->prepare( "UPDATE {$bp->activity->table_name} SET hide_sitewide = 1 WHERE user_id = %d", $user_id ) );
 	}
+
+	/**
+	 * Append user_ids who favorited activities.
+	 *
+	 * @since BuddyPress (2.1.0)
+	 *
+	 * @param array $activities Activities to fetch comments for.
+	 * @param bool $spam Optional. 'ham_only' (default), 'spam_only' or 'all'.
+	 * @return array The updated activities with nested comments.
+	 */
+	public static function append_favorites( $activities = array() ) {
+		$user_favorites = array();
+
+		// Now fetch the user who favorited matching activities.
+		foreach ( (array) $activities as $key => $activity ) {
+			$activities[$key]->user_favorites = self::get_user_favorites_by_activity( $activity->id );
+		}
+
+		return $activities;
+	}
+
+	/**
+	 * Get users who favorited an activity.
+	 *
+	 * @since BuddyPress (2.1.0)
+	 * 
+	 * @param int $activity_id.
+	 * @return array $user_ids list of user ids
+	 */
+	public static function get_user_favorites_by_activity( $activity_id = 0 ) {
+		global $wpdb;
+		$bp = buddypress();
+
+		$user_ids = array();
+
+		if ( empty( $activity_id ) )
+			return $user_ids;
+
+		$user_ids = $wpdb->get_col( $wpdb->prepare( "SELECT user_id FROM {$bp->activity->table_name_favorites} WHERE activity_id = %d", $activity_id ) );
+
+		return $user_ids;
+	}
+
+	/**
+	 * Get user's favorites.
+	 *
+	 * @since BuddyPress (2.1.0)
+	 * 
+	 * @param int $user_id.
+	 * @return array $activity_ids list of activity ids
+	 */
+	public static function get_favorites_by_user( $user_id = 0 ) {
+		global $wpdb;
+		$bp = buddypress();
+
+		$activity_ids = array();
+
+		if ( empty( $user_id ) )
+			return $activity_ids;
+
+		$activity_ids = $wpdb->get_col( $wpdb->prepare( "SELECT activity_id FROM {$bp->activity->table_name_favorites} WHERE user_id = %d", $user_id ) );
+
+		return $activity_ids;
+	}
+
+	/**
+	 * Save a user's favorite.
+	 *
+	 * @since BuddyPress (2.1.0)
+	 * 
+	 * @param array $args.
+	 * @return bool true\false
+	 */
+	public static function save_favorite( $args = array() ) {
+		global $wpdb;
+		$bp = buddypress();
+
+		if ( empty( $args['activity_id'] ) || empty( $args['user_id'] ) )
+			return false;
+
+		$saved = $wpdb->insert(
+			buddypress()->activity->table_name_favorites,
+			$args,
+			array( '%d', '%d', '%s' )
+		);
+
+		return $saved;
+	}
+
+	/**
+	 * Delete a user's favorite.
+	 *
+	 * @since BuddyPress (2.1.0)
+	 * 
+	 * @param array $args.
+	 * @return bool true\false
+	 */
+	public static function delete_favorite( $args = array() ) {
+		global $wpdb;
+		$bp = buddypress();
+
+		if ( empty( $args['activity_id'] ) || empty( $args['user_id'] ) )
+			return false;
+
+		$deleted = $wpdb->delete(
+			buddypress()->activity->table_name_favorites,
+			$args,
+			array( '%d', '%d' )
+		);
+
+		return $deleted;
+	}
+
+	/**
+	 * Delete favorites for one or more activities.
+	 * 
+	 * @since BuddyPress (2.1.0)
+	 * 
+	 * @param array $args.
+	 * @return bool true\false
+	 */
+	public static function delete_activity_favorites( $activity_ids = array() ) {
+		global $wpdb;
+		$bp = buddypress();
+
+		if ( empty( $activity_ids ) )
+			return false;
+
+		$in = implode( ',', wp_parse_id_list( $activity_ids ) );
+
+		return $wpdb->query( "DELETE FROM {$bp->activity->table_name_favorites} WHERE activity_id IN ({$in})" );
+	}
 }
 
 /**
diff --git src/bp-activity/bp-activity-functions.php src/bp-activity/bp-activity-functions.php
index 507387e..5f14587 100644
--- src/bp-activity/bp-activity-functions.php
+++ src/bp-activity/bp-activity-functions.php
@@ -367,7 +367,7 @@ function bp_activity_get_types() {
  *
  * @since BuddyPress (1.2)
  *
- * @uses bp_get_user_meta()
+ * @uses BP_Activity_Activity::get_favorites_by_user()
  * @uses apply_filters() To call the 'bp_activity_get_user_favorites' hook.
  *
  * @param int $user_id ID of the user whose favorites are being queried.
@@ -380,7 +380,7 @@ function bp_activity_get_user_favorites( $user_id = 0 ) {
 		$user_id = bp_displayed_user_id();
 
 	// Get favorites for user
-	$favs = bp_get_user_meta( $user_id, 'bp_favorite_activities', true );
+	$favs = BP_Activity_Activity::get_favorites_by_user( $user_id );
 
 	return apply_filters( 'bp_activity_get_user_favorites', $favs );
 }
@@ -391,10 +391,10 @@ function bp_activity_get_user_favorites( $user_id = 0 ) {
  * @since BuddyPress (1.2)
  *
  * @uses is_user_logged_in()
- * @uses bp_get_user_meta()
+ * @uses bp_activity_get_user_favorites()
  * @uses bp_activity_get_meta()
- * @uses bp_update_user_meta()
  * @uses bp_activity_update_meta()
+ * @uses bp_activity_add_meta()
  * @uses do_action() To call the 'bp_activity_add_user_favorite' hook.
  * @uses do_action() To call the 'bp_activity_add_user_favorite_fail' hook.
  *
@@ -405,14 +405,14 @@ function bp_activity_get_user_favorites( $user_id = 0 ) {
 function bp_activity_add_user_favorite( $activity_id, $user_id = 0 ) {
 
 	// Favorite activity stream items are for logged in users only
-	if ( !is_user_logged_in() )
+	if ( ! is_user_logged_in() )
 		return false;
 
 	// Fallback to logged in user if no user_id is passed
 	if ( empty( $user_id ) )
 		$user_id = bp_loggedin_user_id();
 
-	$my_favs = bp_get_user_meta( $user_id, 'bp_favorite_activities', true );
+	$my_favs = bp_activity_get_user_favorites( $user_id );
 	if ( empty( $my_favs ) || ! is_array( $my_favs ) ) {
 		$my_favs = array();
 	}
@@ -422,18 +422,14 @@ function bp_activity_add_user_favorite( $activity_id, $user_id = 0 ) {
 		return false;
 	}
 
-	// Add to user's favorites
-	$my_favs[] = $activity_id;
-
 	// Update the total number of users who have favorited this activity
 	$fav_count = bp_activity_get_meta( $activity_id, 'favorite_count' );
 	$fav_count = !empty( $fav_count ) ? (int) $fav_count + 1 : 1;
 
-	// Update user meta
-	bp_update_user_meta( $user_id, 'bp_favorite_activities', $my_favs );
+	// Update activity meta counts for backcompat
+	bp_activity_update_meta( $activity_id, 'favorite_count', $fav_count );
 
-	// Update activity meta counts
-	if ( bp_activity_update_meta( $activity_id, 'favorite_count', $fav_count ) ) {
+	if ( bp_activity_add_favorite( $activity_id, $user_id ) ) {
 
 		// Execute additional code
 		do_action( 'bp_activity_add_user_favorite', $activity_id, $user_id );
@@ -456,7 +452,7 @@ function bp_activity_add_user_favorite( $activity_id, $user_id = 0 ) {
  * @since BuddyPress (1.2)
  *
  * @uses is_user_logged_in()
- * @uses bp_get_user_meta()
+ * @uses bp_activity_delete_meta()
  * @uses bp_activity_get_meta()
  * @uses bp_activity_update_meta()
  * @uses bp_update_user_meta()
@@ -469,54 +465,40 @@ function bp_activity_add_user_favorite( $activity_id, $user_id = 0 ) {
 function bp_activity_remove_user_favorite( $activity_id, $user_id = 0 ) {
 
 	// Favorite activity stream items are for logged in users only
-	if ( !is_user_logged_in() )
+	if ( ! is_user_logged_in() )
 		return false;
 
 	// Fallback to logged in user if no user_id is passed
 	if ( empty( $user_id ) )
 		$user_id = bp_loggedin_user_id();
 
-	$my_favs = bp_get_user_meta( $user_id, 'bp_favorite_activities', true );
-	$my_favs = array_flip( (array) $my_favs );
+	// Remove the user favorite
+	$removed = bp_activity_remove_favorite( $activity_id, $user_id );
 
-	// Bail if the user has not previously favorited the item
-	if ( ! isset( $my_favs[ $activity_id ] ) ) {
+	if ( empty( $removed ) ) {
 		return false;
 	}
 
-	// Remove the fav from the user's favs
-	unset( $my_favs[$activity_id] );
-	$my_favs = array_unique( array_flip( $my_favs ) );
-
 	// Update the total number of users who have favorited this activity
-	if ( $fav_count = bp_activity_get_meta( $activity_id, 'favorite_count' ) ) {
-
-		// Deduct from total favorites
-		if ( bp_activity_update_meta( $activity_id, 'favorite_count', (int) $fav_count - 1 ) ) {
-
-			// Update users favorites
-			if ( bp_update_user_meta( $user_id, 'bp_favorite_activities', $my_favs ) ) {
-
-				// Execute additional code
-				do_action( 'bp_activity_remove_user_favorite', $activity_id, $user_id );
+	$fav_count = bp_activity_get_meta( $activity_id, 'favorite_count' );
 
-				// Success
-				return true;
+	// Error getting favorite count
+	if ( empty( $fav_count ) ) {
+		return false;
+	}
 
-			// Error updating
-			} else {
-				return false;
-			}
+	// Deduct from total favorites
+	$count_updated = bp_activity_update_meta( $activity_id, 'favorite_count', (int) $fav_count - 1 );
 
-		// Error updating favorite count
-		} else {
-			return false;
-		}
-
-	// Error getting favorite count
-	} else {
+	// Error updating favorite count
+	if ( empty( $count_updated ) ) {
 		return false;
 	}
+
+	// Execute additional code
+	do_action( 'bp_activity_remove_user_favorite', $activity_id, $user_id );
+
+	return true;
 }
 
 /**
@@ -708,10 +690,6 @@ function bp_activity_remove_all_user_data( $user_id = 0 ) {
 	// Clear the user's activity from the sitewide stream and clear their activity tables
 	bp_activity_delete( array( 'user_id' => $user_id ) );
 
-	// Remove any usermeta
-	bp_delete_user_meta( $user_id, 'bp_latest_update' );
-	bp_delete_user_meta( $user_id, 'bp_favorite_activities' );
-
 	// Execute additional code
 	do_action( 'bp_activity_remove_data', $user_id ); // Deprecated! Do not use!
 
@@ -1952,3 +1930,102 @@ function bp_activity_do_heartbeat() {
 
 	return $retval;
 }
+
+/**
+ * Add a user's favorite
+ *
+ * @since BuddyPress (2.1.0)
+ *
+ * @param int $activity_id the activity to favorite
+ * @param int $user_id the user wishing to favorite the activity
+ * @uses  bp_parse_args()
+ * @uses  bp_loggedin_user_id()
+ * @uses  bp_core_current_time()
+ * @uses  BP_Activity_Activity::save_favorite()
+ * @return bool true|false
+ */
+function bp_activity_add_favorite( $activity_id = 0, $user_id = 0 ) {
+	// Bail if no activity id to favorite
+	if ( empty( $activity_id ) )
+		return false;
+
+	$r = bp_parse_args( array(
+			'user_id'        => $user_id,
+		),
+		array(
+			'activity_id'    => $activity_id,
+			'user_id'        => bp_loggedin_user_id(),
+			'date_favorited' => bp_core_current_time(),
+	), 'activity_add_favorite_args' );
+
+	return BP_Activity_Activity::save_favorite( $r );
+}
+
+/**
+ * Remove a user's favorite
+ *
+ * @since BuddyPress (2.1.0)
+ *
+ * @param int $activity_id the activity to favorite
+ * @param int $user_id the user wishing to favorite the activity
+ * @uses  bp_parse_args()
+ * @uses  bp_loggedin_user_id()
+ * @uses  BP_Activity_Activity::delete_favorite
+ * @return bool true|false
+ */
+function bp_activity_remove_favorite( $activity_id = 0, $user_id = 0 ) {
+	// Bail if no activity id to unfav
+	if ( empty( $activity_id ) )
+		return false;
+
+	$r = bp_parse_args( array(
+			'user_id'        => $user_id,
+		),
+		array(
+			'activity_id'    => $activity_id,
+			'user_id'        => bp_loggedin_user_id(),
+	), 'activity_remove_favorite_args' );
+
+	return BP_Activity_Activity::delete_favorite( $r );
+}
+
+/**
+ * Add filters to list favorited activities to Show dropdowns.
+ *
+ * @since BuddyPress (2.1.0)
+ */
+function bp_activity_activity_favorite_filter_options() {
+	if ( bp_is_user() && bp_is_current_action( 'favorites' ) )
+		return;
+	?>
+
+	<option value="user_favorites"><?php _e( 'Favorited Updates', 'buddypress' ) ?></option>
+
+	<?php
+}
+add_action( 'bp_activity_filter_options', 'bp_activity_activity_favorite_filter_options' );
+add_action( 'bp_member_activity_filter_options', 'bp_activity_activity_favorite_filter_options' );
+add_action( 'bp_group_activity_filter_options', 'bp_activity_activity_favorite_filter_options' );
+
+/**
+ * Migrate user's favorite previously in bp_favorite_activities user meta to new table
+ *
+ * @since BuddyPress (2.1.0)
+ */
+function bp_activity_favorites_migrate() {
+	global $wpdb;
+
+	$user_favorites = $wpdb->get_results( "SELECT user_id, meta_value FROM {$wpdb->usermeta} WHERE meta_key = 'bp_favorite_activities'" );
+	
+	foreach( $user_favorites as $meta ) {
+		$meta_value = maybe_unserialize( $meta->meta_value );
+
+		if ( empty( $meta_value ) )
+			continue;
+
+		foreach( $meta_value as $favorite ) {
+			bp_activity_add_favorite( $favorite, $meta->user_id );
+		}
+
+	}
+}
diff --git src/bp-activity/bp-activity-loader.php src/bp-activity/bp-activity-loader.php
index 0f68f91..32aabaa 100644
--- src/bp-activity/bp-activity-loader.php
+++ src/bp-activity/bp-activity-loader.php
@@ -91,8 +91,9 @@ class BP_Activity_Component extends BP_Component {
 
 		// Global tables for activity component
 		$global_tables = array(
-			'table_name'      => $bp->table_prefix . 'bp_activity',
-			'table_name_meta' => $bp->table_prefix . 'bp_activity_meta',
+			'table_name'           => $bp->table_prefix . 'bp_activity',
+			'table_name_meta'      => $bp->table_prefix . 'bp_activity_meta',
+			'table_name_favorites' => $bp->table_prefix . 'bp_activity_favorites',
 		);
 
 		// Metadata tables for groups component
diff --git src/bp-activity/bp-activity-template.php src/bp-activity/bp-activity-template.php
index 834e4a6..f90a920 100644
--- src/bp-activity/bp-activity-template.php
+++ src/bp-activity/bp-activity-template.php
@@ -184,9 +184,6 @@ class BP_Activity_Template {
 		// Check if blog/forum replies are disabled
 		$this->disable_blogforum_replies = isset( $bp->site_options['bp-disable-blogforum-comments'] ) ? $bp->site_options['bp-disable-blogforum-comments'] : false;
 
-		// Get an array of the logged in user's favorite activities
-		$this->my_favs = maybe_unserialize( bp_get_user_meta( bp_loggedin_user_id(), 'bp_favorite_activities', true ) );
-
 		// Fetch specific activity items based on ID's
 		if ( !empty( $include ) ) {
 			$this->activities = bp_activity_get_specific( array(
@@ -610,13 +607,8 @@ function bp_has_activities( $args = '' ) {
 					}
 					break;
 				case 'favorites':
-					$favs = bp_activity_get_user_favorites( $user_id );
-					if ( empty( $favs ) )
-						return false;
-
-					$in = implode( ',', (array) $favs );
+					$action = 'user_favorites';
 					$display_comments = true;
-					$user_id = 0;
 					break;
 				case 'mentions':
 
@@ -1751,7 +1743,7 @@ function bp_activity_is_favorite() {
 	function bp_get_activity_is_favorite() {
 		global $activities_template;
 
- 		return apply_filters( 'bp_get_activity_is_favorite', in_array( $activities_template->activity->id, (array) $activities_template->my_favs ) );
+ 		return apply_filters( 'bp_get_activity_is_favorite', in_array( bp_loggedin_user_id(), (array) $activities_template->activity->user_favorites ) );
 	}
 
 /**
@@ -2737,6 +2729,87 @@ function bp_total_favorite_count_for_user( $user_id = 0 ) {
 	}
 	add_filter( 'bp_get_total_favorite_count_for_user', 'bp_core_number_format' );
 
+
+function bp_activity_get_favorite_count() {
+	global $activities_template;
+
+	$count = 0;
+
+	if ( ! empty( $activities_template->activity->user_favorites ) ) {
+		$count = count( (array) $activities_template->activity->user_favorites );
+	}
+
+	return apply_filters( 'bp_activity_get_favorite_count', $count );
+}
+
+
+function bp_activity_user_favorites() {
+	echo bp_get_activity_user_favorites();
+}
+
+	function bp_get_activity_user_favorites() {
+		global $activities_template;
+
+		if ( empty( $activities_template->activity->user_favorites ) ) {
+			return;
+		}
+
+		$output = '<ul class="user-favorites-list">';
+
+		foreach( (array) $activities_template->activity->user_favorites as $user_id ) {
+			$user_avatar = bp_core_fetch_avatar( array(
+				'item_id' => $user_id,
+				'object'  => 'user',
+				'type'    => 'thumb',
+				'width'   => 50,
+				'height'  => 50,
+				'html'    => true,
+				'class'   => 'user-favorite-' . $user_id
+			) );
+			$output .= '<li><a href="' . bp_core_get_userlink( $user_id, false, true ) .'">' . $user_avatar . '</a></li>';
+		}
+
+		$output .= '</ul>';
+
+		return apply_filters( 'bp_get_activity_user_favorites', $output, $activities_template->activity->id, $activities_template->activity->user_favorites );
+	}
+
+
+function bp_activity_interactions_nav() {
+	echo bp_get_activity_interactions_nav();
+}
+
+	function bp_get_activity_interactions_nav() {
+		global $activities_template;
+
+		if ( ( is_user_logged_in() && bp_activity_can_comment() ) || ( is_user_logged_in() && bp_activity_can_favorite() ) || bp_is_single_activity() ) {
+
+			$class_nav = $class_favorite = '';
+			$comments_count  = bp_activity_get_comment_count();
+			$favorites_count = bp_activity_get_favorite_count();
+
+			if ( 0 ==  $comments_count + $favorites_count )  {
+				$class_nav = ' hide';
+			}
+
+			$output = '<ul class="activity-interactions-nav'. $class_nav .'">';
+			$output .= '<li class="activity-interactions current"><a href="#" class="activity-comments-interaction">' .  sprintf( __( 'Replies <span>%s</span>', 'buddypress' ), $comments_count ) . '</a></li>';
+
+			if ( 0 == $favorites_count ) {
+				$class_favorite = ' hide';
+			}
+
+			$output .= '<li class="activity-interactions'. $class_favorite .'"><a href="#" class="activity-favorites-interaction">' .  sprintf( __( 'Favorites <span>%s</span>', 'buddypress' ), $favorites_count ) . '</a></li>';
+
+			$output .= '</ul>';
+
+		} else {
+			$output = false;
+		}
+
+		return apply_filters( 'bp_get_activity_interactions_nav', $output );
+	}
+
 /**
  * Output the total mention count for a specified user.
  *
diff --git src/bp-core/admin/bp-core-schema.php src/bp-core/admin/bp-core-schema.php
index 106f628..5503171 100644
--- src/bp-core/admin/bp-core-schema.php
+++ src/bp-core/admin/bp-core-schema.php
@@ -125,6 +125,16 @@ function bp_core_install_activity_streams() {
 				KEY meta_key (meta_key)
 		   	   ) {$charset_collate};";
 
+	$sql[] = "CREATE TABLE {$bp_prefix}bp_activity_favorites (
+				id bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+				activity_id bigint(20) NOT NULL,
+				user_id bigint(20) NOT NULL,
+				date_favorited datetime NOT NULL,
+				KEY activity_id (activity_id),
+				KEY user_id (user_id),
+				KEY date_favorited (date_favorited)
+			) {$charset_collate};";
+
 	dbDelta( $sql );
 }
 
diff --git src/bp-core/bp-core-update.php src/bp-core/bp-core-update.php
index 20bdb6c..5671247 100644
--- src/bp-core/bp-core-update.php
+++ src/bp-core/bp-core-update.php
@@ -240,6 +240,11 @@ function bp_version_updater() {
 		if ( $raw_db_version < 8311 ) {
 			bp_update_to_2_0_1();
 		}
+
+		// 2.1
+		if ( $raw_db_version < 8312 ) {
+			bp_update_to_2_1();
+		}
 	}
 
 	/** All done! *************************************************************/
@@ -389,6 +394,23 @@ function bp_update_to_2_0_1() {
 }
 
 /**
+ * 2.1 database upgrade routine
+ *
+ * @since BuddyPress (2.1.0)
+ *
+ * @return void
+ */
+function bp_update_to_2_1() {
+	/** Install activity tables for favorites table *********************/
+
+	bp_core_install_activity_streams();
+
+	/** Migrate favorites data ******************************************/
+
+	bp_activity_favorites_migrate();
+}
+
+/**
  * Redirect user to BP's What's New page on first page load after activation.
  *
  * @since BuddyPress (1.7.0)
diff --git src/bp-loader.php src/bp-loader.php
index 96e517f..42ce83a 100644
--- src/bp-loader.php
+++ src/bp-loader.php
@@ -302,7 +302,7 @@ class BuddyPress {
 		/** Versions **************************************************/
 
 		$this->version    = '2.1-alpha';
-		$this->db_version = 8311;
+		$this->db_version = 8312;
 
 		/** Loading ***************************************************/
 
diff --git src/bp-members/bp-members-functions.php src/bp-members/bp-members-functions.php
index eea5790..0e3efb3 100644
--- src/bp-members/bp-members-functions.php
+++ src/bp-members/bp-members-functions.php
@@ -938,22 +938,24 @@ function bp_update_user_last_activity( $user_id = 0, $time = '' ) {
 	// As of BuddyPress 2.0, last_activity is no longer stored in usermeta.
 	// However, we mirror it there for backward compatibility. Do not use!
 	// Remove our warning and re-add.
-	remove_filter( 'update_user_metadata', '_bp_update_user_meta_last_activity_warning', 10, 4 );
-	remove_filter( 'get_user_metadata', '_bp_get_user_meta_last_activity_warning', 10, 3 );
+	remove_filter( 'update_user_metadata', '_bp_update_user_meta_activity_warning', 10, 4 );
+	remove_filter( 'get_user_metadata', '_bp_get_user_meta_activity_warning', 10, 3 );
 	update_user_meta( $user_id, 'last_activity', $time );
-	add_filter( 'update_user_metadata', '_bp_update_user_meta_last_activity_warning', 10, 4 );
-	add_filter( 'get_user_metadata', '_bp_get_user_meta_last_activity_warning', 10, 3 );
+	add_filter( 'update_user_metadata', '_bp_update_user_meta_activity_warning', 10, 4 );
+	add_filter( 'get_user_metadata', '_bp_get_user_meta_activity_warning', 10, 3 );
 
 	return BP_Core_User::update_last_activity( $user_id, $time );
 }
 
 /**
- * Backward compatibility for 'last_activity' usermeta fetching.
+ * Backward compatibility for 'last_activity' && bp_favorite_activities usermeta fetching.
  *
  * In BuddyPress 2.0, user last_activity data was moved out of usermeta. For
  * backward compatibility, we continue to mirror the data there. This function
  * serves two purposes: it warns plugin authors of the change, and it returns
  * the data from the proper location.
+ * 
+ * In BuddyPress 2.1, bp_favorite_activities was also moved out of usermeta.
  *
  * @since BuddyPress (2.0.0)
  *
@@ -963,22 +965,32 @@ function bp_update_user_last_activity( $user_id = 0, $time = '' ) {
  * @param int $object_id ID of the user.
  * @param string $meta_key Meta key being fetched.
  */
-function _bp_get_user_meta_last_activity_warning( $retval, $object_id, $meta_key ) {
-	static $warned;
+function _bp_get_user_meta_activity_warning( $retval, $object_id, $meta_key ) {
+	static $warned = array();
 
 	if ( 'last_activity' === $meta_key ) {
 		// Don't send the warning more than once per pageload
-		if ( empty( $warned ) ) {
+		if ( empty( $warned['last_activity'] ) ) {
 			_doing_it_wrong( 'get_user_meta( $user_id, \'last_activity\' )', __( 'User last_activity data is no longer stored in usermeta. Use bp_get_user_last_activity() instead.', 'buddypress' ), '2.0.0' );
-			$warned = 1;
+			$warned['last_activity'] = 1;
 		}
 
 		return bp_get_user_last_activity( $object_id );
 	}
 
+	if ( 'bp_favorite_activities' === $meta_key ) {
+		// Don't send the warning more than once per pageload
+		if ( empty( $warned['bp_favorite_activities'] ) ) {
+			_doing_it_wrong( 'get_user_meta( $user_id, \'bp_favorite_activities\' )', __( 'User bp_favorite_activities data is no longer stored in usermeta. Use bp_activity_get_user_favorites() instead.', 'buddypress' ), '2.1.0' );
+			$warned['bp_favorite_activities'] = 1;
+		}
+
+		return bp_activity_get_user_favorites( $object_id );
+	}
+
 	return $retval;
 }
-add_filter( 'get_user_metadata', '_bp_get_user_meta_last_activity_warning', 10, 3 );
+add_filter( 'get_user_metadata', '_bp_get_user_meta_activity_warning', 10, 3 );
 
 /**
  * Backward compatibility for 'last_activity' usermeta setting.
@@ -997,13 +1009,17 @@ add_filter( 'get_user_metadata', '_bp_get_user_meta_last_activity_warning', 10,
  * @param string $meta_key Meta key being fetched.
  * @param string $meta_value Active time.
  */
-function _bp_update_user_meta_last_activity_warning( $meta_id, $object_id, $meta_key, $meta_value ) {
+function _bp_update_user_meta_activity_warning( $meta_id, $object_id, $meta_key, $meta_value ) {
 	if ( 'last_activity' === $meta_key ) {
 		_doing_it_wrong( 'update_user_meta( $user_id, \'last_activity\' )', __( 'User last_activity data is no longer stored in usermeta. Use bp_update_user_last_activity() instead.', 'buddypress' ), '2.0.0' );
 		bp_update_user_last_activity( $object_id, $meta_value );
 	}
+
+	if ( 'bp_favorite_activities' === $meta_key ) {
+		_doing_it_wrong( 'update_user_meta( $user_id, \'bp_favorite_activities\' )', __( 'User bp_favorite_activities data is no longer stored in usermeta. Use bp_activity_add_user_favorite() or bp_activity_remove_user_favorite() instead.', 'buddypress' ), '2.1.0' );
+	}
 }
-add_filter( 'update_user_metadata', '_bp_update_user_meta_last_activity_warning', 10, 4 );
+add_filter( 'update_user_metadata', '_bp_update_user_meta_activity_warning', 10, 4 );
 
 /**
  * Get the last activity for a given user.
diff --git src/bp-templates/bp-legacy/buddypress-functions.php src/bp-templates/bp-legacy/buddypress-functions.php
index 784b2dc..5ecb49c 100644
--- src/bp-templates/bp-legacy/buddypress-functions.php
+++ src/bp-templates/bp-legacy/buddypress-functions.php
@@ -919,12 +919,27 @@ function bp_legacy_theme_mark_activity_favorite() {
 	if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
 		return;
 
-	if ( bp_activity_add_user_favorite( $_POST['id'] ) )
-		_e( 'Remove Favorite', 'buddypress' );
-	else
-		_e( 'Favorite', 'buddypress' );
+	$result = array();
+	$user_id = bp_loggedin_user_id();
+
+	if ( bp_activity_add_user_favorite( $_POST['id'] ) ) {
+		$result['button'] = __( 'Remove Favorite', 'buddypress' );
+		$user_avatar = bp_core_fetch_avatar( array(
+			'item_id' => $user_id,
+			'object'  => 'user',
+			'type'    => 'thumb',
+			'width'   => 50,
+			'height'  => 50,
+			'html'    => true,
+			'class'   => 'user-favorite-' . $user_id
+		) );
+		$result['avatar'] = '<li><a href="' . bp_core_get_userlink( $user_id, false, true ) .'">' . $user_avatar . '</a></li>';
+	} else {
+		$result['button'] = __( 'Favorite', 'buddypress' );
+		$result['avatar'] = 0;
+	}
 
-	exit;
+	exit( json_encode( $result ) );
 }
 
 /**
@@ -938,12 +953,17 @@ function bp_legacy_theme_unmark_activity_favorite() {
 	if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
 		return;
 
-	if ( bp_activity_remove_user_favorite( $_POST['id'] ) )
-		_e( 'Favorite', 'buddypress' );
-	else
-		_e( 'Remove Favorite', 'buddypress' );
+	$result = array();
 
-	exit;
+	if ( bp_activity_remove_user_favorite( $_POST['id'] ) ){
+		$result['button'] = __( 'Favorite', 'buddypress' );
+		$result['avatar'] = bp_loggedin_user_id();
+	} else {
+		$result['button'] = __( 'Remove Favorite', 'buddypress' );
+		$result['avatar'] = 0;
+	}
+
+	exit( json_encode( $result ) );
 }
 
 /**
diff --git src/bp-templates/bp-legacy/buddypress/activity/entry.php src/bp-templates/bp-legacy/buddypress/activity/entry.php
index 24e296b..9825c25 100644
--- src/bp-templates/bp-legacy/buddypress/activity/entry.php
+++ src/bp-templates/bp-legacy/buddypress/activity/entry.php
@@ -55,7 +55,7 @@
 
 				<?php if ( bp_activity_can_comment() ) : ?>
 
-					<a href="<?php bp_activity_comment_link(); ?>" class="button acomment-reply bp-primary-action" id="acomment-comment-<?php bp_activity_id(); ?>"><?php printf( __( 'Comment <span>%s</span>', 'buddypress' ), bp_activity_get_comment_count() ); ?></a>
+					<a href="<?php bp_activity_comment_link(); ?>" class="button acomment-reply bp-primary-action" id="acomment-comment-<?php bp_activity_id(); ?>"><?php esc_html_e( 'Comment', 'buddypress' ); ?></a>
 
 				<?php endif; ?>
 
@@ -83,6 +83,8 @@
 
 	</div>
 
+	<?php bp_activity_interactions_nav(); ?>
+
 	<?php do_action( 'bp_before_activity_entry_comments' ); ?>
 
 	<?php if ( ( is_user_logged_in() && bp_activity_can_comment() ) || bp_is_single_activity() ) : ?>
@@ -117,6 +119,18 @@
 
 	<?php do_action( 'bp_after_activity_entry_comments' ); ?>
 
+	<?php if ( ( is_user_logged_in() && bp_activity_can_favorite() ) || bp_is_single_activity() ) : ?>
+
+		<div class="activity-favorites">
+
+			<?php bp_activity_user_favorites(); ?>
+
+		</div>
+
+	<?php endif; ?>
+
+	<?php do_action( 'bp_after_activity_entry_favorites' ); ?>
+
 </li>
 
 <?php do_action( 'bp_after_activity_entry' ); ?>
diff --git src/bp-templates/bp-legacy/css/buddypress.css src/bp-templates/bp-legacy/css/buddypress.css
index 36a16c7..c0d7975 100644
--- src/bp-templates/bp-legacy/css/buddypress.css
+++ src/bp-templates/bp-legacy/css/buddypress.css
@@ -12,6 +12,7 @@ Hello, this is the BuddyPress Legacy stylesheet.
 	3.1 - Activity
 		3.1.1 - Activity Listing
 		3.1.2 - Activity Comments
+		3.1.3 - Activity Favorites
 	3.2 - Toolbar
 	3.3 - Directories - Members, Groups, Blogs, Forums
 	3.4 - Error / Success Messages
@@ -484,6 +485,93 @@ body.activity-permalink #buddypress div.activity-comments div.acomment-content {
 	color: inherit;
 }
 
+
+/*--------------------------------------------------------------
+3.1.3 - Activity Favorites
+--------------------------------------------------------------*/
+#buddypress .activity-list li ul.activity-interactions-nav {
+	list-style: none;
+	margin: 20px 0 10px 70px;
+	overflow: hidden; /* IE fix */
+	position: relative;
+	width: auto;
+	clear: both;
+}
+
+#buddypress .activity-list li ul.activity-interactions-nav.hide,
+#buddypress .activity-list li ul.activity-interactions-nav li.hide {
+	display:none;
+}
+
+
+#buddypress .activity-list li ul.activity-interactions-nav li {
+	float: left;
+	margin:0;
+	padding: 4px 8px;
+	font-size: 90%;
+	border-bottom: none;
+}
+
+#buddypress .activity-list li ul.activity-interactions-nav li a {
+	text-decoration: none;
+	color:#555;
+}
+
+#buddypress .activity-list li ul.activity-interactions-nav li.current {
+	background-color: #eee;
+	color: #555;
+	opacity: .8;
+	font-weight: bold;
+}
+
+#buddypress .activity-list li ul.activity-interactions-nav li.current span {
+	background-color: #fff;
+}
+
+#buddypress .activity-list li ul.activity-interactions-nav li span {
+	background: #eee;
+	border-radius: 50%;
+	border: 1px solid #ccc;
+	color: #999;
+	display: inline;
+	font-size: 70%;
+	margin-left: 2px;
+	padding: 3px 6px;
+	text-align: center;
+	vertical-align: middle;
+}
+
+#buddypress div.activity-favorites {
+	display:none;
+	margin: 0 0 0 70px;
+	overflow: hidden; /* IE fix */
+	position: relative;
+	width: auto;
+	clear: both;
+}
+
+#buddypress div.activity-favorites ul.user-favorites-list li {
+	padding:0;
+	float: left;
+	border-bottom: none;
+}
+
+#buddypress div.activity-favorites ul.user-favorites-list {
+	overflow: hidden;
+	list-style: none;
+	width: auto;
+	clear: both;
+}
+
+#buddypress div.activity-favorites ul.user-favorites-list li img {
+	border-width: 1px;
+	float: left;
+	height: 25px;
+	margin-right: 10px;
+	width: 25px;
+}
+
+
 /*--------------------------------------------------------------
 3.3 - Directories - Members, Groups, Blogs, Forums
 --------------------------------------------------------------*/
diff --git src/bp-templates/bp-legacy/js/buddypress.js src/bp-templates/bp-legacy/js/buddypress.js
index dd009ea..2a9d045 100644
--- src/bp-templates/bp-legacy/js/buddypress.js
+++ src/bp-templates/bp-legacy/js/buddypress.js
@@ -284,7 +284,7 @@ jq(document).ready( function() {
 				target.removeClass('loading');
 
 				target.fadeOut( 200, function() {
-					jq(this).html(response);
+					jq(this).html(response['button']);
 					jq(this).attr('title', 'fav' === type ? BP_DTheme.remove_fav : BP_DTheme.mark_as_fav);
 					jq(this).fadeIn(200);
 				});
@@ -297,6 +297,17 @@ jq(document).ready( function() {
 
 						jq('.item-list-tabs ul #activity-favorites span').html( Number( jq('.item-list-tabs ul #activity-favorites span').html() ) + 1 );
 					}
+					jq('#activity-' + parent_id + ' ul.activity-interactions-nav').removeClass('hide');
+					jq('#activity-' + parent_id + ' a.activity-favorites-interaction').parent().removeClass('hide');
+					jq('#activity-' + parent_id + ' a.activity-favorites-interaction span').html( Number( jq('#activity-' + parent_id + ' a.activity-favorites-interaction span').html() ) + 1 );
+
+					if ( ! jq( '#activity-' + parent_id + ' .user-favorites-list' ).length ) {
+						jq( '#activity-' + parent_id + ' .activity-favorites' ).append('<ul class="user-favorites-list"></ul>');
+					}
+
+					if ( 0 != response['avatar'] ){
+						jq( '#activity-' + parent_id + ' .user-favorites-list' ).append( response['avatar'] );
+					}
 
 					target.removeClass('fav');
 					target.addClass('unfav');
@@ -306,6 +317,17 @@ jq(document).ready( function() {
 					target.addClass('fav');
 
 					jq('.item-list-tabs ul #activity-favorites span').html( Number( jq('.item-list-tabs ul #activity-favorites span').html() ) - 1 );
+					jq('#activity-' + parent_id + ' a.activity-favorites-interaction span').html( Number( jq('#activity-' + parent_id + ' a.activity-favorites-interaction span').html() ) - 1 );
+
+					if ( jq( '#activity-' + parent_id + ' .user-favorites-list' ).length ) {
+						jq( '#activity-' + parent_id + ' .user-favorites-list li' ).each( function() {
+							avatar = jq(this).find('img').prop( 'class' ).match( /user-favorite-([0-9]+)/ );
+
+							if ( typeof avatar != 'undefined' && avatar[1] == response['avatar'] ) {
+								jq(this).remove();
+							}
+						});
+					}
 
 					if ( !Number( jq('.item-list-tabs ul #activity-favorites span').html() ) ) {
 						if ( jq('.item-list-tabs ul #activity-favorites').hasClass('selected') ) {
@@ -319,7 +341,7 @@ jq(document).ready( function() {
 				if ( 'activity-favorites' === jq( '.item-list-tabs li.selected').attr('id') ) {
 					target.closest( '.activity-item' ).slideUp( 100 );
 				}
-			});
+			}, 'json' );
 
 			return false;
 		}
@@ -459,6 +481,33 @@ jq(document).ready( function() {
 			// reset the newest activities now they're displayed
 			newest_activities = '';
 		}
+
+		if ( target.parent().hasClass( 'activity-interactions' ) ) {
+			
+			event.preventDefault();
+
+			var css_class = target.attr('class').split( ' ' ),
+				current_div = css_class[0].replace( '-interaction', '' ),
+				div_tohide = '',
+				parent_li = target.parent(),
+				parent_ul = parent_li.parent();
+
+			parent_ul.children( 'li' ).each( function() {
+				jq( this ).removeClass( 'current' );
+
+				if ( jq( this ).find('a').prop( 'class' ) != target.prop( 'class' ) ) {
+					div_tohide = jq.trim( jq( this ).find('a').prop( 'class' ) ).replace( '-interaction', '' );
+				}
+			});
+
+			jq( parent_li ).addClass( 'current' );
+
+			if ( ! div_tohide.length )
+				return
+			
+			parent_ul.parent().find( '.' + div_tohide  ).first().hide();
+			parent_ul.parent().find( '.' + current_div  ).first().show();
+		}
 	});
 
 	// Activity "Read More" links
@@ -507,6 +556,9 @@ jq(document).ready( function() {
 
 		/* Comment / comment reply links */
 		if ( target.hasClass('acomment-reply') || target.parent().hasClass('acomment-reply') ) {
+
+			target.parent().parent().parent().find( '.activity-comments-interaction' ).first().trigger( 'click' );
+
 			if ( target.parent().hasClass('acomment-reply') ) {
 				target = target.parent();
 			}
@@ -612,7 +664,8 @@ jq(document).ready( function() {
 					jq( '#' + form.attr('id') + ' textarea').val('');
 
 					/* Increase the "Reply (X)" button count */
-					jq('#activity-' + form_id[2] + ' a.acomment-reply span').html( Number( jq('#activity-' + form_id[2] + ' a.acomment-reply span').html() ) + 1 );
+					jq('#activity-' + form_id[2] + ' ul.activity-interactions-nav').removeClass('hide');
+					jq('#activity-' + form_id[2] + ' a.activity-comments-interaction span').html( Number( jq('#activity-' + form_id[2] + ' a.activity-comments-interaction span').html() ) + 1 );
 
 					// Increment the 'Show all x comments' string, if present
 					show_all_a = activity_comments.find('.show-all').find('a');
