Index: bbpress.php
--- bbpress.php
+++ bbpress.php
@@ -221,13 +221,14 @@
 		$this->trash_status_id   = apply_filters( 'bbp_trash_post_status',   'trash'   );
 
 		// Other identifiers
-		$this->user_id           = apply_filters( 'bbp_user_id', 'bbp_user' );
-		$this->tops_id           = apply_filters( 'bbp_tops_id', 'bbp_tops' );
-		$this->reps_id           = apply_filters( 'bbp_reps_id', 'bbp_reps' );
-		$this->favs_id           = apply_filters( 'bbp_favs_id', 'bbp_favs' );
-		$this->subs_id           = apply_filters( 'bbp_subs_id', 'bbp_subs' );
-		$this->view_id           = apply_filters( 'bbp_view_id', 'bbp_view' );
-		$this->edit_id           = apply_filters( 'bbp_edit_id', 'edit'     );
+		$this->user_id           = apply_filters( 'bbp_user_id',   'bbp_user'   );
+		$this->tops_id           = apply_filters( 'bbp_tops_id',   'bbp_tops'   );
+		$this->reps_id           = apply_filters( 'bbp_reps_id',   'bbp_reps'   );
+		$this->favs_id           = apply_filters( 'bbp_favs_id',   'bbp_favs'   );
+		$this->subs_id           = apply_filters( 'bbp_subs_id',   'bbp_subs'   );
+		$this->view_id           = apply_filters( 'bbp_view_id',   'bbp_view'   );
+		$this->search_id         = apply_filters( 'bbp_search_id', 'bbp_search' );
+		$this->edit_id           = apply_filters( 'bbp_edit_id',   'edit'       );
 
 		/** Queries ***********************************************************/
 
@@ -239,6 +240,7 @@
 		$this->forum_query    = new stdClass(); // Main forum query
 		$this->topic_query    = new stdClass(); // Main topic query
 		$this->reply_query    = new stdClass(); // Main reply query
+		$this->search_query   = new stdClass(); // Main search query
 
 		/** Theme Compat ******************************************************/
 
@@ -358,8 +360,8 @@
 			'register_views',           // Register the views (no-replies)
 			'register_theme_packages',  // Register bundled theme packages (bbp-theme-compat/bbp-themes)
 			'load_textdomain',          // Load textdomain (bbpress)
-			'add_rewrite_tags',         // Add rewrite tags (view|user|edit)
-			'generate_rewrite_rules'    // Generate rewrite rules (view|edit)
+			'add_rewrite_tags',         // Add rewrite tags (view|user|edit|search)
+			'generate_rewrite_rules'    // Generate rewrite rules (view|edit|search)
 		);
 
 		// Add the actions
