Index: src/wp-admin/css/customize-controls.css
===================================================================
--- src/wp-admin/css/customize-controls.css	(revision 28772)
+++ src/wp-admin/css/customize-controls.css	(working copy)
@@ -32,6 +32,11 @@
 	display: block;
 }
 
+#customize-controls .wp-full-overlay-sidebar-content {
+	overflow-y: auto;
+	overflow-x: hidden;
+}
+
 #customize-info {
 	border: none;
 	border-top: 1px solid #ddd;
@@ -103,7 +108,7 @@
 	background: white;
 }
 
-#customize-theme-controls .control-section:hover .accordion-section-title,
+#customize-theme-controls .control-section:hover > .accordion-section-title,
 #customize-theme-controls .control-section .accordion-section-title:hover,
 #customize-theme-controls .control-section.open .accordion-section-title,
 #customize-theme-controls .control-section .accordion-section-title:focus {
@@ -118,7 +123,7 @@
 	background: #f5f5f5;
 }
 
-#customize-theme-controls .control-section:hover .accordion-section-title::after,
+#customize-theme-controls .control-section:hover > .accordion-section-title::after,
 #customize-theme-controls .control-section .accordion-section-title:hover::after,
 #customize-theme-controls .control-section.open .accordion-section-title::after,
 #customize-theme-controls .control-section .accordion-section-title:focus::after {
@@ -143,6 +148,118 @@
 	margin: 0;
 }
 
+.control-section.control-page > .accordion-section-title:after {
+	content: "\f139";
+}
+
+.current-page > .accordion-section-title {
+	display: none;
+}
+
+.accordion-sub-container.control-page-content {
+	display: none;
+	position: relative;
+	left: 300px;
+	top: 0;
+	width: 300px;
+	border-top: 1px solid #ddd;
+	transition: left ease-in-out .18s;
+}
+
+.current-page .accordion-sub-container.control-page-content {
+	width: 100%;
+	left: 0;
+}
+
+.control-page-back {
+	display: block;
+	position: fixed;
+	top: 0;
+	z-index: 99;
+	left: -48px;
+	width: 45px;
+	height: 45px;
+	padding-right: 2px;
+	background: #eee;
+	border-right: 1px solid #ddd;
+	cursor: pointer;
+	transition: left ease-in-out .18s, color ease-in .1s;
+}
+
+.control-page-back:focus,
+.control-page-back:hover {
+	background: #0074a2;
+	color: #fff;
+	outline: none;
+}
+
+.control-page-back:before {
+	font: normal 29px/1 dashicons;
+	content: "\f340";
+	position: relative;
+	top: 9px;
+	left: 9px;
+}
+
+.current-page .control-page-back {
+	left: 0;
+}
+
+.wp-full-overlay-sidebar .wp-full-overlay-header {
+	transition: padding ease-in-out .18s;
+}
+
+.in-page .wp-full-overlay-sidebar .wp-full-overlay-header {
+	padding-left: 62px;
+}
+
+#customize-info,
+#customize-theme-controls > ul > .accordion-section {
+	position: relative;
+	left: 0;
+	transition: left ease-in-out .18s;
+}
+
+.in-page #customize-info,
+.in-page #customize-theme-controls > ul > .accordion-section {
+	left: -300px;
+	width: 300px;
+}
+
+.in-page .accordion-section.current-page {
+	left: 0;
+}
+
+.in-page #customize-theme-controls .accordion-section.current-page {
+	position: absolute;
+	left: 0;
+	top: 0;
+	width: 100%;
+}
+
+#customize-theme-controls .control-section.current-page {
+	padding: 0;
+}
+
+#customize-theme-controls .control-section.current-page > h3.accordion-section-title {
+	position: relative;
+	left: -300px;
+	width: 300px;
+}
+
+.control-section.current-page .accordion-section-title .page-title {
+	font-size: 20px;
+	font-weight: 200;
+	line-height: 24px;
+	display: block;
+	border: none;
+}
+
+.control-section.control-page.current-page .preview-notice {
+	font-size: 13px;
+	line-height: 24px;
+}
+
 .customize-control {
 	width: 100%;
 	float: left;
Index: src/wp-admin/customize.php
===================================================================
--- src/wp-admin/customize.php	(revision 28772)
+++ src/wp-admin/customize.php	(working copy)
@@ -142,8 +142,12 @@
 
 			<div id="customize-theme-controls"><ul>
 				<?php
-				foreach ( $wp_customize->sections() as $section )
+				foreach ( $wp_customize->pages() as $page ) {
+					$page->maybe_render();
+				}
+				foreach ( $wp_customize->sections() as $section ) {
 					$section->maybe_render();
+				}
 				?>
 			</ul></div>
 		</div>
Index: src/wp-admin/js/accordion.js
===================================================================
--- src/wp-admin/js/accordion.js	(revision 28772)
+++ src/wp-admin/js/accordion.js	(working copy)
@@ -11,6 +11,15 @@
 			accordionSwitch( $( this ) );
 		});
 
