diff --git bp-core/admin/bp-core-functions.php bp-core/admin/bp-core-functions.php
index 7e145fa..a148d60 100644
--- bp-core/admin/bp-core-functions.php
+++ bp-core/admin/bp-core-functions.php
@@ -642,3 +642,80 @@ function bp_admin_list_table_current_bulk_action() {
 
 	return $action;
 }
+
+/** Menus *********************************************************************/
+
+/**
+ * Registers a meta box for BuddyPress WP Nav Menu and a js at the bottom of
+ * the page
+ *
+ * @since BuddyPress (1.9)
+ *
+ * @global integer the current blog id
+ * @uses bp_is_root_blog() to check whether this is the root blog
+ * @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() {
+	if ( ! bp_is_root_blog() ) {
+		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 and populates the BuddyPress accordion on Appearance > Menus
+ *
+ * @since BuddyPress (1.9)
+ *
+ * @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
+ */
+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><!-- /#buddypress-menu -->
+
+	<?php
+}
+
+/**
+ * Don't let the BP menu item CSS classes be edited
+ *
+ * We use the bp-slug-nav class on output, so we want to avoid having it
+ * removed by the admin.
+ *
+ * @since BuddyPress (1.9)
+ */
+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
+}
diff --git bp-core/bp-core-admin.php bp-core/bp-core-admin.php
index 7fb67f5..6bcb1f0 100644
--- bp-core/bp-core-admin.php
+++ bp-core/bp-core-admin.php
@@ -124,6 +124,9 @@ class BP_Admin {
 
 		/** BuddyPress Actions ************************************************/
 
+		// Load the BuddyPress 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' ) );
 
diff --git bp-core/bp-core-classes.php bp-core/bp-core-classes.php
index 6d2f35a..b3f91cd 100644
--- bp-core/bp-core-classes.php
+++ bp-core/bp-core-classes.php
@@ -2010,3 +2010,80 @@ class BP_Walker_Nav_Menu extends Walker_Nav_Menu {
 		$output .= apply_filters( 'bp_walker_nav_menu_start_el', $item_output, $item, $depth, $args );
 	}
 }
