Index: bp-core/bp-core-functions.php
===================================================================
--- bp-core/bp-core-functions.php	(revision 7351)
+++ bp-core/bp-core-functions.php	(working copy)
@@ -1411,3 +1411,78 @@
 	<?php
 }
 add_action( 'wp_footer', 'bp_core_print_generation_time' );
+
+
+/* BP Nav Menu */
+
+/**
+ * Builds a list of page to display in WP Nav Menu BuddyPress accordeon
+ * 
+ * Or if a slug is given, returns the good link for the current loggedin user
+ * 
+ * @param  string $selected bo_nav slug
+ * @uses   bp_core_get_directory_page_ids() to get all the directory page, and check 'register' is in
+ * @uses   get_the_title() to get the title for the registration page
+ * @uses   get_permalink() to get the link to the registration page
+ * @uses   buddypress() to get the bp_nav items
+ * @return mixed           an url or a dummy array of pages
+ */
+function bp_get_nav_item_pages( $selected = '' ) {
+
+	$utilities = array(
+		array( 
+			'name' => __('Log in/Log out', 'buddypress'),
+			'slug' => 'login',
+			'link' => wp_login_url()
+		)
+	);
+
+	$bp_directory_page_ids = bp_core_get_directory_page_ids();
+
+	if( !empty( $bp_directory_page_ids['register'] ) ) {
+		$utilities[] = array(
+			'name' => get_the_title( $bp_directory_page_ids['register'] ),
+			'slug' => 'register',
+			'link' => get_permalink( $bp_directory_page_ids['register'] )
+		);
+	}
+
+	$bp_menu_items = buddypress()->bp_nav;
+	$bp_menu_items = array_merge( $utilities, $bp_menu_items );
+	$page_args = array();
+
+	if( count( $bp_menu_items ) < 1 )
+		return false;
+
+	$found = '';
+
+	foreach( $bp_menu_items as $bp_item ) {
+		$item_name = '';
+
+		if( !empty( $selected ) && $bp_item['slug'] == $selected )
+			return $bp_item['link'];
+
+		else {
+
+			// deleting <span>number</span>
+			$item_name = preg_replace( '/([.0-9]+)/', '', $bp_item['name'] ); 
+			$item_name = trim( wp_kses( $item_name, array() ) );
+
+			$page_args[] = (object) array(
+				'ID'             => -1,
+				'post_title'     => $item_name,
+				'post_author'    => 0,
+				'post_date'      => 0,
+				'post_excerpt'   => $bp_item['slug'],
+				'post_type'      => 'page',
+				'post_status'    => 'publish',
+				'comment_status' => 'closed',
+				'guid'           => $bp_item['link']
+			);
+		}
+
+	}
+	
+	return $page_args;
+	
+}
Index: bp-core/bp-core-filters.php
===================================================================
--- bp-core/bp-core-filters.php	(revision 7351)
+++ bp-core/bp-core-filters.php	(working copy)
@@ -386,3 +386,68 @@
 add_filter( 'bp_modify_page_title', 'wptexturize'     );
 add_filter( 'bp_modify_page_title', 'convert_chars'   );
 add_filter( 'bp_modify_page_title', 'esc_html'        );
+
+
+/* BP Nav Menu */
+
+/**
+ * Filters wp_setup_nav_menu_item to adapt the links to current user
+ * 
+ * If user is not logged in regiser menu and login menu item must show
+ * If user is logged in register menu must be unset and logout must replace login
+ * 
+ * @param  WP_Post $menu_item the menu item
+ * @uses   is_admin() to check we're in backend
+ * @uses   is_user_logged_in() to check if we have a user logged in
+ * @uses   wp_logout_url() to build the log out url
+ * @uses   bp_get_root_domain() to be redirected to root domain url once logged out
+ * @uses   wp_login_url() to build log in url
+ * @uses   wp_guess_url() to be redirected to be redirected at the best place once logged in
+ * @uses   bp_get_nav_item_pages() to get the url for the user's nav
+ * @uses   bp_get_requested_url() to get the current url
+ * @return WP_Post            a modified menu item if needed
+ */
+function bp_setup_nav_menu_item( $menu_item ) {
+
+	if( is_admin() )
+		return $menu_item;
+
+	$css_target = preg_match( '/\sbp-(.*)-nav/', implode( ' ', $menu_item->classes), $matches );
+
+	if( empty( $matches[1] ) )
+		return $menu_item;
+
+	switch( $matches[1] ) {
+		case 'login' :
+				if( is_user_logged_in() ) {
+					$menu_item->url = wp_logout_url( bp_get_root_domain() ); 
+					$menu_item->title = __( 'Log out', 'buddypress' ); 
+				} else {
+					$menu_item->url = wp_login_url( wp_guess_url() ); 
+					$menu_item->title = __( 'Log in', 'buddypress' ); 
+				}
+					
+			break;
+
+		case 'register' :
+				if( is_user_logged_in() )
+					$menu_item->_invalid = true;
+			break;
+
+		default:
+				if( is_user_logged_in() )
+					$menu_item->url = bp_get_nav_item_pages( $matches[1] );
+				else
+					$menu_item->_invalid = true;
+			break;
+	}
+
+	$current = bp_get_requested_url();
+
+	if( strpos( $current, $menu_item->url ) !== false )
+		$menu_item->classes[] = 'current_page_item';
+
+	return $menu_item;
+}
+
+add_filter( 'wp_setup_nav_menu_item', 'bp_setup_nav_menu_item', 10, 1 );
Index: bp-core/admin/bp-core-functions.php
===================================================================
--- bp-core/admin/bp-core-functions.php	(revision 7351)
+++ bp-core/admin/bp-core-functions.php	(working copy)
@@ -642,3 +642,74 @@
 
 	return $action;
 }
