diff --git a/src/wp-admin/includes/schema.php b/src/wp-admin/includes/schema.php
index a2e8216457..5a25babc41 100644
--- a/src/wp-admin/includes/schema.php
+++ b/src/wp-admin/includes/schema.php
@@ -695,6 +695,7 @@ function populate_roles() {
 	populate_roles_270();
 	populate_roles_280();
 	populate_roles_300();
+	populate_roles_540();
 }
 
 /**
@@ -924,6 +925,27 @@ function populate_roles_300() {
 	}
 }
 
+/**
+ * Create and modify WordPress roles for WordPress 5.4.
+ *
+ * @since 5.4.0
+ */
+function populate_roles_540() {
+	// Add the privacy caps to the Administrators.
+	$role = get_role( 'administrator' );
+
+	if ( ! empty( $role ) ) {
+		$role->add_cap( 'export_others_personal_data' );
+		$role->add_cap( 'erase_others_personal_data' );
+		$role->add_cap( 'manage_privacy_options' );
+	}
+
+	$role = get_role( 'editor' );
+	if ( ! empty( $role ) ) {
+		$role->add_cap( 'manage_privacy_options' );
+	}
+}
+
 if ( ! function_exists( 'install_network' ) ) :
 	/**
 	 * Install Network.
diff --git a/src/wp-admin/includes/upgrade.php b/src/wp-admin/includes/upgrade.php
index 505b0aad17..16aa8f4d02 100644
--- a/src/wp-admin/includes/upgrade.php
+++ b/src/wp-admin/includes/upgrade.php
@@ -833,6 +833,11 @@ function upgrade_all() {
 		upgrade_530();
 	}
 
+	// @todo update the db_version in this check when the proper one is known.
+	if ( $wp_current_db_version < 45806 ) {
+		upgrade_540();
+	}
+
 	maybe_disable_link_manager();
 
 	maybe_disable_automattic_widgets();
@@ -2148,6 +2153,21 @@ function upgrade_530() {
 	}
 }
 
+/**
+ * Executes changes made in WordPress 5.4.0.
+ *
+ * @ignore
+ * @since 5.4.0
+ */
+function upgrade_540() {
+	global $wp_current_db_version;
+
+	// @todo update the db_version in this check when the proper one is known.
+	if ( $wp_current_db_version < 45806 ) {
+		populate_roles_540();
+	}
+}
+
 /**
  * Executes network-level upgrade routines.
  *
diff --git a/src/wp-admin/menu.php b/src/wp-admin/menu.php
index 7aec19663d..b78d4f5bde 100644
--- a/src/wp-admin/menu.php
+++ b/src/wp-admin/menu.php
@@ -288,7 +288,12 @@ if ( ! is_multisite() && defined( 'WP_ALLOW_MULTISITE' ) && WP_ALLOW_MULTISITE )
 	$submenu['tools.php'][50] = array( __( 'Network Setup' ), 'setup_network', 'network.php' );
 }
 
-$menu[80]                               = array( __( 'Settings' ), 'manage_options', 'options-general.php', '', 'menu-top menu-icon-settings', 'menu-settings', 'dashicons-admin-settings' );
+if ( current_user_can( 'manage_options' ) ) {
+	$menu[80] = array( __( 'Settings' ), 'manage_options', 'options-general.php', '', 'menu-top menu-icon-settings', 'menu-settings', 'dashicons-admin-settings' );
+} elseif ( current_user_can( 'manage_privacy_options' ) && ! current_user_can( 'manage_options' ) ) {
+	$menu[80] = array( __( 'Settings' ), 'manage_privacy_options', 'options-general.php', '', 'menu-top menu-icon-settings', 'menu-settings', 'dashicons-admin-settings' );
+}
+
 	$submenu['options-general.php'][10] = array( _x( 'General', 'settings screen' ), 'manage_options', 'options-general.php' );
 	$submenu['options-general.php'][15] = array( __( 'Writing' ), 'manage_options', 'options-writing.php' );
 	$submenu['options-general.php'][20] = array( __( 'Reading' ), 'manage_options', 'options-reading.php' );
diff --git a/src/wp-includes/capabilities.php b/src/wp-includes/capabilities.php
index 0c40c7e384..fb3de11a06 100644
--- a/src/wp-includes/capabilities.php
+++ b/src/wp-includes/capabilities.php
@@ -132,7 +132,7 @@ function map_meta_cap( $cap, $user_id, ...$args ) {
 			 * so deleting it should require that too.
 			 */
 			if ( (int) get_option( 'wp_page_for_privacy_policy' ) === $post->ID ) {
-				$caps = array_merge( $caps, map_meta_cap( 'manage_privacy_options', $user_id ) );
+				$caps[] = 'manage_privacy_options';
 			}
 
 			break;
@@ -203,7 +203,7 @@ function map_meta_cap( $cap, $user_id, ...$args ) {
 			 * so editing it should require that too.
 			 */
 			if ( (int) get_option( 'wp_page_for_privacy_policy' ) === $post->ID ) {
-				$caps = array_merge( $caps, map_meta_cap( 'manage_privacy_options', $user_id ) );
+				$caps[] = 'manage_privacy_options';
 			}
 
 			break;
@@ -573,11 +573,6 @@ function map_meta_cap( $cap, $user_id, ...$args ) {
 				$caps[] = 'update_core';
 			}
 			break;
-		case 'export_others_personal_data':
-		case 'erase_others_personal_data':
-		case 'manage_privacy_options':
-			$caps[] = is_multisite() ? 'manage_network' : 'manage_options';
-			break;
 		default:
 			// Handle meta capabilities for custom post types.
 			global $post_type_meta_caps;
