Index: wp-admin/plugin-install.php
===================================================================
--- wp-admin/plugin-install.php	(revision 19998)
+++ wp-admin/plugin-install.php	(working copy)
@@ -6,7 +6,7 @@
  * @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'] ) && ( in_array( $_GET['tab'], array( 'plugin-information', 'plugin-readme' ) ) ) )
 	define( 'IFRAME_REQUEST', true );
 
 /** WordPress Administration Bootstrap */
@@ -28,7 +28,7 @@
 $parent_file = 'plugins.php';
 
 wp_enqueue_script( 'plugin-install' );
-if ( 'plugin-information' != $tab )
+if ( !in_array( $tab, array('plugin-information', 'plugin-readme') ) )
 	add_thickbox();
 
 $body_id = $tab;
Index: wp-admin/css/colors-classic.dev.css
===================================================================
--- wp-admin/css/colors-classic.dev.css	(revision 19998)
+++ wp-admin/css/colors-classic.dev.css	(working copy)
@@ -583,7 +583,8 @@
 }
 
 div#media-upload-header,
-div#plugin-information-header {
+div#plugin-information-header,
+div#plugin-readme-header {
 	background-color: #f9f9f9;
 	border-bottom-color: #dfdfdf;
 }
@@ -1725,20 +1726,25 @@
 	border-right: 1px solid #fff;
 }
 
-#plugin-information .fyi ul {
+#plugin-information .fyi ul,
+#plugin-readme .fyi ul {
 	background-color: #eaf3fa;
 }
 
-#plugin-information .fyi h2.mainheader {
+#plugin-information .fyi h2.mainheader,
+#plugin-readme .fyi h2.mainheader {
 	background-color: #cee1ef;
 }
 
 #plugin-information pre,
-#plugin-information code {
+#plugin-information code,
+#plugin-readme pre,
+#plugin-readme code {
 	background-color: #ededff;
 }
 
-#plugin-information pre {
+#plugin-information pre,
+#plugin-readme pre {
 	border: 1px solid #ccc;
 }
 
Index: wp-admin/css/colors-fresh.dev.css
===================================================================
--- wp-admin/css/colors-fresh.dev.css	(revision 19998)
+++ wp-admin/css/colors-fresh.dev.css	(working copy)
@@ -591,7 +591,8 @@
 }
 
 div#media-upload-header,
-div#plugin-information-header {
+div#plugin-information-header,
+div#plugin-readme-header {
 	background-color: #f9f9f9;
 	border-bottom-color: #dfdfdf;
 }
@@ -1360,20 +1361,25 @@
 	border-right: 1px solid #f9f9f9;
 }
 
-#plugin-information .fyi ul {
+#plugin-information .fyi ul,
+#plugin-readme .fyi ul {
 	background-color: #eaf3fa;
 }
 
-#plugin-information .fyi h2.mainheader {
+#plugin-information .fyi h2.mainheader,
+#plugin-readme .fyi h2.mainheader {
 	background-color: #cee1ef;
 }
 
 #plugin-information pre,
-#plugin-information code {
+#plugin-information code,
+#plugin-readme pre,
+#plugin-readme code {
 	background-color: #ededff;
 }
 
-#plugin-information pre {
+#plugin-information pre,
+#plugin-readme pre {
 	border: 1px solid #ccc;
 }
 
Index: wp-admin/css/wp-admin-rtl.dev.css
===================================================================
--- wp-admin/css/wp-admin-rtl.dev.css	(revision 19998)
+++ wp-admin/css/wp-admin-rtl.dev.css	(working copy)
@@ -2159,26 +2159,31 @@
 	left: 0;
 }
 
-#plugin-information ul#sidemenu {
+#plugin-information ul#sidemenu,
+#plugin-readme ul#sidemenu {
 	left: auto;
 	right: 0;
 }
 
-#plugin-information h2 {
+#plugin-information h2,
+#plugin-readme h2 {
 	margin-right: 0;
 	margin-left: 200px;
 }
 