+
+
+/* BP Nav Menu */
+
+/**
+ * Registers a meta box for BuddyPress WP Nav Menu and a js at the bottom of the page
+ * 
+ * @global integer the current blog id
+ * @uses   bp_get_root_blog_id() to check current is root
+ * @uses   add_meta_box() to register the BuddyPress WP Nav accordeon
+ * @uses   add_action() to hook to admin footer scripts and load a piece of javascript
+ */
+function bp_admin_wp_nav_menu_meta_box() {
+	global $blog_id;
+
+	if( $blog_id != bp_get_root_blog_id() )
+		return;
+
+	add_meta_box( 'add-buddypress-nav-menu', __( 'BuddyPress', 'buddypress' ), 'bp_admin_do_wp_nav_menu_meta_box', 'nav-menus', 'side', 'default' );
+
+	add_action( 'admin_print_footer_scripts', 'bp_admin_wp_nav_menu_restrict_class_attr' );
+}
+
+/**
+ * Builds the accordeon and populates it with login/register/bp_nav items
+ * 
+ * @global $nav_menu_selected_id
+ * @uses   BP_Walker_Nav_Menu_Checklist to use our adapted walker
+ * @uses   bp_get_nav_item_pages() to get the menu items
+ * @return string html output
+ */
+function bp_admin_do_wp_nav_menu_meta_box() {
+	global $nav_menu_selected_id;
+
+	$walker = new BP_Walker_Nav_Menu_Checklist( false );
+	$args = array( 'walker' => $walker );
+	$menu_pages = bp_get_nav_item_pages();
+	?>
+	<div id="buddypress-menu">
+		<div class="tabs-panel tabs-panel-active">
+			<ul id="buddypress-menu-checklist" class="categorychecklist form-no-clear">
+				<?php echo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $menu_pages ), 0, (object) $args );?>
+			</ul>
+		</div>
+		<span class="add-to-menu">
+			<input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e('Add to Menu'); ?>" name="add-custom-menu-item" id="submit-buddypress-menu" />
+			<span class="spinner"></span>
+		</span>
+	</div><!-- /.tabs-panel -->
+	<?php
+}
+
+/**
+ * Listen to the right boxes item-edit click to add an attribute to classes field
+ * 
+ * It's a soft security to avoid an admin to delete the bp-slug-nav class that is useful for the final output
+ * 
+ * @return string js
+ */
+function bp_admin_wp_nav_menu_restrict_class_attr() {
+	?>
+	<script type="text/javascript">
+	jQuery( '#menu-to-edit').on( 'click', 'a.item-edit', function() {
+		jQuery('.edit-menu-item-classes').each( function() {
+			if( jQuery(this).val().indexOf( 'bp-menu') !=1 )
+				jQuery(this).attr( 'readonly', 'readonly' );
+		});
+	});
+	</script>
+	<?php
+}
Index: bp-core/bp-core-admin.php
===================================================================
--- bp-core/bp-core-admin.php	(revision 7351)
+++ bp-core/bp-core-admin.php	(working copy)
@@ -124,6 +124,9 @@
 
 		/** BuddyPress Actions ************************************************/
 
+		// Loads a metabox in the WP Nav Menu Admin UI
+		add_action( 'load-nav-menus.php', 'bp_admin_wp_nav_menu_meta_box' );
+
 		// Add settings
 		add_action( 'bp_register_admin_settings', array( $this, 'register_admin_settings' ) );
 
