diff --git src/bp-templates/bp-legacy/css/buddypress.css src/bp-templates/bp-legacy/css/buddypress.css
index 77b8e3a..d0a4a01 100644
--- src/bp-templates/bp-legacy/css/buddypress.css
+++ src/bp-templates/bp-legacy/css/buddypress.css
@@ -840,7 +840,7 @@ a.bp-title-button {
 #buddypress .wp-editor-wrap input[type=submit],
 #buddypress .wp-editor-wrap input[type=button],
 #buddypress .wp-editor-wrap input[type=reset] {
-	padding: 0 10px 1px;
+	padding: 0 8px 1px;
 }
 
 /* Form classes & generic attr styling */
@@ -1584,6 +1584,26 @@ body.register #buddypress div.page ul {
 #buddypress .field-visibility select {
 	margin: 0;
 }
+#buddypress .wp-editor-container {
+	border: 1px solid #dedede;
+}
+#buddypress .html-active button.switch-html {
+	border-bottom-color: transparent;
+	border-bottom-left-radius: 0;
+	border-bottom-right-radius: 0;
+	background: #f5f5f5;
+}
+#buddypress .tmce-active button.switch-tmce {
+	border-bottom-color: transparent;
+	border-bottom-left-radius: 0;
+	border-bottom-right-radius: 0;
+	background: #f5f5f5;
+}
+#buddypress .standard-form .wp-editor-container textarea {
+	width: 100%;
+	padding-top: 0;
+	padding-bottom: 0;
+}
 
 /*--------------------------------------------------------------
 3.11 - Widgets
diff --git src/bp-templates/bp-legacy/css/twentyfifteen.css src/bp-templates/bp-legacy/css/twentyfifteen.css
index 331f0bb..c9908f8 100644
--- src/bp-templates/bp-legacy/css/twentyfifteen.css
+++ src/bp-templates/bp-legacy/css/twentyfifteen.css
@@ -1708,6 +1708,14 @@ http://codex.buddypress.org/themes/buddypress-companion-stylesheets/
 	border: 1px solid rgba(153, 153, 153, 0.5);
 }
 
+#buddypress .wp-editor-wrap a.button,
+#buddypress .wp-editor-wrap button,
+#buddypress .wp-editor-wrap input[type=submit],
+#buddypress .wp-editor-wrap input[type=button],
+#buddypress .wp-editor-wrap input[type=reset] {
+	padding: 0 5px 1px;
+}
+
 #buddypress .standard-form li,
 #buddypress .group-create-form li {
 	float: none;
diff --git src/bp-templates/bp-legacy/css/twentyfifteen.scss src/bp-templates/bp-legacy/css/twentyfifteen.scss
index cabcd0e..b1a0d57 100644
--- src/bp-templates/bp-legacy/css/twentyfifteen.scss
+++ src/bp-templates/bp-legacy/css/twentyfifteen.scss
@@ -2040,6 +2040,17 @@ http://codex.buddypress.org/themes/buddypress-companion-stylesheets/
 
 	select {border: 1px solid rgba($border-color, 0.5);}
 
+	// Overrides for embedded WP editors.
+	.wp-editor-wrap {
+		a.button,
+		button,
+		input[type=submit],
+		input[type=button],
+		input[type=reset] {
+			padding: 0 5px 1px;
+		}
+	}
+
 } // close #buddypress
 
 
diff --git src/bp-xprofile/bp-xprofile-filters.php src/bp-xprofile/bp-xprofile-filters.php
index 639fd6c..e039a4c 100644
--- src/bp-xprofile/bp-xprofile-filters.php
+++ src/bp-xprofile/bp-xprofile-filters.php
@@ -23,14 +23,14 @@ add_filter( 'bp_get_the_profile_field_value',           'convert_chars'      );
 add_filter( 'bp_get_the_profile_field_value',           'wpautop'            );
 add_filter( 'bp_get_the_profile_field_value',           'force_balance_tags' );
 add_filter( 'bp_get_the_profile_field_value',           'make_clickable'     );
-add_filter( 'bp_get_the_profile_field_value',           'esc_html',        8 );
+add_filter( 'bp_get_the_profile_field_value',           'bp_xprofile_escape_field_data', 8, 3 );
 add_filter( 'bp_get_the_profile_field_value',           'convert_smilies', 9 );
 add_filter( 'bp_get_the_profile_field_value',           'xprofile_filter_format_field_value',         1, 2 );
 add_filter( 'bp_get_the_profile_field_value',           'xprofile_filter_format_field_value_by_type', 8, 3 );
 add_filter( 'bp_get_the_profile_field_value',           'xprofile_filter_link_profile_data',          9, 3 );
 
 add_filter( 'bp_get_the_profile_field_edit_value',      'force_balance_tags' );
-add_filter( 'bp_get_the_profile_field_edit_value',      'esc_html'           );
+add_filter( 'bp_get_the_profile_field_edit_value',      'bp_xprofile_escape_field_data', 10, 3 );
 
 add_filter( 'bp_get_the_profile_group_name',            'stripslashes' );
 add_filter( 'bp_get_the_profile_group_description',     'stripslashes' );
@@ -39,7 +39,7 @@ add_filter( 'bp_get_the_profile_field_edit_value',      'stripslashes' );
 add_filter( 'bp_get_the_profile_field_name',            'stripslashes' );
 add_filter( 'bp_get_the_profile_field_description',     'stripslashes' );
 
-add_filter( 'xprofile_get_field_data',                  'wp_filter_kses', 1 );
+add_filter( 'xprofile_get_field_data',                  'xprofile_filter_kses', 1 );
 add_filter( 'xprofile_field_name_before_save',          'wp_filter_kses', 1 );
 add_filter( 'xprofile_field_description_before_save',   'wp_filter_kses', 1 );
 
@@ -124,6 +124,20 @@ function xprofile_filter_kses( $content, $data_obj = null ) {
 	$xprofile_allowedtags             = $allowedtags;
 	$xprofile_allowedtags['a']['rel'] = array();
 
+	// If the field supports rich text, we must allow tags that appear in wp_editor().
+	if ( $data_obj instanceof BP_XProfile_ProfileData && bp_xprofile_is_richtext_enabled_for_field( $data_obj->field_id ) ) {
+		$richtext_tags = array(
+			'img'  => array( 'id' => 1, 'class' => 1, 'src' => 1, 'alt' => 1, 'width' => 1, 'height' => 1 ),
+			'ul'   => array( 'id' => 1, 'class' => 1 ),
+			'ol'   => array( 'id' => 1, 'class' => 1 ),
+			'li'   => array( 'id' => 1, 'class' => 1 ),
+			'span' => array( 'style' => 1 ),
+			'p'    => array( 'style' => 1 ),
+		);
+
+		$xprofile_allowedtags = array_merge( $allowedtags, $richtext_tags );
+	}
+
 	/**
 	 * Filters the allowed tags for use within xprofile_filter_kses().
 	 *
@@ -280,6 +294,35 @@ function xprofile_filter_pre_validate_value_by_field_type( $value, $field, $fiel
 }
 
 /**
+ * Escape field value for display.
+ *
+ * Most field values are simply run through esc_html(). Those that support rich text (by default, `textarea` only)
+ * are sanitized using kses, which allows a whitelist of HTML tags.
+ *
+ * @since 2.4.0
+ *
+ * @param string $value Field value.
+ * @param string $field_type Field type.
+ * @param int    $field_id Field ID.
+ * @return string
+ */
+function bp_xprofile_escape_field_data( $value, $field_type, $field_id ) {
+	if ( bp_xprofile_is_richtext_enabled_for_field( $field_id ) ) {
+		// xprofile_filter_kses() expects a BP_XProfile_ProfileData object.
+		$data_obj = null;
+		if ( bp_is_user() ) {
+			$data_obj = new BP_XProfile_ProfileData( $field_id, bp_displayed_user_id() );
+		}
+
+		$value = xprofile_filter_kses( $value, $data_obj );
+	} else {
+		$value = esc_html( $value );
+	}
+
+	return $value;
+}
+
+/**
  * Filter an Extended Profile field value, and attempt to make clickable links
  * to members search results out of them.
  *
diff --git src/bp-xprofile/bp-xprofile-functions.php src/bp-xprofile/bp-xprofile-functions.php
index a2004d8..a3d025d 100644
--- src/bp-xprofile/bp-xprofile-functions.php
+++ src/bp-xprofile/bp-xprofile-functions.php
@@ -1020,6 +1020,39 @@ function bp_xprofile_fullname_field_name() {
 }
 
 /**
+ * Is rich text enabled for this profile field?
+ *
+ * By default, rich text is enabled for textarea fields and disabled for all other field types.
+ *
+ * @since 2.4.0
+ *
+ * @param int $field_id Optional. Default current field ID.
+ * @return bool
+ */
+function bp_xprofile_is_richtext_enabled_for_field( $field_id = null ) {
+	if ( ! $field_id ) {
+		$field_id = bp_get_the_profile_field_id();
+	}
+
+	$field = xprofile_get_field( $field_id );
+
+	$enabled = false;
+	if ( $field instanceof BP_XProfile_Field ) {
+		$enabled = (bool) $field->type_obj->supports_richtext;
+	}
+
+	/**
+	 * Filters whether richtext is enabled for the given field.
+	 *
+	 * @since 2.4.0
+	 *
+	 * @param bool $enabled  True if richtext is enabled for the field, otherwise false.
+	 * @param int  $field_id ID of the field.
+	 */
+	return apply_filters( 'bp_xprofile_is_richtext_enabled_for_field', $enabled, $field_id );
+}
+
+/**
  * Get visibility levels out of the $bp global.
  *
  * @return array
diff --git src/bp-xprofile/classes/class-bp-xprofile-field-type-textarea.php src/bp-xprofile/classes/class-bp-xprofile-field-type-textarea.php
index c480dd4..041e2e7 100644
--- src/bp-xprofile/classes/class-bp-xprofile-field-type-textarea.php
+++ src/bp-xprofile/classes/class-bp-xprofile-field-type-textarea.php
@@ -26,6 +26,7 @@ class BP_XProfile_Field_Type_Textarea extends BP_XProfile_Field_Type {
 
 		$this->category = _x( 'Single Fields', 'xprofile field type category', 'buddypress' );
 		$this->name     = _x( 'Multi-line Text Area', 'xprofile field type', 'buddypress' );
+		$this->supports_richtext = true;
 
 		$this->set_format( '/^.*$/m', 'replace' );
 
@@ -59,10 +60,7 @@ class BP_XProfile_Field_Type_Textarea extends BP_XProfile_Field_Type {
 			unset( $raw_properties['user_id'] );
 		}
 
-		$r = bp_parse_args( $raw_properties, array(
-			'cols' => 40,
-			'rows' => 5,
-		) ); ?>
+		$richtext_enabled = bp_xprofile_is_richtext_enabled_for_field(); ?>
 
 		<label for="<?php bp_the_profile_field_input_name(); ?>">
 			<?php bp_the_profile_field_name(); ?>
@@ -72,11 +70,46 @@ class BP_XProfile_Field_Type_Textarea extends BP_XProfile_Field_Type {
 		<?php
 
 		/** This action is documented in bp-xprofile/bp-xprofile-classes */