+
+/**
+ * Create a set of BuddyPress-specific links for use in the Menus admin UI
+ *
+ * Borrowed heavily from WP's Walker_Nav_Menu_Checklist, but modified so as not
+ * to require an actual post type or taxonomy, and to force certain CSS classes
+ *
+ * @since BuddyPress (1.9)
+ */
+class BP_Walker_Nav_Menu_Checklist extends Walker_Nav_Menu {
+	public function __construct( $fields = false ) {
+		if ( $fields ) {
+			$this->db_fields = $fields;
+		}
+	}
+
+	public function start_lvl( &$output, $depth = 0, $args = array() ) {
+		$indent = str_repeat( "\t", $depth );
+		$output .= "\n$indent<ul class='children'>\n";
+	}
+
+	public function end_lvl( &$output, $depth = 0, $args = array() ) {
+		$indent = str_repeat( "\t", $depth );
+		$output .= "\n$indent</ul>";
+	}
+
+	/**
+	 * @see Walker::start_el()
+	 *
+	 * @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 ) .'" />';
+	}
+}
diff --git bp-core/bp-core-filters.php bp-core/bp-core-filters.php
index f8f05d0..75eb028 100644
--- bp-core/bp-core-filters.php
+++ bp-core/bp-core-filters.php
@@ -386,3 +386,79 @@ add_filter( 'wp_title', 'bp_modify_page_title', 10, 3 );
 add_filter( 'bp_modify_page_title', 'wptexturize'     );
 add_filter( 'bp_modify_page_title', 'convert_chars'   );
 add_filter( 'bp_modify_page_title', 'esc_html'        );
+
+/**
+ * Add BuddyPress-specific items to the wp_nav_menu
+ *
+ * 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 obj The modified WP_Post object
+ */
+function bp_setup_nav_menu_item( $menu_item ) {
+	if ( is_admin() ) {
+		return $menu_item;
+	}
+
+	// We use information stored in the CSS class to determine what kind of
+	// menu item this is, and how it should be treated
+	$css_target = preg_match( '/\sbp-(.*)-nav/', implode( ' ', $menu_item->classes), $matches );
+
+	// If this isn't a BP menu item, we can stop here
+	if ( empty( $matches[1] ) ) {
+		return $menu_item;
+	}
+
+	switch ( $matches[1] ) {
+		// The 'login' link appears as 'Log Out' to logged-in users,
+		// 'Log In' to those who are not logged-in
+		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;
+
+		// Don't show the Register link to logged-in users
+		case 'register' :
+			if ( is_user_logged_in() ) {
+				$menu_item->_invalid = true;
+			}
+
+			break;
+
+		// All other BP nav items are specific to the logged-in user,
+		// and so are not relevant to logged-out users
+		default:
+			if ( is_user_logged_in() ) {
+				$menu_item->url = bp_get_nav_item_url( $matches[1] );
+			} else {
+				$menu_item->_invalid = true;
+			}
+
+			break;
+	}
+
+	// Highlight the current page
+	$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 );
diff --git bp-core/bp-core-functions.php bp-core/bp-core-functions.php
index 80d7889..04980ce 100644
--- bp-core/bp-core-functions.php
+++ bp-core/bp-core-functions.php
@@ -1411,3 +1411,115 @@ function bp_core_print_generation_time() {
 	<?php
 }
 add_action( 'wp_footer', 'bp_core_print_generation_time' );
+
+/** Nav Menu ******************************************************************/
+
+/**
+ * Create fake "post" objects for use in a WordPress nav menu
+ *
+ * WordPress nav menus work by representing post or tax term data as a custom
+ * post type, which is then used to populate the checkboxes that appear on
+ * Dashboard > Appearance > Menu as well as the menu as rendered on the front
+ * end. Most of the items in the BuddyPress set of nav items are neither posts
+ * nor tax terms, so we fake a post-like object so as to be compatible with the
+ * menu.
+ *
+ * This technique also allows us to generate links dynamically, so that, for
+ * example, "My Profile" will always point to the URL of the profile of the
+ * logged-in user.
+ *
+ * @since BuddyPress (1.9)
+ *
+ * @uses bp_core_get_directory_page_ids() to get all the directory pages, and
+ *   check for the proper location of the Register page
+ * @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 A URL or an array of dummy pages
+ */
+function bp_get_nav_item_pages() {
+
+	// Try to catch the cached version first
+	if ( ! empty( buddypress()->wp_nav_menu_items ) ) {
+		return buddypress()->wp_nav_menu_items;
+	}
+
+	// Pull up a list of items registered in BP's top-level nav array
+	$bp_menu_items = buddypress()->bp_nav;
+
+	// Some BP nav menu items will not be represented in bp_nav, because
+	// they are not real BP components. We add them manually here.
+	$bp_menu_items[] = array(
+		'name' => __( 'Log in/Log out', 'buddypress' ),
+		'slug' => 'login',
+		'link' => wp_login_url()
+	);
+
+	// The Register page will not always be available (ie, when
+	// registration is disabled)
+	$bp_directory_page_ids = bp_core_get_directory_page_ids();
+
+	if( ! empty( $bp_directory_page_ids['register'] ) ) {
+		$register_page = get_post( $bp_directory_page_ids['register'] );
+		$bp_menu_items[] = array(
+			'name' => $register_page->post_title,
+			'slug' => $register_page->post_name,
+			'link' => get_permalink( $register_page->ID ),
+		);
+	}
+
+	// If there's nothing to show, we're done
+	if ( count( $bp_menu_items ) < 1 ) {
+		return false;
+	}
+
+	$page_args = array();
+
+	foreach ( $bp_menu_items as $bp_item ) {
+		$item_name = '';
+
+		// Remove <span>number</span>
+		$item_name = preg_replace( '/([.0-9]+)/', '', $bp_item['name'] );
+		$item_name = trim( strip_tags( $item_name ) );
+
+		$page_args[ $bp_item['slug'] ] = (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']
+		);
+	}
+
+	buddypress()->wp_nav_menu_items = $page_args;
+
+	return buddypress()->wp_nav_menu_items;
+}
+
+/**
+ * Get the URL for a BuddyPress WP nav menu item, based on slug
+ *
+ * BuddyPress-specific WP nav menu items have dynamically generated URLs,
+ * based on the identity of the current user. This function lets you fetch the
+ * proper URL for a given nav item slug (such as 'login' or 'messages').
+ *
+ * @since BuddyPress (1.9)
+ *
+ * @param string $slug The slug of the nav item: login, register, or one of the
+ *   slugs from buddypress()->bp_nav
+ * @return string $nav_item_url The URL generated for the current user
+ */
+function bp_get_nav_item_url( $slug ) {
+	$nav_item_url = '';
+	$nav_menu_items = bp_get_nav_item_pages();
+
+	if ( isset( $nav_menu_items[ $slug ] ) ) {
+		$nav_item_url = $nav_menu_items[ $slug ]->guid;
+	}
+
+	return $nav_item_url;
+}
