Index: src/wp-admin/admin-ajax.php
===================================================================
--- src/wp-admin/admin-ajax.php	(revision 29136)
+++ src/wp-admin/admin-ajax.php	(working copy)
@@ -60,7 +60,8 @@
 	'wp-remove-post-lock', 'dismiss-wp-pointer', 'upload-attachment', 'get-attachment',
 	'query-attachments', 'save-attachment', 'save-attachment-compat', 'send-link-to-editor',
 	'send-attachment-to-editor', 'save-attachment-order', 'heartbeat', 'get-revision-diffs',
-	'save-user-color-scheme', 'update-widget', 'query-themes', 'parse-embed', 'set-attachment-thumbnail'
+	'save-user-color-scheme', 'update-widget', 'query-themes', 'query-plugins', 'parse-embed', 
+	'set-attachment-thumbnail'
 );
 
 // Register core Ajax calls.
@@ -73,6 +74,7 @@
 add_action( 'wp_ajax_nopriv_heartbeat', 'wp_ajax_nopriv_heartbeat', 1 );
 
 if ( is_user_logged_in() ) {
+
 	/**
 	 * Fires authenticated AJAX actions for logged-in users.
 	 *
Index: src/wp-admin/css/colors/_admin.scss
===================================================================
--- src/wp-admin/css/colors/_admin.scss	(revision 29136)
+++ src/wp-admin/css/colors/_admin.scss	(working copy)
@@ -434,31 +434,6 @@
 	background: $highlight-color;
 }
 
-.theme-section.current,
-.theme-filter.current {
-	border-bottom-color: $menu-background;
-}
-
-body.more-filters-opened .more-filters {
-	color: $menu-text;
-	background-color: $menu-background;
-}
-
-body.more-filters-opened .more-filters:before {
-	color: $menu-text;
-}
-
-body.more-filters-opened .more-filters:hover,
-body.more-filters-opened .more-filters:focus {
-	background-color: $menu-highlight-background;
-	color: $menu-highlight-text;
-}
-
-body.more-filters-opened .more-filters:hover:before,
-body.more-filters-opened .more-filters:focus:before {
-	color: $menu-highlight-text;
-}
-
 .theme-install-overlay .close-full-overlay:hover,
 .theme-install-overlay .close-full-overlay:focus,
 .theme-install-overlay .previous-theme:hover,
@@ -469,6 +444,31 @@
 	color: $menu-highlight-text;
 }
 
+/* Filter */
+
+.wp-filter-link.current {
+	border-bottom-color: $menu-background;
+}
+
+body.show-filter-drawer {
+	.wp-filter-drawer-toggle {
+		background-color: $menu-background;
+		color: $menu-text;
+	}
+	.wp-filter-drawer-toggle:before {
+		color: $menu-text;
+	}
+	.wp-filter-drawer-toggle:hover,
+	.wp-filter-drawer-toggle:focus {
+		background-color: $menu-highlight-background;
+		color: $menu-highlight-text;	
+	}
+	.wp-filter-drawer-toggle:hover:before,
+	.wp-filter-drawer-toggle:focus:before {
+		color: $menu-highlight-text;	
+	}
+}
+
 /* Widgets */
 
 .widgets-chooser li.widgets-chooser-selected {
@@ -529,7 +529,8 @@
 	background: $menu-highlight-background;
 }
 
-.star-rating .star {
+.star-rating .star,
+.rating span:before {
 	color: $highlight-color;
 }
 
Index: src/wp-admin/css/common.css
===================================================================
--- src/wp-admin/css/common.css	(revision 29136)
+++ src/wp-admin/css/common.css	(working copy)
@@ -627,6 +627,21 @@
 	padding-right: 0;
 }
 
+.wp-title-count {
+	display: inline;
+	padding: 4px 10px;
+	-webkit-border-radius: 30px;
+	border-radius: 30px;
+	background: #777;
+	font-size: 14px;
+	font-weight: 600;
+	color: #fff;
+	position: relative;
+	top: -3px;
+	margin-left: 5px;
+	margin-right: 20px;
+}
+
 .wp-dialog {
 	background-color: #fff;
 }
@@ -1800,6 +1815,65 @@
 	margin: 6px 0 0;
 }
 
+.rating span:before {
+	content: "\f154";
+	display: inline-block;
+	-webkit-font-smoothing: antialiased;
+	font: normal 20px/1 'dashicons';
+	vertical-align: top;
+	color: #0074a2;
+}
+/* Half stars */
+.rating-10 span.one:before,
+.rating-30 span.two:before,
+.rating-50 span.three:before,
+.rating-70 span.four:before,
+.rating-90 span.five:before {
+	content: "\f459";
+}
+/* Full stars */
+.rating-20 span.one:before {
+	content: "\f155";
+}
+.rating-30 span.one:before,
+.rating-40 span.one:before,
+.rating-40 span.two:before {
+	content: "\f155";
+}
+.rating-50 span.one:before,
+.rating-50 span.two:before,
+.rating-60 span.one:before,
+.rating-60 span.two:before,
+.rating-60 span.three:before {
+	content: "\f155";
+}
+.rating-70 span.one:before,
+.rating-70 span.two:before,
+.rating-70 span.three:before,
+.rating-80 span.one:before,
+.rating-80 span.two:before,
+.rating-80 span.three:before,
+.rating-80 span.four:before {
+	content: "\f155";
+}
+.rating-90 span.one:before,
+.rating-90 span.two:before,
+.rating-90 span.three:before,
+.rating-90 span.four:before,
+.rating-100 span.one:before,
+.rating-100 span.two:before,
+.rating-100 span.three:before,
+.rating-100 span.four:before,
+.rating-100 span.five:before {
+	content: "\f155";
+}
+.rating .ratings {
+	display: inline;
+	margin-left: 10px;
+	line-height: 20px;
+	color: #999;
+}
+
 /* Plugin install thickbox */
 #plugin-information {
 	background: #fcfcfc;
Index: src/wp-admin/css/forms.css
===================================================================
--- src/wp-admin/css/forms.css	(revision 29136)
+++ src/wp-admin/css/forms.css	(working copy)
@@ -751,9 +751,70 @@
 	margin: -3px 3px;
 }
 
+/*------------------------------------------------------------------------------
+  21.0 - Upload File
+------------------------------------------------------------------------------*/
+
+.wp-upload-container {
+	-webkit-box-sizing: border-box;
+	-moz-box-sizing: border-box;
+	box-sizing: border-box;
+	margin: 0px 0 0;
+	padding: 0;
+	width: 100%;
+	overflow: hidden;
+	position: relative;
+	top: 10px;
+}
+.wp-upload-container-hidden {
+	display: none;
+}
+.wp-upload-container .wp-upload-form {
+	background: #fafafa;
+	border: 1px solid #e5e5e5;
+	padding: 30px;
+	margin: 30px auto;
+	max-width: 380px;
+}
+.wp-upload-container .install-help {
+	color: #999;
+	font-size: 18px;
+	font-style: normal;
+	margin: 0;
+	padding: 40px 0 0;
+	text-align: center;
+}
+
+body.show-upload-container .hide-on-upload,
+body.show-upload-container .wp-upload-show {
+	display: none;
+}
+body.show-upload-container .wp-upload-container-hidden {
+	display: block;
+}
+
+.wp-upload-hide {
+	display: none;
+}
+body.show-upload-container .wp-upload-hide {
+	display: inline;
+}
+
 /* =Media Queries
 -------------------------------------------------------------- */
 
+@media only screen and (max-width: 1120px) {
+	.wp-upload-container .wp-upload-form {
+		margin: 20px 0;
+		max-width: 100%;
+	}
+	.wp-upload-container .install-help {
+		font-size: 15px;
+		padding: 20px 0 0;
+		text-align: left;
+	}
+}
+
 @media screen and ( max-width: 782px ) {
 	/* Input Elements */
 	textarea {
Index: src/wp-admin/css/list-tables.css
===================================================================
--- src/wp-admin/css/list-tables.css	(revision 29136)
+++ src/wp-admin/css/list-tables.css	(working copy)
@@ -1212,6 +1212,12 @@
 }
 
 /* Plugin card table view */
+
+.plugin-browser .plugins {
+	clear: both;
+	padding: 0 0 100px;
+}
+
 .plugin-card {
 	float: left;
 	margin: 0 8px 16px;
@@ -1219,12 +1225,26 @@
 	width: -webkit-calc( 50% - 8px );
 	width: calc( 50% - 8px );
 	background-color: #fff;
-	border: 1px solid #dedede;
+	border: 1px solid #e5e5e5;
+	-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);
+	box-shadow: 0 1px 1px rgba(0,0,0,0.04);
 	-webkit-box-sizing: border-box;
 	-moz-box-sizing: border-box;
 	box-sizing: border-box;
 }
 