-#plugin-information .fyi {
+#plugin-information .fyi,
+#plugin-readme .fyi {
 	margin-left: 5px;
 	margin-right: 20px;
 }
 
-#plugin-information .fyi h2 {
+#plugin-information .fyi h2,
+#plugin-readme .fyi h2 {
 	margin-left: 0;
 }
 
-#plugin-information .fyi ul {
+#plugin-information .fyi ul,
+#plugin-readme .fyi ul {
 	padding: 10px 7px 10px 5px;
 }
 
@@ -2189,13 +2194,17 @@
 
 #plugin-information #section-screenshots ol,
 #plugin-information .updated,
-#plugin-information pre {
+#plugin-information pre,
+#plugin-readme .updated,
+#plugin-readme pre {
 	margin-right: 0;
 	margin-left: 215px;
 }
 
 #plugin-information .updated,
-#plugin-information .error {
+#plugin-information .error,
+#plugin-readme .updated,
+#plugin-readme .error {
 	clear: none;
 	direction: rtl;
 }
Index: wp-admin/css/wp-admin.dev.css
===================================================================
--- wp-admin/css/wp-admin.dev.css	(revision 19998)
+++ wp-admin/css/wp-admin.dev.css	(working copy)
@@ -6852,7 +6852,8 @@
 }
 
 /* Header on thickbox */
-#plugin-information-header {
+#plugin-information-header,
+#plugin-readme-header {
 	margin: 0;
 	padding: 0 5px;
 	font-weight: bold;
@@ -6861,7 +6862,8 @@
 	border-bottom-style: solid;
 	height: 2.5em;
 }
-#plugin-information ul#sidemenu {
+#plugin-information ul#sidemenu,
+#plugin-readme ul#sidemenu {
 	font-weight: normal;
 	margin: 0 5px;
 	position: absolute;
@@ -6889,28 +6891,33 @@
 	line-height: 2em;
 }
 
-#plugin-information h2 {
+#plugin-information h2,
+#plugin-readme h2 {
 	clear: none !important;
 	margin-right: 200px;
 }
 
-#plugin-information .fyi {
+#plugin-information .fyi,
+#plugin-readme .fyi {
 	margin: 0 10px 50px;
 	width: 210px;
 }
 
-#plugin-information .fyi h2 {
+#plugin-information .fyi h2,
+#plugin-readme .fyi h2 {
 	font-size: 0.9em;
 	margin-bottom: 0;
 	margin-right: 0;
 }
 
-#plugin-information .fyi h2.mainheader {
+#plugin-information .fyi h2.mainheader,
+#plugin-readme .fyi h2.mainheader {
 	padding: 5px;
 	-webkit-border-top-left-radius: 3px;
 	border-top-left-radius: 3px;
 }
 
+#plugin-readme .fyi ul,
 #plugin-information .fyi ul {
 	padding: 10px 5px 10px 7px;
 	margin: 0;
@@ -6919,16 +6926,20 @@
 	border-bottom-left-radius: 3px;
 }
 
-#plugin-information .fyi li {
+#plugin-information .fyi li,
+#plugin-readme .fyi li {
 	margin-right: 0;
 }
 
-#plugin-information #section-holder {
+#plugin-information #section-holder,
+#plugin-readme #section-holder {
 	padding: 10px;
 }
 
 #plugin-information .section ul,
-#plugin-information .section ol {
+#plugin-information .section ol,
+#plugin-readme .section ul,
+#plugin-readme .section ol {
 	margin-left: 16px;
 	list-style-type: square;
 	list-style-image: none;
@@ -6954,11 +6965,14 @@
 
 #plugin-information #section-screenshots ol,
 #plugin-information .updated,
-#plugin-information pre {
+#plugin-information pre,
+#plugin-readme .updated,
+#plugin-readme pre {
 	margin-right: 215px;
 }
 
-#plugin-information pre {
+#plugin-information pre,
+#plugin-readme pre {
 	padding: 7px;
 	overflow: auto;
 }
