Index: src/includes/common/classes.php
===================================================================
--- src/includes/common/classes.php	(revision 5800)
+++ src/includes/common/classes.php	(working copy)
@@ -368,6 +368,32 @@
 		$id_field = $this->db_fields['id'];
 		$id       = $element->$id_field;
 
+		// Now fetch child replies for each reply as they're listed...
+
+		$reply_search = !empty($_REQUEST['rs']) ? $_REQUEST['rs'] : false;
+		$post_type = (bbp_is_single_topic() && bbp_show_lead_topic()) ? bbp_get_reply_post_type() : array(bbp_get_topic_post_type(), bbp_get_reply_post_type());
+
+		$child_args = array(
+			'post_type'           => $post_type,
+			'post_parent'         => bbp_get_topic_id(),
+			'posts_per_page'      => '-1',
+			'orderby'             => 'date',
+			'order'               => 'ASC',
+			'hierarchical'        => true,
+			'ignore_sticky_posts' => true,
+			's'                   => $reply_search,
+			'meta_query'          => array(array(
+										'key' => '_bbp_reply_to',
+										'compare' => '=',
+										'value'   => $id
+									))
+		);
+
+		$parsed_args = bbp_parse_args('', $child_args, 'has_replies');
+		$child_posts = new WP_Query($parsed_args);
+		$children_elements = array($id => $child_posts->posts);
+		wp_reset_postdata();
+
 		// Display element
 		parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
 
Index: src/includes/replies/functions.php
===================================================================
--- src/includes/replies/functions.php	(revision 5800)
+++ src/includes/replies/functions.php	(working copy)
@@ -358,7 +358,7 @@
 		'post_parent'    => $topic_id,
 		'post_type'      => bbp_get_reply_post_type(),
 		'comment_status' => 'closed',
-		'menu_order'     => bbp_get_topic_reply_count( $topic_id, true ) + 1
+		'menu_order'     => 0
 	) );
 
 	// Insert reply
@@ -1358,7 +1358,7 @@
 					'post_title'  => '',
 					'post_name'   => false, // will be automatically generated
 					'post_parent' => $destination_topic->ID,
-					'menu_order'  => $reply_position,
+					'menu_order'  => 0, // will be automatically regenerated
 					'guid'        => ''
 				) );
 
@@ -2374,24 +2374,39 @@
 	$topic_id       = !empty( $topic_id ) ? bbp_get_topic_id( $topic_id ) : bbp_get_reply_topic_id( $reply_id );
 	$reply_position = 0;
 
-	// If reply is actually the first post in a topic, return 0
-	if ( $reply_id !== $topic_id ) {
+	if ($reply_id != $topic_id) {
+		$top_level_replies = array();
+		$replies_args = array(
+			'post_type' => bbp_get_reply_post_type(),
+			'post_parent' => $topic_id,
+			'posts_per_page' => -1,
+			'orderby' => 'ID',
+			'meta_query' => array('relation' => 'OR',
+				array(
+					'key' => '_bbp_reply_to',
+					'compare' => 'NOT EXISTS',
+					'value'   => '0'
+				),
+				array(
+					'key' => '_bbp_reply_to',
+					'compare' => '=',
+					'value'   => '0'
+				)
+		));
+		$top_level_reply_posts = get_posts($replies_args);
+		foreach ($top_level_reply_posts as $top_level_reply_post) {
+			array_unshift($top_level_replies, $top_level_reply_post->ID);
+		}
+		array_unshift($top_level_replies, $topic_id);
 
-		// Make sure the topic has replies before running another query
-		$reply_count = bbp_get_topic_reply_count( $topic_id, false );
-		if ( !empty( $reply_count ) ) {
-
-			// Get reply id's
-			$topic_replies = bbp_get_all_child_ids( $topic_id, bbp_get_reply_post_type() );
-			if ( !empty( $topic_replies ) ) {
-
-				// Reverse replies array and search for current reply position
-				$topic_replies  = array_reverse( $topic_replies );
-				$reply_position = array_search( (string) $reply_id, $topic_replies );
-
-				// Bump the position to compensate for the lead topic post
-				$reply_position++;
-			}
+		$reply_position = array_search($reply_id, $top_level_replies);
+		if (empty($reply_position)) {
+			$next_up = $reply_id;
+			do {
+				$reply_to_id = get_post_meta($next_up, '_bbp_reply_to', true);
+				$reply_position = array_search($reply_to_id, $top_level_replies);
+				$next_up = $reply_to_id;
+			} while ($reply_position == false);
 		}
 	}
 
@@ -2427,7 +2442,7 @@
 	$walker = new BBP_Walker_Reply;
 	$walker->paged_walk( bbpress()->reply_query->posts, $r['max_depth'], $r['page'], $r['per_page'], $r );
 
-	bbpress()->max_num_pages            = $walker->max_pages;
+	bbpress()->max_num_pages = $walker->max_pages;
 	bbpress()->reply_query->in_the_loop = false;
 }
 
Index: src/includes/replies/template.php
===================================================================
--- src/includes/replies/template.php	(revision 5800)
+++ src/includes/replies/template.php	(working copy)
@@ -146,6 +146,22 @@
 		$default['s'] = $_REQUEST['rs'];
 	}
 
