Index: src/wp-admin/css/customize-controls.css
===================================================================
--- src/wp-admin/css/customize-controls.css	(revision 41896)
+++ src/wp-admin/css/customize-controls.css	(working copy)
@@ -1761,6 +1761,14 @@
 	z-index: 20;
 }
 
+@media screen and (min-width: 1670px) {
+	.control-panel-themes .customize-themes-full-container {
+		width: 82%;
+		right: 0;
+		left: initial;
+	}
+}
+
 .modal-open .control-panel-themes .customize-themes-full-container {
 	overflow-y: visible;
 }
@@ -1835,7 +1843,7 @@
 	display: none;
 }
 
-.themes-filter-bar .filter-drawer {
+.filter-drawer {
 	box-sizing: border-box;
 	width: 100%;
 	position: absolute;
@@ -1848,7 +1856,7 @@
 	border-bottom: 1px solid #ddd;
 }
 
-.themes-filter-bar .filter-group {
+.filter-drawer .filter-group {
 	margin: 0 25px 0 0;
 	width: calc( (100% - 75px) / 3);
 	min-width: 200px;
@@ -2122,6 +2130,14 @@
 	border-bottom: 1px solid #ddd;
 }
 
+@media screen and (min-width: 1670px) {
+	.customize-preview-header.themes-filter-bar {
+		width: 82%;
+		right: 0;
+		left: initial;
+	}
+}
+
 .themes-filter-bar .themes-filter-container {
 	margin: 0;
 	padding: 0;
@@ -2149,6 +2165,9 @@
 		width: 100%;
 		margin: 0 0 25px 0;
 	}
+	.filter-drawer {
+		top: 46px;
+	}
 	.wp-customizer .theme-browser .themes {
 		padding: 0 0 25px 25px;
 		overflow: hidden;
@@ -2163,7 +2182,7 @@
 }
 
 @media screen and (max-width:1018px) {
-	.themes-filter-bar .filter-group {
+	.filter-drawer .filter-group {
 		width: calc( (100% - 50px) / 2);
 	}
 }
@@ -2180,7 +2199,7 @@
 		min-width: 200px;
 	}
 
-	.themes-filter-bar .filter-drawer {
+	.filter-drawer {
 		top: 86px;
 	}
 
@@ -2190,7 +2209,7 @@
 }
 
 @media screen and (max-width:792px) {
-	.themes-filter-bar .filter-group {
+	.filter-drawer .filter-group {
 		width: calc( 100% - 25px);
 	}
 }
@@ -2202,6 +2221,10 @@
 /* Mobile - toggle between themes and filters */
 @media screen and (max-width:600px) {
 
+	.filter-drawer {
+		top: 132px;
+	}
+
 	.wp-full-overlay.showing-themes .control-panel-themes .filter-themes-count .filter-themes {
 		display: block;
 		float: right;
Index: src/wp-admin/customize.php
===================================================================
--- src/wp-admin/customize.php	(revision 41896)
+++ src/wp-admin/customize.php	(working copy)
@@ -226,6 +226,8 @@
 	<div id="customize-preview" class="wp-full-overlay-main"></div>
 	<?php
 
+	wp_print_request_filesystem_credentials_modal();
+
 	/**
 	 * Prints templates, control scripts, and settings in the footer.
 	 *
Index: src/wp-admin/js/customize-controls.js
===================================================================
--- src/wp-admin/js/customize-controls.js	(revision 41896)
+++ src/wp-admin/js/customize-controls.js	(working copy)
@@ -1799,21 +1799,29 @@
 
 			// Toggle feature filters.
 			section.contentContainer.on( 'click', '.feature-filter-toggle', function( e ) {
-				$( e.currentTarget )
+				var $themeContainer = $( '.customize-themes-full-container' ),
+					$filterToggle = $( e.currentTarget );
+				section.filtersHeight = $filterToggle.parent().next( '.filter-drawer' ).height();
+
+				if ( 0 < $themeContainer.scrollTop() ) {
+					$themeContainer.animate( { scrollTop: 0 }, 400 );
+
+					if ( $filterToggle.hasClass( 'open' ) ) {
+						return;
+					}
+				}
+
+				$filterToggle
 					.toggleClass( 'open' )
 					.attr( 'aria-expanded', function( i, attr ) {
 						return 'true' === attr ? 'false' : 'true';
 					})
-					.next( '.filter-drawer' ).slideToggle( 180, 'linear', function() {
-						if ( 0 === section.filtersHeight ) {
-							section.filtersHeight = $( this ).height();
+					.parent().next( '.filter-drawer' ).slideToggle( 180, 'linear' );
 
-							// First time, so it's opened.
-							section.contentContainer.find( '.themes' ).css( 'margin-top', section.filtersHeight + 76 );
-						}
-					});
-				if ( $( e.currentTarget ).hasClass( 'open' ) ) {
-					section.contentContainer.find( '.themes' ).css( 'margin-top', section.filtersHeight + 76 );
+				if ( $filterToggle.hasClass( 'open' ) ) {
+					var marginOffset = 1018 < window.innerWidth ? 50 : 76;
+
+					section.contentContainer.find( '.themes' ).css( 'margin-top', section.filtersHeight + marginOffset );
 				} else {
 					section.contentContainer.find( '.themes' ).css( 'margin-top', 0 );
 				}
Index: src/wp-includes/customize/class-wp-customize-themes-section.php
===================================================================
--- src/wp-includes/customize/class-wp-customize-themes-section.php	(revision 41896)
+++ src/wp-includes/customize/class-wp-customize-themes-section.php	(working copy)
@@ -80,6 +80,9 @@
 					<div class="customize-preview-header themes-filter-bar">
 						<?php $this->filter_bar_content_template(); ?>
 					</div>
+					<# if ( 'wporg' === data.action ) { #>
+						<?php $this->filter_drawer_content_template(); ?>
+					<# } #>
 					<div class="error unexpected-error" style="display: none; "><p><?php _e( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="https://wordpress.org/support/">support forums</a>.' ); ?></p></div>
 					<ul class="themes">
 					</ul>
@@ -125,22 +128,6 @@
 				?>
 				</span>
 			</button>
-			<div class="filter-drawer filter-details">
-				<?php
-				$feature_list = get_theme_feature_list( false ); // @todo: Use the .org API instead of the local core feature list. The .org API is currently outdated and will be reconciled when the .org themes directory is next redesigned.
-				foreach ( $feature_list as $feature_name => $features ) {
-					echo '<fieldset class="filter-group">';
-					echo '<legend>' . esc_html( $feature_name ) . '</legend>';
-					echo '<div class="filter-group-feature">';
-					foreach ( $features as $feature => $feature_name ) {
-						echo '<input type="checkbox" id="filter-id-' . esc_attr( $feature ) . '" value="' . esc_attr( $feature ) . '" /> ';
-						echo '<label for="filter-id-' . esc_attr( $feature ) . '">' . esc_html( $feature_name ) . '</label><br>';
-					}
-					echo '</div>';
-					echo '</fieldset>';
-				}
-				?>
-			</div>
 		<# } else { #>
 			<div class="themes-filter-container">
 				<label for="{{ data.id }}-themes-filter" class="screen-reader-text"><?php _e( 'Search themes&hellip;' ); ?></label>
@@ -159,4 +146,31 @@
 		</div>
 		<?php
 	}
+
+	/**
+	 * Render the filter drawer portion of a themes section as a JS template.
+	 *
+	 * The template is only rendered by PHP once, so all actions are prepared at once on the server side.
+	 * The filter bar container is rendered by @see `render_template()`.
+	 *
+	 * @since 4.9.0
+	 */
+	protected function filter_drawer_content_template() {
+		$feature_list = get_theme_feature_list( false ); // @todo: Use the .org API instead of the local core feature list. The .org API is currently outdated and will be reconciled when the .org themes directory is next redesigned.
+		?>
+		<div class="filter-drawer filter-details">
+			<?php foreach ( $feature_list as $feature_name => $features ) : ?>
+				<fieldset class="filter-group">
+					<legend><?php echo esc_html( $feature_name ); ?></legend>
+					<div class="filter-group-feature">
+						<?php foreach ( $features as $feature => $feature_name ) : ?>
+							<input type="checkbox" id="filter-id-<?php echo esc_attr( $feature ); ?>" value="<?php echo esc_attr( $feature ); ?>" />
+							<label for="filter-id-<?php echo esc_attr( $feature ); ?>"><?php echo esc_html( $feature_name ); ?></label><br>
+						<?php endforeach; ?>
+					</div>
+				</fieldset>
+			<?php endforeach; ?>
+		</div>
+		<?php
+	}
 }