Index: wp-admin/includes/class-wp-plugin-install-list-table.php
===================================================================
--- wp-admin/includes/class-wp-plugin-install-list-table.php	(revision 19998)
+++ wp-admin/includes/class-wp-plugin-install-list-table.php	(working copy)
@@ -34,7 +34,7 @@
 		$tabs['popular']  = _x( 'Popular','Plugin Installer' );
 		$tabs['new']      = _x( 'Newest','Plugin Installer' );
 
-		$nonmenu_tabs = array( 'plugin-information' ); //Valid actions to perform which do not have a Menu item.
+		$nonmenu_tabs = array( 'plugin-information', 'plugin-readme' ); //Valid actions to perform which do not have a Menu item.
 
 		$tabs = apply_filters( 'install_plugins_tabs', $tabs );
 		$nonmenu_tabs = apply_filters( 'install_plugins_nonmenu_tabs', $nonmenu_tabs );
Index: wp-admin/includes/class-wp-plugins-list-table.php
===================================================================
--- wp-admin/includes/class-wp-plugins-list-table.php	(revision 19998)
+++ wp-admin/includes/class-wp-plugins-list-table.php	(working copy)
@@ -427,6 +427,10 @@
 							$author = '<a href="' . $plugin_data['AuthorURI'] . '" title="' . esc_attr__( 'Visit author homepage' ) . '">' . $plugin_data['Author'] . '</a>';
 						$plugin_meta[] = sprintf( __( 'By %s' ), $author );
 					}
+					$slug = basename( $plugin_file, '.php' );
+					$plugin_meta[] = '<a href="' . self_admin_url( 'plugin-install.php?tab=plugin-readme&amp;readme=true&amp;plugin=' . $slug .
+								'&amp;TB_iframe=true&amp;width=600&amp;height=550' ) . '" class="thickbox" title="' .
+								esc_attr( sprintf( __( 'More information about %s' ), "{$plugin_data['Name']} {$plugin_data['Version']}" ) ) . '">' . __( 'Details' ) . '</a>';
 					if ( ! empty( $plugin_data['PluginURI'] ) )
 						$plugin_meta[] = '<a href="' . $plugin_data['PluginURI'] . '" title="' . esc_attr__( 'Visit plugin site' ) . '">' . __( 'Visit plugin site' ) . '</a>';
 
Index: wp-admin/includes/plugin-install.php
===================================================================
--- wp-admin/includes/plugin-install.php	(revision 19998)
+++ wp-admin/includes/plugin-install.php	(working copy)
@@ -384,3 +384,216 @@
 	exit;
 }
 add_action('install_plugins_pre_plugin-information', 'install_plugin_information');
