diff --git a/wp-admin/customize.php b/wp-admin/customize.php
index 4954ca99ba..4bee7ebcf7 100644
--- a/wp-admin/customize.php
+++ b/wp-admin/customize.php
@@ -171,17 +171,33 @@ do_action( 'customize_controls_print_styles' );
  * @since 3.4.0
  */
 do_action( 'customize_controls_print_scripts' );
+
+// Need to use \ReflectionObject as $wp_customize->theme is protected class.
+$reflection_obj   = new \ReflectionObject( $wp_customize );
+$reflection_theme = $reflection_obj->getProperty( 'theme' );
+$reflection_theme->setAccessible( true );
+$customize_theme = $reflection_theme->getValue( $wp_customize );
+$wp_compatible   = is_wp_version_compatible( $customize_theme->get( 'RequiresWP' ) );
+$php_compatible  = is_php_version_compatible( $customize_theme->get( 'RequiresPHP' ) );
+
 ?>
 </head>
 <body class="<?php echo esc_attr( $body_class ); ?>">
 <div class="wp-full-overlay expanded">
 	<form id="customize-controls" class="wrap wp-full-overlay-sidebar">
 		<div id="customize-header-actions" class="wp-full-overlay-header">
-			<?php $save_text = $wp_customize->is_theme_active() ? __( 'Publish' ) : __( 'Activate &amp; Publish' ); ?>
-			<div id="customize-save-button-wrapper" class="customize-save-button-wrapper" >
-				<?php submit_button( $save_text, 'primary save', 'save', false ); ?>
-				<button id="publish-settings" class="publish-settings button-primary button dashicons dashicons-admin-generic" aria-label="<?php esc_attr_e( 'Publish Settings' ); ?>" aria-expanded="false" disabled></button>
-			</div>
+			<?php if ( $wp_customize && $php_compatible ) : ?>
+				<?php $save_text = $wp_customize->is_theme_active() ? __( 'Publish' ) : __( 'Activate &amp; Publish' ); ?>
+				<div id="customize-save-button-wrapper" class="customize-save-button-wrapper" >
+					<?php submit_button( $save_text, 'primary save', 'save', false ); ?>
+					<button id="publish-settings" class="publish-settings button-primary button dashicons dashicons-admin-generic" aria-label="<?php esc_attr_e( 'Publish Settings' ); ?>" aria-expanded="false" disabled></button>
+				</div>
+			<?php else: ?>
+				<?php $save_text = $wp_customize->is_theme_active() ? __( 'Publish' ) : __( 'Activate &amp; Publish' ); ?>
+				<div id="customize-save-button-wrapper" class="customize-save-button-wrapper disabled" >
+					<button class="button button-primary disabled" aria-label="<?php esc_attr_e( 'Publish Settings' ); ?>" aria-expanded="false" disabled><?php esc_html_e( $save_text ); ?></button>
+				</div>
+			<?php endif; ?>
 			<span class="spinner"></span>
 			<button type="button" class="customize-controls-preview-toggle">
 				<span class="controls"><?php _e( 'Customize' ); ?></span>
