Index: bp-activity.php
===================================================================
--- bp-activity.php	(revision 3275)
+++ bp-activity.php	(working copy)
@@ -494,6 +494,7 @@
 
 		'search_terms' => false, // Pass search terms as a string
 		'show_hidden' => false, // Show activity items that are hidden site-wide?
+		'exclude' => false, // Comma-separated list of activity IDs to exclude
 
 		/**
 		 * Pass filters as an array -- all filter items can be multiple values comma separated:
@@ -512,13 +513,13 @@
 	extract( $r, EXTR_SKIP );
 
 	/* Attempt to return a cached copy of the first page of sitewide activity. */
-	if ( 1 == (int)$page && empty( $max ) && empty( $search_terms ) && empty( $filter ) && 'DESC' == $sort ) {
+	if ( 1 == (int)$page && empty( $max ) && empty( $search_terms ) && empty( $filter ) && 'DESC' == $sort && empty( $exclude ) ) {
 		if ( !$activity = wp_cache_get( 'bp_activity_sitewide_front', 'bp' ) ) {
 			$activity = BP_Activity_Activity::get( $max, $page, $per_page, $sort, $search_terms, $filter, $display_comments, $show_hidden );
 			wp_cache_set( 'bp_activity_sitewide_front', $activity, 'bp' );
 		}
 	} else
-		$activity = BP_Activity_Activity::get( $max, $page, $per_page, $sort, $search_terms, $filter, $display_comments, $show_hidden );
+		$activity = BP_Activity_Activity::get( $max, $page, $per_page, $sort, $search_terms, $filter, $display_comments, $show_hidden, $exclude );
 
 	return apply_filters( 'bp_activity_get', $activity, &$r );
 }
Index: bp-activity/bp-activity-templatetags.php
===================================================================
--- bp-activity/bp-activity-templatetags.php	(revision 3275)
+++ bp-activity/bp-activity-templatetags.php	(working copy)
@@ -15,7 +15,7 @@
 
 	var $full_name;
 