@@ -832,6 +834,7 @@
 	public static function add_rewrite_tags() {
 		add_rewrite_tag( '%%' . bbp_get_view_rewrite_id()               . '%%', '([^/]+)'   ); // View Page tag
 		add_rewrite_tag( '%%' . bbp_get_edit_rewrite_id()               . '%%', '([1]{1,})' ); // Edit Page tag
+		add_rewrite_tag( '%%' . bbp_get_search_rewrite_id()             . '%%', '([^/]+)'   ); // Search Results tag
 		add_rewrite_tag( '%%' . bbp_get_user_rewrite_id()               . '%%', '([^/]+)'   ); // User Profile tag
 		add_rewrite_tag( '%%' . bbp_get_user_favorites_rewrite_id()     . '%%', '([1]{1,})' ); // User Favorites tag
 		add_rewrite_tag( '%%' . bbp_get_user_subscriptions_rewrite_id() . '%%', '([1]{1,})' ); // User Subscriptions tag
@@ -853,23 +856,25 @@
 	public static function generate_rewrite_rules( $wp_rewrite ) {
 
 		// Slugs
-		$view_slug = bbp_get_view_slug();
-		$user_slug = bbp_get_user_slug();
+		$view_slug   = bbp_get_view_slug();
+		$search_slug = bbp_get_search_slug();
+		$user_slug   = bbp_get_user_slug();
 
 		// Unique rewrite ID's
-		$edit_id = bbp_get_edit_rewrite_id();
-		$view_id = bbp_get_view_rewrite_id();
-		$user_id = bbp_get_user_rewrite_id();
-		$favs_id = bbp_get_user_favorites_rewrite_id();
-		$subs_id = bbp_get_user_subscriptions_rewrite_id();
-		$tops_id = bbp_get_user_topics_rewrite_id();
-		$reps_id = bbp_get_user_replies_rewrite_id();
+		$edit_id     = bbp_get_edit_rewrite_id();
+		$view_id     = bbp_get_view_rewrite_id();
+		$search_id   = bbp_get_search_rewrite_id();
+		$user_id     = bbp_get_user_rewrite_id();
+		$favs_id     = bbp_get_user_favorites_rewrite_id();
+		$subs_id     = bbp_get_user_subscriptions_rewrite_id();
+		$tops_id     = bbp_get_user_topics_rewrite_id();
+		$reps_id     = bbp_get_user_replies_rewrite_id();
 
 		// Rewrite rule matches used repeatedly below
-		$root_rule = '/([^/]+)/?$';
-		$edit_rule = '/([^/]+)/edit/?$';
-		$feed_rule = '/([^/]+)/feed/?$';
-		$page_rule = '/([^/]+)/page/?([0-9]{1,})/?$';
+		$root_rule   = '/([^/]+)/?$';
+		$edit_rule   = '/([^/]+)/edit/?$';
+		$feed_rule   = '/([^/]+)/feed/?$';
+		$page_rule   = '/([^/]+)/page/?([0-9]{1,})/?$';
 
 		// User profile rules
 		$tops_rule      = '/([^/]+)/topics/?$';
@@ -907,6 +912,11 @@
 			$view_slug . $page_rule => 'index.php?' . $view_id . '=' . $wp_rewrite->preg_index( 1 ) . '&paged=' . $wp_rewrite->preg_index( 2 ),
 			$view_slug . $feed_rule => 'index.php?' . $view_id . '=' . $wp_rewrite->preg_index( 1 ) . '&feed='  . $wp_rewrite->preg_index( 2 ),
 			$view_slug . $root_rule => 'index.php?' . $view_id . '=' . $wp_rewrite->preg_index( 1 ),
+
+			// Search All
+			$search_slug . $page_rule => 'index.php?' . $search_id . '=' . $wp_rewrite->preg_index( 1 ) . '&paged=' . $wp_rewrite->preg_index( 2 ),
+			$search_slug . $root_rule => 'index.php?' . $search_id . '=' . $wp_rewrite->preg_index( 1 ),
+			$search_slug . '/?$'      => 'index.php?' . $search_id . '=' . $wp_rewrite->preg_index( 1 ),
 		);
 
 		// Merge bbPress rules with existing
Index: includes/admin/settings.php
--- includes/admin/settings.php
+++ includes/admin/settings.php
@@ -299,6 +299,14 @@
 				'callback'          => 'bbp_admin_setting_callback_view_slug',
 				'sanitize_callback' => 'sanitize_title',
 				'args'              => array()
+			),
+
+			// Search slug setting
+			'_bbp_search_slug' => array(
+				'title'             => __( 'Search slug', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_search_slug',
+				'sanitize_callback' => 'sanitize_title',
+				'args'              => array()
 			)
 		),
 
@@ -883,6 +891,21 @@
 	bbp_form_slug_conflict_check( '_bbp_view_slug', 'view' );
 }
 
+/**
+ * Search slug setting field
+ *
+ * @uses bbp_form_option() To output the option value
+ */
+function bbp_admin_setting_callback_search_slug() {
+?>
+
+	<input name="_bbp_search_slug" type="text" id="_bbp_search_slug" class="regular-text code" value="<?php bbp_form_option( '_bbp_search_slug', 'search', true ); ?>"<?php bbp_maybe_admin_setting_disabled( '_bbp_search_slug' ); ?> />
+
+<?php
+	// Slug Check
+	bbp_form_slug_conflict_check( '_bbp_search_slug', 'search' );
+}
+
 /** BuddyPress ****************************************************************/
 
 /**
Index: includes/common/shortcodes.php
--- includes/common/shortcodes.php
+++ includes/common/shortcodes.php
@@ -79,6 +79,10 @@
 
 			'bbp-single-view'      => array( $this, 'display_view'          ), // Single view
 
+			/** Search ********************************************************/
+
+			'bbp-search'           => array( $this, 'display_search'        ), // Search
+
 			/** Account *******************************************************/
 
 			'bbp-login'            => array( $this, 'display_login'         ), // Login
@@ -114,9 +118,10 @@
 		$bbp = bbpress();
 
 		// Unset global queries
-		$bbp->forum_query = new stdClass;
-		$bbp->topic_query = new stdClass;
-		$bbp->reply_query = new stdClass;
+		$bbp->forum_query  = new stdClass;
+		$bbp->topic_query  = new stdClass;
+		$bbp->reply_query  = new stdClass;
+		$bbp->search_query = new stdClass;
 
 		// Unset global ID's
 		$bbp->current_forum_id     = 0;
@@ -602,6 +607,38 @@
 		return $this->end();
 	}
 