+
+/**
+ * Get information from a plugin locally
+ * @param string $slug
+ * @since 3.4.0
+ */
+function local_plugin_api( $slug ) {
+
+	// Try to find the plugin file from the slug
+	$plugin_data = array();
+	if ( file_exists( ABSPATH . PLUGINDIR . "/$slug.php" ) ) {
+		$plugin_data = get_plugin_data( ABSPATH . PLUGINDIR . "/$slug.php" );
+	} elseif ( file_exists( ABSPATH . PLUGINDIR . "/$slug/$slug.php" ) ) {
+		$plugin_data = get_plugin_data( ABSPATH . PLUGINDIR . "/$slug/$slug.php" );
+	}
+	
+	// Try to load data from readme.txt
+	$readme_data = false;
+	if ( file_exists( ABSPATH . PLUGINDIR . "/$slug/readme.txt" ) ) {
+
+		// Get markddown library, turn off plugin functionality
+		if ( !defined( 'MARKDOWN_WP_POSTS' ) )
+			define( 'MARKDOWN_WP_POSTS', false );
+		if ( !defined( 'MARKDOWN_WP_COMMENTS' ) )
+			define( 'MARKDOWN_WP_COMMENTS', false );
+		if ( !class_exists( 'Markdown_Parser' ) )
+			include_once( ABSPATH . 'wp-admin/includes/markdown.php' );
+		
+		include_once( ABSPATH . 'wp-admin/includes/class-wp-plugin-readme-parser.php' );
+		$readme_parser = new wp_plugin_readme_parser();
+		$readme_data = $readme_parser->parse_readme_file( ABSPATH . PLUGINDIR . "/$slug/readme.txt" );
+	}
+	
+	// If there's no readme (e.g. hello.php) create a fake structure
+	if ( empty( $readme_data ) ) {
+		$readme_data = array(
+			'contributors'      => '',
+			'requires_at_least' => '',
+			'tested_up_to'      => '',
+			'tags'              => array(),
+			'sections'          => array(
+				'description'   => !empty( $plugin_data['Description'] ) ? $plugin_data['Description'] : ''
+			)
+		);
+	}
+
+	// Convert to an API-style response
+	$api = array(
+		'name'           => !empty( $plugin_data['Name'] ) ? $plugin_data['Name'] : $slug,
+		'slug'           => $slug,
+		'version'        => !empty( $plugin_data['Version'] ) ? $plugin_data['Version'] : '',
+		'author'         => !empty( $plugin_data['AuthorName'] ) ? $plugin_data['AuthorName'] : '',
+		'author_profile' => null,
+		'contributors'   => $readme_data['contributors'],
+		'requires'       => $readme_data['requires_at_least'],
+		'tested'         => $readme_data['tested_up_to'],
+		'compatibility'  => null,
+		'rating'         => null,
+		'num_ratings'    => null,
+		'downloaded'     => null,
+		'last_updated'   => null,
+		'added'          => null,
+		'homepage'       => !empty( $plugin_data['PluginURI'] ) ? $plugin_data['PluginURI'] : '',
+		'sections'       => $readme_data['sections'],
+		'download_link'  => null,
+		'tags'           => $readme_data['tags']
+	);
+
+	// Done
+	return (object) $api;
+}
+
+/**
+ * Display local plugin information in dialog box form.
+ * Pull from the readme.txt file and the plugin header
+ * @since 3.4.0
+ */
+function plugin_readme_information() {
+	global $tab;
+
+	$api = local_plugin_api( stripslashes( $_REQUEST['plugin'] ) );
+
+	if ( is_wp_error($api) )
+		wp_die($api);
+
+	$plugins_allowedtags = array(
+		'a'    => array(
+			'href'   => array(),
+			'title'  => array(),
+			'target' => array()
+		),
+		'abbr' => array(
+			'title' => array()
+		),
+		'acronym' => array(
+			'title' => array()
+		),
+		'code'   => array(),
+		'pre'    => array(),
+		'em'     => array(),
+		'strong' => array(),
+		'div'    => array(),
+		'p'      => array(),
+		'ul'     => array(),
+		'ol'     => array(),
+		'li'     => array(),
+		'h1'     => array(),
+		'h2'     => array(),
+		'h3'     => array(),
+		'h4'     => array(),
+		'h5'     => array(),
+		'h6'     => array(),
+		'img'    => array(
+			'src'   => array(),
+			'class' => array(),
+			'alt'   => array()
+		)
+	);
+
+	$plugins_section_titles = array(
+		'description'  => _x('Description',  'Plugin installer section title'),
+		'installation' => _x('Installation', 'Plugin installer section title'),
+		'faq'          => _x('FAQ',          'Plugin installer section title'),
+		'changelog'    => _x('Changelog',    'Plugin installer section title'),
+		'other_notes'  => _x('Other Notes',  'Plugin installer section title')
+	);
+
+	// No screenshots at this time
+	if ( !empty( $api->sections['screenshots'] ) )
+		unset( $api->sections['screenshots'] );
+	
+	// Sanitize HTML
+	foreach ( (array)$api->sections as $section_name => $content )
+		$api->sections[$section_name] = wp_kses( $content, $plugins_allowedtags );
+	foreach ( array( 'version', 'author', 'requires', 'tested', 'homepage', 'downloaded', 'slug' ) as $key ) {
+		if ( isset( $api->$key ) )
+			$api->$key = wp_kses( $api->$key, $plugins_allowedtags );
+	}
+
+	// Default to the Description tab, Do not translate, API returns English.
+	$section = isset( $_REQUEST['section'] ) ? stripslashes( $_REQUEST['section'] ) : 'description';
+	if ( empty($section) || ! isset($api->sections[ $section ]) )
+		$section = array_shift( $section_titles = array_keys((array)$api->sections) );
+
+	iframe_header( __( 'Plugin Details' ) );
+	?>
+	<div id="<?php echo $tab; ?>-header">
+		<ul id="sidemenu">
+			<?php foreach ( (array) $api->sections as $section_name => $content ) : ?>
+				<?php				
+					if ( isset( $plugins_section_titles[ $section_name ] ) )
+						$title = $plugins_section_titles[ $section_name ];
+					else
+						$title = ucwords( str_replace( '_', ' ', $section_name ) );
+
+					$class = ( $section_name == $section ) ? ' class="current"' : '';
+					$href = add_query_arg( array('tab' => $tab, 'section' => $section_name) );
+					$href = esc_url($href);
+					$san_section = esc_attr( $section_name );
+				?>
+				<li><a name="<?php echo $san_section; ?>" href="<?php echo $href; ?>" <?php echo $class; ?>><?php echo $title; ?></a></li>
+			<?php endforeach ; ?>
+		</ul>
+	</div>
+	<div class="alignright fyi">
+		<h2 class="mainheader"><?php /* translators: For Your Information */ _e('FYI') ?></h2>
+		<ul>
+			<?php if ( !empty( $api->version ) ) : ?>
+				<li><strong><?php _e('Version:') ?></strong> <?php echo $api->version ?></li>
+			<?php endif; ?>
+			<?php if ( !empty( $api->author ) ) : ?>
+				<li><strong><?php _e('Author:') ?></strong> <?php echo $api->author ?></li>
+			<?php endif; ?>
+			<?php if ( !empty( $api->requires ) ) : ?>
+				<li><strong><?php _e('Requires WordPress Version:') ?></strong> <?php printf(__('%s or higher'), $api->requires) ?></li>
+			<?php endif; ?>
+			<?php if ( !empty( $api->tested ) ) : ?>
+				<li><strong><?php _e('Compatible up to:') ?></strong> <?php echo $api->tested ?></li>
+			<?php endif; ?>		
+			<?php if ( !empty( $api->homepage ) ) : ?>
+				<li><a target="_blank" href="<?php echo $api->homepage ?>"><?php _e('Plugin Homepage &#187;') ?></a></li>
+			<?php endif; ?>
+		</ul>
+	</div>
+	<div id="section-holder" class="wrap">
+	<?php
+		if ( !empty( $api->tested ) && version_compare( substr( $GLOBALS['wp_version'], 0, strlen( $api->tested ) ), $api->tested, '>' ) )
+			echo '<div class="updated"><p>' . __('<strong>Warning:</strong> This plugin has <strong>not been tested</strong> with your current version of WordPress.') . '</p></div>';
+
+		elseif ( !empty( $api->requires ) && version_compare( substr( $GLOBALS['wp_version'], 0, strlen( $api->requires ) ), $api->requires, '<' ) )
+			echo '<div class="updated"><p>' . __('<strong>Warning:</strong> This plugin has <strong>not been marked as compatible</strong> with your version of WordPress.') . '</p></div>';
+
+		foreach ( (array) $api->sections as $section_name => $content ) {
+			if ( isset( $plugins_section_titles[ $section_name ] ) )
+				$title = $plugins_section_titles[ $section_name ];
+			else
+				$title = ucwords( str_replace( '_', ' ', $section_name ) );
+
+			$content = links_add_target($content, '_blank');
+			$san_section = esc_attr( $section_name );
+			$display = ( $section_name == $section ) ? 'block' : 'none';
+			?>
+			<div id="section-<?php echo $san_section; ?>" class="section" style="display: <?php echo $display; ?>;">
+				<h2 class="long-header"><?php echo $title; ?></h2>
+				<?php echo $content; ?>
+			</div>
+			<?php
+		}
+	echo "</div>\n";
+	iframe_footer();
+	exit;
+}
+add_action('install_plugins_pre_plugin-readme', 'plugin_readme_information');