+.plugin-card .column-hidden {
+	display: none;
+}
+
+.plugin-card .column-visible {
+	display: block;
+}
+
+.plugin-card a {
+	text-decoration: none;
+}
+
 @media screen and ( max-width: 782px ) {
 	.plugin-card {
 		margin-left: 0;
@@ -1233,12 +1253,12 @@
 	}
 }
 
-.plugin-card:nth-child(odd) {
+.plugins .plugin:nth-child(odd) .plugin-card {
 	clear: both;
 	margin-left: 0;
 }
 
-.plugin-card:nth-child(even) {
+.plugins .plugin:nth-child(even) .plugin-card {
 	margin-right: 0
 }
 
@@ -1276,13 +1296,17 @@
 	clear: both;
 	padding: 12px 20px;
 	background-color: #fafafa;
-	border-top: 1px solid #dedede;
+	border-top: 1px solid #e5e5e5;
 	overflow: hidden;
 }
 
-.plugin-card-bottom .star-rating {
+.plugin-card-bottom .rating {
 	display: inline;
+	margin-right: .35em;
 }
+.plugin-card-bottom .rating span:before {
+	float: left;
+}
 
 .plugin-card .column-rating {
 	line-height: 23px;
Index: src/wp-admin/css/themes.css
===================================================================
--- src/wp-admin/css/themes.css	(revision 29136)
+++ src/wp-admin/css/themes.css	(working copy)
@@ -25,25 +25,6 @@
 	margin-left: 20px;
 }
 
-.themes-php .wrap .theme-count,
-.theme-navigation .theme-count {
-	color: #fff;
-	-webkit-border-radius: 30px;
-	border-radius: 30px;
-	background: #777;
-	font-size: 14px;
-	padding: 4px 10px;
-	font-weight: 600;
-	margin-left: 5px;
-	margin-right: 20px;
-	position: relative;
-	top: -3px;
-}
-
-.theme-navigation a {
-	text-decoration:none;
-}
-
 /* Position admin messages */
 .themes-php div.updated,
 .themes-php div.error {
@@ -51,6 +32,20 @@
 	clear: both;
 }
 
+/*
+ * The search form
+ */
+.themes-php .wp-filter-search {
+	position: relative;
+	top: -2px;
+	left: 20px;
+	font-size: 16px;
+	font-weight: 300;
+	line-height: 1.5;
+	width: 280px;
+	margin: 0;
+}
+
 .themes-php div.updated a {
 	text-decoration: underline;
 }
@@ -401,19 +396,6 @@
 	z-index: 2;
 }
 
-/*
- * The search form
- */
-.themes-php .theme-search {
-	position: relative;
-	top: -2px;
-	left: 20px;
-	font-size: 16px;
-	font-weight: 300;
-	line-height: 1.5;
-	width: 280px;
-}
-
 /**
  * Theme Overlay
  * Shown when clicking a theme
@@ -1024,8 +1006,8 @@
 	.themes-php .wrap h2 {
 		width: 100%;
 	}
-
-	.themes-php .theme-search {
+	
+	.themes-php .wp-filter-search {
 		float: none;
 		clear: both;
 		left: 0;
@@ -1088,376 +1070,6 @@
 	display: none !important;
 }
 
-.theme-navigation {
-	background: #fff;
-	-webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
-	box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
-	-webkit-box-sizing: border-box;
-	-moz-box-sizing: border-box;
-	box-sizing: border-box;
-	color: #555;
-	display: inline-block;
-	font-size: 13px;
-	margin: 20px 0 30px;
-	padding: 0 20px;
-	position: relative;
-	width: 100%;
-}
-.theme-install-php a.upload,
-.theme-install-php a.browse-themes {
-	cursor: pointer;
-}
-.theme-install-php a.browse-themes,
-.theme-install-php.show-upload-theme a.upload {
-	display: none;
-}
-.theme-install-php.show-upload-theme a.browse-themes {
-	display: inline;
-}
-.upload-theme {
-	-webkit-box-sizing: border-box;
-	-moz-box-sizing: border-box;
-	box-sizing: border-box;
-	display: none;
-	margin: 0px 0 0;
-	padding: 0;
-	width: 100%;
-	overflow: hidden;
-	position: relative;
-	top: 10px;
-}
-body.show-upload-theme .upload-theme {
-	display: block;
-}
-.upload-theme .wp-upload-form {
-	background: #fafafa;
-	border: 1px solid #e5e5e5;
-	padding: 30px;
-	margin: 30px auto;
-	max-width: 380px;
-}
-.upload-theme .install-help {
-	color: #999;
-	font-size: 18px;
-	font-style: normal;
-	margin: 0;
-	padding: 40px 0 0;
-	text-align: center;
-}
-body.show-upload-theme .upload-theme + .theme-navigation,
-body.show-upload-theme .upload-theme + .theme-navigation + .theme-browser {
-	display: none;
-}
-.theme-navigation .theme-count {
-	margin-left: 0;
-	position: absolute;
-	top: 12px;
-}
-.theme-count + .theme-section {
-	margin-left: 60px;
-}
-.theme-section,
-.theme-filter {
-	border-bottom: 4px solid #fff;
-	color: #666;
-	cursor: pointer;
-	display: inline-block;
-	margin: 0 10px;
-	padding: 15px 0;
-}
-.theme-section.current,
-.theme-filter.current {
-	border-bottom: 4px solid #666;
-	color: #222;
-}
-.theme-top-filters {
-	display: inline-block;
-}
-.theme-navigation .more-filters {
-	color: #666;
-	cursor: pointer;
-	display: inline-block;
-	margin: 0 10px;
-	padding: 4px 6px;
-}
-body.more-filters-opened .more-filters {
-	background: #777;
-	-webkit-border-radius: 2px;
-	border-radius: 2px;
-	border: none;
-	color: #fff;
-}
-
-body.more-filters-opened .more-filters:before {
-	color: #fff;
-}
-
-body.more-filters-opened .more-filters:hover,
-body.more-filters-opened .more-filters:focus {
-	background: rgb(46, 162, 204);
-}
-
-.theme-install-php .theme-search {
-	position: absolute;
-	right: 10px;
-	top: 9px;
-	font-size: 16px;
-	font-weight: 300;
-	line-height: 1.5;
-	width: 280px;
-}
-.more-filters:before {
-	color: #777;
-	text-align: center;
-	margin: 0 5px 0 0;
-	content: "\f111";
-	display: inline-block;
-	width: 16px;
-	height: 16px;
-	-webkit-font-smoothing: antialiased;
-	font-size: 16px;
-	line-height: 1;
-	font-family: "dashicons";
-	text-decoration: inherit;
-	font-weight: normal;
-	font-style: normal;
-	vertical-align: top;
-	-webkit-transition: color .1s ease-in 0;
-	transition: color .1s ease-in 0;
-	text-align: center;
-}
-.more-filters.current:before {
-	color: #fff;
-}
-.more-filters-container {
-	display: none;
-	padding: 20px;
-	border-top: 1px solid #eee;
-	margin: 0 -20px;
-	background: #fafafa;
-}
-body.more-filters-opened .more-filters-container {
-	display: block;
-	overflow: hidden;
-}
-body.more-filters-opened .theme-section.current {
-	border-bottom: none;
-}
-body.more-filters-opened .theme-browser,
-body.more-filters-opened.filters-applied.loading-themes .theme-browser {
-	display: none;
-}
-body.more-filters-opened.filters-applied .theme-browser {
-	display: block;
-}
-.more-filters-container .filters-group {
-	-webkit-box-sizing: border-box;
-	-moz-box-sizing: border-box;
-	box-sizing: border-box;
-	float: left;
-	width: 19%;
-	background: #fff;
-	margin: 0 1% 0 0;
-	border: 1px solid #e5e5e5;
-	-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);
-	box-shadow: 0 1px 1px rgba(0,0,0,0.04);
-	padding: 10px;
-}
-.more-filters-container .wide-filters-group {
-	width: 38%;
-}
-.more-filters-container .feature-name {
-	margin: 0;
-	position: relative;
-}
-.more-filters-container ol {
-	list-style-type: none;
-	margin: 20px 0 0;
-	font-size: 12px;
-}
-.more-filters-container li {
-	display: inline-block;
-	vertical-align: top;
-	list-style-type: none;
-	margin: 5px 0;
-	padding-right: 25px;
-	width: 160px;
-}
-.theme-navigation .more-filters-container .apply-filters {
-	margin: 0 0 20px;
-}
-.theme-navigation .more-filters-container .clear-filters {
-	display: none;
-	margin: 0 0 20px 10px;
-}
-.more-filters-container .apply-filters span {
-	display: inline-block;
-	font-size: 12px;
-	text-indent: 10px;
-	opacity: 0.8;
-}
-.more-filters-container .filtering-by {
-	display: none;
-	margin: 0;
-}
-.more-filters-container .filtering-by > span {
-	font-weight: 600;
-}
-.more-filters-container .filtering-by .tags {
-	display: inline;
-}
-.more-filters-container .filtering-by .tag {
-	background: #fff;
-	border: 1px solid #e5e5e5;
-	-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);
-	box-shadow: 0 1px 1px rgba(0,0,0,0.04);
-	font-size: 11px;
-	margin: 0 5px;
-	padding: 4px 8px;
-}
-.more-filters-container .filtering-by a {
-	margin-left: 10px;
-}
-body.filters-applied .more-filters-container .filters-group,
-body.filters-applied .more-filters-container a.button,
-body.filters-applied .more-filters-container br {
-	display: none !important;
-}
-body.filters-applied .more-filters-container .filtering-by {
-	display: block;
-}
-body.filters-applied .more-filters-container {
-	padding: 20px;
-}
-p.no-themes {
-	color: #999;
-	font-size: 18px;
-	font-style: normal;
-	margin: 0;
-	padding: 0;
-	text-align: center;
-	display: none;
-}
-body.no-results p.no-themes {
-	display: block;
-}
-body.show-upload-theme p.no-themes {
-	display: none !important;
-}
-
-
-.theme-install-php .add-new-theme {
-	display: none !important;
-}
-
-@media only screen and (max-width: 1120px) {
-	.theme-install-php .theme-search {
-		margin: 20px 0;
-		position: static;
-		width: 100%;
-	}
-	.more-filters-container {
-		border-bottom: 1px solid #eee;
-	}
-	.upload-theme .wp-upload-form {
-		margin: 20px 0;
-		max-width: 100%;
-	}
-	.upload-theme .install-help {
-		font-size: 15px;
-		padding: 20px 0 0;
-		text-align: left;
-	}
-	.more-filters-container .filters-group {
-		margin-bottom: 0;
-		margin-top: 5px;
-		width: 100%;
-	}
-	.more-filters-container .filters-group li {
-		margin: 10px 0;
-	}
-}
-
-@media only screen and (max-width: 782px) {
-	.more-filters-container .filters-group {
-		width: 100%;
-	}
-	.more-filters-container .filters-group li {
-		width: 100%;
-	}
-}
-
-.rating {
-	margin: 30px 0;
-}
-.rating span:before {
-	color: #e6b800;
-	content: "\f154";
-	display: inline-block;
-	-webkit-font-smoothing: antialiased;
-	font: normal 20px/1 'dashicons';
-	vertical-align: top;
-}
-/* Half stars */
-.rating-10 span.one:before,
-.rating-30 span.two:before,
-.rating-50 span.three:before,
-.rating-70 span.four:before,
-.rating-90 span.five:before {
-	content: "\f459";
-}
-/* Full stars */
-.rating-20 span.one:before {
-	content: "\f155";
-}
-.rating-30 span.one:before,
-.rating-40 span.one:before,
-.rating-40 span.two:before {
-	content: "\f155";
-}
-.rating-50 span.one:before,
-.rating-50 span.two:before,
-.rating-60 span.one:before,
-.rating-60 span.two:before,
-.rating-60 span.three:before {
-	content: "\f155";
-}
-.rating-70 span.one:before,
-.rating-70 span.two:before,
-.rating-70 span.three:before,
-.rating-80 span.one:before,
-.rating-80 span.two:before,
-.rating-80 span.three:before,
-.rating-80 span.four:before {
-	content: "\f155";
-}
-.rating-90 span.one:before,
-.rating-90 span.two:before,
-.rating-90 span.three:before,
-.rating-90 span.four:before,
-.rating-100 span.one:before,
-.rating-100 span.two:before,
-.rating-100 span.three:before,
-.rating-100 span.four:before,
-.rating-100 span.five:before {
-	content: "\f155";
-}
-.rating .ratings {
-	display: inline;
-	margin-left: 10px;
-	line-height: 20px;
-	color: #999;
-}
-.loading-themes .theme-browser,
-.error .theme-browser {
-	display: none;
-}
-.loading-themes .spinner {
-	display: block;
-	margin: 40px auto 0;
-	float: none;
-}
-
 /*------------------------------------------------------------------------------
   16.3 - Custom Header Screen
 ------------------------------------------------------------------------------*/
@@ -1618,6 +1230,14 @@
 	overflow: auto;
 }
 
