diff --git src/bp-core/admin/bp-core-admin-schema.php src/bp-core/admin/bp-core-admin-schema.php
index 87ec012..28af0e2 100644
--- src/bp-core/admin/bp-core-admin-schema.php
+++ src/bp-core/admin/bp-core-admin-schema.php
@@ -688,6 +688,11 @@ function bp_core_install_emails() {
 		'groups-membership-request-rejected' => __( 'Recipient had requested to join a group, which was rejected.', 'buddypress' ),
 	);
 
+	/**
+	 * Emails are inserted on the root blog
+	 */
+	bp_switch_to_root_blog();
+
 	// Add these emails to the database.
 	foreach ( $emails as $id => $email ) {
 		$post_id = wp_insert_post( bp_parse_args( $email, $defaults, 'install_email_' . $id ) );
@@ -704,6 +709,11 @@ function bp_core_install_emails() {
 	}
 
 	/**
+	 * Restore current blog if needed
+	 */
+	bp_restore_current_blog();
+
+	/**
 	 * Fires after BuddyPress adds the posts for its emails.
 	 *
 	 * @since 2.5.0
diff --git src/bp-core/bp-core-functions.php src/bp-core/bp-core-functions.php
index dc93da4..0bd2a3b 100644
--- src/bp-core/bp-core-functions.php
+++ src/bp-core/bp-core-functions.php
@@ -1923,6 +1923,46 @@ function bp_is_network_activated() {
 	return (bool) apply_filters( 'bp_is_network_activated', $retval );
 }
 
+/**
+ * Switch to root blog if necessary
+ *
+ * @since 2.5.0
+ */
+function bp_switch_to_root_blog() {
+	if ( ! is_multisite() || (int) get_current_blog_id() === (int) bp_get_root_blog_id() ) {
+		return;
+	}
+
+	switch_to_blog( bp_get_root_blog_id() );
+
+	// Make sure BuddyPress post types are registered
+	if ( ! post_type_exists( bp_get_email_post_type() ) ) {
+		bp_register_post_types();
+	}
+
+	// Make sure BuddyPress taxonomies are registered
+	if ( ! taxonomy_exists( bp_get_email_tax_type() ) ) {
+		bp_register_taxonomies();
+	}
+
+	buddypress()->core->blog_is_switched = true;
+}
+
+/**
+ * Reset current blog if necessary
+ *
+ * @since 2.5.0
+ */
+function bp_restore_current_blog() {
+	$bp = buddypress();
+
+	if ( isset( $bp->core->blog_is_switched ) && true === $bp->core->blog_is_switched ) {
+		restore_current_blog();
+
+		$bp->core->blog_is_switched = false;
+	}
+}
+
 /** Global Manipulators *******************************************************/
 
 /**
diff --git src/bp-core/bp-core-taxonomy.php src/bp-core/bp-core-taxonomy.php
index dedf1ce..6ee4803 100644
--- src/bp-core/bp-core-taxonomy.php
+++ src/bp-core/bp-core-taxonomy.php
@@ -60,17 +60,11 @@ add_action( 'bp_register_taxonomies', 'bp_register_default_taxonomies' );
  * @return array Array of term taxonomy IDs.
  */
 function bp_set_object_terms( $object_id, $terms, $taxonomy, $append = false ) {
-	$is_root_blog = bp_is_root_blog();
-
-	if ( ! $is_root_blog ) {
-		switch_to_blog( bp_get_root_blog_id() );
-	}
+	bp_switch_to_root_blog();
 
 	$retval = wp_set_object_terms( $object_id, $terms, $taxonomy, $append );
 
-	if ( ! $is_root_blog ) {
-		restore_current_blog();
-	}
+	bp_restore_current_blog();
 
 	return $retval;
 }
@@ -88,17 +82,11 @@ function bp_set_object_terms( $object_id, $terms, $taxonomy, $append = false ) {
  * @return array
  */
 function bp_get_object_terms( $object_ids, $taxonomies, $args = array() ) {
-	$is_root_blog = bp_is_root_blog();
-
-	if ( ! $is_root_blog ) {
-		switch_to_blog( bp_get_root_blog_id() );
-	}
+	bp_switch_to_root_blog();
 
 	$retval = wp_get_object_terms( $object_ids, $taxonomies, $args );
 
-	if ( ! $is_root_blog ) {
-		restore_current_blog();
-	}
+	bp_restore_current_blog();
 
 	return $retval;
 }
@@ -116,17 +104,11 @@ function bp_get_object_terms( $object_ids, $taxonomies, $args = array() ) {
  * @return bool|WP_Error True on success, false or WP_Error on failure.
  */
 function bp_remove_object_terms( $object_id, $terms, $taxonomy ) {
-	$is_root_blog = bp_is_root_blog();
-
-	if ( ! $is_root_blog ) {
-		switch_to_blog( bp_get_root_blog_id() );
-	}
+	bp_switch_to_root_blog();
 
 	$retval = wp_remove_object_terms( $object_id, $terms, $taxonomy );
 
-	if ( ! $is_root_blog ) {
-		restore_current_blog();
-	}
+	bp_restore_current_blog();
 
 	return $retval;
 }