+	// Suppress threaded replies for now...
+	if (bbp_thread_replies()) {
+		$default['meta_query'] = array('relation' => 'OR',
+			array(
+				'key' => '_bbp_reply_to',
+				'compare' => 'NOT EXISTS',
+				'value'   => '0'
+			),
+			array(
+				'key' => '_bbp_reply_to',
+				'compare' => '=',
+				'value'   => '0'
+			)
+		);
+	}
+
 	// What are the default allowed statuses (based on user caps)
 	if ( bbp_get_view_all() ) {
 
@@ -178,9 +194,6 @@
 
 	// Set posts_per_page value if replies are threaded
 	$replies_per_page = $r['posts_per_page'];
-	if ( true === $r['hierarchical'] ) {
-		$r['posts_per_page'] = -1;
-	}
 
 	// Get bbPress
 	$bbp = bbpress();
@@ -252,10 +265,7 @@
 		}
 
 		// Figure out total pages
-		if ( true === $r['hierarchical'] ) {
-			$walker      = new BBP_Walker_Reply;
-			$total_pages = ceil( (int) $walker->get_number_of_root_elements( $bbp->reply_query->posts ) / (int) $replies_per_page );
-		} else {
+
 			$total_pages = ceil( (int) $bbp->reply_query->found_posts / (int) $replies_per_page );
 
 			// Add pagination to query object
@@ -276,7 +286,7 @@
 			} else {
 				$bbp->reply_query->pagination_links = str_replace( '&#038;paged=1', '', $bbp->reply_query->pagination_links );
 			}
-		}
+
 	}
 
 	// Return object
@@ -486,16 +496,10 @@
 		$reply_id   = bbp_get_reply_id      ( $reply_id );
 		$topic_id   = bbp_get_reply_topic_id( $reply_id );
 
-		// Hierarchical reply page
-		if ( bbp_thread_replies() ) {
-			$reply_page = 1;
+		$reply_page = ceil( (int) bbp_get_reply_position( $reply_id, $topic_id ) / (int) bbp_get_replies_per_page() );
 
-		// Standard reply page
-		} else {
-			$reply_page = ceil( (int) bbp_get_reply_position( $reply_id, $topic_id ) / (int) bbp_get_replies_per_page() );
-		}
+		$reply_hash = '#post-' . $reply_id;
 
-		$reply_hash = '#post-' . $reply_id;
 		$topic_link = bbp_get_topic_permalink( $topic_id, $redirect_to );
 		$topic_url  = remove_query_arg( 'view', $topic_link );
 
@@ -1800,31 +1804,15 @@
 		$reply_id       = bbp_get_reply_id( $reply_id );
 		$reply_position = get_post_field( 'menu_order', $reply_id );
 
-		// Reply doesn't have a position so get the raw value
-		if ( empty( $reply_position ) ) {
-			$topic_id = !empty( $topic_id ) ? bbp_get_topic_id( $topic_id ) : bbp_get_reply_topic_id( $reply_id );
-
-			// Post is not the topic
-			if ( $reply_id !== $topic_id ) {
-				$reply_position = bbp_get_reply_position_raw( $reply_id, $topic_id );
-
-				// Update the reply position in the posts table so we'll never have
-				// to hit the DB again.
-				if ( !empty( $reply_position ) ) {
-					bbp_update_reply_position( $reply_id, $reply_position );
-				}
-
-			// Topic's position is always 0
-			} else {
-				$reply_position = 0;
+		if (empty($reply_position)) {
+			$reply_position = bbp_get_reply_position_raw( $reply_id, $topic_id );
+			// Bump the position by one if the lead topic isn't in the replies loop
+			if (!bbp_show_lead_topic()) {
+				$reply_position++;
 			}
+			bbp_update_reply_position($reply_id, $reply_position);
 		}
 
-		// Bump the position by one if the lead topic is in the replies loop
-		if ( ! bbp_show_lead_topic() ) {
-			$reply_position++;
-		}
-
 		return (int) apply_filters( 'bbp_get_reply_position', $reply_position, $reply_id, $topic_id );
 	}
 
@@ -2461,9 +2449,9 @@
 
 		// We are threading replies
 		if ( bbp_thread_replies() && bbp_is_single_topic() ) {
-			return;
+
 			$walker  = new BBP_Walker_Reply;
-			$threads = (int) $walker->get_number_of_root_elements( $bbp->reply_query->posts );
+			$threads = (int) $walker->get_number_of_root_elements( $bbp->reply_query->posts ) + 1; // Not sure where this OB1 error comes from...
 
 			// Adjust for topic
 			$threads--;
