diff --git src/bp-activity/bp-activity-actions.php src/bp-activity/bp-activity-actions.php
index f8c5d52..bdb052e 100644
--- src/bp-activity/bp-activity-actions.php
+++ src/bp-activity/bp-activity-actions.php
@@ -600,7 +600,7 @@ add_action( 'bp_actions', 'bp_activity_action_mentions_feed' );
  * @return bool False on failure.
  */
 function bp_activity_action_favorites_feed() {
-	if ( ! bp_is_user_activity() || ! bp_is_current_action( 'favorites' ) || ! bp_is_action_variable( 'feed', 0 ) ) {
+	if ( ! bp_is_user_activity() || ! bp_is_current_action( bp_get_activity_favorites_slug() ) || ! bp_is_action_variable( 'feed', 0 ) ) {
 		return false;
 	}
 
@@ -615,7 +615,7 @@ function bp_activity_action_favorites_feed() {
 		/* translators: User activity favorites RSS title - "[Site Name] | [User Display Name] | Favorites" */
 		'title'         => sprintf( __( '%1$s | %2$s | Favorites', 'buddypress' ), bp_get_site_name(), bp_get_displayed_user_fullname() ),
 
-		'link'          => bp_displayed_user_domain() . bp_get_activity_slug() . '/favorites/',
+		'link'          => bp_displayed_user_domain() . bp_get_activity_slug() . '/' . bp_get_activity_favorites_slug() . '/',
 		'description'   => sprintf( __( "Activity feed of %s's favorites.", 'buddypress' ), bp_get_displayed_user_fullname() ),
 		'activity_args' => 'include=' . $fav_ids
 	) );
@@ -647,3 +647,105 @@ function bp_activity_setup_akismet() {
 	// Instantiate Akismet for BuddyPress
 	$bp->activity->akismet = new BP_Akismet();
 }
+
+/**
+ * Add globals for activity favorites
+ *
+ * @since BuddyPress (2.1.0)
+ *
+ * @uses buddypress() to get main instance
+ */
+function bp_activity_favorites_globals() {
+	$bp = buddypress();
+
+	/**
+	 * Add some globals for names/slugs/strings
+	 * It's easier this way to cutomize all strings at once
+	 * for instance if you prefer the "like" terminology
+	 */
+	$bp->activity->favorites = new stdClass;
+
+	// Default
+	$favorite_default_args = array(
+		// Activity action args
+		'description'   => _x( 'Favorited an update', 'favorites activity description', 'buddypress' ),
+		'label'         => _x( 'Favorites', 'favorites activity dropdown label', 'buddypress' ),
+		// Wether you want to show the favorites in Activity Directory / group single item activities, 
+		// member single item activities, or the groups tab of member single item activities
+		'contexts'      => array( 'activity', 'group', 'member', 'member_groups' ),
+		// Strings
+		'directory_tab' => _x( 'My Favorites', 'favorites directory tab', 'buddypress' ),
+		// The action button in activity stream to favorite an update
+		'fav_button'    => _x( 'Favorite', 'favorite button', 'buddypress' ),
+		// The action button in activity stream to remove a favorited update
+		'unfav_button'  => _x( 'Remove Favorite', 'unfavorite button', 'buddypress' ),
+		// Nav name
+		'subnav'        => _x( 'Favorites', 'favorites member subnav', 'buddypress' ),
+		// Slug
+		'slug'          => 'favorites'
+	);
+
+	// Use this filter to customize the strings the way you want.
+	$favorite_args = apply_filters( 'bp_activity_favorites_globals', $favorite_default_args );
+
+	// Set favorite globals
+	foreach ( $favorite_args as $key => $arg ) {
+		$bp->activity->favorites->{$key} = $arg;
+	}
+}
+add_action( 'bp_activity_setup_globals', 'bp_activity_favorites_globals' );
+
+/**
+ * Handles the saving of favorites privacy
+ *
+ * @since BuddyPress (2.1.0)
+ */
+function bp_activity_favorites_action_settings() {
+
+	// Bail if not a POST action
+	if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) ) {
+		return;
+	}
+
+	// Bail if no submit action
+	if ( ! isset( $_POST['favorites-settings-submit'] ) ) {
+		return;
+	}
+
+	// 404 if there are any additional action variables attached
+	if ( bp_action_variables() ) {
+		bp_do_404();
+		return;
+	}
+
+	// Nonce check
+	check_admin_referer( 'bp_activity_favorites_settings' );
+
+	do_action( 'bp_activity_favorites_settings_before_save' );
+
+	/** Save ******************************************************************/
+
+	$user_id = bp_displayed_user_id();
+
+	// Only save if there are field ID's being posted
+	if ( ! empty( $_POST['bp_favorites_private'] ) ) {
+		// Save the visibility settings
+		bp_update_user_meta( $user_id, 'bp_favorites_private', absint( $_POST['bp_favorites_private'] ) );
+		// hide favorited activities
+		bp_activity_hide_user_activity( $user_id, 'activity_favorite' );
+	} else {
+		// Delete the visibility settings
+		bp_delete_user_meta( $user_id, 'bp_favorites_private' );
+		// hide favorited activities
+		bp_activity_show_user_activity( $user_id, 'activity_favorite' );
+	}
+
+	/** Other *****************************************************************/
+
+	do_action( 'bp_activity_favorites_settings_after_save' );
+
+	bp_core_add_message( __( 'Favorites privacy saved', 'buddypress' ) );
+	// Redirect to the root domain
+	bp_core_redirect( bp_displayed_user_domain() . bp_get_settings_slug() . '/' . bp_get_activity_favorites_slug() );
+}
+add_action( 'bp_activity_screen_favorites_settings', 'bp_activity_favorites_action_settings' );
diff --git src/bp-activity/bp-activity-classes.php src/bp-activity/bp-activity-classes.php
index f1e6054..bdbc75b 100644
--- src/bp-activity/bp-activity-classes.php
+++ src/bp-activity/bp-activity-classes.php
@@ -324,6 +324,7 @@ class BP_Activity_Activity {
 
 		// Where conditions
 		$where_conditions = array();
+		$excluded_types = array();
 
 		// Spam
 		if ( 'ham_only' == $spam )
@@ -337,6 +338,32 @@ class BP_Activity_Activity {
 			$where_conditions['search_sql'] = "a.content LIKE '%%" . esc_sql( like_escape( $search_terms ) ) . "%%'";
 		}
 
+		// In activity administration & stream mode, display favorites
+		if ( 'stream' !== $display_comments ) {
+			// Exclude 'activity_favorite' items unless the 'action' filter has
+			// been explicitly set
+			if ( empty( $filter['action'] ) ) {
+				$excluded_types[] = 'activity_favorite';
+
+			// If explicitly set transform this as a specific meta query
+			} else if ( 'activity_favorite' == $filter['action'] ) {
+				$meta_query_args = array(
+						'key'     => 'activity_favorite',
+						'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;
@@ -376,13 +403,17 @@ class BP_Activity_Activity {
 		// comments in the stream like normal comments or threaded below
 		// the activity.
 		if ( false === $display_comments || 'threaded' === $display_comments ) {
-			$where_conditions[] = "a.type != 'activity_comment'";
+			$excluded_types[] = 'activity_comment';
 		}
 
 		// Exclude 'last_activity' items unless the 'action' filter has
 		// been explicitly set
 		if ( empty( $filter['object'] ) ) {
-			$where_conditions[] = "a.type != 'last_activity'";
+			$excluded_types[] = 'last_activity';
+		}
+
+		if ( ! empty( $excluded_types ) ) {
+			$where_conditions[] = "a.type NOT IN( '" . implode( "','", $excluded_types ) . "' )";
 		}
 
 		// Filter the where conditions
@@ -465,6 +496,9 @@ class BP_Activity_Activity {
 		// Generate action strings
 		$activities = BP_Activity_Activity::generate_action_strings( $activities );
 
+		// Append user_ids who favorited activities
+		$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 +678,36 @@ 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'] ) && 'activity_favorite' == $activity_meta_query->queries[0]['key'] ) {
+				$wpdb->activitymeta = buddypress()->activity->table_name;
+			} 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 == $wpdb->activitymeta ) {
+				$sql_array['join']  = str_replace( 'JOIN '. $wpdb->activitymeta, 'JOIN '. $wpdb->activitymeta . ' f', $sql_array['join'] );
+				$sql_array['join']  = str_replace( $wpdb->activitymeta .'.activity_id' , 'f.item_id', $sql_array['join'] );
+
+				if ( 'EXISTS' == strtoupper( $activity_meta_query->queries[0]['compare'] ) ) {
+					$sql_array['where'] = str_replace( $wpdb->activitymeta .'.meta_key', 'f.type', $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] ) ) {
+						$table = str_replace( $wpdb->activitymeta, 'f', $matches[1] );
+						$sql_array['where'] = $wpdb->prepare( "( f.type = %s AND {$table}user_id = %d )", $activity_meta_query->queries[0]['key'], $user_id );
+					}
+				}
+				// Restore activitymeta table
+				$wpdb->activitymeta = buddypress()->activity->table_name_meta;
+			}
 		}
 
 		return $sql_array;
@@ -811,28 +868,28 @@ class BP_Activity_Activity {
 		else
 			return false;
 
-		// Fetch the activity IDs so we can delete any comments for this activity item
+		// Fetch the activity IDs so we can delete any children for this activity item
 		$activity_ids = $wpdb->get_col( "SELECT id FROM {$bp->activity->table_name} {$where_sql}" );
 
 		if ( ! $wpdb->query( "DELETE FROM {$bp->activity->table_name} {$where_sql}" ) ) {
 			return false;
 		}
 
-		// Handle accompanying activity comments and meta deletion
+		// Handle accompanying activity children and meta deletion
 		if ( $activity_ids ) {
 			$activity_ids_comma          = implode( ',', wp_parse_id_list( $activity_ids ) );
-			$activity_comments_where_sql = "WHERE type = 'activity_comment' AND item_id IN ({$activity_ids_comma})";
+			$activity_children_where_sql = "WHERE type IN ( 'activity_comment', 'activity_favorite' ) AND item_id IN ({$activity_ids_comma})";
 
-			// Fetch the activity comment IDs for our deleted activity items
-			$activity_comment_ids = $wpdb->get_col( "SELECT id FROM {$bp->activity->table_name} {$activity_comments_where_sql}" );
+			// Fetch the activity child IDs for our deleted activity items
+			$activity_child_ids = $wpdb->get_col( "SELECT id FROM {$bp->activity->table_name} {$activity_children_where_sql}" );
 
 			// We have activity comments!
-			if ( ! empty( $activity_comment_ids ) ) {
-				// Delete activity comments
-				$wpdb->query( "DELETE FROM {$bp->activity->table_name} {$activity_comments_where_sql}" );
+			if ( ! empty( $activity_child_ids ) ) {
+				// Delete activity children
+				$wpdb->query( "DELETE FROM {$bp->activity->table_name} {$activity_children_where_sql}" );
 
 				// Merge activity IDs with activity comment IDs
-				$activity_ids = array_merge( $activity_ids, $activity_comment_ids );
+				$activity_ids = array_merge( $activity_ids, $activity_child_ids );
 			}
 
 			// Delete all activity meta entries for activity items and activity comments
@@ -1283,10 +1340,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_id( $user_id );
+
+		if ( empty( $favorite_activity_entries ) )
 			return 0;
 
-		return count( maybe_unserialize( $favorite_activity_entries ) );
+		return count( $favorite_activity_entries );
 	}
 
 	/**
@@ -1305,12 +1364,132 @@ class BP_Activity_Activity {
 	 * Hide all activity for a given user.
 	 *
 	 * @param int $user_id The ID of the user whose activity you want to mark hidden.
-	 * @param int
+	 * @param string $type the activity type
+	 */
+	public static function hide_all_for_user( $user_id, $type = '' ) {
+		global $wpdb, $bp;
+
+		$where = array(
+			$wpdb->prepare( "user_id = %d", $user_id )
+		);
+
+		if ( ! empty( $type ) ) {
+			$where[] = "type = 'activity_favorite'";
+		}
+
+		$where = 'WHERE ' . implode( ' AND ', $where );
+
+		return $wpdb->get_var( "UPDATE {$bp->activity->table_name} SET hide_sitewide = 1 {$where}" );
+	}
+
+	/**
+	 * Show activity for a given user and a given type.
+	 *
+	 * @param int $user_id The ID of the user whose activity you want to mark hidden.
+	 * @param string $type the activity type
 	 */
-	public static function hide_all_for_user( $user_id ) {
+	public static function show_activity_for_user( $user_id, $type ) {
 		global $wpdb, $bp;
 
-		return $wpdb->get_var( $wpdb->prepare( "UPDATE {$bp->activity->table_name} SET hide_sitewide = 1 WHERE user_id = %d", $user_id ) );
+		if ( empty( $type ) ) {
+			return false;
+		}
+
+		return $wpdb->get_var( $wpdb->prepare( "UPDATE {$bp->activity->table_name} SET hide_sitewide = 0 WHERE user_id = %d AND type = %s", $user_id, $type ) );
+	}
+
+	/**
+	 * Append user_ids who favorited activities.
+	 *
+	 * @since BuddyPress (2.1.0)
+	 *
+	 * @param array $activities Activities to fetch user who favorited.
+	 * @return array The updated activities with attached user ids.
+	 */
+	public static function append_favorites( $activities = array() ) {
+
+		// Now fetch the user who favorited matching activities.
+		foreach ( (array) $activities as $key => $activity ) {
+			if ( 'activity_favorite' == $activity->type ) {
+				$activities[$key]->favorites = array();
+			}
+
+			$activities[$key]->favorites = self::get_favorites_by_activity_id( $activity->id );
+		}
+
+		return $activities;
+	}
+
+	/**
+	 * Get user_ids who favorited activities.
+	 *
+	 * @since BuddyPress (2.1.0)
+	 *
+	 * @param int $activity_id
+	 * @return array $users The users who favorited the activities.
+	 */
+	public static function get_favorites_by_activity_id( $activity_id = 0 ) {
+		global $wpdb;
+		$bp = buddypress();
+
+		$users = array();
+
+		if ( empty( $activity_id ) ) {
+			return $users;
+		}
+
+		$users = $wpdb->get_results( $wpdb->prepare( "SELECT user_id, hide_sitewide FROM {$bp->activity->table_name} WHERE type = 'activity_favorite' AND item_id = %d", $activity_id ) );
+		
+		// Admins can see all favorites
+		if( bp_current_user_can( 'bp_moderate' ) ) {
+			$users = wp_list_pluck( $users, 'user_id' );
+
+		// Only loggedin users can see their private favorites
+		} else {
+			$public = array();
+			foreach( $users as $key => $user ) {
+				// favorite is private and loggedin user is not the one who favorited the activity
+				if( bp_loggedin_user_id() == $user->user_id || 0 == $user->hide_sitewide ) {
+					$public[] = $user->user_id;
+				}
+			}
+			$users = $public;
+		}
+
+		return $users;
+	}
+
+	/**
+	 * Get user_ids who favorited activities.
+	 *
+	 * @since BuddyPress (2.1.0)
+	 *
+	 * @param int $user_id
+	 * @param int $activity_id
+	 * @return array $favorites The favorited activities.
+	 */
+	public static function get_favorites_by_user_id( $user_id = 0, $activity_id = 0 ) {
+		global $wpdb;
+		$bp = buddypress();
+
+		$favorites = array();
+
+		if ( empty( $user_id ) )
+			return $favorites;
+
+		$where = array(
+			"type = 'activity_favorite'",
+			$wpdb->prepare( "user_id = %d", $user_id )
+		);
+
+		if ( ! empty( $activity_id ) ) {
+			$where[] = $wpdb->prepare( "item_id = %d", $activity_id );
+		}
+
+		$where = 'WHERE ' . implode( ' AND ', $where );
+
+		$favorites = $wpdb->get_col( "SELECT item_id FROM {$bp->activity->table_name} {$where}" );
+		return $favorites;
 	}
 }
 
@@ -1530,7 +1709,7 @@ class BP_Activity_Feed {
 		switch ( $this->id ) {
 
 			// also output parent activity item if we're on a specific feed
-			case 'favorites' :
+			case bp_get_activity_favorites_slug() :
 			case 'friends' :
 			case 'mentions' :
 			case 'personal' :
diff --git src/bp-activity/bp-activity-functions.php src/bp-activity/bp-activity-functions.php
index 507387e..e0e529d 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_id() to get user's favorites
  * @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,21 +380,82 @@ 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_id( $user_id );
 
 	return apply_filters( 'bp_activity_get_user_favorites', $favs );
 }
 
 /**
+ * Get a users favorite privacy settings.
+ *
+ * @since BuddyPress (2.1.0)
+ *
+ * @uses bp_get_user_meta()
+ *
+ * @param int $user_id ID of the user
+ * @return bool True if private, false if public.
+ */
+function bp_activity_favorites_get_user_settings( $user_id = 0 ) {
+	// Bail if no user_id to check
+	if ( empty( $user_id ) ) {
+		return false;
+	}
+
+	return (bool) bp_get_user_meta( $user_id, 'bp_favorites_private', true );
+}
+
+/**
+ * Get a users favorite privacy preferences.
+ *
+ * @since BuddyPress (2.1.0)
+ *
+ * @uses bp_activity_favorites_get_user_settings()
+ * @uses apply_filters() To call the 'bp_activity_favorites_privacy' hook.
+ *
+ * @param int $user_id ID of the user whose favorites are being queried.
+ * @return bool True if public, false if private.
+ */
+function bp_activity_favorites_privacy( $user_id = 0 ) {
+	// Bail if no user_id to check
+	if ( empty( $user_id ) ) {
+		return false;
+	}
+
+	$public = true;
+
+	// Admins can always view
+	if ( bp_current_user_can( 'bp_moderate' ) ) {
+		return $public;
+
+	// Self can always view their favorites
+	} else if ( $user_id == bp_loggedin_user_id() ) {
+		return $public;
+
+	// If user had no way to set privacy, default to false
+	} else if ( ! bp_is_active( 'settings' ) ) {
+		$public = false;
+
+	// Check user's preference
+	} else {
+		// if private is set public is false
+		$public = ! bp_activity_favorites_get_user_settings( $user_id );
+	}
+
+	// An admin can force public for his community
+	return apply_filters( 'bp_activity_favorites_privacy', $public );
+}
+
+/**
  * Add an activity stream item as a favorite for a user.
  *
  * @since BuddyPress (1.2)
  *
  * @uses is_user_logged_in()
- * @uses bp_get_user_meta()
+ * @uses bp_loggedin_user_id() to default to current user logged in
+ * @uses BP_Activity_Activity::get_favorites_by_user_id() to check if the activity to favorite is not already favorited
  * @uses bp_activity_get_meta()
- * @uses bp_update_user_meta()
  * @uses bp_activity_update_meta()
+ * @uses bp_activity_add_favorite() to create the 'activity_favorite' activity
  * @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,35 +466,29 @@ 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 );
-	if ( empty( $my_favs ) || ! is_array( $my_favs ) ) {
-		$my_favs = array();
-	}
+	$is_fav = BP_Activity_Activity::get_favorites_by_user_id( $user_id, $activity_id );
 
-	// Bail if the user has already favorited this activity item
-	if ( in_array( $activity_id, $my_favs ) ) {
+	// Bail if Already favorited
+	if ( ! empty( $is_fav ) ) {
 		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;
+	$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 ) ) {
+	// Save the favorite
+	if ( bp_activity_add_favorite( $activity_id, $user_id ) ) {
 
 		// Execute additional code
 		do_action( 'bp_activity_add_user_favorite', $activity_id, $user_id );
@@ -456,10 +511,10 @@ 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_loggedin_user_id() to default to current user logged in
+ * @uses bp_activity_delete_by_item_id() to delete the favorite
  * @uses bp_activity_get_meta()
  * @uses bp_activity_update_meta()
- * @uses bp_update_user_meta()
  * @uses do_action() To call the 'bp_activity_remove_user_favorite' hook.
  *
  * @param int $activity_id ID of the activity item being unfavorited.
@@ -469,53 +524,111 @@ 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 );
+	// the favorite is an activity, so let's delete it
+	$removed = bp_activity_delete_by_item_id(  array(
+		'item_id' => $activity_id,
+		'type'    => 'activity_favorite',
+		'user_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 ) );
+	$fav_count = bp_activity_get_meta( $activity_id, 'favorite_count' );
+ 
+	// Error getting favorite count
+	if ( empty( $fav_count ) ) {
+		return false;
+	}
+	
+	// Deduct from total favorites
+	$count_updated = bp_activity_update_meta( $activity_id, 'favorite_count', (int) $fav_count - 1 );
 
-	// Update the total number of users who have favorited this activity
-	if ( $fav_count = bp_activity_get_meta( $activity_id, 'favorite_count' ) ) {
+	// 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;
+}
 
-		// Deduct from total favorites
-		if ( bp_activity_update_meta( $activity_id, 'favorite_count', (int) $fav_count - 1 ) ) {
+/**
+ * Add an activity typed 'activity_favorite' for the favorited activity
+ *
+ * @since BuddyPress (2.1.0)
+ * @uses  BP_Activity_Activity
+ * @uses  bp_activity_get_permalink()
+ * @uses  bp_core_get_userlink()
+ * @uses  bp_activity_add()
+ * @return int|bool the activity id created or false if it fails
+ */
+function bp_activity_add_favorite( $activity_id = 0, $user_id = 0 ) {
+	if ( empty( $activity_id ) || empty( $user_id ) )
+		return false;
 
-			// Update users favorites
-			if ( bp_update_user_meta( $user_id, 'bp_favorite_activities', $my_favs ) ) {
+	$bp = buddypress();
 
-				// Execute additional code
-				do_action( 'bp_activity_remove_user_favorite', $activity_id, $user_id );
+	// Parent activity exists ?
+	$activity = new BP_Activity_Activity( $activity_id );
 
-				// Success
-				return true;
+	if ( empty( $activity->type ) || 'activity_favorite' == $activity->type ) {
+		return false;
+	}
 
-			// Error updating
-			} else {
-				return false;
-			}
+	$primary_link   = bp_activity_get_permalink( $activity_id, $activity );
+	$description    = $bp->activity->favorites->description;
+	$action         = sprintf( _x( '%1$s %2$s', 'favorite action string', 'buddypress' ), bp_core_get_userlink( $user_id ), $description );
+	$global_privacy = apply_filters( 'bp_activity_favorites_privacy', bp_is_active( 'settings' ) );
+	$hide_sitewide  = ! $global_privacy ? true : bp_activity_favorites_get_user_settings( $user_id );
 
-		// Error updating favorite count
-		} else {
-			return false;
+	$args = array(
+		'user_id'           => $user_id,
+		'component'         => $bp->activity->id,
+		'type'              => 'activity_favorite',
+		'action'            => $action,
+		'content'           => '',
+		'primary_link'      => $primary_link,
+		'item_id'           => $activity_id,
+		'secondary_item_id' => $activity->user_id,
+		'hide_sitewide'     => $hide_sitewide,
+	);
+
+	return bp_activity_add( $args );
+}
+
+/**
+ * Migrate user's favorite (previously in bp_favorite_activities user meta) to activity table
+ *
+ * @since BuddyPress (2.1.0)
+ * @uses  bp_activity_add_favorite() to create the 'activity_favorite' activities
+ */
+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 );
 		}
 
-	// Error getting favorite count
-	} else {
-		return false;
 	}
 }
 
