Index: src/bp-templates/bp-nouveau/includes/template-tags.php
===================================================================
--- src/bp-templates/bp-nouveau/includes/template-tags.php	(revision 11769)
+++ src/bp-templates/bp-nouveau/includes/template-tags.php	(working copy)
@@ -739,6 +739,7 @@
 		}
 
 	} elseif ( ! empty( $bp_nouveau->object_nav ) ) {
+
 		$bp_nouveau->displayed_nav = $bp_nouveau->object_nav;
 
 		/**
@@ -751,6 +752,7 @@
 		 * @param array $n   The arguments of the Navigation loop.
 		 */
 		$nav = apply_filters( 'bp_nouveau_get_nav', $nav, $n );
+
 	}
 
 	$bp_nouveau->sorted_nav = array_values( $nav );
@@ -2074,6 +2076,10 @@
 	}
 
 	foreach ( $fields as $name => $attributes ) {
+
+		// We need to ensure that $classes array is emptied before we start a new iteration of this loop.
+		$classes = '';
+
 		list( $label, $required, $value, $attribute_type, $type, $class ) = array_values( $attributes );
 
 		if ( $required ) {
@@ -2132,22 +2138,42 @@
 			$attribute_type = ' ' . checked( $value, $submitted, false );
 		}
 
-		if ( ! empty( $class ) ) {
-			// In case people are adding classes..
-			$classes = explode( ' ', $class );
-			$class = ' class="' . esc_attr( join( ' ', array_map( 'sanitize_html_class', $classes ) ) ) . '"';
-		}
+		// Do not run function to display errors for the private radio.
+		if ( 'private' !== $value ) {
 
-		// Do not fire the do_action to display errors for the private radio.
-		if ( 'private' !== $value ) {
 			/**
-			 * Fires and displays any member registration field errors.
+			 * Fetch & display any BP member registration field errors.
 			 *
-			 * @since 1.1.0 (BuddyPress)
+			 * Passes BP signup errors to Nouveau's template function to
+			 * render suitable markup for error string.
 			 */
-			do_action( "bp_{$name}_errors" );
+			if( isset( buddypress()->signup->errors[ $name ] ) ) {
+				nouveau_error_template( buddypress()->signup->errors[ $name ] );
+
+				// If we have BP errors lets set a class for the input to style as an error.
+				$invalid = 'invalid';
+			}
 		}
 
+		if ( isset( $invalid ) && isset( buddypress()->signup->errors[ $name ] ) ) {
+			if ( ! empty( $class ) ) {
+				$class = $class . ' ' . $invalid;
+			} else {
+				$class = $invalid;
+			}
+		}
+
+		if ( ! empty( $class ) ) {
+
+			// In case people are adding classes &/or we have an error class to add.
+			$classes = explode( ' ', $class );
+		}
+
+		if ( ! empty( $classes ) ) {
+
+			$class = ' class="' . esc_attr( join( ' ', array_map( 'sanitize_html_class', $classes ) ) ) . '"';
+		}
+
 		// Set the input.
 		$field_output = sprintf( '<input type="%1$s" name="%2$s" id="%3$s" %4$s value="%5$s" %6$s />',
 			esc_attr( $type ),
@@ -2231,3 +2257,42 @@
 		do_action( $submit_data['after'] );
 	}
 }
+
+/**
+ * Display supplemental error or feedback messages
+ *
+ * This template handles in page error or feedback messages e.g signup fields
+ * 'Username exists' type registration field error notices.
+ *
+ * @param  string $string required: the message to display.
+ * @param  string $type optional: the type of error message e.g 'error'.
+ *
+ * @todo Could this requirement to handle additional messages be better served by
+ *       passing strings into the main Nouveau feedback messages array to be rendered
+ *       by the main template include for notices.
+ *
+ * @since 1.0.0
+ */
+function nouveau_error_template( $string = '', $type = '' ) {
+
+	if ( ! $string ) {
+		return;
+	}
+
+	// Set a default type & add white space if passing in a param.
+	if ( $type ) {
+		$type = ' ' . $type;
+	} else {
+		$type = ' error';
+	}
+
+	?>
+
+	<div class="<?php echo esc_attr( 'bp-messages bp-feedback' . $type ); ?>">
+		<span class="bp-icon" aria-hidden="true"></span>
+		<p><?php echo esc_html( $string ); ?></p>
+	</div>
+
+	<?php
+	return;
+}
