Index: bp-activity/bp-activity-loader.php
===================================================================
--- bp-activity/bp-activity-loader.php	(revision 4918)
+++ bp-activity/bp-activity-loader.php	(working copy)
@@ -76,6 +76,7 @@ class BP_Activity_Component extends BP_Component {
 			'path'                  => BP_PLUGIN_DIR,
 			'slug'                  => BP_ACTIVITY_SLUG,
 			'root_slug'             => isset( $bp->pages->activity->slug ) ? $bp->pages->activity->slug : BP_ACTIVITY_SLUG,
+			'has_directory'		=> true,
 			'search_string'         => __( 'Search Activity...', 'buddypress' ),
 			'global_tables'         => $global_tables,
 			'notification_callback' => 'bp_activity_format_notifications',
Index: bp-blogs/bp-blogs-loader.php
===================================================================
--- bp-blogs/bp-blogs-loader.php	(revision 4918)
+++ bp-blogs/bp-blogs-loader.php	(working copy)
@@ -53,6 +53,7 @@ class BP_Blogs_Component extends BP_Component {
 			'path'                  => BP_PLUGIN_DIR,
 			'slug'                  => BP_BLOGS_SLUG,
 			'root_slug'             => isset( $bp->pages->blogs->slug ) ? $bp->pages->blogs->slug : BP_BLOGS_SLUG,
+			'has_directory'		=> true,
 			'notification_callback' => 'bp_blogs_format_notifications',
 			'search_string'         => __( 'Search sites...', 'buddypress' ),
 			'autocomplete_all'      => defined( 'BP_MESSAGES_AUTOCOMPLETE_ALL' ),
Index: bp-core/admin/bp-core-admin.php
===================================================================
--- bp-core/admin/bp-core-admin.php	(revision 4918)
+++ bp-core/admin/bp-core-admin.php	(working copy)
@@ -483,16 +483,25 @@ function bp_core_admin_page_options() {
 	// Get the existing WP pages
 	$existing_pages = bp_core_get_page_meta();
 
-	// An array of strings looped over to create component setup markup
-	$directory_pages = array(
-		'members'  => __( 'Community Members', 'buddypress' ),
-		'activity' => __( 'Activity Streams',  'buddypress' ),
-		'groups'   => __( 'User Groups',       'buddypress' ),
-		'forums'   => __( 'Discussion Forums', 'buddypress' ),
-	);
-
-	if ( is_multisite() )
-		$directory_pages['blogs'] = __( "Site Directory", 'buddypress' ); ?>
+	// Now, set up an array of components (along with component names) that have directory pages
+	$directory_pages = array();
+	foreach( $bp->loaded_components as $component_id => $data ) {
+		if ( isset( $bp->{$component_id} ) ) {
+			// Only components that need directories should be listed here
+			if ( empty( $bp->{$component_id}->has_directory ) )
+				continue;
+			
+			// component->name was introduced in BP 1.5, so we must provide a fallback
+			$component_name = isset( $bp->{$component_id}->name ) ? $bp->{$component_id}->name : ucwords( $component_id );
+			
+			$directory_pages[$component_id] = $component_name;
+			
+		}
+	}
+	
+	$directory_pages = apply_filters( 'bp_directory_pages', $directory_pages );
+	
+	?>
 	
 	<h3><?php _e( 'Directories', 'buddypress' ); ?></h3>
 	
Index: bp-core/bp-core-component.php
===================================================================
--- bp-core/bp-core-component.php	(revision 4918)
+++ bp-core/bp-core-component.php	(working copy)
@@ -33,6 +33,11 @@ class BP_Component {
 	 * @var string Unique slug (used in query string and permalinks)
 	 */
 	var $slug;
+	
+	/**
+	 * @var bool Does this component need a top-level directory? 
+	 */
+	var $has_directory;
 
 	/**
 	 * @var string The path to the plugins files
@@ -107,6 +112,7 @@ class BP_Component {
 		$defaults = array(
 			'slug'                  => '',
 			'root_slug'             => '',
+			'has_directory'		=> false,
 			'notification_callback' => '',
 			'search_string'         => '',
 			'global_tables'         => ''
@@ -119,6 +125,9 @@ class BP_Component {
 		// Slug used for root directory
 		$this->root_slug     = apply_filters( 'bp_' . $this->id . '_root_slug',     $r['root_slug']     );
 
+		// Does this component have a top-level directory?
+		$this->has_directory = apply_filters( 'bp_' . $this->id . '_has_directory', $r['has_directory'] );
+
 		// Search string
 		$this->search_string = apply_filters( 'bp_' . $this->id . '_search_string', $r['search_string'] );
 
Index: bp-core/bp-core-functions.php
===================================================================
--- bp-core/bp-core-functions.php	(revision 4918)
+++ bp-core/bp-core-functions.php	(working copy)
@@ -92,6 +92,11 @@ function bp_core_get_page_meta() {
 		}
   	}
 
+	foreach( $page_ids as $component_name => $page_id ) {
+		if ( empty( $component_name ) || empty( $page_id ) )
+			unset( $page_ids[$component_name] );
+	}
+
 	return apply_filters( 'bp_core_get_page_meta', $page_ids );
 }
 
@@ -121,11 +126,11 @@ function bp_core_update_page_meta( $blog_page_ids ) {
 function bp_core_get_page_names() {
 	global $wpdb, $bp;
 
-	// Set pages as standard class
-	$pages = new stdClass;
-
 	// Get pages and IDs
 	if ( $page_ids = bp_core_get_page_meta() ) {
+		
+		// Set pages as standard class
+		$pages = new stdClass;
 
 		$posts_table_name = bp_is_multiblog_mode() ? $wpdb->get_blog_prefix( bp_get_root_blog_id() ) . 'posts' : $wpdb->posts;
 		$page_ids_sql     = implode( ',', (array)$page_ids );
@@ -420,11 +425,11 @@ function bp_core_activation_notice() {
 	$wp_page_components  = array();
 
 	// Only some BP components require a WP page to function - those with a non-empty root_slug
-	foreach( $bp->active_components as $component_id => $is_active ) {
-		if ( !empty( $bp->{$component_id}->root_slug ) ) {
+	foreach( $bp->loaded_components as $component_id => $is_active ) {
+		if ( !empty( $bp->{$component_id}->has_directory ) ) {
 			$wp_page_components[] = array(
 				'id'	=> $component_id,
-				'name'	=> $bp->{$component_id}->name
+				'name'	=> isset( $bp->{$component_id}->name ) ? $bp->{$component_id}->name : ucwords( $bp->{$component_id}->id )
 			);
 		}
 	}
@@ -1068,9 +1073,9 @@ function bp_core_add_root_component( $slug ) {
 
 	if ( empty( $bp->pages ) )
 		$bp->pages = bp_core_get_page_names();
-
+		
 	$match = false;
-
+	
 	// Check if the slug is registered in the $bp->pages global
 	foreach ( (array)$bp->pages as $key => $page ) {
 		if ( $key == $slug || $page->slug == $slug )
@@ -1080,7 +1085,13 @@ function bp_core_add_root_component( $slug ) {
 	// If there was no match, add a page for this root component
 	if ( empty( $match ) ) {
 		$bp->add_root[] = $slug;
-		add_action( 'bp_init', 'bp_core_create_root_component_page' );
+		//add_action( 'bp_init', 'bp_core_create_root_component_page' );
+	}
+	
+	// Make sure that this component is registered as requiring a top-level directory
+	if ( isset( $bp->{$slug} ) ) {
+		$bp->loaded_components[$bp->{$slug}->slug] = $bp->{$slug}->id;
+		$bp->{$slug}->has_directory = true;
 	}
 }
 
Index: bp-forums/bp-forums-loader.php
===================================================================
--- bp-forums/bp-forums-loader.php	(revision 4918)
+++ bp-forums/bp-forums-loader.php	(working copy)
@@ -55,6 +55,7 @@ class BP_Forums_Component extends BP_Component {
 		$globals = array(
 			'slug'                  => BP_FORUMS_SLUG,
 			'root_slug'             => isset( $bp->pages->forums->slug ) ? $bp->pages->forums->slug : BP_FORUMS_SLUG,
+			'has_directory'		=> true,
 			'notification_callback' => 'messages_format_notifications',
 			'search_string'         => __( 'Search Forums...', 'buddypress' ),
 		);
Index: bp-groups/bp-groups-loader.php
===================================================================
--- bp-groups/bp-groups-loader.php	(revision 4918)
+++ bp-groups/bp-groups-loader.php	(working copy)
@@ -78,6 +78,7 @@ class BP_Groups_Component extends BP_Component {
 		$globals = array(
 			'slug'                  => BP_GROUPS_SLUG,
 			'root_slug'             => isset( $bp->pages->groups->slug ) ? $bp->pages->groups->slug : BP_GROUPS_SLUG,
+			'has_directory'		=> true,
 			'notification_callback' => 'groups_format_notifications',
 			'search_string'         => __( 'Search Groups...', 'buddypress' ),
 			'global_tables'         => $global_tables
Index: bp-members/bp-members-loader.php
===================================================================
--- bp-members/bp-members-loader.php	(revision 4918)
+++ bp-members/bp-members-loader.php	(working copy)
@@ -65,6 +65,7 @@ class BP_Members_Component extends BP_Component {
 		$globals = array(
 			'slug'          => BP_MEMBERS_SLUG,
 			'root_slug'     => isset( $bp->pages->members->slug ) ? $bp->pages->members->slug : BP_MEMBERS_SLUG,
+			'has_directory' => true,
 			'search_string' => __( 'Search Members...', 'buddypress' ),
 		);
 
