diff --git src/bp-activity/bp-activity-loader.php src/bp-activity/bp-activity-loader.php
index 2a34aca..9366910 100644
--- src/bp-activity/bp-activity-loader.php
+++ src/bp-activity/bp-activity-loader.php
@@ -114,6 +114,9 @@ class BP_Activity_Component extends BP_Component {
 			'search_string'         => __( 'Search Activity...', 'buddypress' ),
 			'global_tables'         => $global_tables,
 			'meta_tables'           => $meta_tables,
+			'feedback_messages'     => array(
+				array( 'code' => 2, 'message' => sprintf( __( 'Please use less than %d links in your update', 'buddypress' ), get_option( 'comment_max_links' ) ), 'data' => '' ),
+			),
 		);
 
 		parent::setup_globals( $args );
diff --git src/bp-core/bp-core-classes.php src/bp-core/bp-core-classes.php
index 41be065..ccd8804 100644
--- src/bp-core/bp-core-classes.php
+++ src/bp-core/bp-core-classes.php
@@ -9,6 +9,7 @@
 // Exit if accessed directly
 defined( 'ABSPATH' ) || exit;
 
+require dirname( __FILE__ ) . '/classes/class-bp-feedback.php';
 require dirname( __FILE__ ) . '/classes/class-bp-user-query.php';
 require dirname( __FILE__ ) . '/classes/class-bp-core-user.php';
 require dirname( __FILE__ ) . '/classes/class-bp-date-query.php';
