diff --git bp-activity/bp-activity-functions.php bp-activity/bp-activity-functions.php
index c9d66d7..768fc8f 100644
--- bp-activity/bp-activity-functions.php
+++ bp-activity/bp-activity-functions.php
@@ -1538,7 +1538,16 @@ 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 ) {
+	$use_primary_link = array( 'new_forum_topic', 'new_forum_post' );
+
+	if ( bp_is_active( 'blogs' ) ) {
+		// Gets all post types activity actions available
+		$blogs_post_types        = get_object_vars( buddypress()->activity->actions->blogs );
+		// Adds them to the array to check.
+		$use_primary_link = array_merge( $use_primary_link, array_keys( $blogs_post_types ) );
+	}
+
+	if ( in_array( $activity_obj->type, $use_primary_link ) ) {
 		$link = $activity_obj->primary_link;
 	} else {
 		if ( 'activity_comment' == $activity_obj->type ) {
diff --git bp-activity/bp-activity-template.php bp-activity/bp-activity-template.php
index b416e3a..dfa449c 100644
--- bp-activity/bp-activity-template.php
+++ bp-activity/bp-activity-template.php
@@ -2626,7 +2626,17 @@ function bp_activity_can_comment() {
 	$can_comment = true;
 
 	if ( false === $activities_template->disable_blogforum_replies || (int) $activities_template->disable_blogforum_replies ) {
-		if ( 'new_blog_post' == bp_get_activity_action_name() || 'new_blog_comment' == bp_get_activity_action_name() || 'new_forum_topic' == bp_get_activity_action_name() || 'new_forum_post' == bp_get_activity_action_name() )
+		// initialize with forum activity types
+		$activity_comment_types = array( 'new_forum_topic', 'new_forum_post' );
+
+		if ( bp_is_active( 'blogs' ) ) {
+			// Gets all post types activity actions available
+			$blogs_post_types        = get_object_vars( buddypress()->activity->actions->blogs );
+			// Adds them to the array to check.
+			$activity_comment_types = array_merge( $activity_comment_types, array_keys( $blogs_post_types ) );
+		}
+
+		if ( in_array( bp_get_activity_action_name(), $activity_comment_types ) )
 			$can_comment = false;
 	}
 
diff --git bp-blogs/bp-blogs-activity.php bp-blogs/bp-blogs-activity.php
index 70c41c6..9b4847a 100644
--- bp-blogs/bp-blogs-activity.php
+++ bp-blogs/bp-blogs-activity.php
@@ -20,7 +20,7 @@ if ( !defined( 'ABSPATH' ) ) exit;
  * @return bool|null Returns false if activity component is not active.
  */
 function bp_blogs_register_activity_actions() {
-	global $bp;
+	global $bp, $_wp_post_type_features, $wp_post_types;
 
 	// Bail if activity is not active
 	if ( ! bp_is_active( 'activity' ) ) {
@@ -31,12 +31,89 @@ function bp_blogs_register_activity_actions() {
 		bp_activity_set_action( $bp->blogs->id, 'new_blog', __( 'New site created',        'buddypress' ) );
 	}
 
-	bp_activity_set_action( $bp->blogs->id, 'new_blog_post',    __( 'New post published',      'buddypress' ) );
-	bp_activity_set_action( $bp->blogs->id, 'new_blog_comment', __( 'New post comment posted', 'buddypress' ) );
+	/**
+	 * if post type argument 'bp_tracking' (array) is set and these two labels are set, they will override default values.
+	 * labels are :
+	 * 
+	 * - activity_post_type_action_label         // the post type main action label
+	 * - activity_post_type_comment_action_label // the post type comment action label
+	 * 
+	 * Plugins developers can set these, by adding a bp_tracking argument when registering their post type
+	 * see how to set a post type argument: http://codex.wordpress.org/Function_Reference/register_post_type#Arguments
+	 */
+
+	foreach( $_wp_post_type_features as $post => $post_type ) {
+ 	
+ 		// if the admin did not activate the post type, continue..
+		if ( ! bp_blogs_is_blog_post_type_trackable( $post ) )
+			continue;
+
+		/** Posts ************************************************/
+
+		// Default values
+		$post_type_activity_action       = 'new_blog_'. $post;
+		$post_type_activity_action_label = lcfirst( esc_html( $wp_post_types[ $post ]->labels->singular_name ) );
+
+		// overridden value provided by the post type when registering
+		if ( ! empty( $wp_post_types[ $post ]->bp_tracking['activity_post_type_action'] ) ) {
+			$post_type_activity_action       = esc_html( $wp_post_types[ $post ]->bp_tracking['activity_post_type_action'] );
+		}
+
+		if ( ! empty( $wp_post_types[ $post ]->bp_tracking['activity_post_type_action_label'] ) ) {
+			$post_type_activity_action_label = esc_html( $wp_post_types[ $post ]->bp_tracking['activity_post_type_action_label'] );
+		}
+
+		// Registering the post type activity action
+		bp_activity_set_action( $bp->blogs->id, $post_type_activity_action, sprintf( __( 'New %s published', 'buddypress' ), $post_type_activity_action_label ) );
+		
+
+		/** Comments ************************************************/
+
+		// Checking if post type has comments support else no need to set the activity, as there should never be a comment.
+		if ( ! post_type_supports( $post, 'comments' ) )
+			continue;
+
+		// Default values
+		$comment_prefix = ( 'post' == $post ) ? '' : $post . '_';
+		$post_type_comment_activity_action       = "new_blog_{$comment_prefix}comment";
+		$post_type_comment_activity_action_label = lcfirst( esc_html( $wp_post_types[$post]->labels->singular_name ) ) . ' comment';
+
+		if ( ! empty( $wp_post_types[ $post ]->bp_tracking['activity_post_type_comment_action'] ) ) {
+			$post_type_comment_activity_action       = esc_html( $wp_post_types[ $post ]->bp_tracking['activity_post_type_comment_action'] );
+		}
+
+		if ( ! empty( $wp_post_types[ $post ]->bp_tracking['activity_post_type_comment_action_label'] ) ) {
+			$post_type_comment_activity_action_label = esc_html( $wp_post_types[ $post ]->bp_tracking['activity_post_type_comment_action_label'] );
+		}
+		
+		// Registering the post type comment activity action
+		bp_activity_set_action( $bp->blogs->id, $post_type_comment_activity_action, sprintf( __( 'New %s posted', 'buddypress' ), $post_type_comment_activity_action_label ) );
+	}
+
+
+	// Adding the specific to subsite post types if any
+	if ( is_multisite() ) {
+		
+		$subsites_post_type_actions = bp_get_option( 'bp-enabled-subsites-post-type-actions', array() );
+
+		if ( ! empty( $subsites_post_type_actions ) ) {
+
+			foreach ( $subsites_post_type_actions as $subsites_post_type ) {
+
+				if ( empty( $subsites_post_type['actions'] ) )
+					continue;
+
+				foreach( $subsites_post_type['actions'] as $subsites_action  ) {
+					// Registering the specific to subsite activity actions
+					bp_activity_set_action( $bp->blogs->id, $subsites_action['action'], sprintf( __( 'New %s posted', 'buddypress' ), $subsites_action['label'] ) );
+				}	
+			}
+		}
+	}
 
 	do_action( 'bp_blogs_register_activity_actions' );
 }
-add_action( 'bp_register_activity_actions', 'bp_blogs_register_activity_actions' );
+add_action( 'bp_catch_post_types', 'bp_blogs_register_activity_actions' );
 
 /**
  * Record blog-related activity to the activity stream.
diff --git bp-blogs/bp-blogs-admin.php bp-blogs/bp-blogs-admin.php
index e69de29..a96fb44 100644
--- bp-blogs/bp-blogs-admin.php
+++ bp-blogs/bp-blogs-admin.php
@@ -0,0 +1,367 @@
+<?php
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+if ( !class_exists( 'BP_Blogs_Admin' ) ) :
+/**
+ * Load Blogs admin area.
+ *
+ * @package BuddyPress
+ * @subpackage blogsAdministration
+ *
+ * @since BuddyPress (?)
+ */
+class BP_Blogs_Admin {
+
+	/** Vars *************************************************************/
+
+	/**
+	 * Current blog id.
+	 *
+	 * @var string $blog_id
+	 */
+	public $blog_id = '';
+
+	/**
+	 * The list of post types active on the network.
+	 *
+	 * @var array $network_active
+	 */
+	public $network_active;
+
+	/**
+	 * The list of post type to track for the current blog
+	 *
+	 * @var array $tracked_post_types
+	 */
+	public $tracked_post_types;
+
+	/**
+	 * Is this blog trackable ?
+	 *
+	 * @var boolean
+	 */
+	public $is_public = '';
+
+
+	/**
+	 * Setup BP Blogs Admin.
+	 *
+	 * @access public
+	 * @since BuddyPress (?)
+	 *
+	 * @uses buddypress() to get BuddyPress main instance
+	 */
+	public static function register_blogs_admin() {
+		if( ! is_admin() )
+			return;
+
+		$bp = buddypress();
+
+		if( empty( $bp->blogs->admin ) ) {
+			$bp->blogs->admin = new self;
+		}
+
+		return $bp->blogs->admin;
+	}
+
+	/**
+	 * Constructor method.
+	 *
+	 * @access public
+	 * @since BuddyPress (?)
+	 */
+	public function __construct() {
+		$this->setup_globals();
+		$this->setup_actions();
+	}
+
+	/**
+	 * Set admin-related globals.
+	 *
+	 * @access private
+	 * @since BuddyPress (?)
+	 */
+	private function setup_globals() {
+
+		$this->blog_id            = get_current_blog_id();
+		$this->network_active     = bp_trackable_post_types();
+		$this->tracked_post_types = bp_blogs_blog_trackable_post_type();
+		$this->is_public          = get_option( 'blog_public' );
+
+	}
+
+	/**
+	 * Set admin-related actions and filters.
+	 *
+	 * @access private
+	 * @since BuddyPress (?)
+	 */
+	private function setup_actions() {
+		// Bail if blog is not trackable
+		if ( empty( $this->is_public ) )
+			return;
+
+		// Add an option page to blog settings
+		add_action( 'admin_menu', array( $this, 'admin_menus' ) );
+
+		// Register the blog tracking settings
+		add_action( 'bp_register_admin_settings', array( $this, 'blog_settings' ) );
+	}
+
+	/**
+	 * Create the options sub menu.
+	 *
+	 * @access public
+	 * @since BuddyPress (?)
+	 *
+	 * @uses add_options_page() To add the Site tracking submenu.
+	 */
+	public function admin_menus() {
+
+		$hook = add_options_page( 
+			__( 'Site Tracking', 'buddypress' ), 
+			__( 'Site Tracking', 'buddypress' ), 
+			'manage_options', 
+			'bp-tracking', 
+			array( &$this, 'tracking_settings' )
+		);
+
+		add_action( "admin_head-$hook", array( $this, 'activity_actions' ) );
+
+	}
+
+	/**
+	 * Create the settings page.
+	 *
+	 * @access public
+	 * @since BuddyPress (?)
+	 */
+	public function tracking_settings() {
+		?>
+		<div class="wrap">
+			<?php screen_icon( 'buddypress' ); ?>
+
+			<h2><?php esc_html_e( 'Settings', 'buddypress' ); ?></h2>
+
+			<form action="options.php" method="post">
+
+				<?php settings_fields( 'buddypress_blog' ); ?>
+
+				<?php do_settings_sections( 'buddypress_blog' ); ?>
+
+				<p class="submit">
+					<input type="submit" name="submit" class="button-primary" value="<?php esc_attr_e( 'Save Settings', 'buddypress' ); ?>" />
+				</p>
+			</form>
+		</div>
+		<?php
+	}
+
+	/**
+	 * Create the settings section & fields.
+	 *
+	 * @access public
+	 * @since BuddyPress (?)
+	 */
+	public function blog_settings() {
+		// Add the main section
+		add_settings_section(
+			'bp_blog', 
+			'',
+			array( &$this, 'main_section_callback' ),
+			'buddypress_blog'
+		);
+
+		// Add the site tracking section
+		add_settings_section(
+			'bp_tracking',
+			__( 'Site Tracking Settings', 'buddypress' ),
+			array( &$this, 'tracking_section_callback' ),
+			'buddypress_blog'
+		);
+
+		// Add the tracking setting
+		add_settings_field(
+			'bp-enabled-post-types',
+			__( 'List of post types to track', 'buddypress' ),
+			array( &$this, 'post_types_setting_callback' ),
+			'buddypress_blog',
+			'bp_tracking'
+		);
+
+		register_setting(
+			'buddypress_blog',
+			'bp-enabled-post-types',
+			array( &$this, 'post_types_sanitize_callback' )
+		);
+	}
+
+	/**
+	 * Output the main section callback
+	 * 
+	 * @access public
+	 * @since  BuddyPress (?)
+	 */
+	public function main_section_callback() {}
+
+	/**
+	 * Output the tracking section callback
+	 * 
+	 * @access public
+	 * @since  BuddyPress (?)
+	 */
+	public function tracking_section_callback() {
+		?>
+		<p class="description">
+			<?php esc_html_e( 'List of the post types active for tracking on the network:', 'buddypress' ) ;?>
+
+			<ol>
+			<?php foreach ( $this->network_active as $post_type => $active ) :
+				if ( empty( $active ) )
+					continue;
+				?>
+
+				<li><?php echo esc_html( ucfirst( $post_type ) );?></li>
+
+			<?php endforeach; ?>
+			</ol>
+
+		</p>
+		<p class="description"><?php printf( __( 'You can disable the tracking of your site by <a href="%s">discouraging</a> search engines from indexing your site', 'buddypress' ), admin_url( 'options-reading.php#blog_public' ) ); ?></p>
+		<p class="description"><?php esc_html_e( 'Manage your site post types by enabling, disabling the checkboxes', 'buddypress' ) ;?></p>
+		<?php
+	}
+
+	/**
+	 * Output the tracking section callback
+	 * 
+	 * @access public
+	 * @since  BuddyPress (?)
+	 * 
+	 * @uses bp_admin_setting_callback_post_types_tracked() to get the output
+	 */
+	public function post_types_setting_callback() {
+		return bp_admin_setting_callback_post_types_tracked( $this->tracked_post_types );
+	}
+
+	/**
+	 * Sanitize the tracking setting
+	 * 
+	 * @access public
+	 * @since  BuddyPress (?)
+	 * 
+	 * @uses bp_admin_sanitize_callback_post_types_tracked() to sanitize the option
+	 */
+	public function post_types_sanitize_callback( $option = array() ) {
+		return bp_admin_sanitize_callback_post_types_tracked( $option );
+	}
+
+	/**
+	 * Makes sure the different activity actions will be available on root blog
+	 * 
+	 * @access public
+	 * @since  BuddyPress (?)
+	 */
+	public function activity_actions() {
+		// Bail if no settings were updated
+		if ( empty( $_GET['settings-updated'] ) || 'true' != $_GET['settings-updated'] )
+			return;
+
+		/**
+		 * In order to populate the selectbox filters in activity directory and members activity page
+		 * we need to save the post type activity type and label into a network option
+		 */ 
+		$network_compare = array_diff_key( $this->tracked_post_types, $this->network_active );
+
+		// the network option
+		$subsite_cached_post_type_actions = bp_get_option( 'bp-enabled-subsites-post-type-actions', array() );
+
+		// network post types that are specific to subsite
+		$subsite_compare = array_diff_key( $subsite_cached_post_type_actions, $this->tracked_post_types );
+		
+		/**
+		 * One or more post types active on this blog are not on network
+		 * Let's save its action & label
+		 */
+		if ( ! empty( $network_compare ) ) {
+
+			foreach ( array_keys( $network_compare ) as $post ) {
+				
+				if ( empty( $subsite_cached_post_type_actions[ $post ] ) ) {
+
+					$post_type = get_post_type_object( $post );
+
+					$action = ! empty( $post_type->bp_tracking['activity_post_type_action'] ) ? esc_html( $post_type->bp_tracking['activity_post_type_action'] ) : 'new_blog_'. $post;
+					$label  = ! empty( $post_type->bp_tracking['activity_post_type_action_label'] ) ? esc_html( $post_type->bp_tracking['activity_post_type_action_label'] ) : lcfirst( esc_html( $post_type->labels->singular_name ) );
+
+					$subsite_cached_post_type_actions[ $post ]['actions'][] = array( 
+						'action' => $action,
+						'label'  => $label
+					);
+
+					// Adding the blog to the list
+					$subsite_cached_post_type_actions[ $post ]['blogs'][] = $this->blog_id;
+
+					if ( post_type_supports( $post, 'comments' ) ) {
+
+						$action_comment = ! empty( $post_type->bp_tracking['activity_post_type_comment_action'] ) ? esc_html( $post_type->bp_tracking['activity_post_type_comment_action'] ) : "new_blog_{$post}_comment" ;
+						$label_comment  = ! empty( $post_type->bp_tracking['activity_post_type_comment_action_label'] ) ? esc_html( $post_type->bp_tracking['activity_post_type_comment_action_label'] ) : lcfirst( esc_html( $post_type->labels->singular_name ) . ' comment' );
+
+						$subsite_cached_post_type_actions[ $post ]['actions'][] = array( 
+							'action' => $action_comment,
+							'label'  => $label_comment
+						);
+					}
+
+				} else {
+					// Simply add the blog to the list if it's not already in
+					if ( in_array( $this->blog_id, $subsite_cached_post_type_actions[ $post ]['blogs'] ) )
+						continue;
+					
+					$subsite_cached_post_type_actions[ $post ]['blogs'][] = $this->blog_id;
+				}
+			}
+
+			bp_update_option( 'bp-enabled-subsites-post-type-actions', $subsite_cached_post_type_actions );
+		}
+
+		/**
+		 * The post type is no more tracked
+		 */
+		if ( ! empty( $subsite_compare ) ) {
+
+			foreach( $subsite_compare as $post => $post_type ) {
+				// this should not happen..
+				if ( empty( $subsite_compare[ $post ]['blogs'] ) )
+					continue;
+
+				// removing the blog from the list
+				if ( in_array( $this->blog_id, $subsite_compare[ $post ]['blogs'] ) ) {
+					$blog_index = array_flip( $subsite_compare[ $post ]['blogs'] );
+					unset( $subsite_compare[ $post ]['blogs'][ $blog_index[ $this->blog_id ] ] );
+				}
+
+				// Remove post type that are no more active on any blogs
+				if ( empty( $subsite_compare[ $post ]['blogs'] ) ) {
+					unset( $subsite_compare[ $post ] );
+				}
+					
+			}
+
+			// nothing left, just delete the option
+			if ( empty( $subsite_compare ) ) {
+				bp_delete_option( 'bp-enabled-subsites-post-type-actions' );
+			// some blogs are still using specific post types, just update the option
+			} else {
+				bp_update_option( 'bp-enabled-subsites-post-type-actions', $subsite_compare );
+			}
+		}
+
+	}
+
+}
+endif; // class_exists check
+
+// Load the BP Blogs admin
+add_action( 'bp_init', array( 'BP_Blogs_Admin','register_blogs_admin' ) );
diff --git bp-blogs/bp-blogs-functions.php bp-blogs/bp-blogs-functions.php
index f887dd9..56f219c 100644
--- bp-blogs/bp-blogs-functions.php
+++ bp-blogs/bp-blogs-functions.php
@@ -158,6 +158,59 @@ function bp_blogs_is_blog_trackable( $blog_id, $user_id = 0 ) {
 	return $trackable_globally;
 }
 
+
+function bp_blogs_blog_trackable_post_type( $default = array(), $blog_id = 0 ) {
+	if ( empty( $blog_id ) )
+		$blog_id = get_current_blog_id();
+
+	if ( empty( $default) )
+		$default = array( 'post' => 1 );
+
+	$default = array_merge( bp_trackable_post_types(), $default );
+
+	return (array) apply_filters( 'bp_blogs_blog_trackable_post_types', (array) get_blog_option( $blog_id, 'bp-enabled-post-types', $default ), $blog_id );
+}
+
+/**
+ * Check whether a given blog post type should be tracked by the Blogs component.
+ *
+ * If $blog_id is provided, the developer can restrict a given blog post type from
+ * being trackable.
+ *
+ * @since BuddyPress (?)
+ *
+ * @uses bp_trackable_post_types()
+ * @uses apply_filters()
+ *
+ * @param string $post_type the post type being checked.
+ * @param int $blog_id the blog the post type is registered to.
+ * @return bool True if the post type is trackable, otherwise false.
+ */
+function bp_blogs_is_blog_post_type_trackable( $post_type = '', $blog_id = 0 ) {
+	/**
+	 * If blog id is not root_blog_id, get the current blog settings instead of network one
+	 */
+	if ( $blog_id != bp_get_root_blog_id() ) {
+		$trackable = (array) apply_filters( 'bp_blogs_is_blog_post_type_trackable', bp_blogs_blog_trackable_post_type( array(), $blog_id ), $blog_id );
+	} else {
+		$trackable = (array) apply_filters( 'bp_blogs_is_blog_post_type_trackable', bp_trackable_post_types(),                            $blog_id );
+	}
+
+	// BackCompat
+	$legacy_post_type_filter = apply_filters( 'bp_blogs_record_post_post_types', array() );
+	$legacy_comment_filter   = apply_filters( 'bp_blogs_record_comment_post_types', array() );
+	$legacy_post_type_filter = array_merge( $legacy_post_type_filter, $legacy_comment_filter );
+
+	if ( ! empty( $legacy_post_type_filter ) ) {
+		$legacy_post_type_filter = array_fill_keys( $legacy_post_type_filter, 1 );
+
+		// Merge the two arrays making sure the setting saved for the post type will be the final value 
+		$trackable = array_merge( $legacy_post_type_filter, $trackable );
+	}
+
+	return ! empty( $trackable[ $post_type ] );
+}
+
 /**
  * Make BuddyPress aware of a new site so that it can track its activity.
  *
@@ -280,6 +333,57 @@ function bp_blogs_catch_published_post( $new_status, $old_status, $post ) {
 add_action( 'transition_post_status', 'bp_blogs_catch_published_post', 10, 3 );
 
 /**
+ * Callback function to build the permalink to the post type
+ * 
+ * @since  BuddyPress (?)
+ * 
+ * @param  integer $post_id the post type id
+ * @param  integer $blog_id the blog id
+ * @param  WP_Post  $post    Post object.
+ * @uses   add_query_arg()   To add custom args to the url
+ * @uses   get_home_url()
+ * @return string           the post type permalink
+ */
+function bp_blogs_activity_post_type_permalink_callback( $post_id = 0, $blog_id = 0, $post = null ) {
+	$post_permalink = add_query_arg(
+		'p',
+		$post_id,
+		trailingslashit( get_home_url( $blog_id ) )
+	);
+
+	return $post_permalink;
+}
+
+/**
+ * Callback function to build the action for the post type
+ * 
+ * @param  array  $args the available arguments
+ * @uses   bp_core_get_userlink() to build the post author profile link
+ * @uses   get_blog_option() WordPress function to fetch blog meta.
+ * @return string the activity action
+ */
+function bp_blogs_activity_post_type_action_callback( $args = array() ) {
+
+	$r = bp_parse_args( $args, array(
+		'post_author'             => bp_loggedin_user_id(),
+		'post_title'              => '',
+		'singular_post_type_name' => '',
+		'blog_id'                 => 0,
+		'post_permalink'          => '',
+	), 'blogs_activity_post_type_action_callback' );
+
+	extract( $r, EXTR_SKIP );
+
+	if ( ! empty( $blog_id ) ) {
+		$activity_action  = sprintf( __( '%1$s wrote a new %2$s, %3$s, on the site %4$s', 'buddypress' ), bp_core_get_userlink( (int) $post_author ), $singular_post_type_name, '<a href="' . $post_permalink . '">' . $post_title . '</a>', '<a href="' . get_blog_option( $blog_id, 'home' ) . '">' . get_blog_option( $blog_id, 'blogname' ) . '</a>' );
+	} else {
+		$activity_action  = sprintf( __( '%1$s wrote a new %2$s, %3$s', 'buddypress' ), bp_core_get_userlink( (int) $post_author ), $singular_post_type_name, '<a href="' . $post_permalink . '">' . $post_title . '</a>' );
+	}
+
+	return $activity_action;
+}
+
+/**
  * Record a new blog post in the BuddyPress activity stream.
  *
  * @param int $post_id ID of the post being recorded.
@@ -313,8 +417,8 @@ function bp_blogs_record_post( $post_id, $post, $user_id = 0 ) {
 	if ( (int) $blog_id == $tags_blog_id && apply_filters( 'bp_blogs_block_sitewide_tags_activity', true ) )
 		return false;
 
-	// Don't record this if it's not a post
-	if ( !in_array( $post->post_type, apply_filters( 'bp_blogs_record_post_post_types', array( 'post' ) ) ) )
+	// Don't record this if the post type is not trackable
+	if ( ! bp_blogs_is_blog_post_type_trackable( $post->post_type, $blog_id ) )
 		return false;
 
 	$is_blog_public = apply_filters( 'bp_is_blog_public', (int)get_blog_option( $blog_id, 'blog_public' ) );
@@ -323,40 +427,74 @@ function bp_blogs_record_post( $post_id, $post, $user_id = 0 ) {
 		if ( $is_blog_public || !is_multisite() ) {
 
 			// Record this in activity streams
-			$post_permalink = add_query_arg(
-				'p',
-				$post_id,
-				trailingslashit( get_home_url( $blog_id ) )
+			$post_type_object = get_post_type_object( $post->post_type );
+
+			// Initializing the action arguments
+			$action_args = array(
+				'post_author'              => absint( $post->post_author ),
+				'post_title'               => esc_html( $post->post_title ),
+				'singular_post_type_name'  => lcfirst( esc_html( $post_type_object->labels->singular_name ) ),
+				'blog_id'                  => is_multisite() ? $blog_id : 0,
 			);
 
-			if ( is_multisite() )
-				$activity_action  = sprintf( __( '%1$s wrote a new post, %2$s, on the site %3$s', 'buddypress' ), bp_core_get_userlink( (int) $post->post_author ), '<a href="' . $post_permalink . '">' . $post->post_title . '</a>', '<a href="' . get_blog_option( $blog_id, 'home' ) . '">' . get_blog_option( $blog_id, 'blogname' ) . '</a>' );
-			else
-				$activity_action  = sprintf( __( '%1$s wrote a new post, %2$s', 'buddypress' ), bp_core_get_userlink( (int) $post->post_author ), '<a href="' . $post_permalink . '">' . $post->post_title . '</a>' );
+			if ( ! empty( $post_type_object->bp_tracking ) ) {
+				/**
+				 * Extracting bp_tracking post type argument will give us the following vars (if set):
+				 * - activity_post_type_action                   // the post type main action 
+				 * - activity_post_type_action_label             // the post type main action label (used in template filter box)
+				 * - activity_post_type_permalink_callback       // the post type provided function to build the permalink
+				 * - activity_post_type_action_callback          // the post type provided function to build the activity action
+				 *
+				 * Plugins developers can set these, by adding a bp_tracking argument when registering their post type
+				 * see how to set a post type argument: http://codex.wordpress.org/Function_Reference/register_post_type#Arguments
+				 */
+				extract( $post_type_object->bp_tracking, EXTR_SKIP );
+
+				// Builds the permalink to the post_type using the callback function provided by the post type
+				if ( ! empty( $activity_post_type_permalink_callback ) && is_callable( $activity_post_type_permalink_callback ) )
+					$action_args['post_permalink'] = call_user_func_array( $activity_post_type_permalink_callback, array( $post_id, $blog_id, $post ) );
+
+				// Builds the activity action for the post type
+				if ( ! empty( $activity_post_type_action_callback ) && is_callable( $activity_post_type_action_callback ) )
+					$activity_action               = call_user_func_array( $activity_post_type_action_callback, array( $action_args ) );
+
+			} 
+
+			if ( empty( $action_args['post_permalink'] ) ) 
+				$action_args['post_permalink'] = bp_blogs_activity_post_type_permalink_callback( $post_id, $blog_id, $post );
+
+			if ( empty( $activity_action ) )
+				$activity_action               = bp_blogs_activity_post_type_action_callback( $action_args );
+
+			// if no action "identifier" ( == type field of activity table ) was provided by the post type
+			if ( empty( $activity_post_type_action ) ) {
+				$activity_post_type_action = 'new_blog_'. $post->post_type;
+			}
 
 			// Make sure there's not an existing entry for this post (prevent bumping)
 			if ( bp_is_active( 'activity' ) ) {
 				$existing = bp_activity_get( array(
 					'filter' => array(
-						'action'       => 'new_blog_post',
+						'action'       => $activity_post_type_action,
 						'primary_id'   => $blog_id,
 						'secondary_id' => $post_id,
 					)
 				) );
 
-				if ( !empty( $existing['activities'] ) ) {
+				if ( ! empty( $existing['activities'] ) ) {
 					return;
 				}
 			}
 
 			$activity_content = $post->post_content;
+			$post_permalink   = $action_args['post_permalink'];
 
 			bp_blogs_record_activity( array(
 				'user_id'           => (int) $post->post_author,
-				'action'            => apply_filters( 'bp_blogs_activity_new_post_action',       $activity_action,  $post, $post_permalink ),
-				'content'           => apply_filters( 'bp_blogs_activity_new_post_content',      $activity_content, $post, $post_permalink ),
-				'primary_link'      => apply_filters( 'bp_blogs_activity_new_post_primary_link', $post_permalink,   $post_id               ),
-				'type'              => 'new_blog_post',
+				'action'            => apply_filters( "bp_blogs_activity_new_{$post->post_type}_action",       $activity_action,  $post, $post_permalink ),
+				'content'           => apply_filters( "bp_blogs_activity_new_{$post->post_type}_content",      $activity_content, $post, $post_permalink ),
+				'primary_link'      => apply_filters( "bp_blogs_activity_new_{$post->post_type}_primary_link", $post_permalink,   $post_id               ),
+				'type'              => $activity_post_type_action,
 				'item_id'           => $blog_id,
 				'secondary_item_id' => $post_id,
 				'recorded_time'     => $post->post_date_gmt,
@@ -373,6 +511,34 @@ function bp_blogs_record_post( $post_id, $post, $user_id = 0 ) {
 }
 
 /**
+ * Callback function to build the action for the comment on the post type
+ * 
+ * @param  array  $args the available arguments
+ * @uses   bp_core_get_userlink() to build the post author profile link
+ * @uses   get_blog_option() WordPress function to fetch blog meta.
+ * @return string the activity action
+ */
+function bp_blogs_activity_post_type_comment_action_callback( $args = array() ) {
+	
+	$r = bp_parse_args( $args, array(
+		'user_id'                 => bp_loggedin_user_id(),
+		'post_title'              => '',
+		'singular_post_type_name' => '',
+		'blog_id'                 => 0,
+		'post_permalink'          => '',
+	), 'blogs_activity_post_type_comment_action_callback' );
+
+	extract( $r, EXTR_SKIP );
+
+	if ( ! empty( $blog_id ) )
+		$activity_action = sprintf( __( '%1$s commented on the %2$s, %3$s, on the site %4$s', 'buddypress' ), bp_core_get_userlink( $user_id ), $singular_post_type_name, '<a href="' . $post_permalink . '">' . apply_filters( 'the_title', $post_title ) . '</a>', '<a href="' . get_blog_option( $blog_id, 'home' ) . '">' . get_blog_option( $blog_id, 'blogname' ) . '</a>' );
+	else
+		$activity_action = sprintf( __( '%1$s commented on the %2$s, %3$s', 'buddypress' ), bp_core_get_userlink( $user_id ), $singular_post_type_name, '<a href="' . $post_permalink . '">' . apply_filters( 'the_title', $post_title ) . '</a>' );
+
+	return $activity_action;
+}
+
+/**
  * Record a new blog comment in the BuddyPress activity stream.
  *
  * Only posts the item if blog is public and post is not password-protected.
@@ -424,8 +590,8 @@ function bp_blogs_record_comment( $comment_id, $is_approved = true ) {
 	if ( !empty( $recorded_comment->post->post_password ) )
 		return false;
 
-	// Don't record activity if the comment's associated post isn't a WordPress Post
-	if ( !in_array( $recorded_comment->post->post_type, apply_filters( 'bp_blogs_record_comment_post_types', array( 'post' ) ) ) )
+	// Don't record this if the post type has not been set by administrator to be tracked
+	if ( ! bp_blogs_is_blog_post_type_trackable( $recorded_comment->post->post_type, $blog_id ) )
 		return false;
 
 	$is_blog_public = apply_filters( 'bp_is_blog_public', (int)get_blog_option( $blog_id, 'blog_public' ) );
@@ -433,25 +599,70 @@ function bp_blogs_record_comment( $comment_id, $is_approved = true ) {
 	// If blog is public allow activity to be posted
 	if ( $is_blog_public ) {
 
-		// Get activity related links
-		$post_permalink = get_permalink( $recorded_comment->comment_post_ID );
+		// Record this in activity streams
+		$post_type_object = get_post_type_object( $recorded_comment->post->post_type );
+
+		// Initializing the action arguments
+		$action_args = array(
+			'user_id'                  => $user_id,
+			'post_title'               => $recorded_comment->post->post_title,
+			'singular_post_type_name'  => lcfirst( esc_html( $post_type_object->labels->singular_name ) ),
+			'blog_id'                  => is_multisite() ? $blog_id : 0,
+		);
+		
+		if( ! empty( $post_type_object->bp_tracking ) ) {
+			/**
+			 * Extracting bp_tracking post type argument will give us the following vars (if set):
+			 * - activity_post_type_permalink_callback       // the post type provided function to build the permalink
+			 * - activity_post_type_comment_action           // the post type comment action
+			 * - activity_post_type_comment_action_label     // the post type comment action label (used in template filter box)
+			 * - activity_post_type_comment_action_callback  // the post type provided function to build the comment activity action
+			 *
+			 * Plugins developers can set these, by adding a bp_tracking argument when registering their post type
+			 * see how to set a post type argument: http://codex.wordpress.org/Function_Reference/register_post_type#Arguments
+			 */
+			extract( $post_type_object->bp_tracking, EXTR_SKIP );
+
+			// Builds the permalink to the post_type comment
+			if ( ! empty( $activity_post_type_permalink_callback ) && is_callable( $activity_post_type_permalink_callback ) )
+				$action_args['post_permalink'] = call_user_func_array( $activity_post_type_permalink_callback, array( $recorded_comment->comment_post_ID, $blog_id, $recorded_comment->post ) );
+
+			if( ! empty( $activity_post_type_comment_action_callback ) && is_callable( $activity_post_type_comment_action_callback ) )
+				$activity_action               = call_user_func_array( $activity_post_type_comment_action_callback, array( $action_args ) );
+
+		} 
+
+		if ( empty( $action_args['post_permalink'] ) )
+			$action_args['post_permalink'] = get_permalink( $recorded_comment->comment_post_ID );
+
+		if ( empty( $activity_action ) )
+			$activity_action = bp_blogs_activity_post_type_comment_action_callback( $action_args );
+
+		
+		// Get the activity type
+		$comment_prefix = ( 'post' == $recorded_comment->post->post_type ) ? '' : $recorded_comment->post->post_type . '_';
+
+		// if no action "identifier" ( == type field of activity table ) was provided by the post type
+		if ( empty( $activity_post_type_comment_action ) ) {
+			$activity_post_type_comment_action = "new_blog_{$comment_prefix}comment";
+		}
+
+		// Get comment link
 		$comment_link   = get_comment_link( $recorded_comment->comment_ID );
 
-		// Prepare to record in activity streams
-		if ( is_multisite() )
-			$activity_action = sprintf( __( '%1$s commented on the post, %2$s, on the site %3$s', 'buddypress' ), bp_core_get_userlink( $user_id ), '<a href="' . $post_permalink . '">' . apply_filters( 'the_title', $recorded_comment->post->post_title ) . '</a>', '<a href="' . get_blog_option( $blog_id, 'home' ) . '">' . get_blog_option( $blog_id, 'blogname' ) . '</a>' );
-		else
-			$activity_action = sprintf( __( '%1$s commented on the post, %2$s', 'buddypress' ), bp_core_get_userlink( $user_id ), '<a href="' . $post_permalink . '">' . apply_filters( 'the_title', $recorded_comment->post->post_title ) . '</a>' );
+		// Get the comment content
+		$activity_content = $recorded_comment->comment_content;
 
-		$activity_content	= $recorded_comment->comment_content;
+		// to have custom filters by type of post type commented.
+		$comment_post_type = ( 'post' == $recorded_comment->post->post_type ) ? 'comment' : $recorded_comment->post->post_type . '_comment';
 
 		// Record in activity streams
 		bp_blogs_record_activity( array(
 			'user_id'           => $user_id,
-			'action'            => apply_filters_ref_array( 'bp_blogs_activity_new_comment_action',       array( $activity_action,  &$recorded_comment, $comment_link ) ),
-			'content'           => apply_filters_ref_array( 'bp_blogs_activity_new_comment_content',      array( $activity_content, &$recorded_comment, $comment_link ) ),
-			'primary_link'      => apply_filters_ref_array( 'bp_blogs_activity_new_comment_primary_link', array( $comment_link,     &$recorded_comment                ) ),
-			'type'              => 'new_blog_comment',
+			'action'            => apply_filters_ref_array( "bp_blogs_activity_new_{$comment_post_type}_action",       array( $activity_action,  &$recorded_comment, $comment_link ) ),
+			'content'           => apply_filters_ref_array( "bp_blogs_activity_new_{$comment_post_type}_content",      array( $activity_content, &$recorded_comment, $comment_link ) ),
+			'primary_link'      => apply_filters_ref_array( "bp_blogs_activity_new_{$comment_post_type}_primary_link", array( $comment_link,     &$recorded_comment                ) ),
+			'type'              => $activity_post_type_comment_action,
 			'item_id'           => $blog_id,
 			'secondary_item_id' => $comment_id,
 			'recorded_time'     => $recorded_comment->comment_date_gmt
diff --git bp-blogs/bp-blogs-loader.php bp-blogs/bp-blogs-loader.php
index 39e0450..62ce92b 100644
--- bp-blogs/bp-blogs-loader.php
+++ bp-blogs/bp-blogs-loader.php
@@ -96,9 +96,14 @@ class BP_Blogs_Component extends BP_Component {
 			'buddybar'
 		);
 
-		if ( is_multisite() )
+		if ( is_multisite() ) {
 			$includes[] = 'widgets';
 
+			if ( bp_get_root_blog_id() != get_current_blog_id() && is_admin() && bp_is_active( 'activity' ) )
+				$includes[] = 'admin';
+		}
+			
+
 		// Include the files
 		parent::includes( $includes );
 	}
diff --git bp-blogs/bp-blogs-template.php bp-blogs/bp-blogs-template.php
index b69c1c6..388d31e 100644
--- bp-blogs/bp-blogs-template.php
+++ bp-blogs/bp-blogs-template.php
@@ -1288,3 +1288,29 @@ function bp_blogs_get_profile_stats( $args = '' ) {
 	// Filter and return
 	return apply_filters( 'bp_blogs_get_profile_stats', $r['output'], $r );
 }
+
+/**
+ * Adds the available post types actions to activity filters
+ * 
+ * As in bp-legacy or bp-default templates the regular post type
+ * is already added we'll need to remove it from these options.
+ * Leaving it this way for backcompat theme purpose. But all
+ * post types should be handled there in the future..
+ * 
+ * @return string html output
+ */
+function bp_blogs_post_types_activity_options() {
+
+	$blogs_legacy_actions     = array( 'new_blog_post', 'new_blog_comment' );
+	$blogs_post_types_actions = buddypress()->activity->actions->blogs;
+
+	foreach ( $blogs_post_types_actions as $action ) {
+		if ( in_array( $action['key'], $blogs_legacy_actions ) )
+			continue;
+		?>
+		<option value="<?php echo esc_attr( $action['key'] ) ;?>"><?php echo esc_html( $action['value'] ) ;?></option>
+		<?php
+	}
+}
+add_action( 'bp_activity_filter_options',        'bp_blogs_post_types_activity_options' );
+add_action( 'bp_member_activity_filter_options', 'bp_blogs_post_types_activity_options' );
diff --git bp-core/admin/bp-core-settings.php bp-core/admin/bp-core-settings.php
index e112df7..9e25db3 100644
--- bp-core/admin/bp-core-settings.php
+++ bp-core/admin/bp-core-settings.php
@@ -211,6 +211,77 @@ function bp_admin_setting_callback_group_creation() {
 <?php
 }
 
+/** Blogs Section *************************************************************/
+
+/**
+ * Displays a message about the trackable post types in case BuddyPress is network activated
+ *
+ * @since BuddyPress (?)
+ * @uses  bp_core_do_network_admin() to check if BuddyPress is network activated
+ */
+function bp_admin_setting_callback_blogs_section() {
+	if ( bp_core_do_network_admin() ) {
+	?>
+		<p class="description"><?php _e( 'Only the networked enabled & the primary blog post types can be tracked in Activity stream.', 'buddypress' );?></p>
+	<?php
+	}
+}
+
+/**
+ * Allow the Admin to define the post types to track in activity stream
+ *
+ * @since BuddyPress (?)
+ *
+ * @uses  get_post_types() to list the show_in_nav_menus enabled post types
+ * @uses  checked() To display the checked attribute
+ * @uses  post_type_supports() to check for bp_tracking support
+ */
+function bp_admin_setting_callback_post_types_tracked( $setting = '') {
+	/**
+	 * Using show_in_nav_menus argument avoids the inclusion of the attachment post type 
+	 * if show_in_nav_menus is not defined it defaults to the value of public arguments
+	 */
+	$post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' );
+
+	// Building an array to compare with the array saved in bp-enabled-post-types option
+	$compare    = array_fill_keys( array_keys( $post_types ), 0 );
+
+	if ( empty( $setting ) )
+		$setting = bp_trackable_post_types();
+
+	// Merge the two arrays making sure the setting saved for the post type will be the final value 
+	$db_post_types = array_merge( $compare, $setting );
+
+	if ( empty( $db_post_types ) )
+		return;
+
+	foreach ( $post_types as $post_type => $arguments ) {
+		$readonly = ( 'post' == $post_type ) ? 'disabled' : '';
+		?>
+
+		<input id="bp-enabled-post-types-<?php echo $post_type;?>" name="bp-enabled-post-types[<?php echo $post_type;?>]" type="checkbox" value="1" <?php checked( $db_post_types[ $post_type ] ); ?> <?php echo $readonly;?>/>
+		<label for="bp-enabled-post-types-<?php echo $post_type;?>"><?php echo $arguments->labels->name ?></label>
+
+		<?php
+	}
+
+}
+
+/**
+ * Sanitization for bp-enabled-post-types
+ *
+ * @since BuddyPress (?)
+ */
+function bp_admin_sanitize_callback_post_types_tracked( $value = array() ) {
+	// Post is legacy : always tracked.
+	$tracked = array( 'post' => 1 );
+
+	if( is_array( $value ) )
+		$tracked = array_merge( $tracked, $value );
+
+	return array_map( 'absint', $tracked );
+}
+
 /** Forums Section ************************************************************/
 
 /**
diff --git bp-core/bp-core-actions.php bp-core/bp-core-actions.php
index df61f5a..de1c65e 100644
--- bp-core/bp-core-actions.php
+++ bp-core/bp-core-actions.php
@@ -33,6 +33,7 @@ if ( !defined( 'ABSPATH' ) ) exit;
   */
 add_action( 'plugins_loaded',          'bp_loaded',                 10    );
 add_action( 'init',                    'bp_init',                   10    );
+add_action( 'init',                    'bp_catch_post_types',       100   ); // late to catch post types
 add_action( 'parse_query',             'bp_parse_query',            2     ); // Early for overrides
 add_action( 'wp',                      'bp_ready',                  10    );
 add_action( 'set_current_user',        'bp_setup_current_user',     10    );
diff --git bp-core/bp-core-admin.php bp-core/bp-core-admin.php
index 4020355..0e9ee2e 100644
--- bp-core/bp-core-admin.php
+++ bp-core/bp-core-admin.php
@@ -348,6 +348,18 @@ class BP_Admin {
 		    add_settings_field( 'bp-disable-avatar-uploads', __( 'Avatar Uploads',   'buddypress' ), 'bp_admin_setting_callback_avatar_uploads',   'buddypress', $avatar_setting );
 		    register_setting  ( 'buddypress',         'bp-disable-avatar-uploads',   'intval'                                                                                    );
 		}
+
+		/** Blogs Section **************************************************/
+
+		if ( bp_is_active( 'blogs' ) ) {
+
+			// Add the main section
+			add_settings_section( 'bp_blogs', __( 'Site Tracking Settings', 'buddypress' ), 'bp_admin_setting_callback_blogs_section', 'buddypress' );
+
+			// Post types tracking settings
+			add_settings_field( 'bp-enabled-post-types', __( 'List of post types to track', 'buddypress' ), 'bp_admin_setting_callback_post_types_tracked', 'buddypress', 'bp_blogs' );
+			register_setting  ( 'buddypress',           'bp-enabled-post-types',                            'bp_admin_sanitize_callback_post_types_tracked'                          );
+		}
 	}
 
 	/**
diff --git bp-core/bp-core-dependency.php bp-core/bp-core-dependency.php
index eaf839c..32262c3 100644
--- bp-core/bp-core-dependency.php
+++ bp-core/bp-core-dependency.php
@@ -388,3 +388,13 @@ function bp_get_request() {
 	// Use this static action if you don't mind checking the 'action' yourself.
 	do_action( 'bp_get_request',   $_GET['action'] );
 }
+
+/**
+ * The main action used for catching registered post types
+ *
+ * @since BuddyPress (?)
+ * @uses do_action()
+ */
+function bp_catch_post_types() {
+	do_action( 'bp_catch_post_types' );
+}
diff --git bp-core/bp-core-options.php bp-core/bp-core-options.php
index 07edc8c..4e9ce57 100644
--- bp-core/bp-core-options.php
+++ bp-core/bp-core-options.php
@@ -506,6 +506,22 @@ function bp_disable_blogforum_comments( $default = false ) {
 }
 
 /**
+ * What are the registered post types trackable in activity streams?
+ *
+ * @since BuddyPress (?)
+ *
+ * @uses bp_get_option() To get the blog/forum comments option.
+ *
+ * @param array $default Optional. Fallback value if not found in the database.
+ *        Default: array().
+ * @return bool True if activity comments are disabled for blog and forum
+ *         items, otherwise false.
+ */
+function bp_trackable_post_types( $default = array( 'post' => 1 ) ) {
+	return (array) apply_filters( 'bp_trackable_post_types', (array) bp_get_option( 'bp-enabled-post-types', $default ) );
+}
+
+/**
  * Is group creation turned off?
  *
  * @since BuddyPress (1.6.0)
