diff --git a/src/bp-xprofile/bp-xprofile-filters.php b/src/bp-xprofile/bp-xprofile-filters.php
index dd3f7c567..9ba0a9ccc 100644
--- a/src/bp-xprofile/bp-xprofile-filters.php
+++ b/src/bp-xprofile/bp-xprofile-filters.php
@@ -77,6 +77,9 @@ add_filter( 'xprofile_field_can_delete_before_save',   'absint' );
 add_filter( 'xprofile_field_options_before_save', 'bp_xprofile_sanitize_field_options' );
 add_filter( 'xprofile_field_default_before_save', 'bp_xprofile_sanitize_field_default' );
 
+// Privacy data export.
+add_filter( 'wp_privacy_personal_data_exporters', 'bp_register_xprofile_personal_data_exporter' );
+
 /**
  * Sanitize each field option name for saving to the database.
  *
@@ -623,3 +626,20 @@ function bp_xprofile_filter_meta_query( $q ) {
 
 	return $q;
 }
+
+/**
+ * Register XProfile personal data exporter.
+ *
+ * @since 3.1.0
+ *
+ * @param array $exporters  An array of personal data exporters.
+ * @return array An array of personal data exporters.
+ */
+function bp_register_xprofile_personal_data_exporter( $exporters ) {
+	$exporters['buddypress-xprofile'] = array(
+		'exporter_friendly_name' => __( 'BuddyPress XProfile Data', 'buddypress' ),
+		'callback'               => 'bp_xprofile_personal_data_exporter',
+	);
+
+	return $exporters;
+}
diff --git a/src/bp-xprofile/bp-xprofile-functions.php b/src/bp-xprofile/bp-xprofile-functions.php
index 3344465ec..4d5c8ed5a 100644
--- a/src/bp-xprofile/bp-xprofile-functions.php
+++ b/src/bp-xprofile/bp-xprofile-functions.php
@@ -1336,3 +1336,55 @@ function bp_xprofile_maybe_format_datebox_post_data( $field_id ) {
 		}
 	}
 }
+
+/**
+ * Finds and exports personal data associated with an email address from the XProfile tables.
+ *
+ * @since 3.1.0
+ *
+ * @param string $email_address  The users email address.
+ * @return array An array of personal data.
+ */
+function bp_xprofile_personal_data_exporter( $email_address ) {
+	$email_address = trim( $email_address );
+
+	$data_to_export = array();
+
+	$user = get_user_by( 'email', $email_address );
+
+	if ( ! $user ) {
+		return array(
+			'data' => array(),
+			'done' => true,
+		);
+	}
+
+	$user_data_to_export = array();
+
+	$user_profile_data = BP_XProfile_ProfileData::get_all_for_user( $user->ID );
+	foreach ( $user_profile_data as $field_name => $field ) {
+		// Skip non-array fields, which don't belong to XProfile.
+		if ( ! is_array( $field ) ) {
+			continue;
+		}
+
+		// Repull the data so that BuddyPress formats and sanitizes properly.
+		$value = xprofile_get_field_data( $field['field_id'], $user->ID, 'comma' );
+		$user_data_to_export[] = array(
+			'name'  => $field_name,
+			'value' => $value,
+		);
+	}
+
+	$data_to_export[] = array(
+		'group_id'    => 'bp_xprofile',
+		'group_label' => __( 'Extended Profile Data' ),
+		'item_id'     => "bp-xprofile-{$user->ID}",
+		'data'        => $user_data_to_export,
+	);
+
+	return array(
+		'data' => $data_to_export,
+		'done' => true,
+	);
+}
diff --git a/tests/phpunit/testcases/xprofile/functions.php b/tests/phpunit/testcases/xprofile/functions.php
index 15e9955db..8c8838f85 100644
--- a/tests/phpunit/testcases/xprofile/functions.php
+++ b/tests/phpunit/testcases/xprofile/functions.php
@@ -1074,4 +1074,57 @@ Bar!';
 		$this->assertRegExp( $regex, $output );
 		unset( $GLOBALS['field'] );
 	}
+
+	public function test_bp_xprofile_personal_data_exporter() {
+		$u = self::factory()->user->create();
+
+		$field_group_id = self::factory()->xprofile_group->create();
+		$f1 = self::factory()->xprofile_field->create(
+			array(
+				'field_group_id' => $field_group_id,
+			)
+		);
+		$f2 = self::factory()->xprofile_field->create(
+			array(
+				'field_group_id' => $field_group_id,
+				'type'           => 'checkbox',
+			)
+		);
+
+		$option1 = xprofile_insert_field( array(
+			'field_group_id' => $field_group_id,
+			'parent_id'      => $f2,
+			'type'           => 'option',
+			'name'           => 'Option 1',
+		) );
+
+		$option2 = xprofile_insert_field( array(
+			'field_group_id' => $field_group_id,
+			'parent_id'      => $f2,
+			'type'           => 'option',
+			'name'           => 'Option 2',
+		) );
+
+		$option3 = xprofile_insert_field( array(
+			'field_group_id' => $field_group_id,
+			'parent_id'      => $f2,
+			'type'           => 'option',
+			'name'           => 'Option 3',
+		) );
+
+		xprofile_set_field_data( $f1, $u, 'foo' );
+		xprofile_set_field_data( $f2, $u, array( 'Option 1', 'Option 3' ) );
+
+		$test_user = new WP_User( $u );
+
+		$actual = bp_xprofile_personal_data_exporter( $test_user->user_email );
+
+		$this->assertTrue( $actual['done'] );
+
+		// Number of exported users.
+		$this->assertSame( 1, count( $actual['data'] ) );
+
+		// Number of exported user properties.
+		$this->assertSame( 3, count( $actual['data'][0]['data'] ) );
+	}
 }