@@ -854,6 +967,19 @@ function bp_activity_register_activity_actions() {
 		__( 'Activity Comments', 'buddypress' )
 	);
 
+	$public_favorites = apply_filters( 'bp_activity_favorites_privacy', bp_is_active( 'settings' ) );
+
+	if ( ! empty( $public_favorites ) ) {
+		bp_activity_set_action(
+			$bp->activity->id,
+			'activity_favorite',
+			$bp->activity->favorites->description,
+			'bp_activity_format_activity_action_activity_favorites',
+			$bp->activity->favorites->label,
+			$bp->activity->favorites->contexts
+		);
+	}
+
 	do_action( 'bp_activity_register_activity_actions' );
 
 	// Backpat. Don't use this.
@@ -919,6 +1045,20 @@ function bp_activity_format_activity_action_activity_comment( $action, $activity
 	return apply_filters( 'bp_activity_comment_action', $action, $activity );
 }
 
+/**
+ * Format 'activity_favorite' activity actions.
+ *
+ * @since BuddyPress (2.1.0)
+ *
+ * @param string $action Static activity action.
+ * @param object $activity Activity data object.
+ * @return string
+ */
+function bp_activity_format_activity_action_activity_favorites( $action, $activity ) {
+	$action = sprintf( _x( '%1$s %2$s', 'favorite action string', 'buddypress' ), bp_core_get_userlink( $activity->user_id ), buddypress()->activity->favorites->description );
+	return apply_filters( 'bp_activity_favorite_action', $action, $activity );
+}
+
 /******************************************************************************
  * Business functions are where all the magic happens in BuddyPress. They will
  * handle the actual saving or manipulation of information. Usually they will
@@ -1599,7 +1739,7 @@ function bp_activity_get_permalink( $activity_id, $activity_obj = false ) {
 		$activity_obj = $activity_obj->current_comment;
 	}
 
-	if ( 'new_blog_post' == $activity_obj->type || 'new_blog_comment' == $activity_obj->type || 'new_forum_topic' == $activity_obj->type || 'new_forum_post' == $activity_obj->type ) {
+	if ( 'new_blog_post' == $activity_obj->type || 'new_blog_comment' == $activity_obj->type || 'new_forum_topic' == $activity_obj->type || 'new_forum_post' == $activity_obj->type || 'activity_favorite' == $activity_obj->type ) {
 		$link = $activity_obj->primary_link;
 	} else {
 		if ( 'activity_comment' == $activity_obj->type ) {
@@ -1620,10 +1760,26 @@ function bp_activity_get_permalink( $activity_id, $activity_obj = false ) {
  * @uses BP_Activity_Activity::hide_all_for_user() {@link BP_Activity_Activity}
  *
  * @param int $user_id The ID of the user whose activity is being hidden.
+ * @param string $type the activity type to hide (Defaults to all)
+ * @return bool True on success, false on failure.
+ */
+function bp_activity_hide_user_activity( $user_id, $type = '' ) {
+	return BP_Activity_Activity::hide_all_for_user( $user_id, $type );
+}
+
+/**
+ * Show a user's activity.
+ *
+ * @since BuddyPress (2.1.0)
+ *
+ * @uses BP_Activity_Activity::show_activity_for_user() {@link BP_Activity_Activity}
+ *
+ * @param int $user_id The ID of the user whose activity is being hidden.
+ * @param string $type the activity type to hide (Defaults to all)
  * @return bool True on success, false on failure.
  */
