diff --git src/bp-core/admin/bp-core-admin-tools.php src/bp-core/admin/bp-core-admin-tools.php
index 15058cb10..533586d09 100644
--- src/bp-core/admin/bp-core-admin-tools.php
+++ src/bp-core/admin/bp-core-admin-tools.php
@@ -16,6 +16,7 @@ defined( 'ABSPATH' ) || exit;
  * @since 2.0.0
  */
 function bp_core_admin_tools() {
+	$warnings = array();
 	?>
 	<div class="wrap">
 
@@ -26,14 +27,20 @@ function bp_core_admin_tools() {
 		</p>
 		<p class="description"><?php esc_html_e( 'Some of these tools create substantial database overhead. Avoid running more than one repair job at a time.', 'buddypress' ); ?></p>
 
-		<form class="settings" method="post" action="">
+		<form class="settings" method="post" action="" id="bp-admin-repair-tools">
 
 			<fieldset>
 				<legend><?php esc_html_e( 'Repair tools', 'buddypress' ) ?></legend>
 
 				<div class="checkbox">
-				<?php foreach ( bp_admin_repair_list() as $item ) : ?>
-					<label for="<?php echo esc_attr( str_replace( '_', '-', $item[0] ) ); ?>"><input type="checkbox" class="checkbox" name="<?php echo esc_attr( $item[0] ) . '" id="' . esc_attr( str_replace( '_', '-', $item[0] ) ); ?>" value="1" /> <?php echo esc_html( $item[1] ); ?></label>
+				<?php foreach ( bp_admin_repair_list() as $item ) :
+					$repair_id = esc_attr( str_replace( '_', '-', $item[0] ) );
+
+					if ( isset( $item[3] ) ) {
+						$warnings[ $repair_id ] = esc_html( $item[3] );
+					}	
+				?>
+					<label for="<?php echo esc_attr( str_replace( '_', '-', $item[0] ) ); ?>"><input type="checkbox" class="checkbox" name="<?php echo esc_attr( $item[0] ) . '" id="' . $repair_id; ?>" value="1" /> <?php echo esc_html( $item[1] ); ?></label>
 				<?php endforeach; ?>
 				</div>
 
@@ -49,6 +56,16 @@ function bp_core_admin_tools() {
 	</div>
 
 	<?php
+	// Adds a JavaScript confirmation prompt if needed.
+	if ( $warnings ) {
+		wp_enqueue_script( 'bp-warning-js' );
+		wp_localize_script( 'bp-warning-js', 'bpAdminRepairStrings', array(
+			'warnings' => $warnings,
+			'title'    => _n( esc_html__( 'Warning!', 'buddypress' ), esc_html__( 'Warnings!', 'buddypress' ), count( $warnings ) ),
+			'confirm'  => esc_html__( 'Do you confirm?', 'buddypress' ),
+			'formId'   => 'bp-admin-repair-tools',
+		) );
+	}
 }
 
 /**
@@ -147,6 +164,17 @@ function bp_admin_repair_list() {
 		'bp_admin_reinstall_emails',
 	);
 
+	// Extended profiles:
+	// - Reset custom field visibilities for all users.
+	if ( bp_is_active( 'xprofile' ) ) {
+		$repair_list[110] = array(
+			'bp-xprofile-user-visibilities',
+			__( 'Remove custom field visibilities for all users.', 'buddypress' ),
+			'bp_admin_repair_xprofile_field_visibilities',
+			__( 'You selected a repair tool that will completely erase all users custom visibilities.', 'buddypress' ),
+		);
+	}
+
 	ksort( $repair_list );
 
 	/**
@@ -567,3 +595,16 @@ function bp_core_admin_debug_information( $debug_info = array() ) {
 	return $debug_info;
 }
 add_filter( 'debug_information', 'bp_core_admin_debug_information' );
+
+/**
+ * Remove custom field visibilities for all users.
+ *
+ * @since 5.0.0
+ *
+ * @return array
+ */
+function bp_admin_repair_xprofile_field_visibilities() {
+	$statement = __( 'Removing custom field visibilities for all users&hellip; %s', 'buddypress' );
+	delete_metadata( 'user', 0, 'bp_xprofile_visibility_levels', '', true );
+	return array( 0, sprintf( $statement, __( 'Complete!', 'buddypress' ) ) );
+}
diff --git src/bp-core/admin/js/warning.js src/bp-core/admin/js/warning.js
new file mode 100644
index 000000000..96c533941
--- /dev/null
+++ src/bp-core/admin/js/warning.js
@@ -0,0 +1,32 @@
+( function() {
+    if ( typeof window.bpAdminRepairStrings === 'undefined' ) {
+        return;
+    }
+    
+    var formId = window.bpAdminRepairStrings.formId || null;
+
+    if ( ! formId ) {
+        return;
+    }
+    
+    document.querySelector( '#' + formId ).addEventListener( 'submit', function( event ) {
+        var warningList = [];
+        
+        for( e in event.target.elements ) {
+            if ( 'undefined' !==  typeof event.target.elements[ e ].nodeName ) {
+                if ( window.bpAdminRepairStrings.warnings[ event.target.elements[ e ].getAttribute( 'id' ) ] && event.target.elements[ e ].checked ) {
+                    warningList.push( window.bpAdminRepairStrings.warnings[ event.target.elements[ e ].getAttribute( 'id' ) ] );
+                }
+            }
+        }
+
+        if ( ! warningList.length ) {
+            return event;
+        } else if ( ! confirm( window.bpAdminRepairStrings.title + "\n" + warningList.join( "\n" ) + "\n" + window.bpAdminRepairStrings.confirm ) ) {
+            event.preventDefault();
+            return;
+        }
+
+        return event;
+    } );
+} () );
diff --git src/bp-core/classes/class-bp-admin.php src/bp-core/classes/class-bp-admin.php
index 4f0bd257a..e616209f9 100644
--- src/bp-core/classes/class-bp-admin.php
+++ src/bp-core/classes/class-bp-admin.php
@@ -1143,6 +1143,13 @@ class BP_Admin {
 				'dependencies' => array(),
 				'footer'       => true,
 			),
+
+			// 5.0
+			'bp-warning-js' => array(
+				'file'         => "{$url}warning{$min}.js",
+				'dependencies' => array(),
+				'footer'       => true,
+			),
 		) );
 
 		$version = bp_get_version();