Index: bp-core/bp-core-classes.php
===================================================================
--- bp-core/bp-core-classes.php	(revision 7351)
+++ bp-core/bp-core-classes.php	(working copy)
@@ -2010,3 +2010,79 @@
 		$output .= apply_filters( 'bp_walker_nav_menu_start_el', $item_output, $item, $depth, $args );
 	}
 }
+
+
+/* BP Nav Menu */
+
+/**
+ * It's almost the same walker than Walker_Nav_Menu_Checklist
+ * We just need to adapt it as no post_type or taxonomy are used
+ * We also need to use the classes attribute to better identify nav slugs later
+ */
+class BP_Walker_Nav_Menu_Checklist extends Walker_Nav_Menu {
+	function __construct( $fields = false ) {
+		if ( $fields ) {
+			$this->db_fields = $fields;
+		}
+	}
+
+	function start_lvl( &$output, $depth = 0, $args = array() ) {
+		$indent = str_repeat( "\t", $depth );
+		$output .= "\n$indent<ul class='children'>\n";
+	}
+
+	function end_lvl( &$output, $depth = 0, $args = array() ) {
+		$indent = str_repeat( "\t", $depth );
+		$output .= "\n$indent</ul>";
+	}
+
+	/**
+	 * @see Walker::start_el()
+	 * @since 3.0.0
+	 *
+	 * @param string $output Passed by reference. Used to append additional content.
+	 * @param object $item Menu item data object.
+	 * @param int $depth Depth of menu item. Used for padding.
+	 * @param object $args
+	 */
+	function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
+		global $_nav_menu_placeholder;
+
+		$_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval($_nav_menu_placeholder) - 1 : -1;
+		$possible_object_id = isset( $item->post_type ) && 'nav_menu_item' == $item->post_type ? $item->object_id : $_nav_menu_placeholder;
+		$possible_db_id = ( ! empty( $item->ID ) ) && ( 0 < $possible_object_id ) ? (int) $item->ID : 0;
+
+		$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
+
+		$output .= $indent . '<li>';
+		$output .= '<label class="menu-item-title">';
+		$output .= '<input type="checkbox" class="menu-item-checkbox';
+
+		if ( property_exists( $item, 'label' ) )
+			$title = $item->label;
+
+		$output .= '" name="menu-item[' . $possible_object_id . '][menu-item-object-id]" value="'. esc_attr( $item->object_id ) .'" /> ';
+		$output .= isset( $title ) ? esc_html( $title ) : esc_html( $item->title );
+		$output .= '</label>';
+
+		if( empty( $item->url ) )
+			$item->url = $item->guid;
+
+		if( !in_array( array( 'bp-menu', 'bp-'. $item->post_excerpt .'-nav' ), $item->classes ) ) {
+			$item->classes[] = 'bp-menu';
+			$item->classes[] = 'bp-'. $item->post_excerpt .'-nav';
+		}
+
+		// Menu item hidden fields
+		$output .= '<input type="hidden" class="menu-item-db-id" name="menu-item[' . $possible_object_id . '][menu-item-db-id]" value="' . $possible_db_id . '" />';
+		$output .= '<input type="hidden" class="menu-item-object" name="menu-item[' . $possible_object_id . '][menu-item-object]" value="'. esc_attr( $item->object ) .'" />';
+		$output .= '<input type="hidden" class="menu-item-parent-id" name="menu-item[' . $possible_object_id . '][menu-item-parent-id]" value="'. esc_attr( $item->menu_item_parent ) .'" />';
+		$output .= '<input type="hidden" class="menu-item-type" name="menu-item[' . $possible_object_id . '][menu-item-type]" value="custom" />';
+		$output .= '<input type="hidden" class="menu-item-title" name="menu-item[' . $possible_object_id . '][menu-item-title]" value="'. esc_attr( $item->title ) .'" />';
+		$output .= '<input type="hidden" class="menu-item-url" name="menu-item[' . $possible_object_id . '][menu-item-url]" value="'. esc_attr( $item->url ) .'" />';
+		$output .= '<input type="hidden" class="menu-item-target" name="menu-item[' . $possible_object_id . '][menu-item-target]" value="'. esc_attr( $item->target ) .'" />';
+		$output .= '<input type="hidden" class="menu-item-attr_title" name="menu-item[' . $possible_object_id . '][menu-item-attr_title]" value="'. esc_attr( $item->attr_title ) .'" />';
+		$output .= '<input type="hidden" class="menu-item-classes" name="menu-item[' . $possible_object_id . '][menu-item-classes]" value="'. esc_attr( implode( ' ', $item->classes ) ) .'" />';
+		$output .= '<input type="hidden" class="menu-item-xfn" name="menu-item[' . $possible_object_id . '][menu-item-xfn]" value="'. esc_attr( $item->xfn ) .'" />';
+	}
+}
