Index: src/wp-admin/customize.php
===================================================================
--- src/wp-admin/customize.php	(revision 37280)
+++ src/wp-admin/customize.php	(working copy)
@@ -112,67 +112,69 @@
 <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() ? __( 'Save &amp; Publish' ) : __( 'Save &amp; Activate' );
-			submit_button( $save_text, 'primary save', 'save', false );
-			?>
-			<span class="spinner"></span>
-			<button type="button" class="customize-controls-preview-toggle">
-				<span class="controls"><?php _e( 'Customize' ); ?></span>
-				<span class="preview"><?php _e( 'Preview' ); ?></span>
-			</button>
-			<a class="customize-controls-close" href="<?php echo esc_url( $wp_customize->get_return_url() ); ?>">
-				<span class="screen-reader-text"><?php _e( 'Close the Customizer and go back to the previous page' ); ?></span>
-			</a>
-		</div>
+		<fieldset>
+			<div id="customize-header-actions" class="wp-full-overlay-header">
+				<?php
+				$save_text = $wp_customize->is_theme_active() ? __( 'Save &amp; Publish' ) : __( 'Save &amp; Activate' );
+				submit_button( $save_text, 'primary save', 'save', false );
+				?>
+				<span class="spinner"></span>
+				<button type="button" class="customize-controls-preview-toggle">
+					<span class="controls"><?php _e( 'Customize' ); ?></span>
+					<span class="preview"><?php _e( 'Preview' ); ?></span>
+				</button>
+				<a class="customize-controls-close" href="<?php echo esc_url( $wp_customize->get_return_url() ); ?>">
+					<span class="screen-reader-text"><?php _e( 'Close the Customizer and go back to the previous page' ); ?></span>
+				</a>
+			</div>
 
-		<div id="widgets-right" class="wp-clearfix"><!-- For Widget Customizer, many widgets try to look for instances under div#widgets-right, so we have to add that ID to a container div in the Customizer for compat -->
-		<div class="wp-full-overlay-sidebar-content" tabindex="-1">
-			<div id="customize-info" class="accordion-section customize-info">
-				<div class="accordion-section-title">
-					<span class="preview-notice"><?php
-						echo sprintf( __( 'You are customizing %s' ), '<strong class="panel-title site-title">' . get_bloginfo( 'name' ) . '</strong>' );
-					?></span>
-					<button type="button" class="customize-help-toggle dashicons dashicons-editor-help" aria-expanded="false"><span class="screen-reader-text"><?php _e( 'Help' ); ?></span></button>
+			<div id="widgets-right" class="wp-clearfix"><!-- For Widget Customizer, many widgets try to look for instances under div#widgets-right, so we have to add that ID to a container div in the Customizer for compat -->
+			<div class="wp-full-overlay-sidebar-content" tabindex="-1">
+				<div id="customize-info" class="accordion-section customize-info">
+					<div class="accordion-section-title">
+						<span class="preview-notice"><?php
+							echo sprintf( __( 'You are customizing %s' ), '<strong class="panel-title site-title">' . get_bloginfo( 'name' ) . '</strong>' );
+						?></span>
+						<button type="button" class="customize-help-toggle dashicons dashicons-editor-help" aria-expanded="false"><span class="screen-reader-text"><?php _e( 'Help' ); ?></span></button>
+					</div>
+					<div class="customize-panel-description"><?php
+						_e( 'The Customizer allows you to preview changes to your site before publishing them. You can also navigate to different pages on your site to preview them.' );
+					?></div>
 				</div>
-				<div class="customize-panel-description"><?php
-					_e( 'The Customizer allows you to preview changes to your site before publishing them. You can also navigate to different pages on your site to preview them.' );
-				?></div>
-			</div>
 
-			<div id="customize-theme-controls">
-				<ul><?php // Panels and sections are managed here via JavaScript ?></ul>
+				<div id="customize-theme-controls">
+					<ul><?php // Panels and sections are managed here via JavaScript ?></ul>
+				</div>
 			</div>
-		</div>
-		</div>
+			</div>
 