+.wp-full-overlay-sidebar .rating {
+	display: block;
+	margin: 30px 0;
+}
+.wp-full-overlay-sidebar .rating span:before {
+	color: #e6b800;
+}
+
 /* Close & Navigation Links */
 .theme-install-overlay .wp-full-overlay-sidebar .wp-full-overlay-header {
 	padding: 0;
Index: src/wp-admin/css/wp-admin.css
===================================================================
--- src/wp-admin/css/wp-admin.css	(revision 29136)
+++ src/wp-admin/css/wp-admin.css	(working copy)
@@ -12,3 +12,4 @@
 @import url(nav-menus.css);
 @import url(widgets.css);
 @import url(l10n.css);
+@import url(filter.css);
Index: src/wp-admin/includes/ajax-actions.php
===================================================================
--- src/wp-admin/includes/ajax-actions.php	(revision 29136)
+++ src/wp-admin/includes/ajax-actions.php	(working copy)
@@ -2605,6 +2605,113 @@
 }
 
 /**
+ * Ajax handler for getting plugins from plugins_api().
+ *
+ * @since 4.0.0
+ */
+function wp_ajax_query_plugins() {
+	global $plugins_allowedtags, $plugins_field_defaults;
+	
+	if ( ! current_user_can( 'install_plugins' ) ) {
+		wp_send_json_error();
+	}
+	$args = wp_parse_args( wp_unslash( $_REQUEST['request'] ), array(
+		'per_page' => 20,
+		'fields'   => $plugins_field_defaults
+	) );
+
+	$old_filter = isset( $args['browse'] ) ? $args['browse'] : 'search';
+
+	/** This filter is documented in wp-admin/includes/class-wp-theme-install-list-table.php */
+	$args = apply_filters( 'install_plugins_table_api_args_' . $old_filter, $args );
+
+	require( ABSPATH . 'wp-admin/includes/plugin-install.php' ); // Needed for plugins_api
+	
+	$api = plugins_api( 'query_plugins', $args );
+
+	if ( is_wp_error( $api ) ) {
+		wp_send_json_error();
+	}
+
+	foreach ( $api->plugins as &$plugin ) {
+		
+		if ( version_compare( substr( $GLOBALS['wp_version'], 0, strlen( $plugin->tested ) ), $plugin->tested, '>' ) ) {
+			$plugin->compatibility = 'untested';
+		} else if ( version_compare( substr( $GLOBALS['wp_version'], 0, strlen( $plugin->requires ) ), $plugin->requires, '<' ) ) {
+			$plugin->compatibility = 'incompatible';
+		} else {
+			$plugin->compatibility = 'compatible';
+		}
+		
+		$details_link   = self_admin_url( 'plugin-install.php?tab=plugin-information&amp;plugin=' . $plugin->slug .
+								'&amp;TB_iframe=true&amp;width=830&amp;height=654' );
+								
+		/**
+		 * Filter the details link for a plugin.
+		 *
+		 * @since 4.0.0
+		 *
+		 * @param string $details_link Link to view the current plugin's details.
+		 * @param array  $plugin       The plugin currently being listed.
+		 */
+		$plugin->detail_url = apply_filters( 'plugin_install_details_link', $details_link, (array) $plugin );
+		
+		$action_links = array();
+		
+		$name = strip_tags( $plugin->name . ' ' . $plugin->version );
+		
+		$status = install_plugin_install_status( $plugin );
+		
+		switch ( $status['status'] ) {
+			case 'install':
+				if ( $status['url'] ) {
+					$action_links[]  = '<a class="install-now button" href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Install %s' ), $name ) ) . '">' . __( 'Install Now' ) . '</a>';
+				}
+
+				break;
+			case 'update_available':
+				if ( $status['url'] ) {
+					$action_links[] = '<a class="button" href="' . $status['url'] . '" title="' . esc_attr( sprintf( __( 'Update to version %s' ), $status['version'] ) ) . '">' . __( 'Update Now' ) . '</a>';
+				}
+
+				break;
+			case 'latest_installed':
+			case 'newer_installed':
+				$action_links[] = '<span class="button button-disabled" title="' . esc_attr__( 'This plugin is already installed and is up to date' ) . ' ">' . _x( 'Installed', 'plugin' ) . '</span>';
+				break;
+		}
+		
+		$action_links[] = '<a href="' . esc_attr( $details_link ) . '" class="thickbox" title="' .
+								esc_attr( sprintf( __( 'More information about %s' ), $plugin->name ) ) . '">' . __( 'More Details' ) . '</a>';
+
+		/**
+		 * Filter the install action links for a plugin.
+		 *
+		 * @since 2.7.0
+		 *
+		 * @param array $action_links An array of plugin action hyperlinks. Defaults are links to Details and Install Now.
+		 * @param array $plugin       The plugin currently being listed.
+		 */
+		$plugin->action_links = apply_filters( 'plugin_install_action_links', $action_links, (array) $plugin );
+		
+		$plugin->name					= wp_kses( strip_tags( $plugin->name ), $plugins_allowedtags );
+		$plugin->author					= wp_kses( $plugin->author, $plugins_allowedtags );
+		$plugin->slug					= wp_kses( $plugin->slug, $plugins_allowedtags );
+		$plugin->version				= wp_kses( $plugin->version, $plugins_allowedtags );
+		$plugin->description			= strip_tags( $plugin->description );
+		$plugin->short_description		= strip_tags( $plugin->short_description );
+		$plugin->rating					= wp_kses( $plugin->rating, $plugins_allowedtags );
+		$plugin->ratings				= wp_kses( $plugin->ratings, $plugins_allowedtags );
+		$plugin->num_ratings 			= $plugin->num_ratings;
+		$plugin->num_ratings_formatted	= number_format_i18n( $plugin->num_ratings );
+		$plugin->downloaded				= number_format_i18n( $plugin->downloaded );
+		$plugin->last_updated			= sprintf( __( '%s ago' ), human_time_diff( strtotime( $plugin->last_updated ) ) );
+	}
+
+	wp_send_json_success( $api );
+}
+
+/**
  * Apply [embed] handlers to a string.
  *
  * @since 4.0.0
Index: src/wp-admin/includes/class-wp-plugin-install-list-table.php
===================================================================
--- src/wp-admin/includes/class-wp-plugin-install-list-table.php	(revision 29136)
+++ src/wp-admin/includes/class-wp-plugin-install-list-table.php	(working copy)
@@ -27,9 +27,9 @@
 		// These are the tabs which are shown on the page
 		$tabs = array();
 		$tabs['dashboard'] = __( 'Search' );
-		if ( 'search' == $tab )
+		if ( 'search' == $tab ) {
 			$tabs['search']	= __( 'Search Results' );
-		$tabs['upload']    = __( 'Upload' );
+		}
 		$tabs['featured']  = _x( 'Featured', 'Plugin Installer' );
 		$tabs['popular']   = _x( 'Popular', 'Plugin Installer' );
 		$tabs['new']       = _x( 'Newest', 'Plugin Installer' );
@@ -40,14 +40,7 @@
 
 		$nonmenu_tabs = array( 'plugin-information' ); //Valid actions to perform which do not have a Menu item.
 
-		/**
-		 * Filter the tabs shown on the Plugin Install screen.
-		 *
-		 * @since 2.7.0
-		 *
-		 * @param array $tabs The tabs shown on the Plugin Install screen. Defaults are 'dashboard', 'search',
-		 *                    'upload', 'featured', 'popular', 'new', and 'favorites'.
-		 */
+		/** This filter is documented in wp-admin/plugin-install.php */
 		$tabs = apply_filters( 'install_plugins_tabs', $tabs );
 
 		/**
@@ -112,7 +105,7 @@
 		 * Filter API request arguments for each Plugin Install screen tab.
 		 *
 		 * The dynamic portion of the hook name, $tab, refers to the plugin install tabs.
-		 * Default tabs are 'dashboard', 'search', 'upload', 'featured', 'popular', 'new',
+		 * Default tabs are 'dashboard', 'search', 'featured', 'popular', 'new',
 		 * and 'favorites'.
 		 *
 		 * @since 3.7.0
Index: src/wp-admin/includes/plugin-install.php
===================================================================
--- src/wp-admin/includes/plugin-install.php	(revision 29136)
+++ src/wp-admin/includes/plugin-install.php	(working copy)
@@ -126,7 +126,7 @@
 
 function install_dashboard() {
 	?>
-	<p><?php printf( __( 'Plugins extend and expand the functionality of WordPress. You may automatically install plugins from the <a href="%1$s">WordPress Plugin Directory</a> or upload a plugin in .zip format via <a href="%2$s">this page</a>.' ), 'https://wordpress.org/plugins/', self_admin_url( 'plugin-install.php?tab=upload' ) ); ?></p>
+	<p><?php printf( __( 'Plugins extend and expand the functionality of WordPress. You may automatically install plugins from the <a href="%1$s">WordPress Plugin Directory</a> or <a href="%2$s" class="wp-upload-show">upload a plugin</a> in .zip format.' ), 'https://wordpress.org/plugins/', self_admin_url( 'plugin-install.php?upload' ) ); ?></p>
 
 	<h4><?php _e('Search') ?></h4>
 	<?php install_search_form( false ); ?>
@@ -187,14 +187,15 @@
  */
 function install_plugins_upload( $page = 1 ) {
 ?>
-	<h4><?php _e('Install a plugin in .zip format'); ?></h4>
-	<p class="install-help"><?php _e('If you have a plugin in a .zip format, you may install it by uploading it here.'); ?></p>
-	<form method="post" enctype="multipart/form-data" class="wp-upload-form" action="<?php echo self_admin_url('update.php?action=upload-plugin'); ?>">
-		<?php wp_nonce_field( 'plugin-upload'); ?>
-		<label class="screen-reader-text" for="pluginzip"><?php _e('Plugin zip file'); ?></label>
-		<input type="file" id="pluginzip" name="pluginzip" />
-		<?php submit_button( __( 'Install Now' ), 'button', 'install-plugin-submit', false ); ?>
-	</form>
+	<div class="wp-upload-container wp-upload-container-hidden">
+		<p class="install-help"><?php _e( 'If you have a plugin in a .zip format, you may install it by uploading it here.' ); ?></p>
+		<form method="post" enctype="multipart/form-data" class="wp-upload-form" action="<?php echo self_admin_url( 'update.php?action=upload-plugin' ); ?>">
+			<?php wp_nonce_field( 'plugin-upload' ); ?>
+			<label class="screen-reader-text" for="pluginzip"><?php _e( 'Plugin zip file' ); ?></label>
+			<input type="file" id="pluginzip" name="pluginzip" />
+			<?php submit_button( __( 'Install Now' ), 'button', 'install-plugin-submit', false ); ?>
+		</form>
+	</div>
 <?php
 }
 add_action('install_plugins_upload', 'install_plugins_upload', 10, 1);
