diff --git src/wp-admin/customize.php src/wp-admin/customize.php
index 7f9e5a9dc7..d22b613eeb 100644
--- src/wp-admin/customize.php
+++ src/wp-admin/customize.php
@@ -60,6 +60,39 @@ if ( $wp_customize->changeset_post_id() ) {
 	}
 }
 
+$is_theme_switch_unavailable = (
+	! $wp_customize->is_theme_active()
+	&&
+	! $wp_customize->branching()
+	&&
+	$wp_customize->changeset_post_id()
+	&&
+	in_array(
+		get_post_status( $wp_customize->changeset_post_id() ),
+		array_diff( get_post_stati(), array( 'auto-draft', 'publish', 'trash', 'inherit', 'private' ) ),
+		true
+	)
+);
+if ( $is_theme_switch_unavailable ) {
+	$message = sprintf(
+		/* translators: %s is URL to Customizer with the Publish Settings section auto-focused */
+		__( 'Because you have drafted or scheduled changes, live previewing other themes is currently disabled. Please <a href="%s">publish your changes</a>, or wait until they publish to preview new themes. ' ),
+		add_query_arg(
+			array(
+				'autofocus[section]' => 'publish_settings',
+				'return' => admin_url( 'themes.php' ),
+			),
+			admin_url( 'customize.php' )
+		)
+	);
+
+	wp_die(
+		'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .
+		'<p>' . $message . '</p>',
+		403
+	);
+}
+
 
 wp_reset_vars( array( 'url', 'return', 'autofocus' ) );
 if ( ! empty( $url ) ) {
diff --git src/wp-admin/theme-install.php src/wp-admin/theme-install.php
index 43f105f377..0ede57849e 100644
--- src/wp-admin/theme-install.php
+++ src/wp-admin/theme-install.php
@@ -123,6 +123,23 @@ get_current_screen()->set_help_sidebar(
 
 include(ABSPATH . 'wp-admin/admin-header.php');
 
+$is_customize_preview_available = true;
+
+/** This filter is documented in wp-includes/class-wp-customize-manager.php */
+if ( ! apply_filters( 'customize_changeset_branching', false ) ) {
+	$is_customize_preview_available = count( get_posts( array(
+		'post_type' => 'customize_changeset',
+		'post_status' => array_diff( get_post_stati(), array( 'auto-draft', 'publish', 'trash', 'inherit', 'private' ) ),
+		'author' => 'any',
+		'posts_per_page' => 1,
+		'no_found_rows' => true,
+		'cache_results' => true,
+		'update_post_meta_cache' => false,
+		'update_post_term_cache' => false,
+		'lazy_load_term_meta' => false,
+	) ) ) === 0;
+}
+
 ?>
 <div class="wrap">
 	<h1 class="wp-heading-inline"><?php echo esc_html( $title ); ?></h1>
@@ -150,6 +167,20 @@ include(ABSPATH . 'wp-admin/admin-header.php');
 		<p><?php _e( 'The Theme Installer screen requires JavaScript.' ); ?></p>
 	</div>
 
+	<?php if ( ! $is_customize_preview_available ) : ?>
+		<div class="notice notice-info">
+			<p>
+				<?php
+				printf(
+					/* translators: %s is URL to Customizer with the Publish Settings section auto-focused */
+					__( 'Because you have drafted or scheduled changes, live previewing other themes is currently disabled. Please <a href="%s">publish your changes</a>, or wait until they publish to preview new themes. ' ),
+					add_query_arg( 'autofocus[section]', 'publish_settings', admin_url( 'customize.php' ) )
+				);
+				?>
+			</p>
+		</div>
+	<?php endif; ?>
+
 	<div class="upload-theme">
 	<?php install_themes_upload(); ?>
 	</div>
@@ -277,7 +308,7 @@ if ( $tab ) {
 				<# 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.customize_url ) { #>
+				<# if ( data.customize_url && <?php echo wp_json_encode( $is_customize_preview_available ); ?> ) { #>
 					<a class="button load-customize" href="{{ data.customize_url }}"><?php _e( 'Live Preview' ); ?></a>
 				<# } else { #>
 					<button class="button preview install-theme-preview"><?php _e( 'Preview' ); ?></button>
diff --git src/wp-admin/themes.php src/wp-admin/themes.php
index 9218983239..6ffa58659b 100644
--- src/wp-admin/themes.php
+++ src/wp-admin/themes.php
@@ -148,6 +148,24 @@ wp_enqueue_script( 'theme' );
 wp_enqueue_script( 'updates' );
 
 require_once( ABSPATH . 'wp-admin/admin-header.php' );
+
+$is_customize_preview_available = true;
+
+/** This filter is documented in wp-includes/class-wp-customize-manager.php */
+if ( ! apply_filters( 'customize_changeset_branching', false ) ) {
+	$is_customize_preview_available = count( get_posts( array(
+		'post_type' => 'customize_changeset',
+		'post_status' => array_diff( get_post_stati(), array( 'auto-draft', 'publish', 'trash', 'inherit', 'private' ) ),
+		'author' => 'any',
+		'posts_per_page' => 1,
+		'no_found_rows' => true,
+		'cache_results' => true,
+		'update_post_meta_cache' => false,
+		'update_post_term_cache' => false,
+		'lazy_load_term_meta' => false,
+	) ) ) === 0;
+}
+
 ?>
 
 <div class="wrap">
@@ -178,6 +196,22 @@ if ( ! validate_current_theme() || isset( $_GET['broken'] ) ) : ?>
 <?php
 endif;
 
+if ( ! $is_customize_preview_available ) :
+	?>
+	<div class="notice notice-info">
+		<p>
+			<?php
+			printf(
+				/* translators: %s is URL to Customizer with the Publish Settings section auto-focused */
+				__( 'Because you have drafted or scheduled changes, live previewing other themes is currently disabled. Please <a href="%s">publish your changes</a>, or wait until they publish to preview new themes. ' ),
+				add_query_arg( 'autofocus[section]', 'publish_settings', admin_url( 'customize.php' ) )
+			);
+			?>
+		</p>
+	</div>
+	<?php
+endif;
+
 $ct = wp_get_theme();
 
 if ( $ct->errors() && ( ! is_multisite() || current_user_can( 'manage_network_themes' ) ) ) {
@@ -296,7 +330,7 @@ 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 ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) { ?>
+			<?php if ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) && $is_customize_preview_available ) { ?>
 				<a class="button button-primary load-customize hide-if-no-customize" href="<?php echo $theme['actions']['customize']; ?>"><?php _e( 'Live Preview' ); ?></a>
 			<?php } ?>
 		<?php } ?>
@@ -431,7 +465,9 @@ $can_install = current_user_can( 'install_themes' );
 				$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>
+				<?php if ( $is_customize_preview_available ) : ?>
+					<a class="button button-primary load-customize hide-if-no-customize" href="{{{ data.actions.customize }}}"><?php _e( 'Live Preview' ); ?></a>
+				<?php endif; ?>
 			<# } #>
 		</div>
 	</div>
@@ -492,7 +528,9 @@ $can_install = current_user_can( 'install_themes' );
 				<# if ( data.actions.activate ) { #>
 					<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>
+				<?php if ( $is_customize_preview_available ) : ?>
+					<a href="{{{ data.actions.customize }}}" class="button button-primary load-customize hide-if-no-customize"><?php _e( 'Live Preview' ); ?></a>
+				<?php endif; ?>
 			</div>
 
 			<# if ( ! data.active && data.actions['delete'] ) { #>
diff --git src/wp-includes/class-wp-customize-manager.php src/wp-includes/class-wp-customize-manager.php
index 12256d2173..3cd93ce423 100644
--- src/wp-includes/class-wp-customize-manager.php
+++ src/wp-includes/class-wp-customize-manager.php
@@ -612,7 +612,7 @@ final class WP_Customize_Manager {
 		if ( empty( $this->_changeset_uuid ) ) {
 			$changeset_uuid = null;
 
-			if ( ! $this->branching() && $this->is_theme_active() ) {
+			if ( ! $this->branching() ) {
 				$unpublished_changeset_posts = $this->get_changeset_posts( array(
 					'post_status' => array_diff( get_post_stati(), array( 'auto-draft', 'publish', 'trash', 'inherit', 'private' ) ),
 					'exclude_restore_dismissed' => false,
@@ -782,11 +782,10 @@ final class WP_Customize_Manager {
 		 *
 		 * @since 4.9.0
 		 *
-		 * @param bool                 $allow_branching Whether branching is allowed. If `false`, the default,
-		 *                                              then only one saved changeset exists at a time.
-		 * @param WP_Customize_Manager $wp_customize    Manager instance.
+		 * @param bool $allow_branching Whether branching is allowed. If `false`, the default,
+		 *                              then only one saved changeset exists at a time.
 		 */
-		$this->branching = apply_filters( 'customize_changeset_branching', $this->branching, $this );
+		$this->branching = apply_filters( 'customize_changeset_branching', $this->branching );
 
 		return $this->branching;
 	}
diff --git tests/phpunit/tests/customize/manager.php tests/phpunit/tests/customize/manager.php
index 1152efd983..18f00afb1b 100644
--- tests/phpunit/tests/customize/manager.php
+++ tests/phpunit/tests/customize/manager.php
@@ -197,15 +197,6 @@ class Tests_WP_Customize_Manager extends WP_UnitTestCase {
 		) );
 		$this->assertNotContains( $wp_customize->changeset_uuid(), array( $uuid1, $uuid2 ) );
 		$this->assertEmpty( $wp_customize->changeset_post_id() );
-
-		// Make sure existing changeset is not autoloaded in the case of previewing a theme switch.
-		switch_theme( 'twentyseventeen' );
-		$wp_customize = new WP_Customize_Manager( array(
-			'changeset_uuid' => false, // Cause UUID to be deferred.
-			'branching' => false,
-			'theme' => 'twentyfifteen',
-		) );
-		$this->assertEmpty( $wp_customize->changeset_post_id() );
 	}
 
 	/**