-function bp_activity_hide_user_activity( $user_id ) {
-	return BP_Activity_Activity::hide_all_for_user( $user_id );
+function bp_activity_show_user_activity( $user_id, $type = '' ) {
+	return BP_Activity_Activity::show_activity_for_user( $user_id, $type );
 }
 
 /**
diff --git src/bp-activity/bp-activity-loader.php src/bp-activity/bp-activity-loader.php
index 0f68f91..f3628a4 100644
--- src/bp-activity/bp-activity-loader.php
+++ src/bp-activity/bp-activity-loader.php
@@ -33,6 +33,12 @@ class BP_Activity_Component extends BP_Component {
 				'adminbar_myaccount_order' => 10
 			)
 		);
+
+		$this->show_settings = apply_filters( 'bp_activity_favorites_user_settings', bp_is_active( 'settings' ) );
+
+		if ( ! empty( $this->show_settings ) ) {
+			$this->setup_hooks();
+		}
 	}
 
 	/**
@@ -185,13 +191,14 @@ class BP_Activity_Component extends BP_Component {
 
 		// Favorite activity items
 		$sub_nav[] = array(
-			'name'            => __( 'Favorites', 'buddypress' ),
-			'slug'            => 'favorites',
+			'name'            => bp_get_activity_favorites_nav(),
+			'slug'            => bp_get_activity_favorites_slug(),
 			'parent_url'      => $activity_link,
 			'parent_slug'     => $this->slug,
 			'screen_function' => 'bp_activity_screen_favorites',
 			'position'        => 30,
-			'item_css_id'     => 'activity-favs'
+			'item_css_id'     => 'activity-favs',
+			'user_has_access' => bp_activity_favorites_privacy( bp_displayed_user_id() )
 		);
 
 		// Additional menu if friends is active
@@ -291,8 +298,8 @@ class BP_Activity_Component extends BP_Component {
 			$wp_admin_nav[] = array(
 				'parent' => 'my-account-' . $this->id,
 				'id'     => 'my-account-' . $this->id . '-favorites',
-				'title'  => __( 'Favorites', 'buddypress' ),
-				'href'   => trailingslashit( $activity_link . 'favorites' )
+				'title'  => bp_get_activity_favorites_nav(),
+				'href'   => trailingslashit( $activity_link . bp_get_activity_favorites_slug() )
 			);
 
 			// Friends?
@@ -320,6 +327,15 @@ class BP_Activity_Component extends BP_Component {
 	}
 
 	/**
+	 * Add custom hooks.
+	 *
+	 * @since BuddyPress (2.1.0)
+	 */
+	public function setup_hooks() {
+		add_filter( 'bp_settings_admin_nav', array( $this, 'setup_settings_admin_nav' ), 3 );
+	}
+
+	/**
 	 * Set up the title for pages and <title>.
 	 *
 	 * @since BuddyPress (1.5)
@@ -348,6 +364,55 @@ class BP_Activity_Component extends BP_Component {
 		parent::setup_title();
 	}
 
+	public function setup_settings_subnav() {
+
+		if ( empty( $this->show_settings ) ) {
+			return;
+		}
+		
+		// Determine user to use
+		if ( bp_displayed_user_domain() ) {
+			$user_domain = bp_displayed_user_domain();
+		} elseif ( bp_loggedin_user_domain() ) {
+			$user_domain = bp_loggedin_user_domain();
+		} else {
+			return;
+		}
+
+		bp_core_new_subnav_item( array(
+			'name' 		      => bp_get_activity_favorites_nav(),
+			'slug' 		      => bp_get_activity_favorites_slug(),
+			'parent_slug'     => bp_get_settings_slug(),
+			'parent_url' 	  => trailingslashit( $user_domain . bp_get_settings_slug() ),
+			'screen_function' => 'bp_activity_screen_favorites_settings',
+			'position' 	      => 40,
+			'user_has_access' => bp_core_can_edit_settings()
+		) );
+	}
+
+	/**
+	 * Adds "Settings > Favorites" subnav item under the "Settings" adminbar menu.
+	 *
+	 * @since BuddyPress (2.1.0)
+	 *
+	 * @param array $wp_admin_nav The settings adminbar nav array.
+	 * @return array
+	 */
+	public function setup_settings_admin_nav( $wp_admin_nav ) {
+		// Setup the logged in user variables
+		$settings_link = trailingslashit( bp_loggedin_user_domain() . bp_get_settings_slug() );
+
+		// Add the "Favorites" subnav item
+		$wp_admin_nav[] = array(
+			'parent' => 'my-account-' . buddypress()->settings->id,
+			'id'     => 'my-account-' . buddypress()->settings->id . '-favorites',
+			'title'  => bp_get_activity_favorites_nav(),
+			'href'   => trailingslashit( $settings_link . bp_get_activity_favorites_slug() )
+		);
+
+		return $wp_admin_nav;
+	}
+
 	/**
 	 * Set up actions necessary for the component.
 	 *
@@ -356,6 +421,7 @@ class BP_Activity_Component extends BP_Component {
 	public function setup_actions() {
 		// Spam prevention
 		add_action( 'bp_include', 'bp_activity_setup_akismet' );
+		add_action( 'bp_settings_setup_nav', array( $this, 'setup_settings_subnav' ) );
 
 		parent::setup_actions();
 	}
diff --git src/bp-activity/bp-activity-screens.php src/bp-activity/bp-activity-screens.php
index 2406771..765dee6 100644
--- src/bp-activity/bp-activity-screens.php
+++ src/bp-activity/bp-activity-screens.php
@@ -143,6 +143,22 @@ function bp_activity_reset_my_new_mentions() {
 }
 add_action( 'bp_activity_screen_mentions', 'bp_activity_reset_my_new_mentions' );
 
+
+function bp_activity_screen_favorites_settings() {
+	// Redirect if no privacy settings page is accessible
+	if ( bp_action_variables() || ! bp_is_active( 'activity' ) ) {
+		bp_do_404();
+		return;
+	}
+
+	do_action( 'bp_activity_screen_favorites_settings' );
+
+	add_action( 'bp_template_content', 'bp_activity_favorites_template_settings' );
+
+	// Load the template
+	bp_core_load_template( apply_filters( 'bp_settings_screen_activity_favorites', '/members/single/plugins' ) );
+}
+
 /**
  * Load the page for a single activity item.
  *
diff --git src/bp-activity/bp-activity-template.php src/bp-activity/bp-activity-template.php
index cad209f..685c3ff 100644
--- src/bp-activity/bp-activity-template.php
+++ src/bp-activity/bp-activity-template.php
@@ -83,6 +83,126 @@ function bp_activity_directory_permalink() {
 	}
 
 /**
+ * Output the activity favorite slug.
+ *
+ * @since BuddyPress (2.1.0)
+ *
+ * @uses bp_get_activity_favorites_slug()
+ */
+function bp_activity_favorites_slug() {
+	echo bp_get_activity_favorites_slug();
+}
+	/**
+	 * Return the activity favorite slug.
+	 *
+	 * @since BuddyPress (2.1.0)
+	 *
+	 * @uses apply_filters() To call the 'bp_get_activity_favorites_slug' hook.
+	 * @uses buddypress() to get main instance
+	 *
+	 * @return string The activity favorite slug.
+	 */
+	function bp_get_activity_favorites_slug() {
+		return apply_filters( 'bp_get_activity_favorites_slug', buddypress()->activity->favorites->slug );
+	}
+
+/**
+ * Output the activity favorite nav name.
+ *
+ * @since BuddyPress (2.1.0)
+ *
+ * @uses bp_get_activity_favorites_nav()
+ */
+function bp_activity_favorites_nav() {
+	echo bp_get_activity_favorites_nav();
+}
+	/**
+	 * Return the activity favorite nav name.
+	 *
+	 * @since BuddyPress (2.1.0)
+	 *
+	 * @uses apply_filters() To call the 'bp_get_activity_favorites_nav' hook.
+	 * @uses buddypress() to get main instance
+	 *
+	 * @return string The activity favorite nav name.
+	 */
+	function bp_get_activity_favorites_nav() {
+		return apply_filters( 'bp_get_activity_favorites_nav', buddypress()->activity->favorites->subnav );
+	}
+
+/**
+ * Output the activity favorite fav button caption.
+ *
+ * @since BuddyPress (2.1.0)
+ *
+ * @uses bp_get_activity_favorites_fav_button()
+ */
+function bp_activity_favorites_fav_button() {
+	echo bp_get_activity_favorites_fav_button();
+}
+	/**
+	 * Return the activity favorite fav button caption.
+	 *
+	 * @since BuddyPress (2.1.0)
+	 *
+	 * @uses apply_filters() To call the 'bp_get_activity_favorites_fav_button' hook.
+	 * @uses buddypress() to get main instance
+	 *
+	 * @return string The activity favorite fav button caption.
+	 */
+	function bp_get_activity_favorites_fav_button() {
+		return apply_filters( 'bp_get_activity_favorites_fav_button', buddypress()->activity->favorites->fav_button );
+	}
+
+/**
+ * Output the activity favorite unfav button caption.
+ *
+ * @since BuddyPress (2.1.0)
+ *
+ * @uses bp_get_activity_favorites_unfav_button()
+ */
+function bp_activity_favorites_unfav_button() {
+	echo bp_get_activity_favorites_unfav_button();
+}
+	/**
+	 * Return the activity favorite unfav button caption.
+	 *
+	 * @since BuddyPress (2.1.0)
+	 *
+	 * @uses apply_filters() To call the 'bp_get_activity_favorites_unfav_button' hook.
+	 * @uses buddypress() to get main instance
+	 *
+	 * @return string The activity favorite unfav button caption.
+	 */
+	function bp_get_activity_favorites_unfav_button() {
+		return apply_filters( 'bp_get_activity_favorites_unfav_button', buddypress()->activity->favorites->unfav_button );
+	}
+
+/**
+ * Output the activity favorite directory tab caption.
+ *
+ * @since BuddyPress (2.1.0)
+ *
+ * @uses bp_get_activity_favorites_directory_tab()
+ */
+function bp_activity_favorites_directory_tab() {
+	echo bp_get_activity_favorites_directory_tab();
+}
+	/**
+	 * Return the activity favorite directory tab caption.
+	 *
+	 * @since BuddyPress (2.1.0)
+	 *
+	 * @uses apply_filters() To call the 'bp_get_activity_favorites_directory_tab' hook.
+	 * @uses buddypress() to get main instance
+	 *
+	 * @return string The activity favorite directory tab caption.
+	 */
+	function bp_get_activity_favorites_directory_tab() {
+		return apply_filters( 'bp_get_activity_favorites_directory_tab', buddypress()->activity->favorites->directory_tab );
+	}
+
+/**
  * The main activity template loop class.
  *
  * This is responsible for loading a group of activity items and displaying them.
@@ -184,9 +304,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(
@@ -519,6 +636,11 @@ function bp_has_activities( $args = '' ) {
 	else
 		$scope = bp_current_action();
 
+	// A lot of Ajax/js is done threw markup let's come back to favorites
+	if ( bp_get_activity_favorites_slug() == $scope ) {
+		$scope = 'favorites';
+	}
+
 	// Support for permalinks on single item pages: /groups/my-group/activity/124/
 	if ( bp_is_current_action( bp_get_activity_slug() ) )
 		$include = bp_action_variable( 0 );
@@ -610,13 +732,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 = 'activity_favorite';
 					$display_comments = true;
-					$user_id = 0;
 					break;
 				case 'mentions':
 
@@ -1752,7 +1869,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->favorites ) );
 	}
 
 /**
@@ -2699,11 +2816,38 @@ function bp_activity_can_comment_reply( $comment ) {
  * @return bool $can_favorite True if comment can receive comments.
  */
 function bp_activity_can_favorite() {
+	global $activities_template;
+
 	$can_favorite = true;
 
+	if ( ! empty( $activities_template->activity->type ) && 'activity_favorite' == $activities_template->activity->type ) {
+		$can_favorite = false;
+	}
+
 	return apply_filters( 'bp_activity_can_favorite', $can_favorite );
 }
 
+ /**
+ * Count the users who favorited the current activity.
+ *
+ * @since BuddyPress (2.1.0)
+ *
+ * @uses apply_filters() To call the 'bp_activity_get_favorite_count' hook.
+ *
+ * @return int the number of users who favorited the activity.
+ */
+function bp_activity_get_favorite_count() {
+	global $activities_template;
+
+	$count = 0;
+
+	if ( ! empty( $activities_template->activity->favorites ) ) {
+		$count = count( (array) $activities_template->activity->favorites );
+	}
+
+	return apply_filters( 'bp_activity_get_favorite_count', $count );
+}
+
 /**
  * Output the total favorite count for a specified user.
  *
@@ -2739,6 +2883,129 @@ function bp_total_favorite_count_for_user( $user_id = 0 ) {
 	add_filter( 'bp_get_total_favorite_count_for_user', 'bp_core_number_format' );
 
 /**
+ * Output the List of users who favorited the activity
+ *
+ * To maximize theme backcompat uses the hook bp_after_activity_entry_comments
+ * 
+ * @since BuddyPress (2.1.0)
+ *
+ * @uses bp_get_activity_favorites()
+ */
+function bp_activity_favorites() {
+	echo bp_get_activity_favorites();
+}
+add_action( 'bp_after_activity_entry_comments', 'bp_activity_favorites' );
+	
+	/**
+	 * Return the List of users who favorited the activity
+	 * 
+	 * @since BuddyPress (2.1.0)
+	 *
+	 * @uses bp_activity_list_favorites()
+	 */
+	function bp_get_activity_favorites() {
+
+		if ( 0 == bp_activity_get_comment_count() ) {
+			$output = '<div class="activity-favorites">';
+		} else {
+			$output = '<div class="activity-favorites hide">';
+		}
+		
+		$output .= bp_activity_list_favorites() . '</div>';
+
+		return $output;
+	}
+
+	/**
+	 * Build the List of users who favorited the activity
+	 * 
+	 * @since BuddyPress (2.1.0)
+	 */
+	function bp_activity_list_favorites() {
+		global $activities_template;
+
+		$output = '<ul class="favorites-list">';
+
+		foreach( (array) $activities_template->activity->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-favorited-' . $user_id
+			) );
+			$output .= '<li><a href="' . bp_core_get_userlink( $user_id, false, true ) .'">' . $user_avatar . '</a></li>';
+		}
+
+		$output .= '</ul>';
+
+		return apply_filters( 'bp_activity_list_favorites', $output, $activities_template->activity->id, $activities_template->activity->favorites );
+	}
+
+/**
+ * Output the interaction nav to switch between comments & favorites
+ *
+ * To maximize theme backcompat uses the hook bp_before_activity_entry_comments
+ * 
+ * @since BuddyPress (2.1.0)
+ *
+ * @uses bp_get_activity_interactions_nav()
+ */
+function bp_activity_interactions_nav() {
+	echo bp_get_activity_interactions_nav();
+}
+add_action( 'bp_before_activity_entry_comments', 'bp_activity_interactions_nav' );
+	
+	/**
+	 * Return the interaction nav to switch between comments & favorites
+	 * 
+	 * @since BuddyPress (2.1.0)
+	 */
+	function bp_get_activity_interactions_nav() {
+		global $activities_template;
+
+		$can_comment = bp_activity_can_comment();
+
+		if ( ( is_user_logged_in() && $can_comment ) || ( is_user_logged_in() && bp_activity_can_favorite() ) || bp_is_single_activity() ) {
+
+			$class_nav = $class_favorite = $class_comment = '';
+			$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 .'">';
+
+			if ( ! $can_comment  ) {
+				$class_comment = ' hide';
+			} else if ( 0 !=  $comments_count ) {
+				$class_comment = ' current';
+			}
+
+			$output .= '<li class="activity-interactions'. $class_comment .'"><a href="#" class="activity-comments-interaction">' .  __( 'Replies', 'buddypress' ) . '</a></li>';
+
+			if ( 0 == $favorites_count ) {
+				$class_favorite = ' hide';
+			} else if ( ! $can_comment || 0 ==  $comments_count ) {
+				$class_favorite = ' current';
+			}
+
+			$output .= '<li class="activity-interactions'. $class_favorite .'"><a href="#" class="activity-favorites-interaction">' .  bp_get_activity_favorites_nav() . '</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.
  *
  * @since BuddyPress (1.2)
@@ -3171,8 +3438,8 @@ function bp_activities_member_rss_link() { echo bp_get_member_activity_feed_link
 			$link = bp_displayed_user_domain() . bp_get_activity_slug() . '/' . bp_get_friends_slug() . '/feed/';
 		elseif ( bp_is_active( 'groups'  ) && bp_is_current_action( bp_get_groups_slug()  ) )
 			$link = bp_displayed_user_domain() . bp_get_activity_slug() . '/' . bp_get_groups_slug() . '/feed/';
-		elseif ( 'favorites' == bp_current_action() )
-			$link = bp_displayed_user_domain() . bp_get_activity_slug() . '/favorites/feed/';
+		elseif ( bp_get_activity_favorites_slug() == bp_current_action() )
+			$link = bp_displayed_user_domain() . bp_get_activity_slug() . '/' . bp_get_activity_favorites_slug() . '/feed/';
 		elseif ( 'mentions' == bp_current_action() && bp_activity_do_mentions() )
 			$link = bp_displayed_user_domain() . bp_get_activity_slug() . '/mentions/feed/';
 		else
@@ -3460,3 +3727,58 @@ function bp_activity_show_filters( $context = '' ) {
 
 		return apply_filters( 'bp_get_activity_show_filters', $output, $filters, $context );
 	}
+
+function bp_activity_favorites_template_settings() {
+	do_action( 'bp_before_member_settings_template' ); ?>
+
+	<form action="<?php echo trailingslashit( bp_displayed_user_domain() . bp_get_settings_slug() . '/' . bp_get_activity_favorites_slug() ); ?>" method="post" class="standard-form" id="settings-form">
+
+		<table class="profile-settings" id="favorites-settings">
+			<thead>
+				<tr>
+					<th class="title field-group-name"></th>
+					<th class="title"><?php _e( 'Visibility', 'buddypress' ); ?></th>
+				</tr>
+			</thead>
+
+			<tbody>
+
+				<tr>
+					<td class="field-name"><?php esc_html_e( 'Favorited Activities', 'buddypress' ); ?></td>
+					<td class="field-visibility"><?php bp_activity_favorites_settings_visibility_select(); ?></td>
+				</tr>
+
+			</tbody>
+		</table>
+
+		<?php do_action( 'bp_activity_favorites_settings_before_submit' ); ?>
+
+		<div class="submit">
+			<input id="submit" type="submit" name="favorites-settings-submit" value="<?php esc_attr_e( 'Save Settings', 'buddypress' ); ?>" class="auto" />
+		</div>
+
+		<?php do_action( 'bp_activity_favorites_settings_after_submit' ); ?>
+
+		<?php wp_nonce_field( 'bp_activity_favorites_settings' ); ?>
+
+	</form>
+
+	<?php do_action( 'bp_after_member_settings_template' );
+}
+
+function bp_activity_favorites_settings_visibility_select() {
+	$selected = bp_activity_favorites_get_user_settings( bp_displayed_user_id() );
+
+	$privacy_options = array(
+		__( 'Everyone', 'buddypress' ),
+		__( 'Only Me', 'buddypress' )
+	);
+
+	?>
+	<select name="bp_favorites_private">
+		<?php foreach( $privacy_options as $key => $option ) : ?>
+			<option value="<?php echo esc_attr( $key );?>" <?php selected( $selected, $key );?>><?php echo esc_html( $option ); ?></option>
+		<?php endforeach ;?>
+	</select>
+	<?php
+}
diff --git src/bp-core/bp-core-update.php src/bp-core/bp-core-update.php
index 20bdb6c..9dca4c5 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! *************************************************************/
@@ -388,6 +393,20 @@ function bp_update_to_2_0_1() {
 	bp_core_maybe_install_signups();
 }
 
+ /**
+ * 2.1 database upgrade routine
+ *
+ * @since BuddyPress (2.1.0)
+ *
+ * @return void
+ */
+function bp_update_to_2_1() {
+	/** Migrate favorites data ******************************************/
+	if ( bp_is_active( 'activity' ) ) {
+		bp_activity_favorites_migrate();
+	}
+}
+
 /**
  * Redirect user to BP's What's New page on first page load after activation.
  *
diff --git src/bp-loader.php src/bp-loader.php
index bdd3012..ca5aea5 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-templates/bp-legacy/buddypress-functions.php src/bp-templates/bp-legacy/buddypress-functions.php
index 784b2dc..5b1f4d2 100644
--- src/bp-templates/bp-legacy/buddypress-functions.php
+++ src/bp-templates/bp-legacy/buddypress-functions.php
@@ -232,21 +232,31 @@ class BP_Legacy extends BP_Theme_Compat {
 
 		// Add words that we need to use in JS to the end of the page
 		// so they can be translated and still used.
-		$params = apply_filters( 'bp_core_get_js_strings', array(
+		$params = array(
 			'accepted'            => __( 'Accepted', 'buddypress' ),
 			'close'               => __( 'Close', 'buddypress' ),
 			'comments'            => __( 'comments', 'buddypress' ),
 			'leave_group_confirm' => __( 'Are you sure you want to leave this group?', 'buddypress' ),
-			'mark_as_fav'	      => __( 'Favorite', 'buddypress' ),
-			'my_favs'             => __( 'My Favorites', 'buddypress' ),
 			'rejected'            => __( 'Rejected', 'buddypress' ),
-			'remove_fav'	      => __( 'Remove Favorite', 'buddypress' ),
 			'show_all'            => __( 'Show all', 'buddypress' ),
 			'show_all_comments'   => __( 'Show all comments for this thread', 'buddypress' ),
 			'show_x_comments'     => __( 'Show all %d comments', 'buddypress' ),
 			'unsaved_changes'     => __( 'Your profile has unsaved changes. If you leave the page, the changes will be lost.', 'buddypress' ),
 			'view'                => __( 'View', 'buddypress' ),
-		) );
+		);
+
+		// Favorite strings
+		if ( bp_is_active( 'activity' ) ) {
+			$params = array_merge( $params, array(
+				'mark_as_fav' => bp_get_activity_favorites_fav_button(),
+				'remove_fav'  => bp_get_activity_favorites_unfav_button(),
+				'my_favs'     => bp_get_activity_favorites_directory_tab(),
+			) );
+		}
+		
+		// Allow strings to be filtered
+		$params = apply_filters( 'bp_core_get_js_strings', $params );
+
 		wp_localize_script( $asset['handle'], 'BP_DTheme', $params );
 
 		// Maybe enqueue comment reply JS
@@ -648,7 +658,7 @@ function bp_legacy_theme_activity_template_loader() {
 			$feed_url = bp_loggedin_user_domain() . bp_get_activity_slug() . '/groups/feed/';
 			break;
 		case 'favorites':
-			$feed_url = bp_loggedin_user_domain() . bp_get_activity_slug() . '/favorites/feed/';
+			$feed_url = bp_loggedin_user_domain() . bp_get_activity_slug() . '/' . bp_get_activity_favorites_slug() . '/feed/';
 			break;
 		case 'mentions':
 			$feed_url = bp_loggedin_user_domain() . bp_get_activity_slug() . '/mentions/feed/';
@@ -919,12 +929,29 @@ 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();
+
+	if ( bp_activity_add_user_favorite( $_POST['id'] ) ){
+		$result['button'] = bp_get_activity_favorites_unfav_button();
+		
+		$user_id = bp_loggedin_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-favorited-' . $user_id
+		) );
+		$result['avatar'] = '<li><a href="' . bp_core_get_userlink( $user_id, false, true ) .'">' . $user_avatar . '</a></li>';
+	
+	} else {
+		$result['button'] = bp_get_activity_favorites_fav_button();
+		$result['avatar'] = 0;
+	}
 
-	exit;
+	exit( json_encode( $result ) );
 }
 
 /**
@@ -938,12 +965,18 @@ 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'] = bp_get_activity_favorites_fav_button();
+		$result['avatar'] = bp_loggedin_user_id();
+	} else {
+		$result['button'] = bp_get_activity_favorites_unfav_button();
+		$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..2f230df 100644
--- src/bp-templates/bp-legacy/buddypress/activity/entry.php
+++ src/bp-templates/bp-legacy/buddypress/activity/entry.php
@@ -63,11 +63,11 @@
 
 					<?php if ( !bp_get_activity_is_favorite() ) : ?>
 
-						<a href="<?php bp_activity_favorite_link(); ?>" class="button fav bp-secondary-action" title="<?php esc_attr_e( 'Mark as Favorite', 'buddypress' ); ?>"><?php _e( 'Favorite', 'buddypress' ); ?></a>
+						<a href="<?php bp_activity_favorite_link(); ?>" class="button fav bp-primary-action" title="<?php echo esc_attr( sprintf( __( 'Mark as %s', 'buddypress' ), bp_get_activity_favorites_fav_button() ) ); ?>"><?php printf( _x( '%1$s <span>%2$s</span>', 'favorites fav button', 'buddypress' ), bp_get_activity_favorites_fav_button(), bp_activity_get_favorite_count() ); ?></a>
 
 					<?php else : ?>
 
-						<a href="<?php bp_activity_unfavorite_link(); ?>" class="button unfav bp-secondary-action" title="<?php esc_attr_e( 'Remove Favorite', 'buddypress' ); ?>"><?php _e( 'Remove Favorite', 'buddypress' ); ?></a>
+						<a href="<?php bp_activity_unfavorite_link(); ?>" class="button unfav bp-primary-action" title="<?php echo esc_attr( bp_get_activity_favorites_unfav_button() ); ?>"><?php printf( _x( '%1$s <span>%2$s</span>', 'favorites unfav button', 'buddypress' ), bp_get_activity_favorites_unfav_button(), bp_activity_get_favorite_count() ); ?></a>
 
 					<?php endif; ?>
 
diff --git src/bp-templates/bp-legacy/buddypress/activity/index.php src/bp-templates/bp-legacy/buddypress/activity/index.php
index 40d7725..db22e8c 100644
--- src/bp-templates/bp-legacy/buddypress/activity/index.php
+++ src/bp-templates/bp-legacy/buddypress/activity/index.php
@@ -48,7 +48,7 @@
 
 				<?php if ( bp_get_total_favorite_count_for_user( bp_loggedin_user_id() ) ) : ?>
 
-					<li id="activity-favorites"><a href="<?php echo bp_loggedin_user_domain() . bp_get_activity_slug() . '/favorites/'; ?>" title="<?php esc_attr_e( "The activity I've marked as a favorite.", 'buddypress' ); ?>"><?php printf( __( 'My Favorites <span>%s</span>', 'buddypress' ), bp_get_total_favorite_count_for_user( bp_loggedin_user_id() ) ); ?></a></li>
+					<li id="activity-favorites"><a href="<?php echo bp_loggedin_user_domain() . bp_get_activity_slug() . '/' . bp_get_activity_favorites_slug() . '/'; ?>" title="<?php esc_attr_e( "The activity I've marked as a favorite.", 'buddypress' ); ?>"><?php printf( _x( '%1$s <span>%2$s</span>', 'favorite directory tab output', 'buddypress' ), bp_get_activity_favorites_directory_tab(), bp_get_total_favorite_count_for_user( bp_loggedin_user_id() ) ); ?></a></li>
 
 				<?php endif; ?>
 
diff --git src/bp-templates/bp-legacy/css/buddypress.css src/bp-templates/bp-legacy/css/buddypress.css
index 6441cd3..5d1364b 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
@@ -485,6 +486,88 @@ body.activity-permalink #buddypress div.activity-comments div.acomment-content {
 }
 
 /*--------------------------------------------------------------
++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;
+}
+
+body.activity-permalink #buddypress li ul.activity-interactions-nav {
+	background: none;
+	margin-left: 170px;
+	width: auto;
+}
+
+#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 div.activity-favorites {
+	margin: 0 0 0 70px;
+	overflow: hidden; /* IE fix */
+	position: relative;
+	width: auto;
+	clear: both;
+}
+
+#buddypress div.activity-favorites.hide,
+body.activity-permalink #buddypress div.activity-favorites.hide {
+	display:none;
+}
+
+body.activity-permalink #buddypress div.activity-favorites {
+	margin-left: 170px;
+}
+
+#buddypress div.activity-favorites ul.favorites-list li {
+	padding:0;
+	float: left;
+	border-bottom: none;
+}
+
+#buddypress div.activity-favorites ul.favorites-list {
+	overflow: hidden;
+	list-style: none;
+	width: auto;
+	clear: both;
+}
+
+#buddypress div.activity-favorites ul.favorites-list li img {
+	border-width: 1px;
+	float: left;
+	height: 25px;
+	margin-right: 10px;
+	width: 25px;
+}
+
+/*--------------------------------------------------------------
 3.3 - Directories - Members, Groups, Blogs, Forums
 --------------------------------------------------------------*/
 #buddypress div.dir-search {
