diff --git a/src/wp-admin/includes/class-wp-plugins-list-table.php b/src/wp-admin/includes/class-wp-plugins-list-table.php
index a36ec05221..76817209aa 100644
--- a/src/wp-admin/includes/class-wp-plugins-list-table.php
+++ b/src/wp-admin/includes/class-wp-plugins-list-table.php
@@ -40,7 +40,7 @@ class WP_Plugins_List_Table extends WP_List_Table {
 		);
 
 		$status = 'all';
-		if ( isset( $_REQUEST['plugin_status'] ) && in_array( $_REQUEST['plugin_status'], array( 'active', 'inactive', 'recently_activated', 'upgrade', 'mustuse', 'dropins', 'search', 'paused' ) ) ) {
+		if ( isset( $_REQUEST['plugin_status'] ) && in_array( $_REQUEST['plugin_status'], array( 'active', 'inactive', 'recently_activated', 'upgrade', 'mustuse', 'dropins', 'search', 'paused', 'update-on', 'update-off' ) ) ) {
 			$status = $_REQUEST['plugin_status'];
 		}
 
@@ -100,6 +100,8 @@ class WP_Plugins_List_Table extends WP_List_Table {
 			'mustuse'            => array(),
 			'dropins'            => array(),
 			'paused'             => array(),
+			'update-on'          => array(),
+			'update-off'         => array(),
 		);
 
 		$screen = $this->screen;
@@ -179,7 +181,11 @@ class WP_Plugins_List_Table extends WP_List_Table {
 			update_option( 'recently_activated', $recently_activated );
 		}
 
-		$plugin_info = get_site_transient( 'update_plugins' );
+		$plugin_info            = get_site_transient( 'update_plugins' );
+
+		if ( wp_is_plugins_auto_update_enabled() ) {
+			$wp_auto_update_plugins = get_site_option( 'wp_auto_update_plugins', array() );
+		}
 
 		foreach ( (array) $plugins['all'] as $plugin_file => $plugin_data ) {
 			// Extra info if known. array_merge() ensures $plugin_data has precedence if keys collide.
@@ -233,6 +239,14 @@ class WP_Plugins_List_Table extends WP_List_Table {
 				// Populate the inactive list with plugins that aren't activated
 				$plugins['inactive'][ $plugin_file ] = $plugin_data;
 			}
+
+			if ( wp_is_plugins_auto_update_enabled() ) {
+				if ( in_array( $plugin_data['plugin'], $wp_auto_update_plugins, true ) ) {
+					$plugins['update-on'][ $plugin_file ] = $plugin_data;
+				} else {
+					$plugins['update-off'][ $plugin_file ] = $plugin_data;
+				}
+			}
 		}
 
 		if ( strlen( $s ) ) {
@@ -493,6 +507,22 @@ class WP_Plugins_List_Table extends WP_List_Table {
 						$count
 					);
 					break;
+				case 'update-on':
+					/* translators: %s: Number of plugins. */
+					$text = _n(
+						'Auto Update On <span class="count">(%s)</span>',
+						'Auto Update On <span class="count">(%s)</span>',
+						$count
+					);
+					break;
+				case 'update-off':
+					/* translators: %s: Number of plugins. */
+					$text = _n(
+						'Auto Update Off <span class="count">(%s)</span>',
+						'Auto Update Off <span class="count">(%s)</span>',
+						$count
+					);
+					break;
 			}
 
 			if ( 'search' !== $type ) {
@@ -527,7 +557,9 @@ class WP_Plugins_List_Table extends WP_List_Table {
 
 		if ( ! is_multisite() || $this->screen->in_admin( 'network' ) ) {
 			if ( current_user_can( 'update_plugins' ) ) {
-				$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_plugins' ) && ( 'active' != $status ) ) {
 				$actions['delete-selected'] = __( 'Delete' );
@@ -960,6 +992,48 @@ class WP_Plugins_List_Table extends WP_List_Table {
 						}
 					}
 
+					if ( wp_is_plugins_auto_update_enabled() ) {
+						$wp_auto_update_plugins = get_site_option( 'wp_auto_update_plugins', array() );
+						if ( in_array( $plugin_file, $wp_auto_update_plugins, true ) ) {
+							$aria_label = esc_attr(
+								sprintf(
+									/* translators: Plugin name. */
+									_x( 'Disable automatic updates for %s', 'plugin' ),
+									$plugin_name
+								)
+							);
+							echo '<p class="plugin-autoupdate-enabled">';
+							echo '<span class="dashicons dashicons-update" aria-hidden="true"></span> ' . __( 'Automatic update enabled' );
+							if ( current_user_can( 'update_plugins', $plugin_file ) ) {
+								echo sprintf(
+									' | <a href="%s" class="edit" aria-label="%s">%s</a>',
+									wp_nonce_url( 'plugins.php?action=autoupdate&amp;plugin=' . urlencode( $plugin_file ) . '&amp;paged=' . $page, 'autoupdate-plugin_' . $plugin_file ),
+									$aria_label,
+									__( 'Disable' )
+								);
+							}
+							echo '</p>';
+						} else {
+							if ( current_user_can( 'update_plugins', $plugin_file ) ) {
+								$aria_label = esc_attr(
+									sprintf(
+										/* translators: Plugin name. */
+										_x( 'Enable automatic updates for %s', 'plugin' ),
+										$plugin_name
+									)
+								);
+								echo '<p class="plugin-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( 'plugins.php?action=autoupdate&amp;plugin=' . urlencode( $plugin_file ) . '&amp;paged=' . $page, 'autoupdate-plugin_' . $plugin_file ),
+									$aria_label,
+									__( 'Enable automatic updates' )
+								);
+								echo '</p>';
+							}
+						}
+					}
+
 					echo '</td>';
 					break;
 				default:
diff --git a/src/wp-admin/includes/update.php b/src/wp-admin/includes/update.php
index 0caa04a963..56d8ed304a 100644
--- a/src/wp-admin/includes/update.php
+++ b/src/wp-admin/includes/update.php
@@ -506,6 +506,21 @@ function wp_plugin_update_row( $file, $plugin_data ) {
 						esc_attr( sprintf( __( 'Update %s now' ), $plugin_name ) )
 					)
 				);
+				if ( wp_is_plugins_auto_update_enabled() ) {
+					$wp_auto_update_plugins = get_site_option( 'wp_auto_update_plugins', array() );
+					$autoupdate = '';
+					if ( in_array( $plugin_data['plugin'], $wp_auto_update_plugins, true ) ) {
+						$next_update_time = wp_next_scheduled( 'wp_version_check' );
+						$time_to_next_update = human_time_diff( intval( $next_update_time ) );
+						echo ' <span class="plugin-autoupdate-enabled">';
+						printf(
+							/* translators: Time until the next update. */
+							__( 'Automatic update scheduled in %s.' ),
+							$time_to_next_update
+						);
+						echo '</span> ';
+					}
+				}
 			} else {
 				printf(
 					/* translators: 1: Plugin name, 2: Details URL, 3: Additional link attributes, 4: Version number 5: URL to Update PHP page. */
diff --git a/src/wp-admin/plugins.php b/src/wp-admin/plugins.php
index 459a2f82f6..e80ffc2dcb 100644
--- a/src/wp-admin/plugins.php
+++ b/src/wp-admin/plugins.php
@@ -154,6 +154,99 @@ if ( $action ) {
 			require_once( ABSPATH . 'wp-admin/admin-footer.php' );
 			exit;
 
+		case 'autoupdate':
+			if ( ! current_user_can( 'update_plugins' ) ) {
+				wp_die( __( 'Sorry, you are not allowed to enable plugins automatic updates.' ) );
+			}
+
+			if ( ! wp_is_plugins_auto_update_enabled() ) {
+				wp_die( __( 'Sorry, you are not allowed to enable plugins automatic updates.' ) );
+			}
+
+			if ( is_multisite() && ! is_network_admin() && is_network_only_plugin( $plugin ) ) {
+				wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
+				exit;
+			}
+
+			if ( empty( $plugin ) ) {
+				wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
+				exit;
+			}
+
+			check_admin_referer( 'autoupdate-plugin_' . $plugin );
+
+			$wp_auto_update_plugins = get_site_option( 'wp_auto_update_plugins', array() );
+
+			if ( in_array( $plugin, $wp_auto_update_plugins, true ) ) {
+				$wp_auto_update_plugins = array_diff( $wp_auto_update_plugins, array( $plugin ) );
+				$action_type = 'disable-autoupdate=true';
+			} else {
+				$wp_auto_update_plugins[] = $plugin;
+				$action_type = 'enable-autoupdate=true';
+			}
+
+			update_site_option( 'wp_auto_update_plugins', $wp_auto_update_plugins );
+
+			wp_redirect( self_admin_url( "plugins.php?$action_type&plugin_status=$status&paged=$page&s=$s" ) );
+
+			exit;
+
+		case 'enable-autoupdate-selected':
+			if ( ! current_user_can( 'update_plugins' ) ) {
+				wp_die( __( 'Sorry, you are not allowed to enable plugin automatic updates.' ) );
+			}
+
+			if ( ! wp_is_plugins_auto_update_enabled() ) {
+				wp_die( __( 'Sorry, you are not allowed to enable plugins automatic updates.' ) );
+			}
+
+			check_admin_referer( 'bulk-plugins' );
+
+			$plugins = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array();
+
+			if ( empty( $plugins ) ) {
+				wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
+				exit;
+			}
+
+			$previous_autoupdated_plugins = get_site_option( 'wp_auto_update_plugins', array() );
+
+			$new_autoupdated_plugins = array_merge( $previous_autoupdated_plugins, $plugins );
+			$new_autoupdated_plugins = array_unique( $new_autoupdated_plugins );
+
+			update_site_option( 'wp_auto_update_plugins', $new_autoupdated_plugins );
+
+			wp_redirect( self_admin_url( "plugins.php?enable-autoupdate=true&plugin_status=$status&paged=$page&s=$s" ) );
+			exit;
+
+		case 'disable-autoupdate-selected':
+			if ( ! current_user_can( 'update_plugins' ) ) {
+				wp_die( __( 'Sorry, you are not allowed to disable plugin automatic updates.' ) );
+			}
+
+			if ( ! wp_is_plugins_auto_update_enabled() ) {
+				wp_die( __( 'Sorry, you are not allowed to disable plugins automatic updates.' ) );
+			}
+
+			check_admin_referer( 'bulk-plugins' );
+
+			$plugins = isset( $_POST['checked'] ) ? (array) wp_unslash( $_POST['checked'] ) : array();
+
+			if ( empty( $plugins ) ) {
+				wp_redirect( self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" ) );
+				exit;
+			}
+
+			$previous_autoupdated_plugins = get_site_option( 'wp_auto_update_plugins', array() );
+
+			$new_autoupdated_plugins      = array_diff( $previous_autoupdated_plugins, $plugins );
+			$new_autoupdated_plugins      = array_unique( $new_autoupdated_plugins );
+
+			update_site_option( 'wp_auto_update_plugins', $new_autoupdated_plugins );
+
+			wp_redirect( self_admin_url( "plugins.php?disable-autoupdate=true&plugin_status=$status&paged=$page&s=$s" ) );
+			exit;
+
 		case 'error_scrape':
 			if ( ! current_user_can( 'activate_plugin', $plugin ) ) {
 				wp_die( __( 'Sorry, you are not allowed to activate this plugin.' ) );
@@ -578,6 +671,10 @@ elseif ( isset( $_GET['deleted'] ) ) :
 	<div id="message" class="updated notice is-dismissible"><p><?php _e( 'Selected plugins deactivated.' ); ?></p></div>
 <?php elseif ( 'update-selected' == $action ) : ?>
 	<div id="message" class="updated notice is-dismissible"><p><?php _e( 'All selected plugins are up to date.' ); ?></p></div>
+<?php elseif ( isset( $_GET['enable-autoupdate'] ) ) : ?>
+	<div id="message" class="updated notice is-dismissible"><p><?php _e( 'All selected plugins will now update automatically.' ); ?></p></div>
+<?php elseif ( isset( $_GET['disable-autoupdate'] ) ) : ?>
+	<div id="message" class="updated notice is-dismissible"><p><?php _e( 'All selected plugins won’t automatically update anymore.' ); ?></p></div>
 <?php elseif ( isset( $_GET['resume'] ) ) : ?>
 	<div id="message" class="updated notice is-dismissible"><p><?php _e( 'Plugin resumed.' ); ?></p></div>
 <?php endif; ?>
diff --git a/src/wp-admin/update-core.php b/src/wp-admin/update-core.php
index 2093201149..545b138727 100644
--- a/src/wp-admin/update-core.php
+++ b/src/wp-admin/update-core.php
@@ -328,6 +328,11 @@ function list_plugin_updates() {
 
 	<tbody class="plugins">
 	<?php
+	// Get autoupdated plugins
+	if ( wp_is_plugins_auto_update_enabled() ) {
+		$wp_auto_update_plugins = get_site_option( 'wp_auto_update_plugins', array() );
+	}
+
 	foreach ( (array) $plugins as $plugin_file => $plugin_data ) {
 		$plugin_data = (object) _get_plugin_data_markup_translate( $plugin_file, (array) $plugin_data, false, true );
 
@@ -395,6 +400,21 @@ function list_plugin_updates() {
 		);
 
 		$checkbox_id = 'checkbox_' . md5( $plugin_data->Name );
+
+		if ( wp_is_plugins_auto_update_enabled() ) {
+			$autoupdate = '';
+			if ( in_array( $plugin_data->update->plugin, $wp_auto_update_plugins, true ) ) {
+				$next_update_time = wp_next_scheduled( 'wp_version_check' );
+				$time_to_next_update = human_time_diff( intval( $next_update_time ) );
+				$autoupdate = ' <span class="plugin-autoupdate-enabled">';
+				$autoupdate .= sprintf(
+					/* translators: Time until the next update. */
+					__( 'Automatic update scheduled in %s.' ),
+					$time_to_next_update
+				);
+				$autoupdate .= '</span> ';
+			}
+		}
 		?>
 	<tr>
 		<td class="check-column">
@@ -418,7 +438,7 @@ function list_plugin_updates() {
 				$plugin_data->Version,
 				$plugin_data->update->new_version
 			);
-			echo ' ' . $details . $compat . $upgrade_notice;
+			echo ' ' . $details . $autoupdate . $compat . $upgrade_notice;
 			?>
 		</p></td>
 	</tr>
diff --git a/src/wp-includes/update.php b/src/wp-includes/update.php
index dfb27b2aad..90b7a60d76 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 plugins.
+ *
+ * @since 5.4.0
+ */
+function wp_auto_update_plugin( $update, $item ) {
+	$wp_auto_update_plugins = get_site_option( 'wp_auto_update_plugins', array() );
+	if ( in_array( $item->plugin, $wp_auto_update_plugins, true ) ) {
+		return true;
+	} else {
+		return $update;
+	}
+}
+
+/**
+ * Checks whether plugins manual autoupdate is enabled.
+ *
+ * @since 5.4.0
+ */
+function wp_is_plugins_auto_update_enabled() {
+	$enabled = ! defined( 'WP_DISABLE_PLUGINS_AUTO_UPDATE' ) || ! WP_DISABLE_PLUGINS_AUTO_UPDATE;
+
+	/**
+	 * Filters whether plugins manual autoupdate is enabled.
+	 *
+	 * @since 5.4.0
+	 *
+	 * @param bool $enabled True if plugins auto udpate is enabled, false otherwise.
+	 */
+	return apply_filters( 'wp_plugins_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_plugin', 'wp_auto_update_plugin', 10, 2 );
 
 add_action( 'init', 'wp_schedule_update_checks' );