+		// Back to top-level of pages
+		$( '.accordion-container' ).on( 'click keydown', '.control-page-back', function( e ) {
+			if ( e.type === 'keydown' && 13 !== e.which ) // "return" key
+					return;
+			e.preventDefault(); // Keep this AFTER the key filter above
+
+			pageSwitch( $( this ) );
+		});
+
 		// Re-initialize accordion when screen options are toggled
 		$( '.hide-postbox-tog' ).click( function () {
 			accordionInit();
@@ -36,6 +45,11 @@
 		if ( section.hasClass( 'cannot-expand' ) )
 			return;
 
+		if ( section.hasClass( 'control-page' ) ) {
+			pageSwitch( section );
+			return;
+		}
+
 		if ( section.hasClass( 'open' ) ) {
 			section.toggleClass( 'open' );
 			content.toggle( true ).slideToggle( 150 );
@@ -49,6 +63,25 @@
 		accordionInit();
 	}
 
+	function pageSwitch( page ) {
+		var section = page.closest( '.accordion-section' ),
+			container = section.closest( '.wp-full-overlay' );
+			siblings = container.find( '.accordion-section.open' );
+			content = section.find( '.control-page-content' );
+
+		if ( section.hasClass( 'current-page' ) ) {
+			section.toggleClass( 'current-page' );
+			container.toggleClass( 'in-page' );
+			content.hide();
+		} else {
+			siblings.removeClass( 'open' );
+			content.show( 0, function() {
+				section.toggleClass( 'current-page' );
+				container.toggleClass( 'in-page' );
+			} );
+		}
+	}
+
 	// Initialize the accordion (currently just corner fixes)
 	accordionInit();
 
Index: src/wp-includes/class-wp-customize-manager.php
===================================================================
--- src/wp-includes/class-wp-customize-manager.php	(revision 28772)
+++ src/wp-includes/class-wp-customize-manager.php	(working copy)
@@ -45,6 +45,7 @@
 	public $widgets;
 
 	protected $settings = array();
+	protected $pages    = array();
 	protected $sections = array();
 	protected $controls = array();
 
@@ -315,6 +316,17 @@
 	}
 
 	/**
+	 * Get the registered pages.
+	 *
+	 * @since 4.0.0
+	 *
+	 * @return array
+	 */
+	public function pages() {
+		return $this->pages;
+	}
+
+	/**
 	 * Checks if the current theme is active.
 	 *
 	 * @since 3.4.0
@@ -648,6 +660,50 @@
 	}
 
 	/**
+	 * Add a customize page.
+	 *
+	 * @since 4.0.0
+	 *
+	 * @param WP_Customize_Page|string $id   Customize Page object, or Page ID.
+	 * @param array                    $args Page arguments.
+	 */
+	public function add_page( $id, $args = array() ) {
+		if ( is_a( $id, 'WP_Customize_Page' ) ) {
+			$page = $id;
+		}
+		else {
+			$page = new WP_Customize_Page( $this, $id, $args );
+		}
+
+		$this->pages[ $page->id ] = $page;
+	}
+
+	/**
+	 * Retrieve a customize page.
+	 *
+	 * @since 4.0.0
+	 *
+	 * @param string $id Page ID.
+	 * @return WP_Customize_Page
+	 */
+	public function get_page( $id ) {
+		if ( isset( $this->pages[ $id ] ) ) {
+			return $this->pages[ $id ];
+		}
+	}
+
+	/**
+	 * Remove a customize page.
+	 *
+	 * @since 4.0.0
+	 *
+	 * @param string $id Page ID.
+	 */
+	public function remove_page( $id ) {
+		unset( $this->pages[ $id ] );
+	}
+
+	/**
 	 * Add a customize section.
 	 *
 	 * @since 3.4.0
@@ -749,7 +805,7 @@
 	}
 
 	/**
-	 * Prepare settings and sections.
+	 * Prepare pages, sections, and controls.
 	 *
 	 * For each, check if required related components exist,
 	 * whether the user has the necessary capabilities,
@@ -763,8 +819,9 @@
 		$controls = array();
 
 		foreach ( $this->controls as $id => $control ) {
-			if ( ! isset( $this->sections[ $control->section ] ) || ! $control->check_capabilities() )
+			if ( ! isset( $this->sections[ $control->section ] ) || ! $control->check_capabilities() ) {
 				continue;
+			}
 
 			$this->sections[ $control->section ]->controls[] = $control;
 			$controls[ $id ] = $control;
@@ -778,13 +835,37 @@
 		$sections = array();
 
 		foreach ( $this->sections as $section ) {
-			if ( ! $section->check_capabilities() || ! $section->controls )
+			if ( ! $section->check_capabilities() || ! $section->controls ) {
 				continue;
+			}
 
 			usort( $section->controls, array( $this, '_cmp_priority' ) );
-			$sections[] = $section;
+
+			if ( ! $section->page ) {
+				// Top-level section.
+				$sections[] = $section;
+			} else {
+				// This section belongs to a page.
+				$this->pages[ $section->page ]->sections[] = $section;
+			}
 		}
 		$this->sections = $sections;
+
+		// Prepare pages.
+		// Reversing makes uasort sort by time added when conflicts occur.
+		$this->pages = array_reverse( $this->pages );
+		uasort( $this->pages, array( $this, '_cmp_priority' ) );
+		$pages = array();
+
+		foreach ( $this->pages as $page ) {
+			if ( ! $page->check_capabilities() || ! $page->sections ) {
+				continue;
+			}
+
+			usort( $page->sections, array( $this, '_cmp_priority' ) );
+			$pages[] = $page;
+		}
+		$this->pages = $pages;
 	}
 
 	/**
Index: src/wp-includes/class-wp-customize-section.php
===================================================================
--- src/wp-includes/class-wp-customize-section.php	(revision 28772)
+++ src/wp-includes/class-wp-customize-section.php	(working copy)
@@ -38,6 +38,15 @@
 	public $priority = 10;
 
 	/**
+	 * Page in which to show the section, making it a sub-section.
+	 *
+	 * @since 4.0.0
+	 * @access public
+	 * @var string
+	 */
+	public $page = '';
+
+	/**
 	 * Capability required for the section.
 	 *
 	 * @since 3.4.0
@@ -162,8 +171,12 @@
 	 * @since 3.4.0
 	 */
 	protected function render() {
+		$classes = 'control-section accordion-section';
+		if ( $this->page ) {
+			$classes .= ' control-subsection in-page-' . $this->page;
+		}
 		?>
-		<li id="accordion-section-<?php echo esc_attr( $this->id ); ?>" class="control-section accordion-section">
+		<li id="accordion-section-<?php echo esc_attr( $this->id ); ?>" class="<?php echo esc_attr( $classes ); ?>">
 			<h3 class="accordion-section-title" tabindex="0"><?php echo esc_html( $this->title ); ?></h3>
 			<ul class="accordion-section-content">
 				<?php if ( ! empty( $this->description ) ) : ?>
@@ -178,3 +191,76 @@
 		<?php
 	}
 }