Index: src/wp-admin/includes/theme-install.php
===================================================================
--- src/wp-admin/includes/theme-install.php	(revision 29136)
+++ src/wp-admin/includes/theme-install.php	(working copy)
@@ -136,13 +136,15 @@
 
 function install_themes_upload() {
 ?>
-<p class="install-help"><?php _e('If you have a theme in a .zip format, you may install it by uploading it here.'); ?></p>
-<form method="post" enctype="multipart/form-data" class="wp-upload-form" action="<?php echo self_admin_url('update.php?action=upload-theme'); ?>">
-	<?php wp_nonce_field( 'theme-upload'); ?>
-	<input type="file" name="themezip" />
-	<?php submit_button( __( 'Install Now' ), 'button', 'install-theme-submit', false ); ?>
-</form>
-	<?php
+	<div class="wp-upload-container wp-upload-container-hidden">
+		<p class="install-help"><?php _e( 'If you have a theme in a .zip format, you may install it by uploading it here.' ); ?></p>
+		<form method="post" enctype="multipart/form-data" class="wp-upload-form" action="<?php echo self_admin_url( 'update.php?action=upload-theme' ); ?>">
+			<?php wp_nonce_field( 'theme-upload' ); ?>
+			<input type="file" name="themezip" />
+			<?php submit_button( __( 'Install Now' ), 'button', 'install-theme-submit', false ); ?>
+		</form>
+	</div>
+<?php
 }
 // add_action('install_themes_upload', 'install_themes_upload', 10, 0);
 