+	/** Search ****************************************************************/
+
+	/**
+	 * Display the contents of search results in an output buffer and return to
+	 * ensure that post/page contents are displayed first.
+	 *
+	 * @param array $attr
+	 * @param string $content
+	 * @uses bbp_search_query()
+	 * @uses get_template_part()
+	 */
+	public function display_search( $attr, $content = '' ) {
+
+		// Set passed attribute to $search_terms for clarity
+		$search_terms = $attr['search'];
+
+		// Start output buffer
+		$this->start( 'bbp_search' );
+
+		// Unset globals
+		$this->unset_globals();
+
+		// Load the search
+		bbp_search_query( array( 's' => $search_terms ) );
+
+		// Output template
+		bbp_get_template_part( 'content', 'search' );
+
+		// Return contents of output buffer
+		return $this->end();
+	}
+
 	/** Account ***************************************************************/
 
 	/**
Index: includes/common/template-tags.php
--- includes/common/template-tags.php
+++ includes/common/template-tags.php
@@ -784,6 +784,34 @@
 }
 
 /**
+ * Check if current page is a search page
+ *
+ * @global WP_Query $wp_query To check if WP_Query::bbp_is_search is true
+ * @uses bbp_is_query_name() To get the query name
+ * @return bool Is it a search page?
+ */
+function bbp_is_search() {
+	global $wp_query;
+
+	// Assume false
+	$retval = false;
+
+	// Check query
+	if ( !empty( $wp_query->bbp_is_search ) && ( true == $wp_query->bbp_is_search ) )
+		$retval = true;
+
+	// Check query name
+	if ( empty( $retval ) && bbp_is_query_name( 'bbp_search' ) )
+		$retval = true;
+
+	// Check $_GET
+	if ( empty( $retval ) && isset( $_GET[bbp_get_search_rewrite_id()] ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_search', $retval );
+}
+
+/**
  * Check if current page is an edit page
  *
  * @since bbPress (r3585)
@@ -1806,6 +1834,268 @@
 		return apply_filters( 'bbp_get_view_link', $url, $view );
 	}
 
+/** Search ********************************************************************/
+
+/**
+ * Output the search terms
+ *
+ * @param string $search_terms Optional. Search terms
+ * @uses bbp_get_search_terms() To get the search terms
+ */
+function bbp_search_terms( $search_terms = '' ) {
+	echo bbp_get_search_terms( $search_terms );
+}
+
+	/**
+	 * Get the search terms
+	 *
+	 * If search terms are supplied, those are used. Otherwise check the
+	 * search rewrite id query var.
+	 *
+	 * @param string $search_terms Optional. Search terms
+	 * @uses sanitize_title() To sanitize the search terms
+	 * @uses get_query_var*( To get the search terms from query var 'bbp_search'
+	 * @return bool|string Search terms on success, false on failure
+	 */
+	function bbp_get_search_terms( $search_terms = '' ) {
+
+		$search_terms = !empty( $search_terms ) ? sanitize_title( $search_terms ) : get_query_var( bbp_get_search_rewrite_id() );
+
+		if ( 1 == $search_terms )
+			$search_terms = '';
+
+		if ( !empty( $search_terms ) )
+			return $search_terms;
+
+		return false;
+	}
+
+/**
+ * Output the search page title
+ *
+ * @uses bbp_get_search_title()
+ */
+function bbp_search_title() {
+	echo bbp_get_search_title();
+}
+
+	/**
+	 * Get the search page title
+	 *
+	 * @uses bbp_get_search_terms()
+	 */
+	function bbp_get_search_title() {
+
+		// Get search terms
+		$search_terms = bbp_get_search_terms();
+
+		// No search terms specified
+		if ( empty( $search_terms ) ) {
+			return __( 'Search', 'bbpress' );
+
+		// Include search terms in title
+		} else {
+			return sprintf( __( "Search Results for '%s'", 'bbpress' ), esc_attr( $search_terms ) );
+		}
+	}
+
+/**
+ * Output the search url
+ *
+ * @uses bbp_get_search_url() To get the search url
+ */
+function bbp_search_url() {
+	echo bbp_get_search_url();
+}
+	/**
+	 * Return the search url
+	 *
+	 * @uses user_trailingslashit() To fix slashes
+	 * @uses trailingslashit() To fix slashes
+	 * @uses bbp_get_forums_url() To get the root forums url
+	 * @uses bbp_get_search_slug() To get the search slug
+	 * @uses add_query_arg() To help make unpretty permalinks
+	 * @return string Search url
+	 */
+	function bbp_get_search_url() {
+		global $wp_rewrite;
+
+		// Pretty permalinks
+		if ( $wp_rewrite->using_permalinks() ) {
+			$url = $wp_rewrite->root . bbp_get_search_slug();
+			$url = home_url( user_trailingslashit( $url ) );
+
+		// Unpretty permalinks
+		} else {
+			$search_terms = bbp_get_search_terms();
+			$url = add_query_arg( array( 'bbp_search' => $search_terms ), home_url( '/' ) ); 
+		}
+
+		return apply_filters( 'bbp_get_search_url', $url );
+	}
+
+/**
+ * The main search loop. WordPress does the heavy lifting.
+ *
+ * @param mixed $args All the arguments supported by {@link WP_Query}
+ * @uses bbp_get_view_all() Are we showing all results?
+ * @uses bbp_get_public_status_id() To get the public status id
+ * @uses bbp_get_closed_status_id() To get the closed status id
+ * @uses bbp_get_spam_status_id() To get the spam status id
+ * @uses bbp_get_trash_status_id() To get the trash status id
+ * @uses bbp_get_forum_post_type() To get the forum post type
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses bbp_get_replies_per_page() To get the replies per page option
+ * @uses bbp_get_paged() To get the current page value
+ * @uses bbp_get_search_terms() To get the search terms
+ * @uses WP_Query To make query and get the search results
+ * @uses WP_Rewrite::using_permalinks() To check if the blog is using permalinks
+ * @uses bbp_get_search_url() To get the forum search url
+ * @uses paginate_links() To paginate search results
+ * @uses apply_filters() Calls 'bbp_has_search_results' with
+ *                        bbPress::search_query::have_posts()
+ *                        and bbPress::reply_query
+ * @return object Multidimensional array of search information
+ */
+function bbp_has_search_results( $args = '' ) {
+	global $wp_rewrite;
+
+	/** Defaults **************************************************************/
+
+	// What are the default allowed statuses (based on user caps)
+	if ( bbp_get_view_all( 'edit_others_replies' ) ) {
+		$post_statuses = array( bbp_get_public_status_id(), bbp_get_closed_status_id(), bbp_get_spam_status_id(), bbp_get_trash_status_id() );
+	} else {
+		$post_statuses = array( bbp_get_public_status_id(), bbp_get_closed_status_id() );
+	}
+
+	$default_post_type   = array( bbp_get_forum_post_type(), bbp_get_topic_post_type(), bbp_get_reply_post_type() );
+	$default_post_status = join( ',', $post_statuses );
+
+	// Default query args
+	$default = array(
+		'post_type'      => $default_post_type,                // Forums, topics, and replies
+		'post_status'    => $default_post_status,              // Of this status
+		'posts_per_page' => bbp_get_replies_per_page(),        // This many
+		'paged'          => bbp_get_paged(),                   // On this page
+		'orderby'        => 'date',                            // Sorted by date
+		'order'          => 'DESC',                            // Most recent first
+		's'              => bbp_get_search_terms(),            // This is a search
+	);
+
+	/** Setup *****************************************************************/
+
+	// Parse arguments against default values
+	$r = bbp_parse_args( $args, $default, 'has_search_results' );
+
+	// Don't bother if we don't have search terms
+	if ( empty( $r['s'] ) )
+		return false;
+
+	// Get bbPress
+	$bbp = bbpress();
+
+	// Call the query
+	$bbp->search_query = new WP_Query( $r );
+
+	// Add pagination values to query object
+	$bbp->search_query->posts_per_page  = $r['posts_per_page'];
+	$bbp->search_query->paged           = $r['paged'];
+
+	// Never home, regardless of what parse_query says
+	$bbp->search_query->is_home         = false;
+
+	// Found posts
+	if ( !$bbp->search_query->found_posts )
+		return false;
+
+	// Only add pagination is query returned results
+	if ( (int) $bbp->search_query->found_posts && (int) $bbp->search_query->posts_per_page ) {
+
+		// If pretty permalinks are enabled, make our pagination pretty
+		if ( $wp_rewrite->using_permalinks() ) {
+
+			// Search
+			$base = trailingslashit( bbp_get_search_url() ) . user_trailingslashit( $wp_rewrite->pagination_base . '/%#%/' );
+
+		// Unpretty permalinks
+		} else {
+			$base = add_query_arg( 'paged', '%#%' );
+		}
+
+		// Add pagination to query object
+		$bbp->search_query->pagination_links = paginate_links(
+			apply_filters( 'bbp_search_results_pagination', array(
+				'base'      => $base,
+				'format'    => '',
+				'total'     => ceil( (int) $bbp->search_query->found_posts / (int) $r['posts_per_page'] ),
+				'current'   => (int) $bbp->search_query->paged,
+				'prev_text' => '&larr;',
+				'next_text' => '&rarr;',
+				'mid_size'  => 1,
+				'add_args'  => ( bbp_get_view_all() ) ? array( 'view' => 'all' ) : false
+			) )
+		);
+
+		// Remove first page from pagination
+		if ( $wp_rewrite->using_permalinks() ) {
+			$bbp->search_query->pagination_links = str_replace( $wp_rewrite->pagination_base . '/1/', '', $bbp->search_query->pagination_links );
+		} else {
+			$bbp->search_query->pagination_links = str_replace( '&#038;paged=1', '', $bbp->search_query->pagination_links );
+		}
+	}
+
+	// Return object
+	return apply_filters( 'bbp_has_search_results', $bbp->search_query->have_posts(), $bbp->search_query );
+}
+
+/**
+ * Whether there are more search results available in the loop
+ *
+ * @uses WP_Query bbPress::search_query::have_posts() To check if there are more
+ *                                                     search results available
+ * @return object Search information
+ */
+function bbp_search_results() {
+
+	// Put into variable to check against next
+	$have_posts = bbpress()->search_query->have_posts();
+
+	// Reset the post data when finished
+	if ( empty( $have_posts ) )
+		wp_reset_postdata();
+
+	return $have_posts;
+}
+
+/**
+ * Loads up the current search result in the loop
+ *
+ * @uses WP_Query bbPress::search_query::the_post() To get the current search result
+ * @return object Search information
+ */
+function bbp_the_search_result() {
+	$search_result = bbpress()->search_query->the_post();
+
+	switch ( get_post_type() ) {
+		case bbp_get_forum_post_type() :
+			bbpress()->current_forum_id = get_the_ID();
+			break;
+
+		case bbp_get_topic_post_type() :
+			bbpress()->current_topic_id = get_the_ID();
+			break;
+
+		case bbp_get_reply_post_type() :
+			bbpress()->current_reply_id = get_the_ID();
+			break;
+
+	}
+
+	return $search_result;
+}
+
 /** Query *********************************************************************/
 
 /**
@@ -2368,6 +2658,12 @@
 	// Views
 	} elseif ( bbp_is_single_view() ) {
 		$title = sprintf( __( 'View: %s', 'bbpress' ), bbp_get_view_title() );
+
+	/** Search ****************************************************************/
+
+	// Search
+	} elseif ( bbp_is_search() ) {
+		$title = bbp_get_search_title();
 	}
 
 	// Filter the raw title
Index: includes/common/widgets.php
--- includes/common/widgets.php
+++ includes/common/widgets.php
@@ -320,6 +320,94 @@
 }
 
 /**
+ * bbPress Search Widget
+ *
+ * Adds a widget which displays the forum search form
+ *
+ * @uses WP_Widget
+ */
+class BBP_Search_Widget extends WP_Widget {
+
+	/**
+	 * bbPress Search Widget
+	 *
+	 * Registers the search widget
+	 *
+	 * @uses apply_filters() Calls 'bbp_search_widget_options' with the
+	 *                        widget options
+	 */
+	public function __construct() {
+		$widget_ops = apply_filters( 'bbp_search_widget_options', array(
+			'classname'   => 'widget_display_search',
+			'description' => __( 'The bbPress forum search form.', 'bbpress' )
+		) );
+
+		parent::__construct( false, __( '(bbPress) Forum Search Form', 'bbpress' ), $widget_ops );
+	}
+
+	/**
+	 * Register the widget
+	 *
+	 * @uses register_widget()
+	 */
+	public static function register_widget() {
+		register_widget( 'BBP_Search_Widget' );
+	}
+
+	/**
+	 * Displays the output, the search form
+	 *
+	 */
+	public function widget( $args, $instance ) {
+
+		// Typical WordPress filter
+		$title = apply_filters( 'widget_title',            $instance['title'], $instance, $this->id_base );
+
+		// bbPress filter
+		$title = apply_filters( 'bbp_search_widget_title', $instance['title'], $instance, $this->id_base );
+
+		echo $args['before_widget'];
+		echo $args['before_title'] . $title . $args['after_title'];
+
+		bbp_get_template_part( 'form', 'search' );
+
+		echo $args['after_widget'];
+	}
+
+	/**
+	 * Update the widget options
+	 *
+	 * @param array $new_instance The new instance options
+	 * @param array $old_instance The old instance options
+	 */
+	public function update( $new_instance, $old_instance ) {
+		$instance          = $old_instance;
+		$instance['title'] = strip_tags( $new_instance['title'] );
+
+		return $instance;
+	}
+
+	/**
+	 * Output the search widget options form
+	 *
+	 * @param $instance Instance
+	 * @uses BBP_Search_Widget::get_field_id() To output the field id
+	 * @uses BBP_Search_Widget::get_field_name() To output the field name
+	 */
+	public function form( $instance ) {
+		$title = !empty( $instance['title'] ) ? esc_attr( $instance['title'] ) : ''; ?>
+
+		<p>
+			<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:', 'bbpress' ); ?>
+				<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo $title; ?>" />
+			</label>
+		</p>
+
+		<?php
+	}
+}
+
+/**
  * bbPress Forum Widget
  *
  * Adds a widget which displays the forum list
Index: includes/core/actions.php
--- includes/core/actions.php
+++ includes/core/actions.php
@@ -138,6 +138,7 @@
 // Widgets
 add_action( 'bbp_widgets_init', array( 'BBP_Login_Widget',   'register_widget' ), 10 );
 add_action( 'bbp_widgets_init', array( 'BBP_Views_Widget',   'register_widget' ), 10 );
+add_action( 'bbp_widgets_init', array( 'BBP_Search_Widget',  'register_widget' ), 10 );
 add_action( 'bbp_widgets_init', array( 'BBP_Forums_Widget',  'register_widget' ), 10 );
 add_action( 'bbp_widgets_init', array( 'BBP_Topics_Widget',  'register_widget' ), 10 );
 add_action( 'bbp_widgets_init', array( 'BBP_Replies_Widget', 'register_widget' ), 10 );
Index: includes/core/functions.php
--- includes/core/functions.php
+++ includes/core/functions.php
@@ -247,6 +247,47 @@
 	return apply_filters( 'bbp_get_view_query_args', $retval, $view );
 }
 
+/** Search ********************************************************************/
+
+/**
+ * Run the search query
+ *
+ * @param mixed $new_args New arguments
+ * @uses bbp_get_search_query_args() To get the search query args
+ * @uses bbp_parse_args() To parse the args
+ * @uses bbp_has_search_results() To make the search query
+ * @return bool False if no results, otherwise if search results are there
+ */
+function bbp_search_query( $new_args = '' ) {
+
+	$query_args = bbp_get_search_query_args();
+	if ( empty( $query_args ) )
+		return false;
+
+	// Merge arguments
+	if ( !empty( $new_args ) ) {
+		$new_args   = bbp_parse_args( $new_args, '', 'search_query' );
+		$query_args = array_merge( $query_args, $new_args );
+	}
+
+	return bbp_has_search_results( $query_args );
+}
+
+/**
+ * Return the search's query args
+ *
+ * @uses bbp_get_search_terms() To get the search terms
+ * @return array Query arguments
+ */
+function bbp_get_search_query_args() {
+
+	// Get search terms
+	$search_terms = bbp_get_search_terms();
+	$retval = !empty( $search_terms ) ? array( 's' => $search_terms ) : false;
+
+	return apply_filters( 'bbp_get_search_query_args', $retval );
+}
+
 /** Errors ********************************************************************/
 
 /**
@@ -435,7 +476,7 @@
 }
 
 /**
- * Return the enique ID for all edit rewrite rules (forum|topic|reply|tag|user)
+ * Return the unique ID for all edit rewrite rules (forum|topic|reply|tag|user)
  *
  * @since bbPress (r3762)
  * @return string
@@ -445,6 +486,15 @@
 }
 
 /**
+ * Return the unique ID for all search rewrite rules
+ *
+ * @return string
+ */
+function bbp_get_search_rewrite_id() {
+	return bbpress()->search_id;
+}
+
+/**
  * Return the unique ID for user topics rewrite rules
  *
  * @since bbPress (r4321)
Index: includes/core/options.php
--- includes/core/options.php
+++ includes/core/options.php
@@ -79,6 +79,7 @@
 		/** Other Slugs *******************************************************/
 
 		'_bbp_view_slug'            => 'view',      // View slug
