diff --git src/bp-core/admin/bp-core-admin-functions.php src/bp-core/admin/bp-core-admin-functions.php
index c9a5259e9..73fe02737 100644
--- src/bp-core/admin/bp-core-admin-functions.php
+++ src/bp-core/admin/bp-core-admin-functions.php
@@ -586,7 +586,7 @@ function bp_core_add_contextual_help_content( $tab = '' ) {
 			break;
 
 		case 'bp-profile-overview':
-			$retval = __( 'Your users will distinguish themselves through their profile page. Create relevant profile fields that will show on each users profile.', 'buddypress' ) . '<br /><br />' . __( 'Note: Any fields in the first group will appear on the signup page.', 'buddypress' );
+			$retval = __( 'Your users will distinguish themselves through their profile page. Create relevant profile fields that will show on each users profile.', 'buddypress' ) . '<br /><br />' . __( 'Note: Drag fields from other groups and drop them on the "Signup Fields" tab to include them into your signup form.', 'buddypress' );
 			break;
 
 		default:
diff --git src/bp-core/admin/bp-core-admin-schema.php src/bp-core/admin/bp-core-admin-schema.php
index d7cab5bbe..7a10e39eb 100644
--- src/bp-core/admin/bp-core-admin-schema.php
+++ src/bp-core/admin/bp-core-admin-schema.php
@@ -389,6 +389,7 @@ function bp_core_install_extended_profiles() {
 		// Make sure the custom visibility is disabled for the default field.
 		if ( ! $wpdb->get_var( "SELECT id FROM {$bp_prefix}bp_xprofile_meta WHERE id = 1" ) ) {
 			$insert_sql[] = "INSERT INTO {$bp_prefix}bp_xprofile_meta ( object_id, object_type, meta_key, meta_value ) VALUES ( 1, 'field', 'allow_custom_visibility', 'disabled' );";
+			$insert_sql[] = "INSERT INTO {$bp_prefix}bp_xprofile_meta ( object_id, object_type, meta_key, meta_value ) VALUES ( 1, 'field', 'signup_position', 1 );";
 		}
 	}
 
diff --git src/bp-core/bp-core-update.php src/bp-core/bp-core-update.php
index a7791c445..cd6accb21 100644
--- src/bp-core/bp-core-update.php
+++ src/bp-core/bp-core-update.php
@@ -552,6 +552,24 @@ function bp_update_to_2_7() {
 	bp_add_option( '_bp_ignore_deprecated_code', false );
 }
 
+/**
+ * Retuns needed the fullname field ID for an update task.
+ *
+ * @since 8.0.0
+ *
+ * @return int The fullname field ID.
+ */
+function bp_get_fullname_field_id_for_update() {
+	/**
+	 * The xProfile component is active by default on new installs, even if it
+	 * might be inactive during this update, we need to set the custom visibility
+	 * for the default field, in case the Administrator decides to reactivate it.
+	 */
+	global $wpdb;
+	$bp_prefix = bp_core_get_table_prefix();
+	return (int) $wpdb->get_var( $wpdb->prepare( "SELECT id FROM {$bp_prefix}bp_xprofile_fields WHERE name = %s", addslashes( bp_get_option( 'bp-xprofile-fullname-field-name' ) ) ) );
+}
+
 /**
  * 5.0.0 update routine.
  *
@@ -562,14 +580,9 @@ function bp_update_to_2_7() {
  * @since 5.0.0
  */
 function bp_update_to_5_0() {
-	/**
-	 * The xProfile component is active by default on new installs, even if it
-	 * might be inactive during this update, we need to set the custom visibility
-	 * for the default field, in case the Administrator decides to reactivate it.
-	 */
 	global $wpdb;
 	$bp_prefix = bp_core_get_table_prefix();
-	$field_id  = $wpdb->get_var( $wpdb->prepare( "SELECT id FROM {$bp_prefix}bp_xprofile_fields WHERE name = %s", addslashes( bp_get_option( 'bp-xprofile-fullname-field-name' ) ) ) );
+	$field_id  = bp_get_fullname_field_id_for_update();
 
 	$wpdb->insert(
 		$bp_prefix . 'bp_xprofile_meta',
@@ -598,6 +611,7 @@ function bp_update_to_5_0() {
  * 8.0.0 update routine.
  *
  * - Edit the `new_avatar` activity type's component to `members`.
+ * - Make the BP fullname field a signup field by default.
  *
  * @since 8.0.0
  */
@@ -621,6 +635,23 @@ function bp_update_to_8_0() {
 			'%s',
 		)
 	);
+
+	// Make the BP fullname field a signup field by default.
+	$wpdb->insert(
+		$bp_prefix . 'bp_xprofile_meta',
+		array(
+			'object_id'   => bp_get_fullname_field_id_for_update(),
+			'object_type' => 'field',
+			'meta_key'    => 'signup_position',
+			'meta_value'  => 1,
+		),
+		array(
+			'%d',
+			'%s',
+			'%s',
+			'%d',
+		)
+	);
 }
 
 /**
diff --git src/bp-templates/bp-legacy/buddypress/members/register.php src/bp-templates/bp-legacy/buddypress/members/register.php
index 4e8418e7f..b7cbcc023 100644
--- src/bp-templates/bp-legacy/buddypress/members/register.php
+++ src/bp-templates/bp-legacy/buddypress/members/register.php
@@ -165,7 +165,7 @@
 					<h2><?php _e( 'Profile Details', 'buddypress' ); ?></h2>
 
 					<?php /* Use the profile field loop to render input fields for the 'base' profile field group */ ?>
-					<?php if ( bp_is_active( 'xprofile' ) ) : if ( bp_has_profile( array( 'profile_group_id' => 1, 'fetch_field_data' => false ) ) ) : while ( bp_profile_groups() ) : bp_the_profile_group(); ?>
+					<?php if ( bp_is_active( 'xprofile' ) ) : if ( bp_has_profile( array( 'fetch_fields' => true, 'fetch_field_data' => false, 'signup_fields_only' => true ) ) ) : while ( bp_profile_groups() ) : bp_the_profile_group(); ?>
 
 					<?php while ( bp_profile_fields() ) : bp_the_profile_field(); ?>
 
diff --git src/bp-templates/bp-nouveau/buddypress/members/register.php src/bp-templates/bp-nouveau/buddypress/members/register.php
index 2c0a688f2..ca5560e57 100644
--- src/bp-templates/bp-nouveau/buddypress/members/register.php
+++ src/bp-templates/bp-nouveau/buddypress/members/register.php
@@ -38,7 +38,7 @@
 
 				<?php /***** Extra Profile Details ******/ ?>
 
-				<?php if ( bp_is_active( 'xprofile' ) && bp_nouveau_base_account_has_xprofile() ) : ?>
+				<?php if ( bp_is_active( 'xprofile' ) && bp_nouveau_has_signup_xprofile_fields( true ) ) : ?>
 
 					<?php bp_nouveau_signup_hook( 'before', 'signup_profile' ); ?>
 
diff --git src/bp-templates/bp-nouveau/includes/template-tags.php src/bp-templates/bp-nouveau/includes/template-tags.php
index 3439280fb..5ee755a05 100644
--- src/bp-templates/bp-nouveau/includes/template-tags.php
+++ src/bp-templates/bp-nouveau/includes/template-tags.php
@@ -1515,7 +1515,7 @@ function bp_nouveau_container_classes() {
 		}
 
 		// Provide a class token to acknowledge additional extended profile fields added to default account reg screen
-		if ( 'register' === bp_current_component() && bp_is_active( 'xprofile' ) && bp_nouveau_base_account_has_xprofile()) {
+		if ( 'register' === bp_current_component() && bp_is_active( 'xprofile' ) && bp_nouveau_has_signup_xprofile_fields()) {
 			$classes[] = 'extended-default-reg';
 		}
 
diff --git src/bp-templates/bp-nouveau/includes/xprofile/template-tags.php src/bp-templates/bp-nouveau/includes/xprofile/template-tags.php
index 26ef5199f..9782d1aad 100644
--- src/bp-templates/bp-nouveau/includes/xprofile/template-tags.php
+++ src/bp-templates/bp-nouveau/includes/xprofile/template-tags.php
@@ -3,7 +3,7 @@
  * xProfile Template tags
  *
  * @since 3.0.0
- * @version 3.0.0
+ * @version 8.0.0
  */
 
 // Exit if accessed directly.
@@ -62,12 +62,33 @@ function bp_nouveau_xprofile_edit_visibilty() {
  * profile fields added to it for the registration screen.
  *
  * @since 3.0.0
+ * @deprecated 8.0.0
  */
 function bp_nouveau_base_account_has_xprofile() {
-	return (bool) bp_has_profile(
+	_deprecated_function( __FUNCTION__, '8.0.0', 'bp_nouveau_has_signup_xprofile_fields()' );
+	return bp_nouveau_has_signup_xprofile_fields();
+}
+
+/**
+ * Checks whether there are signup profile fields to display.
+ *
+ * @since 8.0.0
+ *
+ * @param bool Whether to init an xProfile loop.
+ * @return bool True if there are signup profile fields to display. False otherwise.
+ */
+function bp_nouveau_has_signup_xprofile_fields( $do_loop = false ) {
+	$signup_fields = (array) bp_xprofile_get_signup_field_ids();
+
+	if ( ! $do_loop ) {
+		return 1 <= count( $signup_fields );
+	}
+
+	return bp_has_profile(
 		array(
-			'profile_group_id' => 1,
-			'fetch_field_data' => false,
+			'fetch_fields'       => true,
+			'fetch_field_data'   => false,
+			'signup_fields_only' => true,
 		)
 	);
 }
diff --git src/bp-xprofile/admin/css/admin.css src/bp-xprofile/admin/css/admin.css
index b84db929a..36d01b81c 100644
--- src/bp-xprofile/admin/css/admin.css
+++ src/bp-xprofile/admin/css/admin.css
@@ -62,6 +62,10 @@ ul#field-group-tabs li.ui-state-active a.ui-tab {
 	color: #000;
 }
 
+li#signup-group a:focus {
+	box-shadow: none;
+}
+
 /* Toolbar */
 .tab-toolbar {
 	clear: left;
diff --git src/bp-xprofile/admin/js/admin.js src/bp-xprofile/admin/js/admin.js
index 99a5b4b5d..1f296869b 100644
--- src/bp-xprofile/admin/js/admin.js
+++ src/bp-xprofile/admin/js/admin.js
@@ -248,7 +248,7 @@ jQuery( function() {
 		cursor: 'move',
 		axis: 'x',
 		opacity: 1,
-		items: 'li',
+		items: 'li:not(.not-sortable)',
 		tolerance: 'intersect',
 
 		update: function() {
@@ -348,34 +348,77 @@ jQuery( function() {
 			// When field is dropped on tab.
 			drop: function( ev, ui ) {
 				var $item = jQuery(this), // The tab
-					$list = jQuery( $item.find( 'a' ).attr( 'href' ) ).find( '.connectedSortable' ); // The tab body
+					$list = jQuery( $item.find( 'a' ).attr( 'href' ) ).find( '.connectedSortable' ), // The tab body
+					dropInGroup = function( fieldId ) {
+						var fieldOrder, postData = {
+							action: 'xprofile_reorder_fields',
+							'cookie': encodeURIComponent(document.cookie),
+							'_wpnonce_reorder_fields': jQuery( 'input#_wpnonce_reorder_fields' ).val(),
+						};
+
+						// Select new tab as current.
+						$tabs.tabs( 'option', 'active', $tab_items.index( $item ) );
+
+						// Refresh $list variable.
+						$list = jQuery( $item.find( 'a' ).attr( 'href' ) ).find( '.connectedSortable' );
+						jQuery($list).find( 'p.nofields' ).hide( 'slow' );
+
+						jQuery.extend( postData, {
+							'field_group_id': jQuery( $list ).attr( 'id' ),
+							'group_tab': jQuery( $item ).prop( 'id' )
+						} );
+
+						// Set serialized data
+						fieldOrder = jQuery( $list ).sortable( 'serialize' );
+
+						if ( fieldId ) {
+							var serializedField = fieldId.replace( 'draggable_field_', 'draggable_signup_field[]=' );
+							if ( fieldOrder ) {
+								fieldOrder += '&' + serializedField;
+							} else {
+								fieldOrder = serializedField;
+							}
+
+							jQuery.extend( postData, {
+								'new_signup_field_id': serializedField,
+							} );
+						} else {
+							// Show new placement.
+							jQuery( this ).appendTo( $list ).show( 'slow' ).animate( { opacity: '1' }, 500 );
+
+							// Refresh $list variable.
+							$list = jQuery( $item.find( 'a' ).attr( 'href' ) ).find( '.connectedSortable' );
+
+							// Reset serialized data.
+							fieldOrder = jQuery( $list ).sortable( 'serialize' );
+
+							jQuery.extend( postData, {
+								'field_group_id': jQuery( $list ).attr( 'id' )
+							} );
+						}
+
+						jQuery.extend( postData, {
+							'field_order': fieldOrder,
+						} );
+
+						// Ajax update field locations and orders.
+						jQuery.post( ajaxurl, postData, function( response ) {
+							if ( response.data && response.data.signup_field ) {
+								jQuery( $list ).append( response.data.signup_field );
+							}
+						}, 'json' );
+					};
 
 				// Remove helper class.
 				jQuery($item).removeClass( 'drop-candidate' );
 
-				// Hide field, change selected tab, and show new placement.
-				ui.draggable.hide( 'slow', function() {
-
-					// Select new tab as current.
-					$tabs.tabs( 'option', 'active', $tab_items.index( $item ) );
-
-					// Show new placement.
-					jQuery(this).appendTo($list).show( 'slow' ).animate( {opacity: '1'}, 500 );
-
-					// Refresh $list variable.
-					$list = jQuery( $item.find( 'a' ).attr( 'href' ) ).find( '.connectedSortable' );
-					jQuery($list).find( 'p.nofields' ).hide( 'slow' );
-
-					// Ajax update field locations and orders.
-					jQuery.post( ajaxurl, {
-						action: 'xprofile_reorder_fields',
-						'cookie': encodeURIComponent(document.cookie),
-						'_wpnonce_reorder_fields': jQuery( 'input#_wpnonce_reorder_fields' ).val(),
-						'field_order': jQuery( $list ).sortable( 'serialize' ),
-						'field_group_id': jQuery( $list ).attr( 'id' )
-					},
-					function() {} );
-				});
+				if ( 'signup-group' === jQuery( $item ).prop( 'id' ) ) {
+					// Simply add the field to signup ones.
+					dropInGroup( ui.draggable.prop( 'id' ) );
+				} else if ( ! ui.draggable.prop( 'id' ).match( /draggable_signup_field_([0-9]+)/ ) ) {
+					// Hide field, change selected tab, and show new placement.
+					ui.draggable.hide( 'slow', dropInGroup );
+				}
 			},
 			over: function() {
 				jQuery(this).addClass( 'drop-candidate' );
@@ -385,4 +428,27 @@ jQuery( function() {
 			}
 		});
 	}
+
+	jQuery( '#signup-fields' ).on( 'click', '.removal', function( e ) {
+		e.preventDefault();
+
+		var fieldId = jQuery( e.target ).attr( 'href' ).replace( '#remove_field-', '' ),
+		    container = jQuery( e.target ).closest( '#draggable_signup_field_' + fieldId );
+
+		if ( ! fieldId ) {
+			return false;
+		}
+
+		// Ajax update field locations and orders.
+		jQuery.post( ajaxurl, {
+			action: 'xprofile_remove_signup_field',
+			'cookie': encodeURIComponent(document.cookie),
+			'_wpnonce_reorder_fields': jQuery( 'input#_wpnonce_reorder_fields' ).val(),
+			'signup_field_id': fieldId
+		}, function( response ) {
+			if ( response.success ) {
+				jQuery( container ).remove();
+			}
+		}, 'json' );
+	} );
 });
diff --git src/bp-xprofile/bp-xprofile-admin.php src/bp-xprofile/bp-xprofile-admin.php
index 5bd8a899d..07f447c30 100644
--- src/bp-xprofile/bp-xprofile-admin.php
+++ src/bp-xprofile/bp-xprofile-admin.php
@@ -188,6 +188,14 @@ function xprofile_admin_screen( $message = '', $type = 'error' ) {
 
 					<?php endforeach; endif; ?>
 
+					<?php if ( bp_get_signup_allowed() ) : ?>
+						<li id="signup-group" class="not-sortable last">
+							<a href="#tabs-signup-group" class="ui-tab">
+								<?php esc_html_e( 'Signup Fields', 'buddypress' ); ?>
+							</a>
+						</li>
+					<?php endif; ?>
+
 				</ul>
 
 				<?php if ( !empty( $groups ) ) : foreach ( $groups as $group ) :
@@ -294,12 +302,6 @@ function xprofile_admin_screen( $message = '', $type = 'error' ) {
 
 						</fieldset>
 
-						<?php if ( empty( $group->can_delete ) ) : ?>
-
-							<p><?php esc_html_e( '* Fields in this group appear on the signup page.', 'buddypress' ); ?></p>
-
-						<?php endif; ?>
-
 					</div>
 
 				<?php endforeach; else : ?>
@@ -309,10 +311,73 @@ function xprofile_admin_screen( $message = '', $type = 'error' ) {
 
 				<?php endif; ?>
 
+				<?php
+				// List fields to use into the signup form.
+				if ( bp_get_signup_allowed() ) {
+					$signup_groups = bp_xprofile_get_groups(
+						array(
+							'fetch_fields'       => true,
+							'signup_fields_only' => true,
+						)
+					);
+					$has_signup_fields   = false;
+					$signup_fields       = array();
+					$signup_fields_order = bp_xprofile_get_signup_field_ids();
+					?>
+					<div id="tabs-signup-group"" class="tab-wrapper">
+						<div class="tab-toolbar">
+							<p class="description"><?php esc_html_e( 'Drag fields from other groups and drop them on the above tab to include them into your signup form.', 'buddypress' ); ?></a>
+						</div>
+						<fieldset id="signup-fields" class="connectedSortable field-group" aria-live="polite" aria-atomic="true" aria-relevant="all">
+							<legend class="screen-reader-text">
+								<?php esc_html_e( 'Fields to use into the signup form', 'buddypress' );?>
+							</legend>
+
+							<?php
+							if ( ! empty( $signup_groups ) ) {
+								foreach ( $signup_groups as $signup_group ) {
+									if ( ! empty( $signup_group->fields ) ) {
+										$has_signup_fields = true;
+
+										foreach ( $signup_group->fields as $signup_field ) {
+											// Load the field.
+											$_signup_field = xprofile_get_field( $signup_field, null, false );
+
+											/**
+											 * This function handles the WYSIWYG profile field
+											 * display for the xprofile admin setup screen.
+											 */
+											$signup_fields[ $_signup_field->id ] = bp_xprofile_admin_get_signup_field( $_signup_field, $signup_group, '' );
+										}
+									}
+								}
+
+								// Output signup fields according to their signup position.
+								foreach ( $signup_fields_order as $ordered_signup_field_id ) {
+									if ( ! isset( $signup_fields[ $ordered_signup_field_id ] ) ) {
+										continue;
+									}
+
+									echo $signup_fields[ $ordered_signup_field_id ];
+								}
+							}
+
+							if ( ! $has_signup_fields ) {
+								?>
+								<p class="nodrag nofields"><?php esc_html_e( 'There are no signup fields set. The signup form uses the primary group by default.', 'buddypress' ); ?></p>
+								<?php
+							}
+							?>
+						</fieldset>
+
+						<p><?php esc_html_e( '* Fields in this group appear on the signup page.', 'buddypress' ); ?></p>
+					</div>
+					<?php
+				}
+				?>
 			</div>
 		</form>
 	</div>
-
 <?php
 }
 
@@ -730,26 +795,150 @@ function xprofile_admin_delete_field_screen( $field_id, $field_type ) {
  * Handles the ajax reordering of fields within a group.
  *
  * @since 1.0.0
+ * @since 8.0.0 Returns a JSON object.
  */
 function xprofile_ajax_reorder_fields() {
-
 	// Check the nonce.
 	check_admin_referer( 'bp_reorder_fields', '_wpnonce_reorder_fields' );
 
 	if ( empty( $_POST['field_order'] ) ) {
-		return false;
+		return wp_send_json_error();
 	}
 
-	parse_str( $_POST['field_order'], $order );
-
 	$field_group_id = $_POST['field_group_id'];
+	$group_tab      = '';
 
-	foreach ( (array) $order['draggable_field'] as $position => $field_id ) {
-		xprofile_update_field_position( (int) $field_id, (int) $position, (int) $field_group_id );
+	if ( isset( $_POST['group_tab'] ) && $_POST['group_tab'] ) {
+		$group_tab = wp_unslash( $_POST['group_tab'] );
+	}
+
+	if ( 'signup-fields' === $field_group_id ) {
+		parse_str( $_POST['field_order'], $order );
+		$fields = (array) $order['draggable_signup_field'];
+		$fields = array_map( 'intval', $fields );
+
+		if ( isset( $_POST['new_signup_field_id'] ) && $_POST['new_signup_field_id'] ) {
+			parse_str( $_POST['new_signup_field_id'], $signup_field );
+			$signup_fields = (array) $signup_field['draggable_signup_field'];
+		}
+
+		if ( 'signup-group' === $group_tab ) {
+			$field_id = (int) reset( $signup_fields );
+
+			// Load the field.
+			$field = xprofile_get_field( $field_id, null, false );
+
+			if ( $field instanceof BP_XProfile_Field ) {
+				$signup_position = bp_xprofile_get_meta( $field_id, 'field', 'signup_position' );
+
+				if ( ! $signup_position ) {
+					$position = array_search( $field_id, $fields, true );
+					if ( false !== $position ) {
+						$position += 1;
+					} else {
+						$position = 1;
+					}
+
+					// Set the signup position.
+					bp_xprofile_update_field_meta( $field_id, 'signup_position', $position );
+
+					// Get the real Group object.
+					$group = xprofile_get_field_group( $field->id );
+
+					// Gets the HTML Output of the signup field.
+					$signup_field = bp_xprofile_admin_get_signup_field( $field, $group );
+
+					/**
+					 * Fires once a signup field has been inserted.
+					 *
+					 * @since 8.0.0
+					 */
+					do_action( 'bp_xprofile_inserted_signup_field' );
+
+					// Send the signup field to output.
+					wp_send_json_success(
+						array(
+							'signup_field' => $signup_field,
+						)
+					);
+				} else {
+					wp_send_json_error(
+						array(
+							'message' => __( 'This field has been already added to the signup form.', 'buddypress' ),
+						)
+					);
+				}
+
+			} else {
+				wp_send_json_error();
+			}
+		} else {
+			// it's a sort operation.
+			foreach ( $fields as $position => $field_id ) {
+				bp_xprofile_update_field_meta( (int) $field_id, 'signup_position', (int) $position + 1 );
+			}
+
+			/**
+			 * Fires once the signup fields have been reordered.
+			 *
+			 * @since 8.0.0
+			 */
+			do_action( 'bp_xprofile_reordered_signup_fields' );
+
+			wp_send_json_success();
+		}
+	} else {
+		/**
+		 * @todo there's something going wrong here.
+		 * moving a field to another tab when there's only the fullname field fails.
+		 */
+		parse_str( $_POST['field_order'], $order );
+		$fields = (array) $order['draggable_field'];
+
+		foreach ( $fields as $position => $field_id ) {
+			xprofile_update_field_position( (int) $field_id, (int) $position, (int) $field_group_id );
+		}
+
+		wp_send_json_success();
 	}
 }
 add_action( 'wp_ajax_xprofile_reorder_fields', 'xprofile_ajax_reorder_fields' );
 
+/**
+ * Removes a field from signup fields.
+ *
+ * @since 8.0.0
+ */
+function bp_xprofile_ajax_remove_signup_field() {
+	// Check the nonce.
+	check_admin_referer( 'bp_reorder_fields', '_wpnonce_reorder_fields' );
+
+	if ( ! isset( $_POST['signup_field_id'] ) || ! $_POST['signup_field_id'] ) {
+		return wp_send_json_error();
+	}
+
+	$signup_field_id = (int) wp_unslash( $_POST['signup_field_id'] );
+
+	// Validate the field ID.
+	$signup_position = bp_xprofile_get_meta( $signup_field_id, 'field', 'signup_position' );
+
+	if ( ! $signup_position ) {
+		wp_send_json_error();
+	}
+
+	bp_xprofile_delete_meta( $signup_field_id, 'field', 'signup_position' );
+
+	/**
+	 * Fires when a signup field is removed from the signup form.
+	 *
+	 * @since 8.0.0
+	 */
+	do_action( 'bp_xprofile_removed_signup_field' );
+
+	wp_send_json_success();
+}
+add_action( 'wp_ajax_xprofile_remove_signup_field', 'bp_xprofile_ajax_remove_signup_field' );
+
 /**
  * Handles the reordering of field groups.
  *
@@ -776,15 +965,18 @@ add_action( 'wp_ajax_xprofile_reorder_groups', 'xprofile_ajax_reorder_field_grou
  * Handles the WYSIWYG display of each profile field on the edit screen.
  *
  * @since 1.5.0
+ * @since 8.0.0 Adds the `$is_signup` parameter.
  *
  * @param BP_XProfile_Field   $admin_field Admin field.
  * @param object $admin_group Admin group object.
  * @param string $class       Classes to append to output.
+ * @param bool   $is_signup   Whether the admin field output is made inside the signup group.
  */
-function xprofile_admin_field( $admin_field, $admin_group, $class = '' ) {
+function xprofile_admin_field( $admin_field, $admin_group, $class = '', $is_signup = false ) {
 	global $field;
 
-	$field = $admin_field;
+	$field       = $admin_field;
+	$fieldset_id = sprintf( 'draggable_field_%d', $field->id );
 
 	// Users admin URL.
 	$url = bp_get_admin_url( 'users.php' );
@@ -804,16 +996,22 @@ function xprofile_admin_field( $admin_field, $admin_group, $class = '' ) {
 			'mode'     => 'delete_field',
 			'field_id' => (int) $field->id
 		), $url . '#tabs-' . (int) $field->group_id );
-	} ?>
+	}
+
+	// Avoid duplicate IDs into the signup group.
+	if ( $is_signup ) {
+		$fieldset_id = sprintf( 'draggable_signup_field_%d', $field->id );
+	}
+	?>
 
-	<fieldset id="draggable_field_<?php echo esc_attr( $field->id ); ?>" class="sortable<?php echo ' ' . $field->type; if ( !empty( $class ) ) echo ' ' . $class; ?>">
+	<fieldset id="<?php echo esc_attr( $fieldset_id ); ?>" class="sortable<?php echo ' ' . $field->type; if ( !empty( $class ) ) echo ' ' . $class; ?>">
 		<legend>
 			<span>
 				<?php bp_the_profile_field_name(); ?>
 
 				<?php if ( empty( $field->can_delete )                                    ) : ?><?php esc_html_e( '(Primary)', 'buddypress' ); endif; ?>
 				<?php bp_the_profile_field_required_label(); ?>
-				<?php if ( bp_xprofile_get_meta( $field->id, 'field', 'signup_position' ) ) : ?><?php esc_html_e( '(Sign-up)', 'buddypress' ); endif; ?>
+				<?php if ( bp_get_signup_allowed() && bp_xprofile_get_meta( $field->id, 'field', 'signup_position' ) ) : ?><?php esc_html_e( '(Sign-up)', 'buddypress' ); endif; ?>
 				<?php if ( bp_get_member_types() ) : echo $field->get_member_type_label(); endif; ?>
 
 				<?php
@@ -859,7 +1057,7 @@ function xprofile_admin_field( $admin_field, $admin_group, $class = '' ) {
 			<div class="actions">
 				<a class="button edit" href="<?php echo esc_url( $field_edit_url ); ?>"><?php _ex( 'Edit', 'Edit field link', 'buddypress' ); ?></a>
 
-				<?php if ( $field->can_delete ) : ?>
+				<?php if ( $field->can_delete && ! $is_signup ) : ?>
 
 					<div class="delete-button">
 						<a class="confirm submit-delete deletion" href="<?php echo esc_url( wp_nonce_url( $field_delete_url, 'bp_xprofile_delete_field-' . $field->id, 'bp_xprofile_delete_field' ) ); ?>"><?php _ex( 'Delete', 'Delete field link', 'buddypress' ); ?></a>
@@ -867,6 +1065,14 @@ function xprofile_admin_field( $admin_field, $admin_group, $class = '' ) {
 
 				<?php endif; ?>
 
+				<?php if ( $field->can_delete && $is_signup ) : ?>
+
+					<div class="delete-button">
+						<a class="submit-delete removal" href="<?php echo esc_attr( sprintf( '#remove_field-%d', $field->id ) ); ?>"><?php echo esc_html_x( 'Remove', 'Remove field link', 'buddypress' ); ?></a>
+					</div>
+
+				<?php endif; ?>
+
 				<?php
 
 				/**
@@ -882,10 +1088,40 @@ function xprofile_admin_field( $admin_field, $admin_group, $class = '' ) {
 			</div>
 		</div>
 	</fieldset>
-
 <?php
 }
 
+/**
+ * Handles the WYSIWYG display of signup profile fields on the edit screen.
+ *
+ * @since 8.0.0
+ *
+ * @param BP_XProfile_Field   $signup_field The field to use into the signup form.
+ * @param object $field_group The real field group object.
+ * @param string $class       Classes to append to output.
+ * @param bool   $echo        Whether to return or display the HTML output.
+ * @return string The HTML output.
+ */
+function bp_xprofile_admin_get_signup_field( $signup_field, $field_group = null, $class = '', $echo = false ) {
+	add_filter( 'bp_get_the_profile_field_input_name', 'bp_get_the_profile_signup_field_input_name' );
+
+	if ( ! $echo ) {
+		// Set up an output buffer.
+		ob_start();
+		xprofile_admin_field( $signup_field, $field_group, $class, true );
+		$output = ob_get_contents();
+		ob_end_clean();
+	} else {
+		xprofile_admin_field( $signup_field, $field_group, $class, true );
+	}
+
+	remove_filter( 'bp_get_the_profile_field_input_name', 'bp_get_the_profile_signup_field_input_name' );
+
+	if ( ! $echo ) {
+		return $output;
+	}
+}
+
 /**
  * Print <option> elements containing the xprofile field types.
  *
diff --git src/bp-xprofile/bp-xprofile-cache.php src/bp-xprofile/bp-xprofile-cache.php
index 5c5badae5..6881b7082 100644
--- src/bp-xprofile/bp-xprofile-cache.php
+++ src/bp-xprofile/bp-xprofile-cache.php
@@ -314,3 +314,15 @@ function bp_xprofile_reset_user_mid_cache( $user_id ) {
 	wp_cache_delete( $user_id, 'bp_user_mid' );
 }
 add_action( 'profile_update', 'bp_xprofile_reset_user_mid_cache', 10, 1 );
+
+/**
+ * Resets the signup field IDs cache.
+ *
+ * @since 8.0.0
+ */
+function bp_xprofile_reset_signup_field_cache() {
+	wp_cache_delete( 'signup_fields', 'bp_xprofile' );
+}
+add_action( 'bp_xprofile_inserted_signup_field', 'bp_xprofile_reset_signup_field_cache' );
+add_action( 'bp_xprofile_reordered_signup_fields', 'bp_xprofile_reset_signup_field_cache' );
+add_action( 'bp_xprofile_removed_signup_field', 'bp_xprofile_reset_signup_field_cache' );
diff --git src/bp-xprofile/bp-xprofile-filters.php src/bp-xprofile/bp-xprofile-filters.php
index 7a2fc06be..e182ec234 100644
--- src/bp-xprofile/bp-xprofile-filters.php
+++ src/bp-xprofile/bp-xprofile-filters.php
@@ -691,3 +691,23 @@ function bp_xprofile_register_personal_data_exporter( $exporters ) {
 
 	return $exporters;
 }
+
+/**
+ * Used to edit the field input name inside the xProfile Admin Screen
+ *
+ * @see bp_xprofile_admin_get_signup_field()
+ *
+ * @since 8.0.0
+ *
+ * @param string $field_selector The text to use as the input name/id attribute.
+ * @return string                The text to use as the input name/id attribute.
+ */
+function bp_get_the_profile_signup_field_input_name( $field_selector = '' ) {
+	global $field;
+
+	if ( isset( $field->id ) && $field->id ) {
+		$field_selector = sprintf( 'signup_field_%d', $field->id );
+	}
+
+	return $field_selector;
+}
diff --git src/bp-xprofile/bp-xprofile-functions.php src/bp-xprofile/bp-xprofile-functions.php
index 9764102f4..284cab369 100644
--- src/bp-xprofile/bp-xprofile-functions.php
+++ src/bp-xprofile/bp-xprofile-functions.php
@@ -1420,3 +1420,25 @@ function bp_xprofile_get_wp_user_keys() {
 		array_keys( wp_get_user_contact_methods() )
 	);
 }
+
+/**
+ * Returns the signup field IDs.
+ *
+ * @since 8.0.0
+ *
+ * @return int[] The signup field IDs.
+ */
+function bp_xprofile_get_signup_field_ids() {
+	$signup_field_ids = wp_cache_get( 'signup_fields', 'bp_xprofile' );
+
+	if ( ! $signup_field_ids ) {
+		global $wpdb;
+		$bp = buddypress();
+
+		$signup_field_ids = $wpdb->get_col( "SELECT object_id FROM {$bp->profile->table_name_meta} WHERE object_type = 'field' AND meta_key = 'signup_position' ORDER BY meta_value ASC" );
+
+		wp_cache_set( 'signup_fields', $signup_field_ids, 'bp_xprofile' );
+	}
+
+	return array_map( 'intval', $signup_field_ids );
+}
diff --git src/bp-xprofile/bp-xprofile-template.php src/bp-xprofile/bp-xprofile-template.php
index 10b5188c9..78fff208c 100644
--- src/bp-xprofile/bp-xprofile-template.php
+++ src/bp-xprofile/bp-xprofile-template.php
@@ -15,7 +15,7 @@ defined( 'ABSPATH' ) || exit;
  *
  * @since 1.0.0
  * @since 2.4.0 Introduced `$member_type` argument.
- * @since 8.0.0 Introduced `$hide_field_types` argument.
+ * @since 8.0.0 Introduced `$hide_field_types` & `$signup_fields_only` arguments.
  *
  * @global object $profile_template
  * @see BP_XProfile_Group::get() for full description of `$args` array.
@@ -36,6 +36,7 @@ defined( 'ABSPATH' ) || exit;
  *     @type int[]|bool   $exclude_groups         Default: false.
  *     @type int[]|bool   $exclude_fields         Default: false.
  *     @type string[]     $hide_field_types       Default: empty array.
+ *     @type bool         $signup_fields_only     Default: false.
  *     @type bool         $update_meta_cache      Default: true.
  * }
  *
@@ -68,6 +69,7 @@ function bp_has_profile( $args = '' ) {
 		'exclude_groups'         => false, // Comma-separated list of profile field group IDs to exclude.
 		'exclude_fields'         => false, // Comma-separated list of profile field IDs to exclude.
 		'hide_field_types'       => array(), // List of field types to hide from profile fields loop.
+		'signup_fields_only'     => false, // Whether to only return signup fields.
 		'update_meta_cache'      => true,
 	), 'has_profile' );
 
diff --git src/bp-xprofile/classes/class-bp-xprofile-data-template.php src/bp-xprofile/classes/class-bp-xprofile-data-template.php
index 8aa3a4909..ca478f174 100644
--- src/bp-xprofile/classes/class-bp-xprofile-data-template.php
+++ src/bp-xprofile/classes/class-bp-xprofile-data-template.php
@@ -105,7 +105,7 @@ class BP_XProfile_Data_Template {
 	 *
 	 * @since 1.5.0
 	 * @since 2.4.0 Introduced `$member_type` argument.
-	 * @since 8.0.0 Introduced `$hide_field_types` argument.
+	 * @since 8.0.0 Introduced `$hide_field_types` & `$signup_fields_only` arguments.
 	 *
 	 * @param array|string $args {
 	 *     An array of arguments. All items are optional.
@@ -120,8 +120,9 @@ class BP_XProfile_Data_Template {
 	 *     @type array        $exclude_fields          Exclude these fields.
 	 *     @type int|bool     $hide_empty_fields       Should empty fields be skipped.
 	 *     @type int|bool     $fetch_visibility_level  Fetch visibility levels.
-	 *     @type int|bool     $update_meta_cache       Should metadata cache be updated.
 	 *     @type string[]     $hide_field_types        List of field types to hide form loop. Default: empty array.
+	 *     @type bool         $signup_fields_only      Whether to only return signup fields. Default: false.
+	 *     @type int|bool     $update_meta_cache       Should metadata cache be updated.
 	 * }
 	 */
 	public function __construct( $args = '' ) {
@@ -159,10 +160,51 @@ class BP_XProfile_Data_Template {
 			'exclude_groups'         => false,
 			'exclude_fields'         => false,
 			'hide_field_types'       => array(),
+			'signup_fields_only'     => false,
 			'update_meta_cache'      => true
 		) );
 
-		$this->groups      = bp_xprofile_get_groups( $r );
+		$groups = bp_xprofile_get_groups( $r );
+
+		if ( true === $r['signup_fields_only'] && bp_get_signup_allowed() ) {
+			$signup_fields_order       = bp_xprofile_get_signup_field_ids();
+			$signup_group              = new BP_XProfile_Group();
+			$signup_group->id          = 0;
+			$signup_group->name        = __( 'Signup Fields', 'buddypress' );
+			$signup_group->description = '';
+			$signup_group->can_delete  = 0;
+			$signup_group->group_order = 0;
+			$fields                    = array();
+			$signup_group->fields      = array();
+
+			// Get all group fields.
+			foreach ( $groups as $group ) {
+				if ( ! $group->fields ) {
+					continue;
+				}
+
+				// Populate fields using the field ID as key.
+				foreach ( $group->fields as $signup_field ) {
+					$fields[ $signup_field->id ] = $signup_field;
+				}
+			}
+
+			if ( $fields ) {
+				// Reorder signup fields.
+				foreach ( $signup_fields_order as $ordered_signup_field_id ) {
+					if ( ! isset( $fields[ $ordered_signup_field_id ] ) ) {
+						continue;
+					}
+
+					$signup_group->fields[] = $fields[ $ordered_signup_field_id ];
+				}
+			}
+
+			// Override groups with the signup one.
+			$groups = array( $signup_group );
+		}
+
+		$this->groups      = $groups;
 		$this->group_count = count( $this->groups );
 		$this->user_id     = $r['user_id'];
 	}
diff --git src/bp-xprofile/classes/class-bp-xprofile-field-type-wordpress-textbox.php src/bp-xprofile/classes/class-bp-xprofile-field-type-wordpress-textbox.php
index 3c5828a73..0a2d17404 100644
--- src/bp-xprofile/classes/class-bp-xprofile-field-type-wordpress-textbox.php
+++ src/bp-xprofile/classes/class-bp-xprofile-field-type-wordpress-textbox.php
@@ -144,6 +144,7 @@ class BP_XProfile_Field_Type_WordPress_Textbox extends BP_XProfile_Field_Type_Wo
 			$this->wp_user_key = self::get_field_settings( bp_get_the_profile_field_id() );
 		}
 
+		$field_value = '';
 		if ( 'user_url' === $this->wp_user_key ) {
 			if ( bp_displayed_user_id() ) {
 				$field_value = bp_get_displayed_user()->userdata->{$this->wp_user_key};
diff --git src/bp-xprofile/classes/class-bp-xprofile-group.php src/bp-xprofile/classes/class-bp-xprofile-group.php
index b6f196838..6b50d35b6 100644
--- src/bp-xprofile/classes/class-bp-xprofile-group.php
+++ src/bp-xprofile/classes/class-bp-xprofile-group.php
@@ -238,31 +238,32 @@ class BP_XProfile_Group {
 	 *
 	 * @since 1.2.0
 	 * @since 2.4.0 Introduced `$member_type` argument.
-	 * @since 8.0.0 Introduced `$hide_field_types` argument.
+	 * @since 8.0.0 Introduced `$hide_field_types` & `$signup_fields_only` arguments.
 	 *
 	 * @global object $wpdb WordPress DB access object.
 	 *
 	 * @param array $args {
 	 *  Array of optional arguments:
-	 *      @type int          $profile_group_id  Limit results to a single profile group.
-	 *      @type int          $user_id           Required if you want to load a specific user's data.
-	 *                                            Default: displayed user's ID.
-	 *      @type array|string $member_type       Limit fields by those restricted to a given member type, or array of
-	 *                                            member types. If `$user_id` is provided, the value of `$member_type`
-	 *                                            will be overridden by the member types of the provided user. The
-	 *                                            special value of 'any' will return only those fields that are
-	 *                                            unrestricted by member type - i.e., those applicable to any type.
-	 *      @type bool         $hide_empty_groups True to hide groups that don't have any fields. Default: false.
-	 *      @type bool         $hide_empty_fields True to hide fields where the user has not provided data.
-	 *                                            Default: false.
-	 *      @type bool         $fetch_fields      Whether to fetch each group's fields. Default: false.
-	 *      @type bool         $fetch_field_data  Whether to fetch data for each field. Requires a $user_id.
-	 *                                            Default: false.
-	 *      @type int[]|bool   $exclude_groups    Comma-separated list or array of group IDs to exclude.
-	 *      @type int[]|bool   $exclude_fields    Comma-separated list or array of field IDs to exclude.
-	 *      @type string[]     $hide_field_types  List of field types to hide form loop. Default: empty array.
-	 *      @type bool         $update_meta_cache Whether to pre-fetch xprofilemeta for all retrieved groups, fields,
-	 *                                            and data. Default: true.
+	 *      @type int          $profile_group_id   Limit results to a single profile group.
+	 *      @type int          $user_id            Required if you want to load a specific user's data.
+	 *                                             Default: displayed user's ID.
+	 *      @type array|string $member_type        Limit fields by those restricted to a given member type, or array of
+	 *                                             member types. If `$user_id` is provided, the value of `$member_type`
+	 *                                             will be overridden by the member types of the provided user. The
+	 *                                             special value of 'any' will return only those fields that are
+	 *                                             unrestricted by member type - i.e., those applicable to any type.
+	 *      @type bool         $hide_empty_groups  True to hide groups that don't have any fields. Default: false.
+	 *      @type bool         $hide_empty_fields  True to hide fields where the user has not provided data.
+	 *                                             Default: false.
+	 *      @type bool         $fetch_fields       Whether to fetch each group's fields. Default: false.
+	 *      @type bool         $fetch_field_data   Whether to fetch data for each field. Requires a $user_id.
+	 *                                             Default: false.
+	 *      @type int[]|bool   $exclude_groups     Comma-separated list or array of group IDs to exclude.
+	 *      @type int[]|bool   $exclude_fields     Comma-separated list or array of field IDs to exclude.
+	 *      @type string[]     $hide_field_types   List of field types to hide form loop. Default: empty array.
+	 *      @type bool         $signup_fields_only Whether to only return signup fields. Default: false.
+	 *      @type bool         $update_meta_cache  Whether to pre-fetch xprofilemeta for all retrieved groups, fields,
+	 *                                             and data. Default: true.
 	 * }
 	 * @return array $groups
 	 */
@@ -283,6 +284,7 @@ class BP_XProfile_Group {
 			'exclude_fields'         => false,
 			'hide_field_types'       => array(),
 			'update_meta_cache'      => true,
+			'signup_fields_only'     => false,
 		) );
 
 		// Keep track of object IDs for cache-priming.
@@ -342,6 +344,10 @@ class BP_XProfile_Group {
 		// Pull field objects from the cache.
 		$fields = array();
 		foreach ( $field_ids as $field_id ) {
+			if ( true === $r['signup_fields_only'] && ! in_array( $field_id, bp_xprofile_get_signup_field_ids(), true ) ) {
+				continue;
+			}
+
 			$_field = xprofile_get_field( $field_id, null, false );
 
 			if ( in_array( $_field->type, $r['hide_field_types'], true ) ) {