Index: src/wp-admin/js/theme.js
===================================================================
--- src/wp-admin/js/theme.js	(revision 29136)
+++ src/wp-admin/js/theme.js	(working copy)
@@ -79,7 +79,7 @@
 
 		// Render and append
 		this.view.render();
-		this.$el.empty().append( this.view.el ).addClass('rendered');
+		this.$el.empty().append( this.view.el ).addClass( 'rendered' );
 		this.$el.append( '<br class="clear"/>' );
 	},
 
@@ -105,12 +105,12 @@
 		// Render and append after screen title
 		view.render();
 		this.searchContainer
-			.append( $.parseHTML( '<label class="screen-reader-text" for="theme-search-input">' + l10n.search + '</label>' ) )
+			.append( $.parseHTML( '<label class="screen-reader-text" for="wp-filter-search-input">' + l10n.search + '</label>' ) )
 			.append( view.el );
 	},
 
 	// Checks when the user gets close to the bottom
-	// of the mage and triggers a theme:scroll event
+	// of the page and triggers a theme:scroll event
 	scroller: function() {
 		var self = this,
 			bottom, threshold;
@@ -342,7 +342,7 @@
 			beforeSend: function() {
 				if ( ! paginated ) {
 					// Spin it
-					$( 'body' ).addClass( 'loading-themes' ).removeClass( 'no-results' );
+					$( 'body' ).addClass( 'loading-content' ).removeClass( 'no-results' );
 				}
 			}
 		});