+		'_bbp_search_slug'          => 'search',    // Search slug
 
 		/** Topics ************************************************************/
 
@@ -499,6 +500,15 @@
 	return apply_filters( 'bbp_get_view_slug', bbp_maybe_get_root_slug() . get_option( '_bbp_view_slug', $default ) );
 }
 
+/**
+ * Return the search slug
+ *
+ * @return string
+ */
+function bbp_get_search_slug( $default = 'search' ) {
+	return apply_filters( 'bbp_get_search_slug', bbp_maybe_get_root_slug() . get_option( '_bbp_search_slug', $default ) );
+}
+
 /** Legacy ********************************************************************/
 
 /**
Index: includes/core/template-functions.php
--- includes/core/template-functions.php
+++ includes/core/template-functions.php
@@ -257,6 +257,7 @@
  * If it's a reply edit, WP_Query::bbp_is_reply_edit is set to true.
  *
  * If it's a view page, WP_Query::bbp_is_view is set to true
+ * If it's a search page, WP_Query::bbp_is_search is set to true
  *
  * @since bbPress (r2688)
  *
@@ -291,9 +292,10 @@
 		return;
 
 	// Get query variables
-	$bbp_view = $posts_query->get( bbp_get_view_rewrite_id() );
-	$bbp_user = $posts_query->get( bbp_get_user_rewrite_id() );
-	$is_edit  = $posts_query->get( bbp_get_edit_rewrite_id() );
+	$bbp_view   = $posts_query->get( bbp_get_view_rewrite_id() );
+	$bbp_search = $posts_query->get( bbp_get_search_rewrite_id() );
+	$bbp_user   = $posts_query->get( bbp_get_user_rewrite_id() );
+	$is_edit    = $posts_query->get( bbp_get_edit_rewrite_id() );
 
 	// It is a user page - We'll also check if it is user edit
 	if ( !empty( $bbp_user ) ) {
@@ -421,6 +423,20 @@
 		// We are in a custom topic view
 		$posts_query->bbp_is_view = true;
 
+	// Search Page
+	} elseif ( !empty( $bbp_search ) ) {
+
+		// Check if there are search query args set
+		$search_terms = bbp_get_search_terms();
+		if ( !empty( $search_terms ) )
+			$posts_query->bbp_search_terms = $search_terms;
+
+		// Correct is_home variable
+		$posts_query->is_home = false;
+
+		// We are in a search query
+		$posts_query->bbp_is_search = true;
+
 	// Forum/Topic/Reply Edit Page
 	} elseif ( !empty( $is_edit ) ) {
 
Index: includes/core/template-loader.php
--- includes/core/template-loader.php
+++ includes/core/template-loader.php
@@ -30,6 +30,8 @@
  * @uses bbp_get_single_user_edit_template() To get user edit template
  * @uses bbp_is_single_view() To check if page is single view
  * @uses bbp_get_single_view_template() To get view template
+ * @uses bbp_is_search() To check if page is search
+ * @uses bbp_get_search_template() To get search template
  * @uses bbp_is_forum_edit() To check if page is forum edit
  * @uses bbp_get_forum_edit_template() To get forum edit template
  * @uses bbp_is_topic_merge() To check if page is topic merge
@@ -63,6 +65,9 @@
 	// Single View
 	elseif ( bbp_is_single_view()      && ( $new_template = bbp_get_single_view_template()      ) ) :
 
+	// Search
+	elseif ( bbp_is_search()           && ( $new_template = bbp_get_search_template()           ) ) :
+
 	// Forum edit
 	elseif ( bbp_is_forum_edit()       && ( $new_template = bbp_get_forum_edit_template()       ) ) :
 
@@ -251,6 +256,18 @@
 }
 
 /**
+ * Get the search template
+ *
+ */
+function bbp_get_search_template() {
+	$templates = array(
+		'page-forum-search.php', // Single Search
+		'forum-search.php',      // Search
+	);
+	return bbp_get_query_template( 'single_search', $templates );
+}
+
+/**
  * Get the single forum template
  *
  * @since bbPress (r3922)
Index: includes/core/theme-compat.php
--- includes/core/theme-compat.php
+++ includes/core/theme-compat.php
@@ -435,6 +435,8 @@
  * @uses bbp_get_single_user_edit_template() To get user edit template
  * @uses bbp_is_single_view() To check if page is single view
  * @uses bbp_get_single_view_template() To get view template
+ * @uses bbp_is_search() To check if page is search
+ * @uses bbp_get_search_template() To get search template
  * @uses bbp_is_forum_edit() To check if page is forum edit
  * @uses bbp_get_forum_edit_template() To get forum edit template
  * @uses bbp_is_topic_merge() To check if page is topic merge
@@ -591,6 +593,22 @@
 			'comment_status' => 'closed'
 		) );
 
+	/** Search ************************************************************/
+
+	} elseif ( bbp_is_search() ) {
+
+		// Reset post
+		bbp_theme_compat_reset_post( array(
+			'ID'             => 0,
+			'post_title'     => bbp_get_search_title(),
+			'post_author'    => 0,
+			'post_date'      => 0,
+			'post_content'   => '',
+			'post_type'      => '',
+			'post_status'    => bbp_get_public_status_id(),
+			'comment_status' => 'closed'
+		) );
+
 	/** Topic Tags ********************************************************/
 
 	// Topic Tag Edit
@@ -824,6 +842,11 @@
 	} elseif ( bbp_is_single_view() ) {
 		$new_content = $bbp->shortcodes->display_view( array( 'id' => get_query_var( 'bbp_view' ) ) );
 
+	/** Search ************************************************************/
+
+	} elseif ( bbp_is_search() ) {
+		$new_content = $bbp->shortcodes->display_search( array( 'search' => get_query_var( 'bbp_search' ) ) );
+
 	/** Topic Tags ********************************************************/
 
 	// Show topics of tag
Index: templates/default/bbpress/content-search-forum.php
--- templates/default/bbpress/content-search-forum.php No Base Revision
+++ templates/default/bbpress/content-search-forum.php Locally New
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * Search Loop - Single Forum
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<li>
+	<h3><a href="<?php bbp_forum_permalink( get_the_ID() ); ?>"><?php printf( __( 'Forum: %s', 'bbpress' ), bbp_get_forum_title( get_the_ID() ) ); ?></a></h3>
+	<?php the_excerpt(); ?>
+</li>
Index: templates/default/bbpress/content-search-reply.php
--- templates/default/bbpress/content-search-reply.php No Base Revision
+++ templates/default/bbpress/content-search-reply.php Locally New
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * Search Loop - Single Reply
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<li class="bbp-reply">
+	<h3><a href="<?php bbp_reply_url( get_the_ID() ); ?>"><?php bbp_reply_title( get_the_ID() ); ?></a></h3>
+	<p class="date">
+		<?php printf( _x( 'Topic started by %s', 'bbpress' ), bbp_get_topic_author_link( array( 'post_id' => bbp_get_reply_topic_id( get_the_ID() ), 'size' => '20' ) ) ); ?>
+		on <?php printf( __( '%1$s <span>in <a href="%2$s">%3$s</a></span>', 'bbpress' ), get_the_date(), bbp_get_forum_permalink( bbp_get_reply_forum_id( get_the_ID() ) ), bbp_get_forum_title( bbp_get_reply_forum_id( get_the_ID() ) ) ); ?>
+	</p>
+	<?php bbp_reply_excerpt( get_the_ID() ); ?>
+</li>
Index: templates/default/bbpress/content-search-topic.php
--- templates/default/bbpress/content-search-topic.php No Base Revision
+++ templates/default/bbpress/content-search-topic.php Locally New
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * Search Loop - Single Topic
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<li class="bbp-topic">
+	<h3><a href="<?php bbp_topic_permalink( get_the_ID() ); ?>"><?php printf( __( 'Topic: %s', 'bbpress' ), bbp_get_topic_title( get_the_ID() ) ); ?></a></h3>
+	<p class="date">
+		<?php printf( __( 'Topic started by %s', 'bbpress' ), bbp_get_topic_author_link( array( 'post_id' => get_the_ID(), 'size' => 20 ) ) ) ?>
+		on <?php printf( __( '%1$s <span>in <a href="%2$s">%3$s</a></span>', 'bbpress' ), get_the_date(), bbp_get_forum_permalink( bbp_get_topic_forum_id( get_the_ID() ) ), bbp_get_forum_title( bbp_get_topic_forum_id( get_the_ID() ) ) ); ?>
+	</p>
+	<?php bbp_topic_excerpt( get_the_ID() ); ?>
+</li>
Index: templates/default/bbpress/content-search.php
--- templates/default/bbpress/content-search.php No Base Revision
+++ templates/default/bbpress/content-search.php Locally New
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * Search Content Part
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<div id="bbpress-forums">
+
+	<?php bbp_breadcrumb(); ?>
+
+	<?php bbp_set_query_name( 'bbp_search' ); ?>
+
+	<?php do_action( 'bbp_template_before_search' ); ?>
+
+	<?php if ( bbp_has_search_results() ) : ?>
+
+		<?php bbp_get_template_part( 'pagination', 'search' ); ?>
+
+		<?php bbp_get_template_part( 'loop',       'search' ); ?>
+
+		<?php bbp_get_template_part( 'pagination', 'search' ); ?>
+
+	<?php else : ?>
+
+		<?php _e( 'No search results.', 'bbpress' ); ?>
+
+	<?php endif; ?>
+
+	<?php bbp_get_template_part( 'form', 'search' ); ?>
+
+	<?php do_action( 'bbp_template_after_search_results' ); ?>
+
+</div>
Index: templates/default/bbpress/form-search.php
--- templates/default/bbpress/form-search.php No Base Revision
+++ templates/default/bbpress/form-search.php Locally New
@@ -0,0 +1,18 @@
+<?php
+
+/**
+ * Search 
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<form role="search" method="get" id="bbp-search" action="<?php bbp_search_url(); ?>">
+	<div>
+		<label class="screen-reader-text" for="bbp_search"><?php _e( 'Search for:', 'bbpress' ); ?></label>
+		<input type="text" value="<?php echo esc_attr( bbp_get_search_terms() ); ?>" name="bbp_search" id="bbp_search" />
+		<input type="submit" id="bbp_search_submit" value="<?php _e( 'Search Forums', 'bbpress' ); ?>" />
+	</div>
+</form>
Index: templates/default/bbpress/loop-search.php
--- templates/default/bbpress/loop-search.php No Base Revision
+++ templates/default/bbpress/loop-search.php Locally New
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * Search Loop
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<?php do_action( 'bbp_template_before_search_results_loop' ); ?>
+
+<ul id="search_results" class="forums bbp-search-results">
+
+	<?php while( bbp_search_results() ) : bbp_the_search_result(); ?>
+
+		<?php bbp_get_template_part( 'content', 'search-' . get_post_type() ); ?>
+
+	<?php endwhile; ?>
+
+</ul><!-- #search_results -->
+
+<?php do_action( 'bbp_template_after_search_results_loop' ); ?>