-		do_action( bp_get_the_profile_field_errors_action() ); ?>
-
-		<textarea <?php echo $this->get_edit_field_html_elements( $r ); ?>><?php bp_the_profile_field_edit_value(); ?></textarea>
-
-		<?php
+		do_action( bp_get_the_profile_field_errors_action() );
+
+		if ( ! $richtext_enabled ) {
+			$r = wp_parse_args( $raw_properties, array(
+				'cols' => 40,
+				'rows' => 5,
+			) );
+
+			?>
+
+			<textarea <?php echo $this->get_edit_field_html_elements( $r ); ?>><?php bp_the_profile_field_edit_value(); ?></textarea>
+
+			<?php
+
+		} else {
+
+			/**
+			 * Filters the arguments passed to `wp_editor()` in richtext xprofile fields.
+			 *
+			 * @since 2.4.0
+			 *
+			 * @param array $args {
+			 *     Array of optional arguments. See `wp_editor()`.
+			 *     @type bool $teeny         Whether to use the teeny version of TinyMCE. Default true.
+			 *     @type bool $media_buttons Whether to show media buttons. Default false.
+			 *     @type bool $quicktags     Whether to show the quicktags buttons. Default true.
+			 * }
+			 */
+			$editor_args = apply_filters( 'bp_xprofile_field_type_textarea_editor_args', array(
+				'teeny'         => true,
+				'media_buttons' => false,
+				'quicktags'     => true,
+			) );
+
+			wp_editor(
+				bp_get_the_profile_field_edit_value(),
+				bp_get_the_profile_field_input_name(),
+				$editor_args
+			);
+		}
 	}
 
 	/**
@@ -89,14 +122,33 @@ class BP_XProfile_Field_Type_Textarea extends BP_XProfile_Field_Type {
 	 * @param array $raw_properties Optional key/value array of permitted attributes that you want to add.
 	 */
 	public function admin_field_html( array $raw_properties = array() ) {
-		$r = bp_parse_args( $raw_properties, array(
-			'cols' => 40,
-			'rows' => 5,
-		) ); ?>
+		$richtext_enabled = bp_xprofile_is_richtext_enabled_for_field();
 
-		<textarea <?php echo $this->get_edit_field_html_elements( $r ); ?>></textarea>
+		if ( ! $richtext_enabled ) {
 
-		<?php
+			$r = bp_parse_args( $raw_properties, array(
+				'cols' => 40,
+				'rows' => 5,
+			) ); ?>
+
+			<textarea <?php echo $this->get_edit_field_html_elements( $r ); ?>></textarea>
+
+			<?php
+		} else {
+
+			/** This filter is documented in bp-xprofile/classes/class-bp-xprofile-field-type-textarea.php */
+			$editor_args = apply_filters( 'bp_xprofile_field_type_textarea_editor_args', array(
+				'teeny'         => true,
+				'media_buttons' => false,
+				'quicktags'     => true,
+			) );
+
+			wp_editor(
+				'',
+				'xprofile_textarea_' . bp_get_the_profile_field_id(),
+				$editor_args
+			);
+		}
 	}
 
 	/**
diff --git src/bp-xprofile/classes/class-bp-xprofile-field-type.php src/bp-xprofile/classes/class-bp-xprofile-field-type.php
index dda936a..1557c25 100644
--- src/bp-xprofile/classes/class-bp-xprofile-field-type.php
+++ src/bp-xprofile/classes/class-bp-xprofile-field-type.php
@@ -73,6 +73,14 @@ abstract class BP_XProfile_Field_Type {
 	public $supports_multiple_defaults = false;
 
 	/**
+	 * If the field type supports rich text by default.
+	 *
+	 * @since 2.4.0
+	 * @var bool
+	 */
+	public $supports_richtext = false;
+
+	/**
 	 * If object is created by an BP_XProfile_Field object.
 	 *
 	 * @since 2.0.0
diff --git tests/phpunit/testcases/xprofile/functions.php tests/phpunit/testcases/xprofile/functions.php
index 63256ea..f5f56e4 100644
--- tests/phpunit/testcases/xprofile/functions.php
+++ tests/phpunit/testcases/xprofile/functions.php
@@ -913,4 +913,30 @@ Bar!';
 		$this->assertEquals( $field_1, $field_2 );
 		$this->assertSame( $num_queries, $wpdb->num_queries );
 	}
+
+	/**
+	 * @ticket BP5625
+	 */
+	public function test_bp_xprofie_is_richtext_enabled_for_field_should_default_to_true_for_textareas() {
+		$g = $this->factory->xprofile_group->create();
+		$f = $this->factory->xprofile_field->create( array(
+			'field_group_id' => $g,
+			'type' => 'textarea',
+		) );
+
+		$this->assertTrue( bp_xprofile_is_richtext_enabled_for_field( $f ) );
+	}
+
+	/**
+	 * @ticket BP5625
+	 */
+	public function test_bp_xprofie_is_richtext_enabled_for_field_should_default_to_false_for_non_textareas() {
+		$g = $this->factory->xprofile_group->create();
+		$f = $this->factory->xprofile_field->create( array(
+			'field_group_id' => $g,
+			'type' => 'radio',
+		) );
+
+		$this->assertFalse( bp_xprofile_is_richtext_enabled_for_field( $f ) );
+	}
 }