+
+/**
+ * Customize Page Class.
+ *
+ * A UI container for sections, managed by the WP_Customize_Manager.
+ *
+ * @package WordPress
+ * @subpackage Customize
+ * @since 4.0.0
+ */
+class WP_Customize_Page extends WP_Customize_Section {
+
+	/**
+	 * Customizer sections for this page.
+	 *
+	 * @since 4.0.0
+	 * @access public
+	 * @var array
+	 */
+	public $sections;
+
+	/**
+	 * Constructor.
+	 *
+	 * Any supplied $args override class property defaults.
+	 *
+	 * @since 4.0.0
+	 *
+	 * @param WP_Customize_Manager $manager Customizer bootstrap instance.
+	 * @param string               $id      An specific ID of the section.
+	 * @param array                $args    Section arguments.
+	 */
+	public function __construct( $manager, $id, $args = array() ) {
+		parent::__construct( $manager, $id, $args );
+
+		$this->sections = array(); // Users cannot customize the $sections array.
+
+		return $this;
+	}
+
+	/**
+	 * Render the page, and the sections that have been added to it.
+	 *
+	 * @since 4.0.0
+	 */
+	protected function render() {
+		?>
+		<li id="accordion-section-<?php echo esc_attr( $this->id ); ?>" class="control-section control-page accordion-section">
+			<h3 class="accordion-section-title" tabindex="0"><?php echo esc_html( $this->title ); ?></h3>
+			<span class="control-page-back" tabindex="0"><span class="screen-reader-text">Back to Customize</span></span>
+			<ul class="accordion-sub-container control-page-content">
+				<li class="accordion-section control-section<?php if ( empty( $this->description ) ) echo ' cannot-expand'; ?>">
+					<div class="accordion-section-title" tabindex="0">
+						<span class="preview-notice"><?php _e( 'You are editing your site&#8217;s' ); ?>
+							<strong class="page-title"><?php echo esc_html( $this->title ); ?></strong>
+						</span>
+					</div>
+					<?php if ( ! empty( $this->description ) ) : ?>
+						<div class="accordion-section-content description">
+							<?php echo $this->description; ?>
+						</div>
+					<?php endif; ?>
+				</li>
+				<?php
+				foreach ( $this->sections as $section ) {
+					$section->maybe_render();
+				}
+				?>
+			</ul>
+		</li>
+		<?php
+	}
+}
Index: src/wp-includes/class-wp-customize-widgets.php
===================================================================
--- src/wp-includes/class-wp-customize-widgets.php	(revision 28772)
+++ src/wp-includes/class-wp-customize-widgets.php	(working copy)
@@ -433,6 +433,10 @@
 			$this->manager->add_setting( $setting_id, $setting_args );
 		}
 
+		$this->manager->add_page( 'widgets', array(
+			'title' => __( 'Widgets' ),
+		) );
+
 		foreach ( $sidebars_widgets as $sidebar_id => $sidebar_widget_ids ) {
 			if ( empty( $sidebar_widget_ids ) ) {
 				$sidebar_widget_ids = array();
@@ -458,10 +462,10 @@
 				if ( $is_active_sidebar ) {
 
 					$section_args = array(
-						/* translators: %s: sidebar name */
-						'title' => sprintf( __( 'Widgets: %s' ), $GLOBALS['wp_registered_sidebars'][$sidebar_id]['name'] ),
-						'description' => $GLOBALS['wp_registered_sidebars'][$sidebar_id]['description'],
+						'title' => $GLOBALS['wp_registered_sidebars'][ $sidebar_id ]['name'],
+						'description' => $GLOBALS['wp_registered_sidebars'][ $sidebar_id ]['description'],
 						'priority' => 1000 + array_search( $sidebar_id, array_keys( $wp_registered_sidebars ) ),
+						'page' => 'widgets',
 					);
 
 					/**
