diff --git a/src/wp-admin/css/themes.css b/src/wp-admin/css/themes.css
index 565f2fa..fc39880 100644
--- a/src/wp-admin/css/themes.css
+++ b/src/wp-admin/css/themes.css
@@ -1357,6 +1357,13 @@ body.full-overlay-active {
 	height: 100%;
 }
 
+#customize-preview.wp-full-overlay-main {
+	background: url(../images/spinner.gif) no-repeat;
+	-webkit-background-size: 20px 20px;
+	background-size: 20px 20px;
+	background-position: center center;
+}
+
 .wp-full-overlay-sidebar .wp-full-overlay-header {
 	position: absolute;
 	left: 0;
diff --git a/src/wp-admin/js/customize-controls.js b/src/wp-admin/js/customize-controls.js
index 7c4a631..af9d886 100644
--- a/src/wp-admin/js/customize-controls.js
+++ b/src/wp-admin/js/customize-controls.js
@@ -1769,6 +1769,9 @@
 		refresh: function() {
 			var self = this;
 
+			// Display loading indicator
+			this.send( 'loading' );
+
 			this.abort();
 
 			this.loading = new api.PreviewFrame({
diff --git a/src/wp-includes/class-wp-customize-manager.php b/src/wp-includes/class-wp-customize-manager.php
index b695271..7958c89 100644
--- a/src/wp-includes/class-wp-customize-manager.php
+++ b/src/wp-includes/class-wp-customize-manager.php
@@ -432,6 +432,7 @@ final class WP_Customize_Manager {
 		add_action( 'wp', array( $this, 'customize_preview_override_404_status' ) );
 		add_action( 'wp_head', array( $this, 'customize_preview_base' ) );
 		add_action( 'wp_head', array( $this, 'customize_preview_html5' ) );
+		add_action( 'wp_head', array( $this, 'customize_preview_loading_style' ) );
 		add_action( 'wp_footer', array( $this, 'customize_preview_settings' ), 20 );
 		add_action( 'shutdown', array( $this, 'customize_preview_signature' ), 1000 );
 		add_filter( 'wp_die_handler', array( $this, 'remove_preview_signature' ) );
@@ -491,6 +492,18 @@ final class WP_Customize_Manager {
 		<![endif]--><?php
 	}
 
+	public function customize_preview_loading_style() {
+		?><style>
+			body.customizer-navigating-away {
+				opacity: 0.25;
+				cursor: progress !important;
+			}
+			body.customizer-navigating-away * {
+				pointer-events: none !important;
+			}
+		</style><?php
+	}
+
 	/**
 	 * Print JavaScript settings for preview frame.
 	 *
@@ -503,6 +516,9 @@ final class WP_Customize_Manager {
 			'activePanels' => array(),
 			'activeSections' => array(),
 			'activeControls' => array(),
+			'l10n' => array(
+				'loading'  => __( 'Loading ...' ),
+			),
 		);
 
 		if ( 2 == $this->nonce_tick ) {
diff --git a/src/wp-includes/js/customize-preview.js b/src/wp-includes/js/customize-preview.js
index 82f7bb8..d095fbf 100644
--- a/src/wp-includes/js/customize-preview.js
+++ b/src/wp-includes/js/customize-preview.js
@@ -115,6 +115,12 @@
 			activeControls: api.settings.activeControls
 		} );
 
+		// Display a loading indicator when preview is reloading
+		api.preview.bind( 'loading', function () {
+			$( 'body' ).addClass( 'customizer-navigating-away' );
+			$( 'html' ).prop( 'title', api.settings.l10n.loading );
+		});
+
 		/* Custom Backgrounds */
 		bg = $.map(['color', 'image', 'position_x', 'repeat', 'attachment'], function( prop ) {
 			return 'background_' + prop;
-- 
2.2.2