diff --git src/bp-xprofile/bp-xprofile-functions.php src/bp-xprofile/bp-xprofile-functions.php
index 2ba68eaf8..13dbc0f52 100644
--- src/bp-xprofile/bp-xprofile-functions.php
+++ src/bp-xprofile/bp-xprofile-functions.php
@@ -496,7 +496,7 @@ function xprofile_set_field_visibility_level( $field_id = 0, $user_id = 0, $visi
 	// Stored in an array in usermeta.
 	$current_visibility_levels = bp_get_user_meta( $user_id, 'bp_xprofile_visibility_levels', true );
 
-	if ( !$current_visibility_levels ) {
+	if ( ! is_array( $current_visibility_levels ) ) {
 		$current_visibility_levels = array();
 	}
 
@@ -1284,6 +1284,9 @@ function bp_xprofile_get_fields_by_visibility_levels( $user_id, $levels = array(
 	}
 
 	$user_visibility_levels = bp_get_user_meta( $user_id, 'bp_xprofile_visibility_levels', true );
+	if ( ! is_array( $user_visibility_levels ) ) {
+		$user_visibility_levels = array();
+	}
 
 	// Parse the user-provided visibility levels with the default levels, which may take
 	// precedence.
diff --git src/bp-xprofile/bp-xprofile-template.php src/bp-xprofile/bp-xprofile-template.php
index 6f5a3c10a..5bf2606c2 100644
--- src/bp-xprofile/bp-xprofile-template.php
+++ src/bp-xprofile/bp-xprofile-template.php
@@ -891,6 +891,11 @@ function bp_the_profile_field_visibility_level_label() {
 
 		$fields = bp_xprofile_get_visibility_levels();
 
+		// Fallback on public if the level does not exist.
+		if ( ! isset( $fields[ $level ]['label'] ) ) {
+			$level = 'public';
+		}
+
 		/**
 		 * Filters the profile field visibility level label.
 		 *