-	function bp_activity_template( $page, $per_page, $max, $include, $sort, $filter, $search_terms, $display_comments, $show_hidden ) {
+	function bp_activity_template( $page, $per_page, $max, $include, $sort, $filter, $search_terms, $display_comments, $show_hidden, $exclude ) {
 		global $bp;
 
 		$this->pag_page = isset( $_REQUEST['acpage'] ) ? intval( $_REQUEST['acpage'] ) : $page;
@@ -31,7 +31,7 @@
 		if ( !empty( $include ) )
 			$this->activities = bp_activity_get_specific( array( 'activity_ids' => explode( ',', $include ), 'max' => $max, 'page' => $this->pag_page, 'per_page' => $this->pag_num, 'sort' => $sort, 'display_comments' => $display_comments ) );
 		else
-			$this->activities = bp_activity_get( array( 'display_comments' => $display_comments, 'max' => $max, 'per_page' => $this->pag_num, 'page' => $this->pag_page, 'sort' => $sort, 'search_terms' => $search_terms, 'filter' => $filter, 'show_hidden' => $show_hidden ) );
+			$this->activities = bp_activity_get( array( 'display_comments' => $display_comments, 'max' => $max, 'per_page' => $this->pag_num, 'page' => $this->pag_page, 'sort' => $sort, 'search_terms' => $search_terms, 'filter' => $filter, 'show_hidden' => $show_hidden, 'exclude' => $exclude ) );
 
 		if ( !$max || $max >= (int)$this->activities['total'] )
 			$this->total_activity_count = (int)$this->activities['total'];
@@ -141,6 +141,7 @@
 	 */
 	$user_id = false;
 	$include = false;
+	$exclude = false;
 	$show_hidden = false;
 	$object = false;
 	$primary_id = false;
@@ -165,7 +166,8 @@
 	/* Note: any params used for filtering can be a single value, or multiple values comma separated. */
 	$defaults = array(
 		'display_comments' => 'threaded', // false for none, stream/threaded - show comments in the stream or threaded under items
-		'include' => $include, // pass an activity_id or string of ID's comma separated
+		'include' => $include, // pass an activity_id or string of IDs comma-separated
+		'exclude' => $exclude, // pass an activity_id or string of IDs comma-separated
 		'sort' => 'DESC', // sort DESC or ASC
 		'page' => 1, // which page to load
 		'per_page' => 20, // number of items per page
@@ -253,7 +255,7 @@
 	else if ( !empty( $user_id ) || !empty( $object ) || !empty( $action ) || !empty( $primary_id ) || !empty( $secondary_id ) )
 		$filter = array( 'user_id' => $user_id, 'object' => $object, 'action' => $action, 'primary_id' => $primary_id, 'secondary_id' => $secondary_id );
 
-	$activities_template = new BP_Activity_Template( $page, $per_page, $max, $include, $sort, $filter, $search_terms, $display_comments, $show_hidden );
+	$activities_template = new BP_Activity_Template( $page, $per_page, $max, $include, $sort, $filter, $search_terms, $display_comments, $show_hidden, $exclude );
 
 	return apply_filters( 'bp_has_activities', $activities_template->has_activities(), &$activities_template );
 }
Index: bp-activity/bp-activity-classes.php
===================================================================
--- bp-activity/bp-activity-classes.php	(revision 3275)
+++ bp-activity/bp-activity-classes.php	(working copy)
@@ -68,7 +68,7 @@
 		if ( !$this->primary_link )
 			$this->primary_link = $bp->loggedin_user->domain;
 
-		/* If we have an existing ID, update the activity item, otherwise insert it. */
+		// If we have an existing ID, update the activity item, otherwise insert it.
 		if ( $this->id )
 			$q = $wpdb->prepare( "UPDATE {$bp->activity->table_name} SET user_id = %d, component = %s, type = %s, action = %s, content = %s, primary_link = %s, date_recorded = %s, item_id = %s, secondary_item_id = %s, hide_sitewide = %d WHERE id = %d", $this->user_id, $this->component, $this->type, $this->action, $this->content, $this->primary_link, $this->date_recorded, $this->item_id, $this->secondary_item_id, $this->hide_sitewide, $this->id );
 		else
@@ -84,39 +84,45 @@
 		return true;
 	}
 
-	/* Static Functions */
+	// Static Functions
 
-	function get( $max = false, $page = 1, $per_page = 25, $sort = 'DESC', $search_terms = false, $filter = false, $display_comments = false, $show_hidden = false ) {
+	function get( $max = false, $page = 1, $per_page = 25, $sort = 'DESC', $search_terms = false, $filter = false, $display_comments = false, $show_hidden = false, $exclude = false ) {
 		global $wpdb, $bp;
 
-		/* Select conditions */
+		// Select conditions
 		$select_sql = "SELECT a.*, u.user_email, u.user_nicename, u.user_login, u.display_name";
 
 		$from_sql = " FROM {$bp->activity->table_name} a LEFT JOIN {$wpdb->users} u ON a.user_id = u.ID";
 
-		/* Where conditions */
+		// Where conditions
 		$where_conditions = array();
 
-		/* Filtering */
+		// Filtering
 		if ( $filter && $filter_sql = BP_Activity_Activity::get_filter_sql( $filter ) )
 			$where_conditions['filter_sql'] = $filter_sql;
 
-		/* Sorting */
+		// Sorting
 		if ( $sort != 'ASC' && $sort != 'DESC' )
 			$sort = 'DESC';
 
-		/* Hide Hidden Items? */
+		// Hide Hidden Items?
 		if ( !$show_hidden )
 			$where_conditions['hidden_sql'] = "a.hide_sitewide = 0";
+		
+		// Exclude specified items
+		if ( $exclude )
+			$where_conditions['exclude'] = "a.id NOT IN ({$exclude})";
 
-		/* Alter the query based on whether we want to show activity item comments in the stream like normal comments or threaded below the activity */
+		// Alter the query based on whether we want 
+		// to show activity item comments in the stream 
+		// like normal comments or threaded below the activity
 		if ( !$display_comments || 'threaded' == $display_comments ) {
 			$where_conditions[] = "a.type != 'activity_comment'";
 		}
 
 		$where_sql = 'WHERE ' . join( ' AND ', $where_conditions );
 
-		/* Searching */
+		// Searching
 		if ( $search_terms ) {
 			$search_terms = $wpdb->escape( $search_terms );
 
@@ -136,7 +142,7 @@
 
 		$total_activities = $wpdb->get_var( $wpdb->prepare( "SELECT count(a.id) FROM {$bp->activity->table_name} a {$where_sql} ORDER BY a.date_recorded {$sort}" ) );
 
-		/* Get the fullnames of users so we don't have to query in the loop */
+		// Get the fullnames of users so we don't have to query in the loop
 		if ( bp_is_active( 'xprofile' ) && $activities ) {
 			foreach ( (array)$activities as $activity ) {
 				if ( (int)$activity->user_id )
@@ -163,7 +169,7 @@
 		if ( $activities && $display_comments )
 			$activities = BP_Activity_Activity::append_comments( &$activities );
 
-		/* If $max is set, only return up to the max results */
+		// If $max is set, only return up to the max results
 		if ( !empty( $max ) ) {
 			if ( (int)$total_activities > (int)$max )
 				$total_activities = $max;
@@ -195,7 +201,7 @@
 		if ( $display_comments )
 			$activities = BP_Activity_Activity::append_comments( $activities );
 
-		/* If $max is set, only return up to the max results */
+		// If $max is set, only return up to the max results
 		if ( !empty( $max ) ) {
 			if ( (int)$total_activities > (int)$max )
 				$total_activities = $max;