-		<div id="customize-footer-actions" class="wp-full-overlay-footer">
-			<?php $previewable_devices = $wp_customize->get_previewable_devices(); ?>
-			<?php if ( ! empty( $previewable_devices ) ) : ?>
-			<div class="devices">
-				<?php foreach ( (array) $previewable_devices as $device => $settings ) : ?>
-					<?php
-					if ( empty( $settings['label'] ) ) {
-						continue;
-					}
-					$active = ! empty( $settings['default'] );
-					$class = 'preview-' . $device;
-					if ( $active ) {
-						$class .= ' active';
-					}
-					?>
-					<button type="button" class="<?php echo esc_attr( $class ); ?>" aria-pressed="<?php echo esc_attr( $active ) ?>" data-device="<?php echo esc_attr( $device ); ?>">
-						<span class="screen-reader-text"><?php echo esc_html( $settings['label'] ); ?></span>
-					</button>
-				<?php endforeach; ?>
+			<div id="customize-footer-actions" class="wp-full-overlay-footer">
+				<?php $previewable_devices = $wp_customize->get_previewable_devices(); ?>
+				<?php if ( ! empty( $previewable_devices ) ) : ?>
+				<div class="devices">
+					<?php foreach ( (array) $previewable_devices as $device => $settings ) : ?>
+						<?php
+						if ( empty( $settings['label'] ) ) {
+							continue;
+						}
+						$active = ! empty( $settings['default'] );
+						$class = 'preview-' . $device;
+						if ( $active ) {
+							$class .= ' active';
+						}
+						?>
+						<button type="button" class="<?php echo esc_attr( $class ); ?>" aria-pressed="<?php echo esc_attr( $active ) ?>" data-device="<?php echo esc_attr( $device ); ?>">
+							<span class="screen-reader-text"><?php echo esc_html( $settings['label'] ); ?></span>
+						</button>
+					<?php endforeach; ?>
+				</div>
+				<?php endif; ?>
+				<button type="button" class="collapse-sidebar button-secondary" aria-expanded="true" aria-label="<?php esc_attr_e( 'Collapse Sidebar' ); ?>">
+					<span class="collapse-sidebar-arrow"></span>
+					<span class="collapse-sidebar-label"><?php _e( 'Collapse' ); ?></span>
+				</button>
 			</div>
-			<?php endif; ?>
-			<button type="button" class="collapse-sidebar button-secondary" aria-expanded="true" aria-label="<?php esc_attr_e( 'Collapse Sidebar' ); ?>">
-				<span class="collapse-sidebar-arrow"></span>
-				<span class="collapse-sidebar-label"><?php _e( 'Collapse' ); ?></span>
-			</button>
-		</div>
+		</fieldset>
 	</form>
 	<div id="customize-preview" class="wp-full-overlay-main"></div>
 	<?php
Index: src/wp-admin/js/customize-controls.js
===================================================================
--- src/wp-admin/js/customize-controls.js	(revision 37280)
+++ src/wp-admin/js/customize-controls.js	(working copy)
@@ -3338,6 +3338,9 @@
 					} );
 					request = wp.ajax.post( 'customize_save', query );
 
+					//Add disbaled state to fieldset element.
+					$( "#customize-controls > fieldset" ).prop( 'disabled', true );
+
 					api.trigger( 'save', request );
 
 					request.always( function () {
@@ -3362,6 +3365,11 @@
 							} );
 						}
 						api.trigger( 'error', response );
+
+						//Remove disbaled state from fieldset element.
+						if( $( "#customize-controls > fieldset" ).prop( 'disabled' ) ) {
+							$( "#customize-controls > fieldset" ).prop( 'disabled', false );
+						}
 					} );
 
 					request.done( function( response ) {
@@ -3373,6 +3381,11 @@
 						api.previewer.send( 'saved', response );
 
 						api.trigger( 'saved', response );
+
+						//Remove disbaled state from fieldset element.
+						if( $( "#customize-controls > fieldset" ).prop( 'disabled' ) ) {
+							$( "#customize-controls > fieldset" ).prop( 'disabled', false );
+						}
 					} );
 				};
 
