diff --git a/src/bp-members/bp-members-template.php b/src/bp-members/bp-members-template.php
index 81cf94075..9797bd5f8 100644
--- a/src/bp-members/bp-members-template.php
+++ b/src/bp-members/bp-members-template.php
@@ -2409,6 +2409,28 @@ function bp_signup_avatar_dir_value() {
 		return apply_filters( 'bp_get_signup_avatar_dir_value', $signup_avatar_dir );
 	}
 
+/**
+ * Determines whether privacy policy acceptance is required for registration.
+ *
+ * @since 4.0.0
+ *
+ * @return bool
+ */
+function bp_signup_requires_privacy_policy_acceptance() {
+	// Default to true when a published Privacy Policy page exists.
+	$privacy_policy_url = get_privacy_policy_url();
+	$required           = ! empty( $privacy_policy_url );
+
+	/**
+	 * Filters whether privacy policy acceptance is required for registration.
+	 *
+	 * @since 4.0.0
+	 *
+	 * @param bool $required Whether privacy policy acceptance is required.
+	 */
+	return (bool) apply_filters( 'bp_signup_requires_privacy_policy_acceptance', $required );
+}
+
 /**
  * Output the current signup step.
  *
diff --git a/src/bp-members/screens/register.php b/src/bp-members/screens/register.php
index fd92a63cd..8341f5266 100644
--- a/src/bp-members/screens/register.php
+++ b/src/bp-members/screens/register.php
@@ -73,6 +73,10 @@ function bp_core_screen_signup() {
 		if ( ( !empty( $_POST['signup_password'] ) && !empty( $_POST['signup_password_confirm'] ) ) && $_POST['signup_password'] != $_POST['signup_password_confirm'] )
 			$bp->signup->errors['signup_password'] = __( 'The passwords you entered do not match.', 'buddypress' );
 
+		if ( bp_signup_requires_privacy_policy_acceptance() && ! empty( $_POST['signup-privacy-policy-check'] ) && empty( $_POST['signup-privacy-policy-accept'] ) ) {
+			$bp->signup->errors['signup_privacy_policy'] = __( 'You must indicate that you have read and agreed to the Privacy Policy.', 'buddypress' );
+		}
+
 		$bp->signup->username = $_POST['signup_username'];
 		$bp->signup->email = $_POST['signup_email'];
 
diff --git a/src/bp-templates/bp-nouveau/buddypress/members/register.php b/src/bp-templates/bp-nouveau/buddypress/members/register.php
index 6eeb8629f..7647859f8 100644
--- a/src/bp-templates/bp-nouveau/buddypress/members/register.php
+++ b/src/bp-templates/bp-nouveau/buddypress/members/register.php
@@ -104,6 +104,10 @@
 
 				</div><!-- //.layout-wrap -->
 
+				<?php if ( bp_signup_requires_privacy_policy_acceptance() ) : ?>
+					<?php bp_nouveau_signup_privacy_policy_acceptance_section(); ?>
+				<?php endif; ?>
+
 				<?php bp_nouveau_submit_button( 'register' ); ?>
 
 			<?php endif; // request-details signup step ?>
diff --git a/src/bp-templates/bp-nouveau/includes/template-tags.php b/src/bp-templates/bp-nouveau/includes/template-tags.php
index ce2ad93f5..0dd7c8c34 100644
--- a/src/bp-templates/bp-nouveau/includes/template-tags.php
+++ b/src/bp-templates/bp-nouveau/includes/template-tags.php
@@ -2398,6 +2398,32 @@ function bp_nouveau_signup_form( $section = 'account_details' ) {
 	do_action( "bp_{$section}_fields" );
 }
 
+/**
+ * Outputs the Privacy Policy acceptance area on the registration page.
+ *
+ * @since 4.0.0
+ */
+function bp_nouveau_signup_privacy_policy_acceptance_section() {
+	$error = buddypress()->signup->errors['signup_privacy_policy'];
+
+	?>
+
+	<div class="privacy-policy-accept">
+		<?php if ( $error ) : ?>
+			<?php nouveau_error_template( $error ); ?>
+		<?php endif; ?>
+
+		<label>
+			<input type="hidden" name="signup-privacy-policy-check" value="1" />
+
+			<?php /* translators: link to Privacy Policy */ ?>
+			<input type="checkbox" name="signup-privacy-policy-accept" id="signup-privacy-policy-accept" required /> <?php printf( esc_html__( 'I have read and agree to this site\'s %s.', 'buddypress' ), sprintf( '<a href="%s">%s</a>', esc_url( get_privacy_policy_url() ), esc_html__( 'Privacy Policy', 'buddypress' ) ) ); ?>
+		</label>
+	</div>
+
+	<?php
+}
+
 /**
  * Output a submit button and the nonce for the requested action.
  *