@@ -1080,8 +1080,8 @@
 themes.view.Search = wp.Backbone.View.extend({
 
 	tagName: 'input',
-	className: 'theme-search',
-	id: 'theme-search-input',
+	className: 'wp-filter-search',
+	id: 'wp-filter-search-input',
 	searching: false,
 
 	attributes: {
@@ -1110,7 +1110,7 @@
 	// Runs a search on the theme collection.
 	search: function( event ) {
 		var options = {};
-
+		
 		// Clear on escape.
 		if ( event.type === 'keyup' && event.which === 27 ) {
 			event.target.value = '';
@@ -1168,11 +1168,11 @@
 	},
 
 	search: function( query ) {
-		$( '.theme-search' ).val( query );
+		$( '.wp-filter-search' ).val( query );
 	},
 
 	themes: function() {
-		$( '.theme-search' ).val( '' );
+		$( '.wp-filter-search' ).val( '' );
 	},
 
 	navigate: function() {
@@ -1229,7 +1229,7 @@
 
 		// Handles search route event
 		themes.router.on( 'route:search', function() {
-			$( '.theme-search' ).trigger( 'keyup' );
+			$( '.wp-filter-search' ).trigger( 'keyup' );
 		});
 
 		this.extraRoutes();
@@ -1288,8 +1288,8 @@
 			request.tag = [ value.slice( 4 ) ];
 		}
 
-		$( '.theme-section.current' ).removeClass( 'current' );
-		$( 'body' ).removeClass( 'more-filters-opened filters-applied' );
+		$( '.wp-filter-link.current' ).removeClass( 'current' );
+		$( 'body' ).removeClass( 'show-filter-drawer filters-applied' );
 
 		// Get the themes by sending Ajax POST request to api.wordpress.org/themes
 		// or searching the local cache
@@ -1304,16 +1304,16 @@
 
 	el: '#wpbody-content .wrap',
 
-	// Register events for sorting and filters in theme-navigation
+	// Register events for sorting and filters in wp-filter
 	events: {
-		'click .theme-section': 'onSort',
+		'click .wp-filter-link': 'onSort',
 		'click .theme-filter': 'onFilter',
-		'click .more-filters': 'moreFilters',
-		'click .apply-filters': 'applyFilters',
-		'click [type="checkbox"]': 'addFilter',
-		'click .clear-filters': 'clearFilters',
-		'click .feature-name': 'filterSection',
-		'click .filtering-by a': 'backToFilters'
+		'click .wp-filter-drawer-toggle': 'moreFilters',
+		'click .wp-filter-drawer-apply': 'applyFilters',
+		'click .wp-filter-group [type="checkbox"]': 'addFilter',
+		'click .wp-filter-drawer-clear': 'clearFilters',
+		'click .wp-filter-group-title': 'filterSection',
+		'click .wp-filter-by a': 'backToFilters'
 	},
 
 	// Initial render method
@@ -1343,12 +1343,12 @@
 		});
 
 		this.listenTo( this.collection, 'query:success', function() {
-			$( 'body' ).removeClass( 'loading-themes' );
+			$( 'body' ).removeClass( 'loading-content' );
 			$( '.theme-browser' ).find( 'div.error' ).remove();
 		});
 
 		this.listenTo( this.collection, 'query:fail', function() {
-			$( 'body' ).removeClass( 'loading-themes' );
+			$( 'body' ).removeClass( 'loading-content' );
 			$( '.theme-browser' ).find( 'div.error' ).remove();
 			$( '.theme-browser' ).find( 'div.themes' ).before( '<div class="error"><p>' + l10n.error + '</p></div>' );
 		});
@@ -1386,7 +1386,7 @@
 
 		event.preventDefault();
 
-		$( 'body' ).removeClass( 'filters-applied more-filters-opened' );
+		$( 'body' ).removeClass( 'filters-applied show-filter-drawer' );
 
 		// Bail if this is already active
 		if ( $el.hasClass( this.activeClass ) ) {
@@ -1395,7 +1395,7 @@
 
 		this.sort( sort );
 
-		// Trigger a router.naviagte update
+		// Trigger a router.navigate update
 		themes.router.navigate( themes.router.baseUrl( '?browse=' + sort ) );
 	},
 
@@ -1402,7 +1402,7 @@
 	sort: function( sort ) {
 		this.clearSearch();
 
-		$( '.theme-section, .theme-filter' ).removeClass( this.activeClass );
+		$( '.wp-filter-link, .theme-filter' ).removeClass( this.activeClass );
 		$( '[data-sort="' + sort + '"]' ).addClass( this.activeClass );
 
 		this.browse( sort );
@@ -1419,7 +1419,7 @@
 			return;
 		}
 
-		$( '.theme-filter, .theme-section' ).removeClass( this.activeClass );
+		$( '.wp-filter-link, .theme-filter' ).removeClass( this.activeClass );
 		$el.addClass( this.activeClass );
 
 		if ( ! filter ) {
@@ -1446,7 +1446,7 @@
 		var name,
 			tags = this.filtersChecked(),
 			request = { tag: tags },
-			filteringBy = $( '.filtering-by .tags' );
+			filteringBy = $( '.wp-filter-by .tags' );
 
 		if ( event ) {
 			event.preventDefault();
@@ -1453,11 +1453,11 @@
 		}
 
 		$( 'body' ).addClass( 'filters-applied' );
-		$( '.theme-section.current' ).removeClass( 'current' );
+		$( '.wp-filter-link.current' ).removeClass( 'current' );
 		filteringBy.empty();
 
 		_.each( tags, function( tag ) {
-			name = $( 'label[for="feature-id-' + tag + '"]' ).text();
+			name = $( 'label[for="filter-id-' + tag + '"]' ).text();
 			filteringBy.append( '<span class="tag">' + name + '</span>' );
 		});
 
@@ -1469,7 +1469,7 @@
 	// Get the checked filters
 	// @return {array} of tags or false
 	filtersChecked: function() {
-		var items = $( '.feature-group' ).find( ':checkbox' ),
+		var items = $( '.wp-filter-group' ).find( ':checkbox' ),
 			tags = [];
 
 		_.each( items.filter( ':checked' ), function( item ) {
@@ -1478,14 +1478,14 @@
 
 		// When no filters are checked, restore initial state and return
 		if ( tags.length === 0 ) {
-			$( '.apply-filters' ).find( 'span' ).text( '' );
-			$( '.clear-filters' ).hide();
+			$( '.wp-filter-drawer-apply' ).find( 'span' ).text( '' );
+			$( '.wp-filter-drawer-clear' ).hide();
 			$( 'body' ).removeClass( 'filters-applied' );
 			return false;
 		}
 
-		$( '.apply-filters' ).find( 'span' ).text( tags.length );
-		$( '.clear-filters' ).css( 'display', 'inline-block' );
+		$( '.wp-filter-drawer-apply' ).find( 'span' ).text( tags.length );
+		$( '.wp-filter-drawer-clear' ).css( 'display', 'inline-block' );
 
 		return tags;
 	},
@@ -1494,17 +1494,17 @@
 
 	// Overwrite search container class to append search
 	// in new location
-	searchContainer: $( '.theme-navigation' ),
+	searchContainer: $( '.wp-filter' ),
 
 	uploader: function() {
-		$( 'a.upload' ).on( 'click', function( event ) {
+		$( '.wp-upload-show' ).on( 'click', function( event ) {
 			event.preventDefault();
-			$( 'body' ).addClass( 'show-upload-theme' );
+			$( 'body' ).addClass( 'show-upload-container' );
 			themes.router.navigate( themes.router.baseUrl( '?upload' ), { replace: true } );
 		});
-		$( 'a.browse-themes' ).on( 'click', function( event ) {
+		$( '.wp-upload-hide' ).on( 'click', function( event ) {
 			event.preventDefault();
-			$( 'body' ).removeClass( 'show-upload-theme' );
+			$( 'body' ).removeClass( 'show-upload-container' );
 			themes.router.navigate( themes.router.baseUrl( '' ), { replace: true } );
 		});
 	},
@@ -1519,7 +1519,7 @@
 
 		// If the filters section is opened and filters are checked
 		// run the relevant query collapsing to filtered-by state
-		if ( $( 'body' ).hasClass( 'more-filters-opened' ) && this.filtersChecked() ) {
+		if ( $( 'body' ).hasClass( 'show-filter-drawer' ) && this.filtersChecked() ) {
 			return this.addFilter();
 		}
 
@@ -1526,7 +1526,7 @@
 		this.clearSearch();
 
 		themes.router.navigate( themes.router.baseUrl( '' ) );
-		$( 'body' ).toggleClass( 'more-filters-opened' );
+		$( 'body' ).toggleClass( 'show-filter-drawer' );
 	},
 
 	// Expand/collapse each individual filter section
@@ -1537,7 +1537,7 @@
 	// Clears all the checked filters
 	// @uses filtersChecked()
 	clearFilters: function( event ) {
-		var items = $( '.feature-group' ).find( ':checkbox' ),
+		var items = $( '.wp-filter-group' ).find( ':checkbox' ),
 			self = this;
 
 		event.preventDefault();
@@ -1557,7 +1557,7 @@
 	},
 
 	clearSearch: function() {
-		$( '#theme-search-input').val( '' );
+		$( '#wp-filter-search-input' ).val( '' );
 	}
 });
 
@@ -1575,7 +1575,7 @@
 	},
 
 	search: function( query ) {
-		$( '.theme-search' ).val( query );
+		$( '.wp-filter-search' ).val( query );
 	},
 
 	navigate: function() {
@@ -1642,12 +1642,12 @@
 
 		// Support the `upload` route by going straight to upload section
 		themes.router.on( 'route:upload', function() {
-			$( 'a.upload' ).trigger( 'click' );
+			$( '.wp-upload-show' ).trigger( 'click' );
 		});
 
 		// The `search` route event. The router populates the input field.
 		themes.router.on( 'route:search', function() {
-			$( '.theme-search' ).focus().trigger( 'keyup' );
+			$( '.wp-filter-search' ).focus().trigger( 'keyup' );
 		});
 
 		this.extraRoutes();
Index: src/wp-admin/plugin-install.php
===================================================================
--- src/wp-admin/plugin-install.php	(revision 29136)
+++ src/wp-admin/plugin-install.php	(working copy)
@@ -6,16 +6,21 @@
  * @subpackage Administration
  */
 // TODO route this pages via a specific iframe handler instead of the do_action below
-if ( !defined( 'IFRAME_REQUEST' ) && isset( $_GET['tab'] ) && ( 'plugin-information' == $_GET['tab'] ) )
+if ( !defined( 'IFRAME_REQUEST' ) && isset( $_GET['tab'] ) && ( 'plugin-information' == $_GET['tab'] ) ) {
 	define( 'IFRAME_REQUEST', true );
+}
 
 /**
  * WordPress Administration Bootstrap.
  */
 require_once( dirname( __FILE__ ) . '/admin.php' );
+require( ABSPATH . 'wp-admin/includes/plugin-install.php' );
 
-if ( ! current_user_can('install_plugins') )
+wp_reset_vars( array( 'tab' ) );
+
+if ( ! current_user_can('install_plugins') ) {
 	wp_die(__('You do not have sufficient permissions to install plugins on this site.'));
+}
 
 if ( is_multisite() && ! is_network_admin() ) {
 	wp_redirect( network_admin_url( 'plugin-install.php' ) );
@@ -22,16 +27,49 @@
 	exit();
 }
 
-$wp_list_table = _get_list_table('WP_Plugin_Install_List_Table');
-$pagenum = $wp_list_table->get_pagenum();
-$wp_list_table->prepare_items();
-
 $title = __('Install Plugins');
 $parent_file = 'plugins.php';
 
-wp_enqueue_script( 'plugin-install' );
-if ( 'plugin-information' != $tab )
+$tabs = array(
+	'upload'        	=> __( 'Upload Plugin' ),
+	'browse-plugins'	=> _x( 'Browse', 'plugins' ),
+);
+
+$sections = array(
+	'featured' 	=> _x( 'Featured', 'plugins' ),
+	'popular'  	=> _x( 'Popular', 'plugins' ),
+	'new'      	=> _x( 'Latest', 'plugins' ),
+);
+if ( $tab === 'beta' || false !== strpos( $GLOBALS['wp_version'], '-' ) ) {
+	$sections['beta'] = _x( 'Beta Testing', 'plugins' );
+}
+
+wp_localize_script( 'plugin', '_wpPluginSettings', array(
+	'plugins' => false,
+	'settings' => array(
+		'isInstall'     => true,
+		'canInstall'    => current_user_can( 'install_plugins' ),
+		'installURI'    => current_user_can( 'install_plugins' ) ? self_admin_url( 'plugin-install.php' ) : null,
+		'adminUrl'      => parse_url( self_admin_url(), PHP_URL_PATH )
+	),
+	'l10n' => array(
+		'search'  => __( 'Search Plugins' ),
+		'searchPlaceholder' => __( 'Search plugins...' ), // placeholder (no ellipsis)
+		'upload' => __( 'Upload Plugin' ),
+		'error'  => __( '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>.' ),
+		'pluginInformation' => __('Plugin Information:'),
+		'ays' => __('Are you sure you want to install this plugin?'),
+	),
+	'browse' => array(
+		'sections' => $sections,
+	),
+) );
+
+wp_enqueue_script( 'plugin' );
+
+if ( 'plugin-information' != $tab ) {
 	add_thickbox();
+}
 
 $body_id = $tab;
 
@@ -43,8 +81,21 @@
  *
  * @since 2.7.0
  */
-do_action( "install_plugins_pre_$tab" );
+if ( $tab ) {
+	do_action( "install_plugins_pre_$tab" );	
+}
 
+add_screen_option( 'misc_screen_options', array( 'option' => 'manageplugin-installplugin-cardcolumnshidden', 'id' => 'plugin-card' ) );
+
+$screen_options = array(
+	'description' => 'Description',
+	'rating' => 'Rating',
+	'extra_details' => 'Extra Details'
+);
+foreach ( $screen_options as $id => $label ) {
+	add_screen_option( $id, array( 'label' => __( $label ) ) );
+}
+
 get_current_screen()->add_help_tab( array(
 'id'		=> 'overview',
 'title'		=> __('Overview'),
@@ -73,27 +124,156 @@
 include(ABSPATH . 'wp-admin/admin-header.php');
 ?>
 <div class="wrap">
-<h2><?php echo esc_html( $title ); ?></h2>
+	<h2>
+		<?php echo esc_html( $title ); ?>
+		<?php
+		/**
+		 * Filter the tabs shown on the Plugin Install screen.
+		 * 
+		 * @since 2.7.0
+		 * @param array $tabs The tabs shown on the Plugin Install screen. Defaults are
+		 *                    'upload' and 'browse-plugins'.
+		 */
+		$tabs = apply_filters( 'install_plugins_tabs', $tabs );
+		foreach ( $tabs as $tab_slug => $tab_name ) {
+			$visibility = $tab_slug == 'upload' ? ' wp-upload-show' : ' wp-upload-hide';
+			
+			echo '<a href="#" class="' . esc_attr( $tab_slug ) . $visibility . ' add-new-h2">' . $tab_name . '</a>';
+		}
+		?>
+	</h2>
 
-<?php $wp_list_table->views(); ?>
+	<?php install_plugins_upload(); ?>
 
-<br class="clear" />
-<?php
-/**
- * Fires after the plugins list table in each tab of the Install Plugins screen.
- *
- * The dynamic portion of the action hook, $tab, allows for targeting
- * individual tabs, for instance 'install_plugins_plugin-information'.
- *
- * @since 2.7.0
- *
- * @param int $paged The current page number of the plugins list table.
- */
-?>
-<?php do_action( "install_plugins_$tab", $paged ); ?>
+	<div class="wp-filter hide-on-upload">
+		<div class="wp-filter-count">
+			<span class="count plugin-count"></span>
+		</div>
+		
+		<ul class="wp-filter-links"> 
+		<?php foreach( $sections as $section_sort => $section_text ) { ?> 
+			<li> 
+				<a href="#" class="wp-filter-link" data-sort="<?php echo $section_sort; ?>"> 
+					<?php echo $section_text; ?> 
+				</a> 
+			</li> 
+		<?php } ?> 
+		</ul>
+		
+		<a class="wp-filter-drawer-toggle dashicons-before dashicons-heart" href="#" data-drawer="favorites">
+			<?php _e( 'Favorites' ); ?>
+		</a>
+		<a class="wp-filter-drawer-toggle dashicons-before dashicons-tag" href="#" data-drawer="tag">
+			<?php _e( 'Tag Filter' ); ?>
+		</a>
+		
+		<div class="wp-filter-drawer" data-drawer="favorites">
+		
+			TODO - Favorites
+			
+		</div>
+		<div class="wp-filter-drawer" data-drawer="tag">
+		
+			TODO - Tag Filter
+			
+		</div>
+	
+	</div>
+	
+	<div class="hide-on-upload">
+		<div class="wp-filter-content plugin-browser"></div>
+	
+		<p class="wp-filter-notice"><?php _e( 'No plugins found. Try a different search.' ); ?></p>
+		<span class="spinner"></span>
+	</div>
+	<br class="clear" />
+	<?php
+	/**
+	 * Fires after the plugins list table in each tab of the Install Plugins screen.
+	 *
+	 * The dynamic portion of the action hook, $tab, allows for targeting
+	 * individual tabs, for instance 'install_plugins_plugin-information'.
+	 *
+	 * @since 2.7.0
+	 *
+	 * @param int $paged The current page number of the plugins list table.
+	 */
+	if ( $tab ) {
+		do_action( "install_plugins_$tab", $paged );
+	}
+	?>
 </div>
+
+<script id="tmpl-plugin" type="text/template">
+	<div class="plugin-card">
+		<?php
+		$hidden = get_user_option( 'manageplugin-installplugin-cardcolumnshidden' );
+		$columns = array();
+		
+		foreach ( $screen_options as $id => $field ) {
+			$columns[$id] = is_array( $hidden ) && in_array( $id, $hidden ) ? "column-{$id} column-hidden" : "column-{$id} column-visible";
+		}
+		?>
+		<div class="plugin-card-top">
+			<div class="name data-field">
+				<h4>
+					<a href="{{{ data.detail_url }}}" class="thickbox">
+						{{{ data.name }}}
+					</a>
+				</h4>
+			<# if ( data.action_links ) { #>
+				<div class="action-links">
+					<ul class="plugin-action-buttons">
+					<# _.each( data.action_links, function ( action_link ) { #>
+						<li>{{{ action_link }}}</li>
+					<# }); #>
+					</ul>
+				</div>
+			<# } #>
+			</div>
+			<div class="desc <?php echo $columns['description']; ?>">
+				<p>
+					{{{ data.short_description }}}
+				<# if ( data.author ) { #>
+					<span class="authors">
+						<cite><?php printf( __( 'By %s' ), '{{{ data.author }}}' ); ?></cite>
+					</span>
+				<# } #>
+				</p>
+			</div>
+		</div>
+		<footer class="plugin-card-bottom <?php echo $columns['extra_details']; ?>">
+			<div class="vers <?php echo $columns['rating']; ?>">
+				<div class="rating rating-{{ Math.round( data.rating / 10 ) * 10 }}">
+					<span class="one"></span>
+					<span class="two"></span>
+					<span class="three"></span>
+					<span class="four"></span>
+					<span class="five"></span>
+				</div>
+				<span class="num-ratings">({{ data.num_ratings_formatted }})</span>
+			</div>
+			<div class="column-updated">
+				<strong><?php echo __( 'Last updated:' ); ?></strong> {{ data.last_updated }}
+			</div>
+			<div class="column-downloaded">
+				<?php printf( _n( '%s download', '%s downloads', '{{ data.downloaded }}' ), '{{ data.downloaded }}' ); ?>
+			</div>
+			<div class="column-compatibility">
+			<# if ( data.compatibility == 'untested' ) { #>
+				<?php echo __( '<strong>Untested</strong> with your install' ); ?>
+			<# } else if ( data.compatibility == 'incompatible' ) { #>
+				<?php echo __( '<strong>Incompatible</strong> with your install' ); ?>
+			<# } else { #>
+				<?php echo __( '<strong>Compatible</strong> with your install' ); ?>
+			<# } #>
+			</div>
+		</footer>
+	</div>
+</script>
+		
 <?php
 /**
  * WordPress Administration Template Footer.
  */
-include(ABSPATH . 'wp-admin/admin-footer.php');
+include(ABSPATH . 'wp-admin/admin-footer.php');
\ No newline at end of file
Index: src/wp-admin/theme-install.php
===================================================================
--- src/wp-admin/theme-install.php	(revision 29136)
+++ src/wp-admin/theme-install.php	(working copy)
@@ -12,8 +12,9 @@
 
 wp_reset_vars( array( 'tab' ) );
 
-if ( ! current_user_can('install_themes') )
+if ( ! current_user_can('install_themes') ) {
 	wp_die( __( 'You do not have sufficient permissions to install themes on this site.' ) );
+}
 
 if ( is_multisite() && ! is_network_admin() ) {
 	wp_redirect( network_admin_url( 'theme-install.php' ) );
@@ -33,9 +34,9 @@
 );
 
 $sections = array(
-	'featured' => __( 'Featured Themes' ),
-	'popular'  => __( 'Popular Themes' ),
-	'new'      => __( 'Newest Themes' ),
+	'featured' => _x( 'Featured', 'themes' ),
+	'popular'  => _x( 'Popular', 'themes' ),
+	'new'      => _x( 'Latest', 'themes' ),
 );
 
 $installed_themes = search_theme_directories();
@@ -125,79 +126,92 @@
 		 */
 		$tabs = apply_filters( 'install_themes_tabs', $tabs );
 		foreach ( $tabs as $tab_slug => $tab_name ) {
-			echo '<a href="#" class="' . esc_attr( $tab_slug ) . ' add-new-h2">' . $tab_name . '</a>';
+			$visibility = $tab_slug == 'upload' ? ' wp-upload-show' : ' wp-upload-hide';
+			
+			echo '<a href="#" class="' . esc_attr( $tab_slug ) . $visibility . ' add-new-h2">' . $tab_name . '</a>';
 		}
 		?>
 	</h2>
 
-	<div class="upload-theme">
 	<?php install_themes_upload(); ?>
-	</div>
-
-	<div class="theme-navigation">
-		<span class="theme-count"></span>
-		<a class="theme-section" href="#" data-sort="featured"><?php _ex( 'Featured', 'themes' ); ?></a>
-		<a class="theme-section" href="#" data-sort="popular"><?php _ex( 'Popular', 'themes' ); ?></a>
-		<a class="theme-section" href="#" data-sort="new"><?php _ex( 'Latest', 'themes' ); ?></a>
-		<div class="theme-top-filters">
-			<!-- <span class="theme-filter" data-filter="photoblogging">Photography</span>
-			<span class="theme-filter" data-filter="responsive-layout">Responsive</span> -->
-			<a class="more-filters" href="#"><?php _e( 'Feature Filter' ); ?></a>
+	
+	<div class="wp-filter hide-on-upload">
+		<div class="wp-filter-count">
+			<span class="count theme-count"></span>
 		</div>
-		<div class="more-filters-container">
-			<a class="apply-filters button button-secondary" href="#"><?php _e( 'Apply Filters' ); ?><span></span></a>
-			<a class="clear-filters button button-secondary" href="#"><?php _e( 'Clear' ); ?></a>
-			<br class="clear" />
+		
+		<ul class="wp-filter-links"> 
+		<?php foreach( $sections as $section_sort => $section_text ) { ?> 
+			<li> 
+				<a href="#" class="wp-filter-link" data-sort="<?php echo $section_sort; ?>"> 
+					<?php echo $section_text; ?> 
+				</a> 
+			</li> 
+		<?php } ?> 
+		</ul>
+		
+		<a class="wp-filter-drawer-toggle dashicons-before dashicons-admin-generic" href="#" data-drawer="feature">
+			<?php _e( 'Feature Filter' ); ?>
+		</a>
+		
+		<div class="wp-filter-drawer" data-drawer="feature">
+			<div class="wp-filter-drawer-buttons"> 
+				<a class="wp-filter-drawer-apply button button-secondary" href="#"><?php _e( 'Apply Filters' ); ?><span></span></a> 
+				<a class="wp-filter-drawer-clear button button-secondary" href="#"><?php _e( 'Clear' ); ?></a> 
+			</div> 
 		<?php
 		$feature_list = get_theme_feature_list();
 		foreach ( $feature_list as $feature_name => $features ) {
-			if ( $feature_name === 'Features' || $feature_name === __( 'Features' ) ) { // hack hack hack
-				echo '<div class="filters-group wide-filters-group">';
-			} else {
-				echo '<div class="filters-group">';
-			}
-			$feature_name = esc_html( $feature_name );
-			echo '<h4 class="feature-name">' . $feature_name . '</h4>';
-			echo '<ol class="feature-group">';
-			foreach ( $features as $feature => $feature_name ) {
-				$feature = esc_attr( $feature );
-				echo '<li><input type="checkbox" id="feature-id-' . $feature . '" value="' . $feature . '" /> ';
-				echo '<label for="feature-id-' . $feature . '">' . $feature_name . '</label></li>';
-			}
-			echo '</ol>';
-			echo '</div>';
-		}
-		?>
-			<div class="filtering-by">
+			if ( $feature_name === 'Features' || $feature_name === __( 'Features' ) ) { // hack hack hack ?>
+				<div class="wp-filter-group wp-filter-group-wide">
+			<?php } else { ?>
+				<div class="wp-filter-group">
+			<?php } ?>
+				<h4 class="wp-filter-group-title"><?php echo $feature_name; ?></h4>
+				<ol>
+				<?php foreach ( $features as $feature => $feature_name ) {
+					$feature = esc_attr( $feature ); ?>
+					<li>
+						<input type="checkbox" id="filter-id-<?php echo $feature; ?>" value="<?php echo $feature; ?>" />
+						<label for="filter-id-<?php echo $feature; ?>"><?php echo $feature_name; ?></label>
+					</li>
+				<?php } ?>
+				</ol>
+			</div>
+		<?php } ?>
+			<div class="wp-filter-by">
 				<span><?php _e( 'Filtering by:' ); ?></span>
 				<div class="tags"></div>
 				<a href="#"><?php _e( 'Edit' ); ?></a>
 			</div>
 		</div>
+	
 	</div>
-	<div class="theme-browser"></div>
-	<div class="theme-install-overlay wp-full-overlay expanded"></div>
-
-	<p class="no-themes"><?php _e( 'No themes found. Try a different search.' ); ?></p>
-	<span class="spinner"></span>
-
+	
+	<div class="hide-on-upload">
+		<div class="wp-filter-content theme-browser"></div>
+		<div class="wp-full-overlay theme-install-overlay expanded"></div>
+	
+		<p class="wp-filter-notice"><?php _e( 'No themes found. Try a different search.' ); ?></p>
+		<span class="spinner"></span>
+	</div>
 	<br class="clear" />
-<?php
-/**
- * Fires at the top of each of the tabs on the Install Themes page.
- *
- * The dynamic portion of the hook name, $tab, refers to the current
- * theme install tab. Possible values are 'dashboard', 'search', 'upload',
- * 'featured', 'new', or 'updated'.
- *
- * @since 2.8.0
- *
- * @param int $paged Number of the current page of results being viewed.
- */
-if ( $tab ) {
-	do_action( "install_themes_{$tab}", $paged );
-}
-?>
+	<?php
+	/**
+	 * Fires at the top of each of the tabs on the Install Themes page.
+	 *
+	 * The dynamic portion of the hook name, $tab, refers to the current
+	 * theme install tab. Possible values are 'dashboard', 'search', 'upload',
+	 * 'featured', 'new', or 'updated'.
+	 *
+	 * @since 2.8.0
+	 *
+	 * @param int $paged Number of the current page of results being viewed.
+	 */
+	if ( $tab ) {
+		do_action( "install_themes_{$tab}", $paged );
+	}
+	?>
 </div>
 
 <script id="tmpl-theme" type="text/template">
Index: src/wp-admin/themes.php
===================================================================
--- src/wp-admin/themes.php	(revision 29136)
+++ src/wp-admin/themes.php	(working copy)
@@ -117,7 +117,7 @@
 
 <div class="wrap">
 	<h2><?php esc_html_e( 'Themes' ); ?>
-		<span class="theme-count"><?php echo count( $themes ); ?></span>
+		<span class="wp-title-count theme-count"><?php echo count( $themes ); ?></span>
 	<?php if ( ! is_multisite() && current_user_can( 'install_themes' ) ) : ?>
 		<a href="<?php echo admin_url( 'theme-install.php' ); ?>" class="hide-if-no-js add-new-h2"><?php echo esc_html( _x( 'Add New', 'Add new theme' ) ); ?></a>
 	<?php endif; ?>
Index: src/wp-includes/script-loader.php
===================================================================
--- src/wp-includes/script-loader.php	(revision 29136)
+++ src/wp-includes/script-loader.php	(working copy)
@@ -488,11 +488,7 @@
 			'error' => __('Error while saving the changes.')
 		) );
 
-		$scripts->add( 'plugin-install', "/wp-admin/js/plugin-install$suffix.js", array( 'jquery', 'thickbox' ), false, 1 );
-		did_action( 'init' ) && $scripts->localize( 'plugin-install', 'plugininstallL10n', array(
-			'plugin_information' => __('Plugin Information:'),
-			'ays' => __('Are you sure you want to install this plugin?')
-		) );
+		$scripts->add( 'plugin', "/wp-admin/js/plugin$suffix.js", array( 'wp-backbone' ), false, 1 );
 
 		$scripts->add( 'updates', "/wp-admin/js/updates$suffix.js", array( 'jquery' ) );
 
