diff --git bp-core/bp-core-catchuri.php bp-core/bp-core-catchuri.php
index bb052a1..518f86a 100644
--- bp-core/bp-core-catchuri.php
+++ bp-core/bp-core-catchuri.php
@@ -367,7 +367,7 @@ function bp_core_load_template( $templates ) {
 		$wp_query->queried_object_id = $object_id;
 		$post                        = $wp_query->queried_object;
 	}
-
+	
 	// Define local variables
 	$located_template   = false;
 	$filtered_templates = array();
@@ -385,7 +385,11 @@ function bp_core_load_template( $templates ) {
 		$wp_query->is_page = $wp_query->is_singular = true;
 		$wp_query->is_404  = false;
 
+		do_action( 'bp_core_pre_load_template', $located_template );
+
 		load_template( apply_filters( 'bp_load_template', $located_template ) );
+	
+		do_action( 'bp_core_post_load_template', $located_template );
 	}
 
 	// Kill any other output after this.
diff --git bp-core/bp-core-functions.php bp-core/bp-core-functions.php
index 76576a0..1e5f5f9 100644
--- bp-core/bp-core-functions.php
+++ bp-core/bp-core-functions.php
@@ -1524,4 +1524,28 @@ function bp_do_404( $redirect = 'remove_canonical_direct' ) {
 	if ( 'remove_canonical_direct' == $redirect )
 		remove_action( 'template_redirect', 'redirect_canonical' );
 }
+
+/**
+ * Canonicalizes URLs by ensuring that requests are always redirected to a trailingslashed version
+ *
+ * @since 1.6
+ */
+function bp_redirect_canonical() {
+	if ( !bp_is_blog_page() && apply_filters( 'bp_do_redirect_canonical', true ) ) {
+		// build the URL in the address bar
+		$requested_url  = is_ssl() ? 'https://' : 'http://';
+		$requested_url .= $_SERVER['HTTP_HOST'];
+		$requested_url .= $_SERVER['REQUEST_URI'];
+		
+		// Stash query args
+		$url_stack    = explode( '?', $requested_url );
+		$url_base     = $url_stack[0];
+		$url_stack[0] = trailingslashit( $url_stack[0] );
+		
+		if ( $url_stack[0] !== $url_base ) {
+			bp_core_redirect( implode( '?', $url_stack ) );
+		}
+	}
+}
+add_action( 'bp_core_pre_load_template', 'bp_redirect_canonical' );
 ?>
