diff --git a/src/wp-admin/admin-ajax.php b/src/wp-admin/admin-ajax.php
index 3213d55028..2966c21252 100644
--- a/src/wp-admin/admin-ajax.php
+++ b/src/wp-admin/admin-ajax.php
@@ -60,7 +60,7 @@ $core_actions_post = array(
 	'wp-remove-post-lock', 'dismiss-wp-pointer', 'upload-attachment', 'get-attachment',
 	'query-attachments', 'save-attachment', 'save-attachment-compat', 'send-link-to-editor',
 	'send-attachment-to-editor', 'save-attachment-order', 'heartbeat', 'get-revision-diffs',
-	'save-user-color-scheme', 'update-widget', 'query-themes', 'parse-embed', 'set-attachment-thumbnail',
+	'update-widget', 'query-themes', 'parse-embed', 'set-attachment-thumbnail',
 	'parse-media-shortcode', 'destroy-sessions', 'install-plugin', 'update-plugin', 'press-this-save-post',
 	'press-this-add-category', 'crop-image', 'generate-password', 'save-wporg-username', 'delete-plugin',
 	'search-plugins', 'search-install-plugins', 'activate-plugin', 'update-theme', 'delete-theme',
@@ -69,6 +69,7 @@ $core_actions_post = array(
 
 // Deprecated
 $core_actions_post[] = 'wp-fullscreen-save-post';
+$core_actions_post[] = 'save-user-color-scheme';
 
 // Register core Ajax calls.
 if ( ! empty( $_GET['action'] ) && in_array( $_GET['action'], $core_actions_get ) )
diff --git a/src/wp-admin/includes/ajax-actions.php b/src/wp-admin/includes/ajax-actions.php
index e132ac8101..ad3c7d0a67 100644
--- a/src/wp-admin/includes/ajax-actions.php
+++ b/src/wp-admin/includes/ajax-actions.php
@@ -2874,34 +2874,6 @@ function wp_ajax_get_revision_diffs() {
 }
 
 /**
- * Ajax handler for auto-saving the selected color scheme for
- * a user's own profile.
- *
- * @since 3.8.0
- *
- * @global array $_wp_admin_css_colors
- */
-function wp_ajax_save_user_color_scheme() {
-	global $_wp_admin_css_colors;
-
-	check_ajax_referer( 'save-color-scheme', 'nonce' );
-
-	$color_scheme = sanitize_key( $_POST['color_scheme'] );
-
-	if ( ! isset( $_wp_admin_css_colors[ $color_scheme ] ) ) {
-		wp_send_json_error();
-	}
-
-	$previous_color_scheme = get_user_meta( get_current_user_id(), 'admin_color', true );
-	update_user_meta( get_current_user_id(), 'admin_color', $color_scheme );
-
-	wp_send_json_success( array(
-		'previousScheme' => 'admin-color-' . $previous_color_scheme,
-		'currentScheme'  => 'admin-color-' . $color_scheme
-	) );
-}
-
-/**
  * Ajax handler for getting themes from themes_api().
  *
  * @since 3.9.0
diff --git a/src/wp-admin/includes/deprecated.php b/src/wp-admin/includes/deprecated.php
index a9e0e6f9d1..06672d6068 100644
--- a/src/wp-admin/includes/deprecated.php
+++ b/src/wp-admin/includes/deprecated.php
@@ -1478,3 +1478,34 @@ function post_form_autocomplete_off() {
 		echo ' autocomplete="off"';
 	}
 }
+
+/**
+ * Ajax handler for auto-saving the selected color scheme for
+ * a user's own profile.
+ *
+ * @since 3.8.0
+ * @deprecated 4.8.0 Use /wp/v2/users REST API endpoint instead.
+ *
+ * @global array $_wp_admin_css_colors
+ */
+function wp_ajax_save_user_color_scheme() {
+	global $_wp_admin_css_colors;
+
+	_deprecated_function( __FUNCTION__, '4.8.0', '/wp/v2/users' );
+
+	check_ajax_referer( 'save-color-scheme', 'nonce' );
+
+	$color_scheme = sanitize_key( $_POST['color_scheme'] );
+
+	if ( ! isset( $_wp_admin_css_colors[ $color_scheme ] ) ) {
+		wp_send_json_error();
+	}
+
+	$previous_color_scheme = get_user_meta( get_current_user_id(), 'admin_color', true );
+	update_user_meta( get_current_user_id(), 'admin_color', $color_scheme );
+
+	wp_send_json_success( array(
+		'previousScheme' => 'admin-color-' . $previous_color_scheme,
+		'currentScheme'  => 'admin-color-' . $color_scheme
+	) );
+}
diff --git a/src/wp-admin/includes/misc.php b/src/wp-admin/includes/misc.php
index 679b9ac5d6..277d6456dd 100644
--- a/src/wp-admin/includes/misc.php
+++ b/src/wp-admin/includes/misc.php
@@ -658,7 +658,6 @@ function admin_color_scheme_picker( $user_id ) {
 	<fieldset id="color-picker" class="scheme-list">
 		<legend class="screen-reader-text"><span><?php _e( 'Admin Color Scheme' ); ?></span></legend>
 		<?php
-		wp_nonce_field( 'save-color-scheme', 'color-nonce', false );
 		foreach ( $_wp_admin_css_colors as $color => $color_info ) :
 
 			?>
diff --git a/src/wp-admin/js/user-profile.js b/src/wp-admin/js/user-profile.js
index ca99584215..1c919eba85 100644
--- a/src/wp-admin/js/user-profile.js
+++ b/src/wp-admin/js/user-profile.js
@@ -327,7 +327,7 @@
 	}
 
 	$(document).ready( function() {
-		var $colorpicker, $stylesheet, user_id, current_user_id,
+		var $colorpicker, $stylesheet, user_id, current_user_id, current_scheme,
 			select       = $( '#display_name' ),
 			current_name = select.val(),
 			greeting     = $( '#wp-admin-bar-my-account' ).find( '.display-name' );
@@ -391,9 +391,10 @@
 		$stylesheet = $( '#colors-css' );
 		user_id = $( 'input#user_id' ).val();
 		current_user_id = $( 'input[name="checkuser_id"]' ).val();
+		current_scheme = $( 'input[name="admin_color"]:checked' ).val();
 
 		$colorpicker.on( 'click.colorpicker', '.color-option', function() {
-			var colors,
+			var colors, user, previous_scheme
 				$this = $(this);
 
 			if ( $this.hasClass( 'selected' ) ) {
@@ -425,14 +426,12 @@
 				}
 
 				// update user option
-				$.post( ajaxurl, {
-					action:       'save-user-color-scheme',
-					color_scheme: $this.children( 'input[name="admin_color"]' ).val(),
-					nonce:        $('#color-nonce').val()
-				}).done( function( response ) {
-					if ( response.success ) {
-						$( 'body' ).removeClass( response.data.previousScheme ).addClass( response.data.currentScheme );
-					}
+				previous_scheme = current_scheme;
+				current_scheme = $this.children( 'input[name="admin_color"]' ).val();
+
+				user = new wp.api.models.UsersMe();
+				user.save( { meta: { admin_color: current_scheme } } ).done( function ( response ) {
+					$( 'body' ).removeClass( 'admin-color-' + previous_scheme ).addClass( 'admin-color-' + current_scheme );
 				});
 			}
 		});
diff --git a/src/wp-includes/default-filters.php b/src/wp-includes/default-filters.php
index 8f0237028d..b72efaedc5 100644
--- a/src/wp-includes/default-filters.php
+++ b/src/wp-includes/default-filters.php
@@ -426,6 +426,9 @@ add_filter( 'get_post_format', '_post_format_get_term' );
 add_filter( 'get_terms', '_post_format_get_terms', 10, 3 );
 add_filter( 'wp_get_object_terms', '_post_format_wp_get_object_terms' );
 
+// User
+add_action( 'init', 'create_initial_user_meta', 0 );
+
 // KSES
 add_action( 'init', 'kses_init' );
 add_action( 'set_current_user', 'kses_init' );
diff --git a/src/wp-includes/script-loader.php b/src/wp-includes/script-loader.php
index ff7d8bb855..25213de631 100644
--- a/src/wp-includes/script-loader.php
+++ b/src/wp-includes/script-loader.php
@@ -406,7 +406,7 @@ function wp_default_scripts( &$scripts ) {
 		'mismatch' => _x( 'Mismatch', 'password mismatch' ),
 	) );
 
-	$scripts->add( 'user-profile', "/wp-admin/js/user-profile$suffix.js", array( 'jquery', 'password-strength-meter', 'wp-util' ), false, 1 );
+	$scripts->add( 'user-profile', "/wp-admin/js/user-profile$suffix.js", array( 'jquery', 'password-strength-meter', 'wp-util', 'wp-api' ), false, 1 );
 	did_action( 'init' ) && $scripts->localize( 'user-profile', 'userProfileL10n', array(
 		'warn'     => __( 'Your new password has not been saved.' ),
 		'warnWeak' => __( 'Confirm use of weak password' ),
diff --git a/src/wp-includes/user.php b/src/wp-includes/user.php
index 2bb4e0543e..ef556c10b1 100644
--- a/src/wp-includes/user.php
+++ b/src/wp-includes/user.php
@@ -7,6 +7,39 @@
  */
 
 /**
+ * Registers the initial user meta.
+ *
+ * @since 4.8.0
+ */
+function create_initial_user_meta() {
+	register_meta( 'user', 'admin_color', array(
+		'type'              => 'string',
+		'description'       => __( 'Admin color scheme' ),
+		'single'            => true,
+		'sanitize_callback' => 'wp_sanitize_admin_color',
+		'show_in_rest'      => true,
+	));
+}
+
+/**
+ * Sanitizes admin_color meta value.
+ *
+ * @since 4.8.0
+ *
+ * @param string $value Supplied admin color scheme value.
+ * @return string Sanitized admin color scheme value.
+ */
+function wp_sanitize_admin_color( $value ) {
+	$value = preg_replace( '|[^a-z0-9 _.\-@]|i', '', $value );
+	$value = sanitize_key( $value );
+	if ( empty( $value ) ) {
+		return 'fresh';
+	}
+
+	return $value;
+}
+
+/**
  * Authenticates and logs a user in with 'remember' capability.
  *
  * The credentials is an array that has 'user_login', 'user_password', and