diff --git a/wp-admin/includes/theme.php b/wp-admin/includes/theme.php
index 47168057e0..4a5a32c0f5 100644
--- a/wp-admin/includes/theme.php
+++ b/wp-admin/includes/theme.php
@@ -654,20 +654,24 @@ function wp_prepare_themes_for_js( $themes = null ) {
 		}
 
 		$prepared_themes[ $slug ] = array(
-			'id'           => $slug,
-			'name'         => $theme->display( 'Name' ),
-			'screenshot'   => array( $theme->get_screenshot() ), // @todo Multiple screenshots.
-			'description'  => $theme->display( 'Description' ),
-			'author'       => $theme->display( 'Author', false, true ),
-			'authorAndUri' => $theme->display( 'Author' ),
-			'version'      => $theme->display( 'Version' ),
-			'tags'         => $theme->display( 'Tags' ),
-			'parent'       => $parent,
-			'active'       => $slug === $current_theme,
-			'hasUpdate'    => isset( $updates[ $slug ] ),
-			'hasPackage'   => isset( $updates[ $slug ] ) && ! empty( $updates[ $slug ]['package'] ),
-			'update'       => get_theme_update_available( $theme ),
-			'actions'      => array(
+			'id'             => $slug,
+			'name'           => $theme->display( 'Name' ),
+			'screenshot'     => array( $theme->get_screenshot() ), // @todo Multiple screenshots.
+			'description'    => $theme->display( 'Description' ),
+			'author'         => $theme->display( 'Author', false, true ),
+			'authorAndUri'   => $theme->display( 'Author' ),
+			'version'        => $theme->display( 'Version' ),
+			'tags'           => $theme->display( 'Tags' ),
+ 			'requires'       => $theme->display( 'RequiresWP' ),
+ 			'requires_php'   => $theme->display( 'RequiresPHP' ),
+ 			'wp_compatible'  => is_wp_version_compatible( $theme->display( 'RequiresWP' ) ),
+ 			'php_compatible' => is_php_version_compatible( $theme->display( 'RequiresPHP' ) ),
+			'parent'         => $parent,
+			'active'         => $slug === $current_theme,
+			'hasUpdate'      => isset( $updates[ $slug ] ),
+			'hasPackage'     => isset( $updates[ $slug ] ) && ! empty( $updates[ $slug ]['package'] ),
+			'update'         => get_theme_update_available( $theme ),
+			'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,
@@ -754,8 +758,18 @@ function customize_themes_print_templates() {
 
 					<# if ( data.hasUpdate ) { #>
 						<div class="notice notice-warning notice-alt notice-large" data-slug="{{ data.id }}">
+						<# if ( data.wp_compatible && data.php_compatible ) { #>
 							<h3 class="notice-title"><?php _e( 'Update Available' ); ?></h3>
 							{{{ data.update }}}
+						<# } else { #>
+							<h3 class="notice-title"><?php _e( 'Update incompatible' ); ?></h3>
+							<p><?php printf(
+								/* translators: %s: WordPress version, %s: PHP version */
+								__( 'This theme is incompatible with your current installation. This theme requires at least WordPress %s and PHP %s.' ),
+								'{{{ data.requires }}}',
+								'{{{ data.requires_php }}}'
+								); ?></p>
+						<# } #>
 						</div>
 					<# } #>
 
diff --git a/wp-admin/theme-install.php b/wp-admin/theme-install.php
index 944e9d7d0a..52900a6bdd 100644
--- a/wp-admin/theme-install.php
+++ b/wp-admin/theme-install.php
@@ -285,7 +285,11 @@ if ( $tab ) {
 				$aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' );
 				?>
 				<# if ( data.activate_url ) { #>
-					<a class="button button-primary activate" href="{{ data.activate_url }}" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
+					<# if ( data.wp_compatible && data.php_compatible ) { #>
+						<a class="button button-primary activate" href="{{ data.activate_url }}" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
+					<# } else { #>
+						<a class="button button-primary disabled" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
+					<# } #>
 				<# } #>
 				<# if ( data.customize_url ) { #>
 					<a class="button load-customize" href="{{ data.customize_url }}"><?php _e( 'Live Preview' ); ?></a>
@@ -315,9 +319,17 @@ if ( $tab ) {
 			<button class="previous-theme"><span class="screen-reader-text"><?php _e( 'Previous theme' ); ?></span></button>
 			<button class="next-theme"><span class="screen-reader-text"><?php _e( 'Next theme' ); ?></span></button>
 			<# if ( data.installed ) { #>
-				<a class="button button-primary activate" href="{{ data.activate_url }}"><?php _e( 'Activate' ); ?></a>
-			<# } else { #>
-				<a href="{{ data.install_url }}" class="button button-primary theme-install" data-name="{{ data.name }}" data-slug="{{ data.id }}"><?php _e( 'Install' ); ?></a>
+				<# if ( data.wp_compatible && data.php_compatible ) { #>
+  					<a class="button button-primary activate" href="{{ data.activate_url }}"><?php _e( 'Activate' ); ?></a>
+				<# } else { #>
+ 					<a class="button button-primary disabled"><?php _e( 'Activate' ); ?></a>
+				<# } #>
+ 			<# } else { #>
+				<# <?php if ( $wp_compatible  && $php_compatible ) : ?> #>
+					<a href="{{ data.install_url }}" class="button button-primary theme-install" data-name="{{ data.name }}" data-slug="{{ data.id }}"><?php _e( 'Install' ); ?></a>
+				<# <?php else: ?> #>
+					<a class="button button-primary theme-install disabled"><?php _e( 'Install' ); ?></a>
+				<# <?php endif; ?> #>
 			<# } #>
 		</div>
 		<div class="wp-full-overlay-sidebar-content">
diff --git a/wp-admin/themes.php b/wp-admin/themes.php
index 53bb1049a7..f7b03d675f 100644
--- a/wp-admin/themes.php
+++ b/wp-admin/themes.php
@@ -323,10 +323,14 @@ foreach ( $themes as $theme ) :
 
 	<?php if ( $theme['hasUpdate'] ) : ?>
 		<div class="update-message notice inline notice-warning notice-alt">
-		<?php if ( $theme['hasPackage'] ) : ?>
-			<p><?php _e( 'New version available. <button class="button-link" type="button">Update now</button>' ); ?></p>
+		<?php if ( $theme['wp_compatible'] && $theme['php_compatible'] ): ?>
+			<?php if ( $theme['hasPackage'] ) : ?>
+				<p><?php _e( 'New version available. <button class="button-link" type="button">Update now</button>' ); ?></p>
+			<?php else : ?>
+				<p><?php _e( 'New version available.' ); ?></p>
+			<?php endif; ?>
 		<?php else : ?>
-			<p><?php _e( 'New version available.' ); ?></p>
+			<p><?php _e( 'Version update incompatible.' ); ?></p>
 		<?php endif; ?>
 		</div>
 	<?php endif; ?>
@@ -358,10 +362,15 @@ foreach ( $themes as $theme ) :
 			/* translators: %s: Theme name. */
 			$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 ( 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 } ?>
+			<?php if ( $theme['wp_compatible'] && $theme['php_compatible'] ): ?>
+				<a class="button activate" href="<?php echo $theme['actions']['activate']; ?>" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
+				<?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 } ?>
+			<?php else : ?>
+				<a class="button disabled" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
+				<a class="button button-primary load-customize hide-if-no-customize disabled"><?php _e( 'Live Preview' ); ?></a>
+			<?php endif; ?>
 		<?php } ?>
 
 		</div>
@@ -488,10 +497,16 @@ if ( ! is_multisite() && current_user_can( 'edit_themes' ) && $broken_themes ) {
 	<# } #>
 
 	<# if ( data.hasUpdate ) { #>
-		<# if ( data.hasPackage ) { #>
-			<div class="update-message notice inline notice-warning notice-alt"><p><?php _e( 'New version available. <button class="button-link" type="button">Update now</button>' ); ?></p></div>
+		<# if ( data.wp_compatible && data.php_compatible ) { #>
+			<div class="update-message notice inline notice-warning notice-alt">
+			<# if ( data.hasPackage ) { #>
+				<p><?php _e( 'New version available. <button class="button-link" type="button">Update now</button>' ); ?></p></div>
+			<# } else { #>
+				<div class="update-message notice inline notice-warning notice-alt"><p><?php _e( 'New version available.' ); ?></p></div>
+			<# } #>
 		<# } else { #>
-			<div class="update-message notice inline notice-warning notice-alt"><p><?php _e( 'New version available.' ); ?></p></div>
+			<div class="notice inline notice-warning notice-alt">
+			<p><?php _e( 'Update incompatible.' ); ?></p></div>
 		<# } #>
 	<# } #>
 
@@ -522,8 +537,13 @@ if ( ! is_multisite() && current_user_can( 'edit_themes' ) && $broken_themes ) {
 				/* translators: %s: Theme name. */
 				$aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' );
 				?>
-				<a class="button activate" href="{{{ data.actions.activate }}}" aria-label="<?php echo $aria_label; ?>"><?php _e( 'Activate' ); ?></a>
-				<a class="button button-primary load-customize hide-if-no-customize" href="{{{ data.actions.customize }}}"><?php _e( 'Live Preview' ); ?></a>
+				<# if ( data.wp_compatible && data.php_compatible ) { #>
+					<a class="button activate" href="{{{ data.actions.activate }}}" aria-label="<?php echo $aria_label; ?>"><?php _e( 'Activate' ); ?></a>
+					<a class="button button-primary load-customize hide-if-no-customize" href="{{{ data.actions.customize }}}"><?php _e( 'Live Preview' ); ?></a>
+				<# } else { #>
+					<a class="button disabled" aria-label="<?php echo $aria_label; ?>"><?php _e( 'Activate' ); ?></a>
+					<a class="button button-primary load-customize hide-if-no-customize disabled"><?php _e( 'Live Preview' ); ?></a>
+				<# } #>
 			<# } #>
 		</div>
 	</div>
@@ -565,8 +585,18 @@ if ( ! is_multisite() && current_user_can( 'edit_themes' ) && $broken_themes ) {
 
 				<# 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.wp_compatible && data.php_compatible ) { #>
+						<h3 class="notice-title"><?php _e( 'Update Available' ); ?></h3>
+						{{{ data.update }}}
+					<# } else { #>
+						<h3 class="notice-title"><?php _e( 'Update incompatible' ); ?></h3>
+						<p><?php printf(
+								/* translators: %s: WordPress version, %s: PHP version */
+								__( 'This theme is incompatible with your current installation. This theme requires at least WordPress %s and PHP %s.' ),
+								'{{{ data.requires }}}',
+								'{{{ data.requires_php }}}'
+							); ?></p>
+					<# } #>
 				</div>
 				<# } #>
 				<p class="theme-description">{{{ data.description }}}</p>
@@ -596,10 +626,13 @@ if ( ! is_multisite() && current_user_can( 'edit_themes' ) && $broken_themes ) {
 				/* translators: %s: Theme name. */
 				$aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' );
 				?>
-				<# if ( data.actions.activate ) { #>
+				<# if ( data.actions.activate && data.wp_compatible && data.php_compatible ) { #>
 					<a href="{{{ data.actions.activate }}}" class="button activate" aria-label="<?php echo $aria_label; ?>"><?php _e( 'Activate' ); ?></a>
+					<a href="{{{ data.actions.customize }}}" class="button button-primary load-customize hide-if-no-customize"><?php _e( 'Live Preview' ); ?></a>
+				<# } else { #>
+					<a class="button disabled" aria-label="<?php echo $aria_label; ?>"><?php _e( 'Activate' ); ?></a>
+					<a class="button button-primary load-customize hide-if-no-customize disabled"><?php _e( 'Live Preview' ); ?></a>
 				<# } #>
-				<a href="{{{ data.actions.customize }}}" class="button button-primary load-customize hide-if-no-customize"><?php _e( 'Live Preview' ); ?></a>
 			</div>
 
 			<# if ( ! data.active && data.actions['delete'] ) { #>
diff --git a/wp-admin/update-core.php b/wp-admin/update-core.php
index 9d21ac8c2c..b147fa363f 100644
--- a/wp-admin/update-core.php
+++ b/wp-admin/update-core.php
@@ -479,17 +479,36 @@ function list_theme_updates() {
 	<tbody class="plugins">
 	<?php
 	foreach ( $themes as $stylesheet => $theme ) {
-		$checkbox_id = 'checkbox_' . md5( $theme->get( 'Name' ) );
+		$checkbox_id    = 'checkbox_' . md5( $theme->get( 'Name' ) );
+		$compatible_php = is_php_version_compatible( $theme->get( 'RequiresPHP' ) );
+		$compat         = '';
+		$annotation     = '';
+		if ( ! $compatible_php && current_user_can( 'update_php' ) ) {
+			$compat .= '<br>' . __( 'This update doesn&#8217;t work with your version of PHP.' ) . '&nbsp;';
+			$compat .= sprintf(
+				/* translators: %s: URL to Update PHP page. */
+				__( '<a href="%s">Learn more about updating PHP</a>.' ),
+				esc_url( wp_get_update_php_url() )
+			);
+
+			$annotation = wp_get_update_php_annotation();
+
+			if ( $annotation ) {
+				$compat .= '</p><p><em>' . $annotation . '</em>';
+			}
+		}
 		?>
 	<tr>
 		<td class="check-column">
-			<input type="checkbox" name="checked[]" id="<?php echo $checkbox_id; ?>" value="<?php echo esc_attr( $stylesheet ); ?>" />
-			<label for="<?php echo $checkbox_id; ?>" class="screen-reader-text">
-				<?php
-				/* translators: %s: Theme name. */
-				printf( __( 'Select %s' ), $theme->display( 'Name' ) );
-				?>
-			</label>
+			<?php if ( $compatible_php ) : ?>
+				<input type="checkbox" name="checked[]" id="<?php echo $checkbox_id; ?>" value="<?php echo esc_attr( $stylesheet ); ?>" />
+				<label for="<?php echo $checkbox_id; ?>" class="screen-reader-text">
+					<?php
+					/* translators: %s: Theme name. */
+					printf( __( 'Select %s' ), $theme->display( 'Name' ) );
+					?>
+				</label>
+			<?php endif; ?>
 		</td>
 		<td class="plugin-title"><p>
 			<img src="<?php echo esc_url( $theme->get_screenshot() ); ?>" width="85" height="64" class="updates-table-screenshot" alt="" />
@@ -501,6 +520,7 @@ function list_theme_updates() {
 				$theme->display( 'Version' ),
 				$theme->update['new_version']
 			);
+			echo $compat . $annotation;
 			?>
 		</p></td>
 	</tr>
diff --git a/wp-includes/customize/class-wp-customize-theme-control.php b/wp-includes/customize/class-wp-customize-theme-control.php
index 10f09d180b..5dd0873d40 100644
--- a/wp-includes/customize/class-wp-customize-theme-control.php
+++ b/wp-includes/customize/class-wp-customize-theme-control.php
@@ -90,21 +90,29 @@ class WP_Customize_Theme_Control extends WP_Customize_Control {
 			</div>
 
 			<# if ( 'installed' === data.theme.type && data.theme.hasUpdate ) { #>
-				<div class="update-message notice inline notice-warning notice-alt" data-slug="{{ data.theme.id }}">
-					<p>
-						<?php
-						if ( is_multisite() ) {
-							_e( 'New version available.' );
-						} else {
-							printf(
-								/* translators: %s: "Update now" button. */
-								__( 'New version available. %s' ),
-								'<button class="button-link update-theme" type="button">' . __( 'Update now' ) . '</button>'
-							);
-						}
-						?>
-					</p>
-				</div>
+				<# if ( data.theme.wp_compatible && data.theme.php_compatible ) { #>
+					<div class="update-message notice inline notice-warning notice-alt" data-slug="{{ data.theme.id }}">
+						<p>
+							<?php
+							if ( is_multisite() ) {
+								_e( 'New version available.' );
+							} else {
+								printf(
+									/* translators: %s: "Update now" button. */
+									__( 'New version available. %s' ),
+									'<button class="button-link update-theme" type="button">' . __( 'Update now' ) . '</button>'
+								);
+							}
+							?>
+						</p>
+					</div>
+				<# } else { #>
+					<div class="update-message notice inline notice-warning notice-alt" data-slug="{{ data.theme.id }}">
+						<p>
+							<?php _e( 'Update Incompatible.' ); ?>
+						</p>
+					</div>
+				<# } #>
 			<# } #>
 
 			<# if ( data.theme.active ) { #>
@@ -121,7 +129,11 @@ class WP_Customize_Theme_Control extends WP_Customize_Control {
 				<div class="theme-id-container">
 					<h3 class="theme-name" id="{{ data.section }}-{{ data.theme.id }}-name">{{ data.theme.name }}</h3>
 					<div class="theme-actions">
-						<button type="button" class="button button-primary preview-theme" aria-label="<?php echo esc_attr( $preview_label ); ?>" data-slug="{{ data.theme.id }}"><?php _e( 'Live Preview' ); ?></button>
+						<# if ( data.theme.wp_compatible && data.theme.php_compatible ) { #>
+							<button type="button" class="button button-primary preview-theme" aria-label="<?php echo esc_attr( $preview_label ); ?>" data-slug="{{ data.theme.id }}"><?php _e( 'Live Preview' ); ?></button>
+						<# } else { #>
+							<button class="button button-primary disabled" aria-label="<?php echo esc_attr( $preview_label ); ?>"><?php _e( 'Live Preview' ); ?></button>
+						<# } #>
 					</div>
 				</div>
 				<div class="notice notice-success notice-alt"><p><?php _ex( 'Installed', 'theme' ); ?></p></div>
