diff --git src/bp-xprofile/bp-xprofile-filters.php src/bp-xprofile/bp-xprofile-filters.php
index ab0d854..7d3017a 100644
--- src/bp-xprofile/bp-xprofile-filters.php
+++ src/bp-xprofile/bp-xprofile-filters.php
@@ -218,16 +218,17 @@ function xprofile_filter_format_field_value( $field_value, $field_type = '' ) {
  *
  * @param mixed $field_value Field value.
  * @param string $field_type Field type.
+ * @param int    $field_id   ID of the field, if available.
  * @return mixed
  */
-function xprofile_filter_format_field_value_by_type( $field_value, $field_type = '' ) {
+function xprofile_filter_format_field_value_by_type( $field_value, $field_type = '', $field_id = '' ) {
 	foreach ( bp_xprofile_get_field_types() as $type => $class ) {
 		if ( $type !== $field_type ) {
 			continue;
 		}
 
 		if ( method_exists( $class, 'display_filter' ) ) {
-			$field_value = call_user_func( array( $class, 'display_filter' ), $field_value );
+			$field_value = call_user_func( array( $class, 'display_filter' ), $field_value, $field_id );
 		}
 	}
 
@@ -244,7 +245,7 @@ function xprofile_filter_format_field_value_by_type( $field_value, $field_type =
  */
 function xprofile_filter_format_field_value_by_field_id( $field_value, $field_id ) {
 	$field = new BP_XProfile_Field( $field_id );
-	return xprofile_filter_format_field_value_by_type( $field_value, $field->type );
+	return xprofile_filter_format_field_value_by_type( $field_value, $field->type, $field_id );
 }
 
 /**
diff --git src/bp-xprofile/bp-xprofile-functions.php src/bp-xprofile/bp-xprofile-functions.php
index 71d0649..d92d49b 100644
--- src/bp-xprofile/bp-xprofile-functions.php
+++ src/bp-xprofile/bp-xprofile-functions.php
@@ -983,6 +983,37 @@ function bp_xprofile_fullname_field_name() {
 }
 
 /**
+ * Is rich text enabled for this profile field?
+ *
+ * @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 ( isset( $field->type ) && 'textarea' === $field->type ) {
+		$enabled = true;
+	}
+
+	/**
+	 * 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 4b5ffc2..cd322ff 100644
--- src/bp-xprofile/classes/class-bp-xprofile-field-type-textarea.php
+++ src/bp-xprofile/classes/class-bp-xprofile-field-type-textarea.php
@@ -26,9 +26,26 @@ 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->type     = 'textare';
 
 		$this->set_format( '/^.*$/m', 'replace' );
 
+		// Create custom filters that mirror 'the_content' for formatting output
+		add_filter( 'bp_xprofile_field_type_textarea_content', 'wptexturize'        );
+		add_filter( 'bp_xprofile_field_type_textarea_content', 'convert_smilies'    );
+		add_filter( 'bp_xprofile_field_type_textarea_content', 'convert_chars'      );
+		add_filter( 'bp_xprofile_field_type_textarea_content', 'wpautop'            );
+		add_filter( 'bp_xprofile_field_type_textarea_content', 'shortcode_unautop'  );
+
+		// Override and augment allowed tags
+		add_filter( 'xprofile_allowed_tags', array( $this, 'allowed_tags' ), 30, 2 );
+
+		// Format the value displayed when editing.
+		add_filter( 'bp_get_the_profile_field_edit_value', array( $this, 'get_field_value' ), 30, 3 );
+
+		// Filter for those who use xprofile_get_field_data instead of `get_field_value()`.
+		add_filter( 'xprofile_get_field_data', array( $this, 'get_field_data' ), 15, 2 );
+
 		/**
 		 * Fires inside __construct() method for BP_XProfile_Field_Type_Textarea class.
 		 *
@@ -56,10 +73,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(); ?>
@@ -71,11 +85,47 @@ 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() ); ?>
+		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>
+		if ( ! $richtext_enabled ) {
+			$r = wp_parse_args( $raw_properties, array(
+				'cols' => 40,
+				'rows' => 5,
+			) );
 
-		<?php
+			?>
+
+			<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,
+			) );
+
+			// Create the editor.
+			wp_editor(
+				bp_get_the_profile_field_edit_value(),
+				bp_get_the_profile_field_input_name(),
+				$editor_args
+			);
+		}
 	}
 
 	/**
@@ -87,14 +137,34 @@ class BP_XProfile_Field_Type_Textarea extends BP_XProfile_Field_Type {
 	 * @since 2.0.0
 	 */
 	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/bp-xprofile-classes */
+			$editor_args = apply_filters( 'bp_xprofile_field_type_textarea_editor_args', array(
+				'teeny'         => true,
+				'media_buttons' => false,
+				'quicktags'     => true,
+			) );
+
+			// Create the editor
+			wp_editor(
+				'',
+				'xprofile_textarea_' . bp_get_the_profile_field_id(),
+				$editor_args
+			);
+		}
 	}
 
 	/**
@@ -106,4 +176,133 @@ class BP_XProfile_Field_Type_Textarea extends BP_XProfile_Field_Type {
 	 * @since 2.0.0
 	 */
 	public function admin_new_field_html( BP_XProfile_Field $current_field, $control_type = '' ) {}
+
+	/**
+	 * Format Visual Editor content for display.
+	 *
+	 * @since 2.4.0
+	 *
+	 * @param string $field_value The Visual Editor content, as saved in the database.
+	 * @return string Formatted HTML.
+	 */
+	public static function display_filter( $field_value, $field_id ) {
+
+		$richtext_enabled = bp_xprofile_is_richtext_enabled_for_field( $field_id );
+
+		if ( $richtext_enabled ) {
+
+			/*
+			 * This is a bit of a hack because formatted text looks strange with the
+			 * 'xprofile_filter_link_profile_data' filter applied. If instead, we parse
+			 * this field type in read mode after all BuddyPress filters have been applied
+			 * we can avoid this.
+			 */
+//			add_filter( 'bp_get_the_profile_field_value', array( 'BP_XProfile_Field_Type_Textarea', 'get_field_value' ), 30, 3 );
+
+		}
+
+		return $field_value;
+
+	}
+
+	/**
+	 * Get the field value.
+	 *
+	 * @param string $value
+	 * @param string $type
+	 * @param integer $id
+	 * @return string
+	 */
+	public function get_field_value( $value = '', $type = '', $id = '' ) {
+		global $field;
+
+		if ( bp_xprofile_is_richtext_enabled_for_field() ) {
+
+			// Reach directly into the global to get an unfiltered value.
+			$value = $field->data->value;
+
+			/**
+			 * Filters textarea richtext content for display.
+			 *
+			 * @since 4.4.0
+			 *
+			 * @param string $value Textarea content.
+			 */
+			$value = apply_filters( 'bp_xprofile_field_type_textarea_content', stripslashes( $value ) );
+
+			return apply_filters( 'bp_xprofile_field_type_textarea_value', $value );
+		}
+
+		return $value;
+
+	}
+
+	/**
+	 * Filter for those who use xprofile_get_field_data instead of get_field_value
+	 *
+	 * @param string $value
+	 * @param integer $field_id
+	 * @param integer $user_id
+	 * @return string
+	 */
+	public function get_field_data( $value = '', $field_id = '' ) {
+
+		if ( bp_xprofile_is_richtext_enabled_for_field( $field_id ) ) {
+
+			// apply content filter
+			$value = apply_filters( 'bp_xprofile_field_type_textarea_content', stripslashes( $value ) );
+
+			// return filtered value
+			return apply_filters( 'bp_xprofile_field_type_textarea_value', $value );
+		}
+
+		return $value;
+	}
+
+	/**
+	 * Callback to allow tags that teeny TinyMCE enables
+	 *
+	 * @since BuddyPress (2.2.0)
+	 *
+	 * @param array $allowedtags The array of allowed tags
+	 * @param object $data_obj The xProfile data object (BP 2.1+)
+	 * @return array $allowedtags The modified array of allowed tags
+	 */
+	public function allowed_tags( $allowedtags, $data_obj = null ) {
+
+		// test if BP has sent the data object
+		if ( ! is_null( $data_obj ) ) {
+
+			// get field from data object
+			$field = new BP_XProfile_Field( $data_obj->field_id );
+
+			// if this isn't our field, skip amending allowed tags
+			if ( $field->type != $this->type ) return $allowedtags;
+
+			// get enabled and default to enabled if not yet present
+			$richtext_enabled = bp_xprofile_get_meta( $field->id, 'field', 'richtext_enabled', true );
+			if ( $richtext_enabled === false ) $richtext_enabled = 1;
+			$richtext_enabled = ( $richtext_enabled == 1 ) ? true : false;
+
+			// bail if not rich text
+			if ( ! $richtext_enabled )  return $allowedtags;
+
+		}
+
+		// default tags we need to enable the teeny TinyMCE editor markup
+		$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 ),
+		);
+
+		$allowedtags = array_merge( $allowedtags, $richtext_tags );
+
+		return apply_filters( 'bp_xprofile_field_type_textarea_allowedtags', $allowedtags, $data_obj );
+
+	}
+
 }
diff --git tests/phpunit/testcases/xprofile/functions.php tests/phpunit/testcases/xprofile/functions.php
index fc954a2..e624e1c 100644
--- tests/phpunit/testcases/xprofile/functions.php
+++ tests/phpunit/testcases/xprofile/functions.php
@@ -868,4 +868,30 @@ Bar!';
 		// assert!
 		$this->assertEquals( array( 1, $g1, $g3, $g2 ), wp_list_pluck( $field_groups, 'id' ) );
 	}
+
+	/**
+	 * @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 ) );
+	}
 }