diff --git src/bp-templates/bp-legacy/js/buddypress.js src/bp-templates/bp-legacy/js/buddypress.js
index 63eb97f..c48d75d 100644
--- src/bp-templates/bp-legacy/js/buddypress.js
+++ src/bp-templates/bp-legacy/js/buddypress.js
@@ -272,11 +272,25 @@ jq(document).ready( function() {
 			li, id, link_href, nonce, timestamp,
 			oldest_page, just_posted;
 
+		if ( target.parent().hasClass( 'fav' ) || target.parent().hasClass( 'unfav' ) ) {
+			target = target.parent();
+		}
+
 		/* Favoriting activity stream items */
 		if ( target.hasClass('fav') || target.hasClass('unfav') ) {
 			type      = target.hasClass('fav') ? 'fav' : 'unfav';
 			parent    = target.closest('.activity-item');
 			parent_id = parent.attr('id').substr( 9, parent.attr('id').length );
+			count     = Number( jq( target ).find( 'span' ).html() );
+
+			jq( '#activity-' + parent_id + ' .activity-interactions-nav' ).removeClass( 'hide' );
+			jq( '#activity-' + parent_id + ' a.activity-favorites-interaction' ).parent( 'li' ).removeClass( 'hide' );
+			jq( '#activity-' + parent_id + ' a.activity-favorites-interaction' ).trigger( 'click' );
+
+			// In case of a likes 'override'
+			if ( 'unfav' == type && typeof BP_DTheme.no_unfav != 'undefined' && 1 == BP_DTheme.no_unfav ) {
+				return false;
+			}
 
 			target.addClass('loading');
 
@@ -289,11 +303,17 @@ jq(document).ready( function() {
 				target.removeClass('loading');
 
 				target.fadeOut( 200, function() {
-					jq(this).html(response);
+					jq(this).html(response['button']);
+					count = ( 'fav' === type ) ? Number( count ) + 1 : Number( count ) - 1;
+					jq(this).html( response['button'] + ' <span>' + count +'</span>' );
 					jq(this).attr('title', 'fav' === type ? BP_DTheme.remove_fav : BP_DTheme.mark_as_fav);
 					jq(this).fadeIn(200);
 				});
 
+				if ( ! jq( '#activity-' + parent_id + ' .favorites-list' ).length ) {
+					jq( '#activity-' + parent_id + ' .activity-favorites' ).append( '<ul class="favorites-list"></ul>' );
+				}
+
 				if ( 'fav' === type ) {
 					if ( !jq('.item-list-tabs #activity-favs-personal-li').length ) {
 						if ( !jq('.item-list-tabs #activity-favorites').length ) {
@@ -306,7 +326,12 @@ jq(document).ready( function() {
 					target.removeClass('fav');
 					target.addClass('unfav');
 
+					if ( 0 != response['avatar'] ){
+						jq( '#activity-' + parent_id + ' .favorites-list' ).append( response['avatar'] );
+					}
+
 				} else {
+
 					target.removeClass('unfav');
 					target.addClass('fav');
 
@@ -319,16 +344,53 @@ jq(document).ready( function() {
 
 						jq('.item-list-tabs ul #activity-favorites').remove();
 					}
+
+					if ( 0 != response['avatar'] ){
+						jq( '#activity-' + parent_id + ' .favorites-list .user-favorited-' + response['avatar'] ).parent().parent().remove();
+
+						if ( 0 == jq( '#activity-' + parent_id + ' .favorites-list').children().length ) {
+							jq( '#activity-' + parent_id + ' a.activity-comments-interaction' ).trigger( 'click' );
+							jq( '#activity-' + parent_id + ' a.activity-favorites-interaction' ).parent( 'li' ).addClass( 'hide' );
+						}
+					}
 				}
 
 				if ( 'activity-favorites' === jq( '.item-list-tabs li.selected').attr('id') ) {
 					target.closest( '.activity-item' ).slideUp( 100 );
 				}
-			});
+			}, 'json' );
 
 			return false;
 		}
 
+		/* Display Replies or favorites */
+		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();
+		}
+
 		/* Delete activity stream items */
 		if ( target.hasClass('delete-activity') ) {
 			li        = target.parents('div.activity ul li');
@@ -512,6 +574,8 @@ 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();
 			}
@@ -618,6 +682,7 @@ jq(document).ready( function() {
 
 					/* 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');
 
 					// Increment the 'Show all x comments' string, if present
 					show_all_a = activity_comments.find('.show-all').find('a');