diff --git src/bp-core/bp-core-component.php src/bp-core/bp-core-component.php
index a24de99..2b7a592 100644
--- src/bp-core/bp-core-component.php
+++ src/bp-core/bp-core-component.php
@@ -125,6 +125,15 @@ class BP_Component {
 	 */
 	public $global_tables = array();
 
+	/**
+	 * Feedback for the component (if applicable)
+	 *
+	 * @since BuddyPress (2.4.0)
+	 *
+	 * @var object
+	 */
+	public $feedback = null;
+
 	/** Methods ***************************************************************/
 
 	/**
@@ -221,6 +230,7 @@ class BP_Component {
 			'search_string'         => '',
 			'global_tables'         => '',
 			'meta_tables'           => '',
+			'feedback_messages'     => array(),
 		) );
 
 		/**
@@ -287,6 +297,15 @@ class BP_Component {
 			$this->register_meta_tables( $r['meta_tables'] );
 		}
 
+		// Set the feedback messages
+		if ( ! empty(  $r['feedback_messages'] ) ) {
+			$this->feedback = new BP_Feedback;
+
+			foreach ( (array) $r['feedback_messages'] as $feedback_message ) {
+				$this->feedback->add( $feedback_message['code'], $feedback_message['message'], $feedback_message['data'] );
+			}
+		}
+
 		/** BuddyPress ********************************************************/
 
 		// Register this component in the loaded components array
diff --git src/bp-core/bp-core-functions.php src/bp-core/bp-core-functions.php
index 55449bf..2707f6a 100644
--- src/bp-core/bp-core-functions.php
+++ src/bp-core/bp-core-functions.php
@@ -917,6 +917,7 @@ function bp_core_get_root_domain() {
  *        headers. Default: 302.
  */
 function bp_core_redirect( $location = '', $status = 302 ) {
+	$bp = buddypress();
 
 	// On some setups, passing the value of wp_get_referer() may result in an
 	// empty value for $location, which results in an error. Ensure that we
@@ -925,9 +926,19 @@ function bp_core_redirect( $location = '', $status = 302 ) {
 		$location = bp_get_root_domain();
 	}
 
+	if ( ! empty( $bp->template_message_code ) ) {
+		$args = array( 'success' => $bp->template_message_code );
+
+		if ( ! empty( $bp->template_message_type ) ) {
+			$args = array( $bp->template_message_type => $bp->template_message_code );
+		}
+
+		$location = esc_url_raw( add_query_arg( $args, $location ) );
+	}
+
 	// Make sure we don't call status_header() in bp_core_do_catch_uri() as this
 	// conflicts with wp_redirect() and wp_safe_redirect().
-	buddypress()->no_status_set = true;
+	$bp->no_status_set = true;
 
 	wp_safe_redirect( $location, $status );
 	die;
@@ -1260,6 +1271,36 @@ function bp_core_add_message( $message, $type = '' ) {
 	 */
 	$bp->template_message      = $message;
 	$bp->template_message_type = $type;
+
+	// Template message code defaults to 1
+	$bp->template_message_code = 1;
+}
+
+/**
+ * Set the feedback message code
+ *
+ * @param  mixed $codes    single message code, array or comma separated list of message codes
+ * @param  string $type Message type. 'updated', 'success', 'error', 'warning'.
+ *         Default: 'success'.
+ */
+function bp_core_add_message_code( $codes = '', $type = '' ) {
+
+	// Success is the default
+	if ( empty( $type ) ) {
+		$type = 'success';
+	}
+
+	// Get BuddyPress
+	$bp = buddypress();
+
+	$message_codes = wp_parse_id_list( $codes );
+
+	/***
+	 * Send the values to the $bp global so we can still output messages
+	 * without a page reload
+	 */
+	$bp->template_message_code = join( ',', $message_codes );
+	$bp->template_message_type = $type;
 }
 
 /**
@@ -1300,19 +1341,93 @@ function bp_core_setup_message() {
 add_action( 'bp_actions', 'bp_core_setup_message', 5 );
 
 /**
+ * Get feedback messages for given codes and component
+ *
+ * @since BuddyPress (2.4.0)
+ *
+ * @param  array  $codes the code of the feedback messages to get
+ * @param  string $component the id of the component messages are related to
+ * @return array  list of matching feedback messages
+ */
+function bp_core_get_feedback_messages( $codes = array(), $component = '' ) {
+	$bp = buddypress();
+
+	if ( empty( $component ) ) {
+		$component = 'core';
+
+		if ( bp_current_component() ) {
+			$component = bp_current_component();
+		}
+	}
+
+	if ( ! bp_is_active( $component ) || empty( $codes ) ) {
+		return false;
+	}
+
+	/**
+	 * Filter to edit the feedback messages
+	 *
+	 * @since BuddyPress (2.4.0)
+	 *
+	 * @param array             list of feedback messages
+	 * @param array  $codes     list of feedback codes
+	 * @param string $component the component id the messages are related to
+	 */
+	return (array) apply_filters( 'bp_core_get_feedback_messages', $bp->{$component}->feedback->get_feedback_messages( $codes ), $codes, $component );
+}
+
+/**
  * Render the 'template_notices' feedback message.
  *
  * The hook action 'template_notices' is used to call this function, it is not
  * called directly.
  */
-function bp_core_render_message() {
+function bp_core_render_message( $class = '', $echo = true ) {
 
 	// Get BuddyPress
 	$bp = buddypress();
 
-	if ( !empty( $bp->template_message ) ) :
-		$type    = ( 'success' === $bp->template_message_type ) ? 'updated' : 'error';
+	if ( ! empty( $_REQUEST ) ) {
+		$is_feedback = array_intersect_key( $_REQUEST, array( 'error' => true, 'success' => true ) );
+
+		if ( ! empty( $is_feedback ) ) {
+			$bp->template_message_type = key( $is_feedback );
+			$bp->template_message_code = $is_feedback[ $bp->template_message_type ];
+		}
+	}
+
+	if ( isset( $bp->template_message_code ) && 1 !== (int) $bp->template_message_code ) {
+		$codes    = wp_parse_id_list( $bp->template_message_code );
+		$messages = bp_core_get_feedback_messages( $codes );
+
+	} elseif ( ! empty( $bp->template_message ) ) {
+		$messages = array( $bp->template_message );
+	}
+
+	if ( empty( $messages ) ) {
+		return;
+	}
+
+	// Set the type
+	$type = ( 'success' === $bp->template_message_type ) ? 'updated' : 'error';
+
+	if ( empty( $class ) ) {
+		$class = 'bp-template-notice';
+	}
+
+	/**
+	 * Filters the classes of the 'template_notices'
+	 *
+	 * @since BuddyPress (2.4.0)
+	 *
+	 * @param array the classes for the template notices
+	 */
+	$classes = apply_filters( 'bp_core_render_message_classes', array( $class, $type ) );
+
+	// Build the output
+	$output = '<div id="message" class="' . join( ' ', array_map( 'sanitize_html_class',  $classes ) ) . '">';
 
+	foreach ( $messages as $message ) {
 		/**
 		 * Filters the 'template_notices' feedback message content.
 		 *
@@ -1322,24 +1437,25 @@ function bp_core_render_message() {
 		 * @param string $type             The type of message being displayed.
 		 *                                 Either 'updated' or 'error'.
 		 */
-		$content = apply_filters( 'bp_core_render_message_content', $bp->template_message, $type ); ?>
-
-		<div id="message" class="bp-template-notice <?php echo esc_attr( $type ); ?>">
+		$output .= apply_filters( 'bp_core_render_message_content', $message, $type );
+	}
 
-			<?php echo $content; ?>
+	$output .= '</div>';
 
-		</div>
-
-	<?php
+	// Return the message
+	if ( false === (bool) $echo ) {
+		return $output;
 
+	// Display the message
+	} else {
+		echo $output;
 		/**
 		 * Fires after the display of any template_notices feedback messages.
 		 *
 		 * @since BuddyPress (1.1.0)
 		 */
 		do_action( 'bp_core_render_message' );
-
-	endif;
+	}
 }
 
 /** Last active ***************************************************************/
diff --git src/bp-core/bp-core-moderation.php src/bp-core/bp-core-moderation.php
index c2cf377..40fb21e 100644
--- src/bp-core/bp-core-moderation.php
+++ src/bp-core/bp-core-moderation.php
@@ -134,6 +134,7 @@ function bp_core_check_for_moderation( $user_id = 0, $title = '', $content = ''
 
 		// Das ist zu viele links!
 		if ( $num_links >= $max_links ) {
+			bp_core_add_message_code( 2, 'error' );
 			return false;
 		}
 	}
diff --git src/bp-core/classes/class-bp-feedback.php src/bp-core/classes/class-bp-feedback.php
index e69de29..14ebd40 100644
--- src/bp-core/classes/class-bp-feedback.php
+++ src/bp-core/classes/class-bp-feedback.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Core component classes.
+ *
+ * @package BuddyPress
+ * @subpackage Core
+ */
+
+// Exit if accessed directly
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * User feedback class
+ *
+ * @since BuddyPress (2.4.0)
+ */
+class BP_Feedback extends WP_Error {
+
+	/**
+	 * Get the list of feedback messages for the requested codes
+	 *
+	 * @since BuddyPress (2.4.0)
+	 *
+	 * @param  array $codes             the list of requested codes
+	 * @return array $selected_messages the list of feedback messages
+	 */
+	public function get_feedback_messages( $codes = array() ) {
+		$selected_messages = array();
+
+		if ( count( $codes ) > 1 ) {
+			$selected_messages = array_flip( $codes );
+
+			foreach ( (array) $this->errors as $code => $messages ) {
+				if ( isset( $selected_messages[ $code ] ) ) {
+					$selected_messages[ $code ] = $messages[0];
+				}
+			}
+		} else {
+			$selected_messages = array( $this->get_feedback_message( $codes[0] ) );
+		}
+
+		return $selected_messages;
+	}
+
+	/**
+	 * Get all feedback messages
+	 *
+	 * @since BuddyPress (2.4.0)
+	 *
+	 * @return array all feedback messages
+	 */
+	public function get_all_feedback_messages() {
+		return parent::get_error_messages();
+	}
+
+	/**
+	 * Get a specific feedback message
+	 *
+	 * @since BuddyPress (2.4.0)
+	 *
+	 * @param  int    $code the requested code
+	 * @return string       the feedback message
+	 */
+	public function get_feedback_message( $code = 0 ) {
+		return parent::get_error_message( $code );
+	}
+}
diff --git src/bp-members/bp-members-loader.php src/bp-members/bp-members-loader.php
index e02daaa..8cf64b2 100644
--- src/bp-members/bp-members-loader.php
+++ src/bp-members/bp-members-loader.php
@@ -104,7 +104,10 @@ class BP_Members_Component extends BP_Component {
 			'global_tables'   => array(
 				'table_name_last_activity' => bp_core_get_table_prefix() . 'bp_activity',
 				'table_name_signups'       => bp_core_get_table_prefix() . 'signups',
-			)
+			),
+			'feedback_messages' => array(
+				array( 'code' => 15, 'message' => __( 'The account was successfully deleted.', 'buddypress' ), 'data' => '' ),
+			),
 		);
 
 		parent::setup_globals( $args );
diff --git src/bp-settings/bp-settings-actions.php src/bp-settings/bp-settings-actions.php
index 6eb9bc4..aa57ae1 100644
--- src/bp-settings/bp-settings-actions.php
+++ src/bp-settings/bp-settings-actions.php
@@ -215,16 +215,16 @@ Regards,
 	// Email feedback
 	switch ( $email_error ) {
 		case 'invalid' :
-			$feedback['email_invalid']  = __( 'That email address is invalid. Check the formatting and try again.', 'buddypress' );
+			$feedback['email_invalid']  = 2;
 			break;
 		case 'blocked' :
-			$feedback['email_blocked']  = __( 'That email address is currently unavailable for use.', 'buddypress' );
+			$feedback['email_blocked']  = 3;
 			break;
 		case 'taken' :
-			$feedback['email_taken']    = __( 'That email address is already taken.', 'buddypress' );
+			$feedback['email_taken']    = 4;
 			break;
 		case 'empty' :
-			$feedback['email_empty']    = __( 'Email address cannot be empty.', 'buddypress' );
+			$feedback['email_empty']    = 5;
 			break;
 		case false :
 			// No change
@@ -234,16 +234,16 @@ Regards,
 	// Password feedback
 	switch ( $pass_error ) {
 		case 'invalid' :
-			$feedback['pass_error']    = __( 'Your current password is invalid.', 'buddypress' );
+			$feedback['pass_error']    = 6;
 			break;
 		case 'mismatch' :
-			$feedback['pass_mismatch'] = __( 'The new password fields did not match.', 'buddypress' );
+			$feedback['pass_mismatch'] = 7;
 			break;
 		case 'empty' :
-			$feedback['pass_empty']    = __( 'One of the password fields was empty.', 'buddypress' );
+			$feedback['pass_empty']    = 8;
 			break;
 		case 'same' :
-			$feedback['pass_same'] 	   = __( 'The new password must be different from the current password.', 'buddypress' );
+			$feedback['pass_same'] 	   = 9;
 			break;
 		case false :
 			// No change
@@ -252,20 +252,20 @@ Regards,
 
 	// No errors so show a simple success message
 	if ( ( ( false === $email_error ) || ( false == $pass_error ) ) && ( ( true === $pass_changed ) || ( true === $email_changed ) ) ) {
-		$feedback[]    = __( 'Your settings have been saved.', 'buddypress' );
+		$feedback[]    = 10;
 		$feedback_type = 'success';
 
 	// Some kind of errors occurred
 	} elseif ( ( ( false === $email_error ) || ( false === $pass_error ) ) && ( ( false === $pass_changed ) || ( false === $email_changed ) ) ) {
 		if ( bp_is_my_profile() ) {
-			$feedback['nochange'] = __( 'No changes were made to your account.', 'buddypress' );
+			$feedback['nochange'] = 11;
 		} else {
-			$feedback['nochange'] = __( 'No changes were made to this account.', 'buddypress' );
+			$feedback['nochange'] = 12;
 		}
 	}
 
 	// Set the feedback
-	bp_core_add_message( implode( "\n", $feedback ), $feedback_type );
+	bp_core_add_message_code( $feedback, $feedback_type );
 
 	/**
 	 * Fires after the general settings have been saved, and before redirect.
@@ -312,9 +312,9 @@ function bp_settings_action_notifications() {
 
 	// Switch feedback for super admins
 	if ( bp_is_my_profile() ) {
-		bp_core_add_message( __( 'Your notification settings have been saved.',        'buddypress' ), 'success' );
+		bp_core_add_message_code( 13, 'success' );
 	} else {
-		bp_core_add_message( __( "This user's notification settings have been saved.", 'buddypress' ), 'success' );
+		bp_core_add_message_code( 14, 'success' );
 	}
 
 	/**
@@ -431,17 +431,21 @@ function bp_settings_action_delete_account() {
 	// Nonce check
 	check_admin_referer( 'delete-account' );
 
-	// Get username now because it might be gone soon!
-	$username = bp_get_displayed_user_fullname();
-
 	// delete the users account
 	if ( bp_core_delete_account( bp_displayed_user_id() ) ) {
 
 		// Add feedback after deleting a user
-		bp_core_add_message( sprintf( __( '%s was successfully deleted.', 'buddypress' ), $username ), 'success' );
+		bp_core_add_message_code( 15, 'success' );
+
+		$redirect = bp_get_root_domain();
+
+		// Should always be the case!
+		if ( bp_is_active( 'members' ) ) {
+			$redirect = bp_get_members_directory_permalink();
+		}
 
 		// Redirect to the root domain
-		bp_core_redirect( bp_get_root_domain() );
+		bp_core_redirect( $redirect );
 	}
 }
 add_action( 'bp_actions', 'bp_settings_action_delete_account' );
@@ -484,10 +488,10 @@ function bp_settings_verify_email_change(){
 			bp_delete_user_meta( bp_displayed_user_id(), 'pending_email_change' );
 
 			// Post a success message and redirect
-			bp_core_add_message( __( 'You have successfully verified your new email address.', 'buddypress' ) );
+			bp_core_add_message_code( 15 );
 		} else {
 			// Unknown error
-			bp_core_add_message( __( 'There was a problem verifying your new email address. Please try again.', 'buddypress' ), 'error' );
+			bp_core_add_message_code( 16, 'error' );
 		}
 
 		bp_core_redirect( $redirect_to );
@@ -495,8 +499,8 @@ function bp_settings_verify_email_change(){
 
 	// Email change is being dismissed
 	} elseif ( ! empty( $_GET['dismiss_email_change'] ) ) {
-	        bp_delete_user_meta( bp_displayed_user_id(), 'pending_email_change' );
-		bp_core_add_message( __( 'You have successfully dismissed your pending email change.', 'buddypress' ) );
+		bp_delete_user_meta( bp_displayed_user_id(), 'pending_email_change' );
+		bp_core_add_message_code( 17 );
 
 		bp_core_redirect( $redirect_to );
 		die();
diff --git src/bp-settings/bp-settings-loader.php src/bp-settings/bp-settings-loader.php
index c310125..e6a07fd 100644
--- src/bp-settings/bp-settings-loader.php
+++ src/bp-settings/bp-settings-loader.php
@@ -58,8 +58,26 @@ class BP_Settings_Component extends BP_Component {
 
 		// All globals for settings component.
 		parent::setup_globals( array(
-			'slug'          => BP_SETTINGS_SLUG,
-			'has_directory' => false,
+			'slug'              => BP_SETTINGS_SLUG,
+			'has_directory'     => false,
+			'feedback_messages' => array(
+				array( 'code' =>  2, 'message' => __( 'That email address is invalid. Check the formatting and try again.', 'buddypress' ),      'data' => '' ),
+				array( 'code' =>  3, 'message' => __( 'That email address is currently unavailable for use.', 'buddypress' ),                    'data' => '' ),
+				array( 'code' =>  4, 'message' => __( 'That email address is already taken.', 'buddypress' ),                                    'data' => '' ),
+				array( 'code' =>  5, 'message' => __( 'Email address cannot be empty.', 'buddypress' ),                                          'data' => '' ),
+				array( 'code' =>  6, 'message' => __( 'Your current password is invalid.', 'buddypress' ),                                       'data' => '' ),
+				array( 'code' =>  7, 'message' => __( 'The new password fields did not match.', 'buddypress' ),                                  'data' => '' ),
+				array( 'code' =>  8, 'message' => __( 'One of the password fields was empty.', 'buddypress' ),                                   'data' => '' ),
+				array( 'code' =>  9, 'message' => __( 'The new password must be different from the current password.', 'buddypress' ),           'data' => '' ),
+				array( 'code' => 10, 'message' => __( 'Your settings have been saved.', 'buddypress' ),                                          'data' => '' ),
+				array( 'code' => 11, 'message' => __( 'No changes were made to your account.', 'buddypress' ),                                   'data' => '' ),
+				array( 'code' => 12, 'message' => __( 'No changes were made to this account.', 'buddypress' ),                                   'data' => '' ),
+				array( 'code' => 13, 'message' => __( 'Your notification settings have been saved.', 'buddypress' ),                             'data' => '' ),
+				array( 'code' => 14, 'message' => __( "This user's notification settings have been saved.", 'buddypress' ),                      'data' => '' ),
+				array( 'code' => 15, 'message' => __( 'You have successfully verified your new email address.', 'buddypress' ),                  'data' => '' ),
+				array( 'code' => 16, 'message' => __( 'There was a problem verifying your new email address. Please try again.', 'buddypress' ), 'data' => '' ),
+				array( 'code' => 17, 'message' => __( 'You have successfully dismissed your pending email change.', 'buddypress' ),              'data' => '' ),
+			),
 		) );
 	}
 
diff --git src/bp-templates/bp-legacy/buddypress-functions.php src/bp-templates/bp-legacy/buddypress-functions.php
index 7ebf90e..0f4128d 100644
--- src/bp-templates/bp-legacy/buddypress-functions.php
+++ src/bp-templates/bp-legacy/buddypress-functions.php
@@ -920,8 +920,16 @@ function bp_legacy_theme_post_update() {
 		$activity_id = apply_filters( 'bp_activity_custom_update', false, $_POST['object'], $_POST['item_id'], $_POST['content'] );
 	}
 
-	if ( empty( $activity_id ) )
-		exit( '-1<div id="message" class="error bp-ajax-message"><p>' . __( 'There was a problem posting your update. Please try again.', 'buddypress' ) . '</p></div>' );
+	if ( empty( $activity_id ) ) {
+		$feedback_message = '-1<div id="message" class="error bp-ajax-message"><p>' . __( 'There was a problem posting your update. Please try again.', 'buddypress' ) . '</p></div>';
+
+		// Do we have a specific feedback message for the error ?
+		if ( ! empty( $bp->template_message_code ) ) {
+			$feedback_message = '-1' . bp_core_render_message( 'bp-ajax-message', false );
+		}
+
+		exit( $feedback_message );
+	}
 
 	$last_recorded = ! empty( $_POST['since'] ) ? date( 'Y-m-d H:i:s', intval( $_POST['since'] ) ) : 0;
 	if ( $last_recorded ) {
diff --git src/bp-templates/bp-legacy/buddypress/members/index.php src/bp-templates/bp-legacy/buddypress/members/index.php
index 1cefe5e..48becd5 100644
--- src/bp-templates/bp-legacy/buddypress/members/index.php
+++ src/bp-templates/bp-legacy/buddypress/members/index.php
@@ -41,6 +41,10 @@ do_action( 'bp_before_directory_members_page' ); ?>
 	do_action( 'bp_before_directory_members_tabs' ); ?>
 
 	<form action="" method="post" id="members-directory-form" class="dir-form">
+		<?php
+
+		/** This action is documented in bp-templates/bp-legacy/buddypress/activity/index.php */
+		do_action( 'template_notices' ); ?>
 
 		<div class="item-list-tabs" role="navigation">
 			<ul>
