diff --git a/src/wp-admin/css/themes.css b/src/wp-admin/css/themes.css
index 2b26a75f49..79c70fada8 100644
--- a/src/wp-admin/css/themes.css
+++ b/src/wp-admin/css/themes.css
@@ -688,7 +688,8 @@ body.folded .theme-browser ~ .theme-overlay .theme-wrap {
 	line-height: inherit;
 }
 
-.theme-overlay .theme-author a {
+.theme-overlay .theme-author a,
+.theme-overlay .theme-autoupdate a {
 	text-decoration: none;
 }
 
diff --git a/src/wp-admin/includes/class-wp-ms-themes-list-table.php b/src/wp-admin/includes/class-wp-ms-themes-list-table.php
index 96e17efe58..1c1a008516 100644
--- a/src/wp-admin/includes/class-wp-ms-themes-list-table.php
+++ b/src/wp-admin/includes/class-wp-ms-themes-list-table.php
@@ -382,7 +382,9 @@ class WP_MS_Themes_List_Table extends WP_List_Table {
 		}
 		if ( ! $this->is_site_themes ) {
 			if ( current_user_can( 'update_themes' ) ) {
-				$actions['update-selected'] = __( 'Update' );
+				$actions['update-selected']             = __( 'Update' );
+				$actions['enable-autoupdate-selected']  = __( 'Enable auto update' );
+				$actions['disable-autoupdate-selected'] = __( 'Disable auto update' );
 			}
 			if ( current_user_can( 'delete_themes' ) ) {
 				$actions['delete-selected'] = __( 'Delete' );
@@ -440,9 +442,10 @@ class WP_MS_Themes_List_Table extends WP_List_Table {
 
 		// Pre-order.
 		$actions = array(
-			'enable'  => '',
-			'disable' => '',
-			'delete'  => '',
+			'enable'     => '',
+			'disable'    => '',
+			'delete'     => '',
+			'autoupdate' => '',
 		);
 
 		$stylesheet = $theme->get_stylesheet();
@@ -637,6 +640,48 @@ class WP_MS_Themes_List_Table extends WP_List_Table {
 		echo implode( ' | ', $theme_meta );
 
 		echo '</div>';
+
+		if ( wp_is_themes_auto_update_enabled() ) {
+			$wp_auto_update_themes = get_site_option( 'wp_auto_update_themes', array() );
+			if ( in_array( $stylesheet, $wp_auto_update_themes, true ) ) {
+				$aria_label = esc_attr(
+					sprintf(
+						/* translators: Theme name. */
+						_x( 'Disable automatic updates for %s', 'theme' ),
+						$theme->display( 'Name' )
+					)
+				);
+				echo '<p class="theme-autoupdate-enabled">';
+				echo '<span class="dashicons dashicons-update" aria-hidden="true"></span> ' . __( 'Automatic update enabled' );
+				if ( current_user_can( 'update_themes', $stylesheet ) ) {
+					echo sprintf(
+						' | <a href="%s" class="edit" aria-label="%s">%s</a>',
+						wp_nonce_url( 'themes.php?action=autoupdate&amp;theme=' . urlencode( $stylesheet ), 'autoupdate-theme_' . urlencode( $stylesheet ) ),
+						$aria_label,
+						__( 'Disable' )
+					);
+				}
+				echo '</p>';
+			} else {
+				if ( current_user_can( 'update_themes', $stylesheet ) ) {
+					$aria_label = esc_attr(
+						sprintf(
+							/* translators: Theme name. */
+							_x( 'Enable automatic updates for %s', 'theme' ),
+							$stylesheet
+						)
+					);
+					echo '<p class="theme-autoupdate-enabled">';
+					echo sprintf(
+						'<a href="%s" class="edit" aria-label="%s"><span class="dashicons dashicons-update" aria-hidden="true"></span> %s</a>',
+						wp_nonce_url( 'themes.php?action=autoupdate&amp;theme=' . urlencode( $stylesheet ), 'autoupdate-theme_' . urlencode( $stylesheet ) ),
+						$aria_label,
+						__( 'Enable automatic updates' )
+					);
+					echo '</p>';
+				}
+			}
+		}
 	}
 
 	/**
diff --git a/src/wp-admin/includes/theme.php b/src/wp-admin/includes/theme.php
index 9f7a181553..9bd07ec441 100644
--- a/src/wp-admin/includes/theme.php
+++ b/src/wp-admin/includes/theme.php
@@ -653,6 +653,14 @@ function wp_prepare_themes_for_js( $themes = null ) {
 			);
 		}
 
+		$is_autoupdated_enabled = null;
+		if ( wp_is_themes_auto_update_enabled() ) {
+			$wp_auto_update_themes = get_site_option( 'wp_auto_update_themes', array() );
+			if ( in_array( $slug, $wp_auto_update_themes, true ) ) {
+				$is_autoupdated_enabled = true;
+			}
+		}
+
 		$prepared_themes[ $slug ] = array(
 			'id'           => $slug,
 			'name'         => $theme->display( 'Name' ),
@@ -667,10 +675,12 @@ function wp_prepare_themes_for_js( $themes = null ) {
 			'hasUpdate'    => isset( $updates[ $slug ] ),
 			'hasPackage'   => isset( $updates[ $slug ] ) && ! empty( $updates[ $slug ]['package'] ),
 			'update'       => get_theme_update_available( $theme ),
+			'autoupdated'  => $is_autoupdated_enabled,
 			'actions'      => array(
 				'activate'  => current_user_can( 'switch_themes' ) ? wp_nonce_url( admin_url( 'themes.php?action=activate&amp;stylesheet=' . $encoded_slug ), 'switch-theme_' . $slug ) : null,
 				'customize' => $customize_action,
 				'delete'    => current_user_can( 'delete_themes' ) ? wp_nonce_url( admin_url( 'themes.php?action=delete&amp;stylesheet=' . $encoded_slug ), 'delete-theme_' . $slug ) : null,
+				'autoupdate' => current_user_can( 'update_themes' ) ? wp_nonce_url( admin_url( 'themes.php?action=autoupdate&amp;stylesheet=' . $encoded_slug ), 'autoupdate-theme_' . $slug ) : null,
 			),
 		);
 	}
diff --git a/src/wp-admin/network/themes.php b/src/wp-admin/network/themes.php
index 8fbce0a519..a73b741d59 100644
--- a/src/wp-admin/network/themes.php
+++ b/src/wp-admin/network/themes.php
@@ -88,6 +88,84 @@ if ( $action ) {
 			echo '</div>';
 			require_once( ABSPATH . 'wp-admin/admin-footer.php' );
 			exit;
+		case 'autoupdate':
+			if ( ! wp_is_themes_auto_update_enabled() ) {
+				wp_die( __( 'Sorry, you are not allowed to enable themes automatic updates.' ) );
+			}
+
+			check_admin_referer( 'autoupdate-theme_' . $_GET['theme'] );
+
+			$wp_auto_update_themes = get_site_option( 'wp_auto_update_themes', array() );
+
+			if ( in_array( $_GET['theme'], $wp_auto_update_themes, true ) ) {
+				$wp_auto_update_themes = array_diff( $wp_auto_update_themes, array( $_GET['theme'] ) );
+				$action_type = 'disable-autoupdate';
+			} else {
+				$wp_auto_update_themes[] = $_GET['theme'];
+				$action_type = 'enable-autoupdate';
+			}
+			update_site_option( 'wp_auto_update_themes', $wp_auto_update_themes );
+
+			wp_redirect( self_admin_url( "themes.php?$action_type=1&paged=$page&s=$s" ) );
+			exit;
+		case 'enable-autoupdate-selected':
+			if ( ! wp_is_themes_auto_update_enabled() ) {
+				wp_die( __( 'Sorry, you are not allowed to enable themes automatic updates.' ) );
+			}
+
+			check_admin_referer( 'bulk-themes' );
+
+			if ( isset( $_GET['themes'] ) ) {
+				$themes = explode( ',', $_GET['themes'] );
+			} elseif ( isset( $_POST['checked'] ) ) {
+				$themes = (array) $_POST['checked'];
+			} else {
+				$themes = array();
+			}
+
+			if ( empty( $themes ) ) {
+				wp_safe_redirect( add_query_arg( 'error', 'main', $referer ) );
+				exit;
+			}
+
+			$previous_autoupdated_themes = get_site_option( 'wp_auto_update_themes', array() );
+
+			$new_autoupdated_themes = array_merge( $previous_autoupdated_themes, $themes );
+			$new_autoupdated_themes = array_unique( $new_autoupdated_themes );
+
+			update_site_option( 'wp_auto_update_themes', $new_autoupdated_themes );
+
+			wp_redirect( self_admin_url( "themes.php?enable-autoupdate=true&paged=$page&s=$s" ) );
+			exit;
+		case 'disable-autoupdate-selected':
+			if ( ! wp_is_themes_auto_update_enabled() ) {
+				wp_die( __( 'Sorry, you are not allowed to disable themes automatic updates.' ) );
+			}
+
+			check_admin_referer( 'bulk-themes' );
+
+			if ( isset( $_GET['themes'] ) ) {
+				$themes = explode( ',', $_GET['themes'] );
+			} elseif ( isset( $_POST['checked'] ) ) {
+				$themes = (array) $_POST['checked'];
+			} else {
+				$themes = array();
+			}
+
+			if ( empty( $themes ) ) {
+				wp_safe_redirect( add_query_arg( 'error', 'main', $referer ) );
+				exit;
+			}
+
+			$previous_autoupdated_themes = get_site_option( 'wp_auto_update_themes', array() );
+
+			$new_autoupdated_themes = array_diff( $previous_autoupdated_themes, $themes );
+			$new_autoupdated_themes = array_unique( $new_autoupdated_themes );
+
+			update_site_option( 'wp_auto_update_themes', $new_autoupdated_themes );
+
+			wp_redirect( self_admin_url( "themes.php?disable-autoupdate=true&paged=$page&s=$s" ) );
+			exit;
 		case 'delete-selected':
 			if ( ! current_user_can( 'delete_themes' ) ) {
 				wp_die( __( 'Sorry, you are not allowed to delete themes for this site.' ) );
@@ -309,6 +387,18 @@ if ( isset( $_GET['enabled'] ) ) {
 		$message = _n( '%s theme deleted.', '%s themes deleted.', $deleted );
 	}
 	echo '<div id="message" class="updated notice is-dismissible"><p>' . sprintf( $message, number_format_i18n( $deleted ) ) . '</p></div>';
+} elseif ( isset( $_GET['enable-autoupdate'] ) ) {
+	if ( 1 === intval( $_GET['enable-autoupdate'] ) ) {
+		echo '<div id="message" class="updated notice is-dismissible"><p>' . __( 'The selected theme will now update automatically.' ) . '</p></div>';
+	} else {
+		echo '<div id="message" class="updated notice is-dismissible"><p>' . __( 'The selected themes will now update automatically.' ) . '</p></div>';
+	}
+} elseif ( isset( $_GET['disable-autoupdate'] ) ) {
+	if ( 1 === intval( $_GET['disable-autoupdate'] ) ) {
+		echo '<div id="message" class="updated notice is-dismissible"><p>' . __( 'The selected theme won’t update automatically anymore.' ) . '</p></div>';
+	} else {
+		echo '<div id="message" class="updated notice is-dismissible"><p>' . __( 'The selected themes won’t update automatically anymore.' ) . '</p></div>';
+	}
 } elseif ( isset( $_GET['error'] ) && 'none' == $_GET['error'] ) {
 	echo '<div id="message" class="error notice is-dismissible"><p>' . __( 'No theme selected.' ) . '</p></div>';
 } elseif ( isset( $_GET['error'] ) && 'main' == $_GET['error'] ) {
diff --git a/src/wp-admin/themes.php b/src/wp-admin/themes.php
index bf424e93ff..c3b2c5c8d3 100644
--- a/src/wp-admin/themes.php
+++ b/src/wp-admin/themes.php
@@ -53,6 +53,40 @@ if ( current_user_can( 'switch_themes' ) && isset( $_GET['action'] ) ) {
 
 		wp_redirect( admin_url( 'themes.php?resumed=true' ) );
 		exit;
+	} elseif ( 'autoupdate' == $_GET['action'] ) {
+		check_admin_referer( 'autoupdate-theme_' . $_GET['stylesheet'] );
+		$theme = wp_get_theme( $_GET['stylesheet'] );
+		$slug = $theme->get_stylesheet();
+
+		if ( ! current_user_can( 'update_themes' ) ) {
+			wp_die(
+				'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
+				'<p>' . __( 'Sorry, you are not allowed to enable automatic update for themes.' ) . '</p>',
+				403
+			);
+		}
+
+		if ( ! wp_is_themes_auto_update_enabled() ) {
+			wp_die(
+				'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
+				'<p>' . __( 'Sorry, you are not allowed to enable automatic update for themes.' ) . '</p>',
+				403
+			);
+		}
+
+		$wp_auto_update_themes = get_site_option( 'wp_auto_update_themes', array() );
+		if ( ! in_array( $slug, $wp_auto_update_themes, true ) ) {
+			$autoupdate_action    = 'enable';
+			$wp_auto_update_themes[] = $slug;
+		} else {
+			$autoupdate_action    = 'disable';
+			$wp_auto_update_themes = array_diff( $wp_auto_update_themes, array( $slug ) );
+		}
+
+		update_site_option( 'wp_auto_update_themes', $wp_auto_update_themes );
+
+		wp_redirect( admin_url( 'themes.php?autoupdated=' . $autoupdate_action ) );
+		exit;
 	} elseif ( 'delete' == $_GET['action'] ) {
 		check_admin_referer( 'delete-theme_' . $_GET['stylesheet'] );
 		$theme = wp_get_theme( $_GET['stylesheet'] );
@@ -228,6 +262,15 @@ if ( ! validate_current_theme() || isset( $_GET['broken'] ) ) {
 	?>
 	<div id="message6" class="error"><p><?php _e( 'Theme could not be resumed because it triggered a <strong>fatal error</strong>.' ); ?></p></div>
 	<?php
+} elseif ( isset( $_GET['autoupdated'] ) ) {
+	$wp_auto_update_themes = get_site_option( 'wp_auto_update_themes', array() );
+	$autoupdate_notice  = __( 'The selected theme won’t update automatically anymore.' );
+	if ( 'enable' === $_GET['autoupdated'] ) {
+		$autoupdate_notice = __( 'The selected theme will now update automatically.' );
+	}
+	?>
+	<div id="message7" class="updated notice is-dismissible"><p><?php echo $autoupdate_notice; ?></p></div>
+	<?php
 }
 
 $ct = wp_get_theme();
@@ -359,6 +402,18 @@ foreach ( $themes as $theme ) :
 			$aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' );
 			?>
 			<a class="button activate" href="<?php echo $theme['actions']['activate']; ?>" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
+			<?php
+			if ( wp_is_themes_auto_update_enabled() ) {
+				/* translators: %s: Theme name. */
+				$aria_label_enable  = sprintf( _x( 'Enable automatic update for %s', 'theme' ), '{{ data.name }}' );
+				$aria_label_disable = sprintf( _x( 'Disable automatic update for %s', 'theme' ), '{{ data.name }}' );
+				?>
+				<# if ( data.autoupdated ) { #>
+					<a class="button autoupdate" href="{{{ data.actions.autoupdate }}}" aria-label="<?php echo $aria_label_disable; ?>"><?php _e( 'Disable auto update' ); ?></a>
+				<# } else { #>
+					<a class="button autoupdate" href="{{{ data.actions.autoupdate }}}" aria-label="<?php echo $aria_label_enable; ?>"><?php _e( 'Enable auto update' ); ?></a>
+				<# } #>
+			<?php } ?>
 			<?php if ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) { ?>
 				<a class="button button-primary load-customize hide-if-no-customize" href="<?php echo $theme['actions']['customize']; ?>"><?php _e( 'Live Preview' ); ?></a>
 			<?php } ?>
@@ -562,11 +617,36 @@ if ( ! is_multisite() && current_user_can( 'edit_themes' ) && $broken_themes ) {
 					printf( __( 'By %s' ), '{{{ data.authorAndUri }}}' );
 					?>
 				</p>
-
+				<?php if ( wp_is_themes_auto_update_enabled() ) : ?>
+				<p class="theme-autoupdate">
+					<?php
+					/* translators: %s: Theme name. */
+					$aria_label_enable  = sprintf( _x( 'Enable automatic update for %s', 'theme' ), '{{ data.name }}' );
+					$aria_label_disable = sprintf( _x( 'Disable automatic update for %s', 'theme' ), '{{ data.name }}' );
+					?>
+					<# if ( data.autoupdated ) { #>
+						<a href="{{{ data.actions.autoupdate }}}" aria-label="<?php echo $aria_label_disable; ?>"><span class="dashicons dashicons-update" aria-hidden="true"></span> <?php _e( 'Disable automatic updates' ); ?></a>
+					<# } else { #>
+						<a href="{{{ data.actions.autoupdate }}}" aria-label="<?php echo $aria_label_enable; ?>"><span class="dashicons dashicons-update" aria-hidden="true"></span> <?php _e( 'Enable automatic updates' ); ?></a>
+					<# } #>
+				</p>
+				<?php endif; ?>
 				<# if ( data.hasUpdate ) { #>
 				<div class="notice notice-warning notice-alt notice-large">
 					<h3 class="notice-title"><?php _e( 'Update Available' ); ?></h3>
 					{{{ data.update }}}
+					<# if ( data.autoupdated ) { #>
+						<?php
+						$next_update_time = wp_next_scheduled( 'wp_version_check' );
+						$time_to_next_update = human_time_diff( intval( $next_update_time ) );
+						$autoupdate = sprintf(
+							/* translators: Time until the next update. */
+							__( 'Automatic update scheduled in %s.' ),
+							$time_to_next_update
+						);
+						?>
+						<p class="theme-autoupdate-enabled"><?php echo $autoupdate; ?></p>
+					<# } #>
 				</div>
 				<# } #>
 				<p class="theme-description">{{{ data.description }}}</p>
diff --git a/src/wp-admin/update-core.php b/src/wp-admin/update-core.php
index 0f075e6442..2377ab5c85 100644
--- a/src/wp-admin/update-core.php
+++ b/src/wp-admin/update-core.php
@@ -478,8 +478,27 @@ function list_theme_updates() {
 
 	<tbody class="plugins">
 	<?php
+	if ( wp_is_themes_auto_update_enabled() ) {
+		$wp_auto_update_themes = get_site_option( 'wp_auto_update_themes', array() );
+	}
+
 	foreach ( $themes as $stylesheet => $theme ) {
 		$checkbox_id = 'checkbox_' . md5( $theme->get( 'Name' ) );
+
+		$autoupdate = '';
+		if ( wp_is_themes_auto_update_enabled() ) {
+			if ( in_array( $stylesheet, $wp_auto_update_themes, true ) ) {
+				$next_update_time = wp_next_scheduled( 'wp_version_check' );
+				$time_to_next_update = human_time_diff( intval( $next_update_time ) );
+				$autoupdate = ' <p class="theme-autoupdate-enabled">';
+				$autoupdate .= sprintf(
+					/* translators: Time until the next update. */
+					__( 'Automatic update scheduled in %s.' ),
+					$time_to_next_update
+				);
+				$autoupdate .= '</p> ';
+			}
+		}
 		?>
 	<tr>
 		<td class="check-column">
@@ -501,6 +520,7 @@ function list_theme_updates() {
 				$theme->display( 'Version' ),
 				$theme->update['new_version']
 			);
+			echo $autoupdate;
 			?>
 		</p></td>
 	</tr>
diff --git a/src/wp-includes/update.php b/src/wp-includes/update.php
index 125a6e3084..1abf446734 100644
--- a/src/wp-includes/update.php
+++ b/src/wp-includes/update.php
@@ -813,6 +813,38 @@ if ( ( ! is_main_site() && ! is_network_admin() ) || wp_doing_ajax() ) {
 	return;
 }
 
+/**
+ * Autoupdate selected themes.
+ *
+ * @since 5.4.0
+ */
+function wp_auto_update_theme( $update, $item ) {
+	$wp_auto_update_themes = get_site_option( 'wp_auto_update_themes', array() );
+	if ( in_array( $item->theme, $wp_auto_update_themes, true ) ) {
+		return true;
+	} else {
+		return $update;
+	}
+}
+
+/**
+ * Checks whether themes manual autoupdate is enabled.
+ *
+ * @since 5.4.0
+ */
+function wp_is_themes_auto_update_enabled() {
+	$enabled = ! defined( 'WP_DISABLE_THEMES_AUTO_UPDATE' ) || ! WP_DISABLE_THEMES_AUTO_UPDATE;
+
+	/**
+	 * Filters whether themes manual autoupdate is enabled.
+	 *
+	 * @since 5.4.0
+	 *
+	 * @param bool $enabled True if themes auto udpate is enabled, false otherwise.
+	 */
+	return apply_filters( 'wp_themes_auto_update_enabled', $enabled );
+}
+
 add_action( 'admin_init', '_maybe_update_core' );
 add_action( 'wp_version_check', 'wp_version_check' );
 
@@ -831,5 +863,6 @@ add_action( 'wp_update_themes', 'wp_update_themes' );
 add_action( 'update_option_WPLANG', 'wp_clean_update_cache', 10, 0 );
 
 add_action( 'wp_maybe_auto_update', 'wp_maybe_auto_update' );
+add_filter( 'auto_update_theme', 'wp_auto_update_theme', 10, 2 );
 
 add_action( 'init', 'wp_schedule_update_checks' );
