Index: wp-admin/css/colors-classic.dev.css
===================================================================
--- wp-admin/css/colors-classic.dev.css	(revision 17860)
+++ wp-admin/css/colors-classic.dev.css	(working copy)
@@ -641,6 +641,56 @@
 	border-color: #D1E5EE;
 }
 
+#dashboard_browser_nag.postbox.browser-insecure {
+	background-color: #AC1B1B;
+	border-color: #AC1B1B;
+}
+
+#dashboard_browser_nag.postbox {
+	background-color: #e29808;
+	border-color: #EDC048;
+}
+
+#dashboard_browser_nag.postbox {
+	-moz-box-shadow: none;
+	-webkit-box-shadow: none;
+	box-shadow:none;
+}
+
+#dashboard_browser_nag.browser-insecure.postbox h3 {
+	border-bottom-color: #CD5A5A;
+}
+
+#dashboard_browser_nag.postbox h3 {
+	border-bottom-color: #F6E2AC;
+}
+
+#dashboard_browser_nag.postbox h3 {
+	background:none;
+	text-shadow: none;
+	-moz-box-shadow: none;
+	-webkit-box-shadow: none;
+	box-shadow: none;
+}
+.ui-sortable #dashboard_browser_nag.postbox,
+.ui-sortable #dashboard_browser_nag.postbox h3 {
+	color: #fff;
+}
+
+#dashboard_browser_nag a {
+	color: #fff;
+}
+
+#dashboard_browser_nag.browser-insecure a.browse-happy-link,
+#dashboard_browser_nag.browser-insecure a.update-browser-link {
+	text-shadow: #871B15 0 1px 0;
+}
+
+#dashboard_browser_nag a.browse-happy-link,
+#dashboard_browser_nag a.update-browser-link {
+	text-shadow: #D29A04 0 1px 0;
+}
+
 .widget,
 .postbox {
 	background-color: #fff;
Index: wp-admin/css/colors-fresh.dev.css
===================================================================
--- wp-admin/css/colors-fresh.dev.css	(revision 17860)
+++ wp-admin/css/colors-fresh.dev.css	(working copy)
@@ -665,6 +665,56 @@
 	background-color: #f9f9f9;
 }
 
+#dashboard_browser_nag.postbox.browser-insecure {
+	background-color: #AC1B1B;
+	border-color: #AC1B1B;
+}
+
+#dashboard_browser_nag.postbox {
+	background-color: #e29808;
+	border-color: #EDC048;
+}
+
+#dashboard_browser_nag.postbox {
+	-moz-box-shadow: none;
+	-webkit-box-shadow: none;
+	box-shadow:none;
+}
+
+#dashboard_browser_nag.postbox.browser-insecure h3 {
+	border-bottom-color: #CD5A5A;
+}
+
+#dashboard_browser_nag.postbox h3 {
+	border-bottom-color: #F6E2AC;
+}
+
+#dashboard_browser_nag.postbox h3 {
+	text-shadow: none;
+	-moz-box-shadow: none;
+	-webkit-box-shadow: none;
+	box-shadow: none;
+}
+
+.ui-sortable #dashboard_browser_nag.postbox,
+.ui-sortable #dashboard_browser_nag.postbox h3 {
+	color: #fff;
+}
+
+#dashboard_browser_nag a {
+	color: #fff;
+}
+
+#dashboard_browser_nag.browser-insecure a.browse-happy-link,
+#dashboard_browser_nag.browser-insecure a.update-browser-link {
+	text-shadow: #871B15 0 1px 0;
+}
+
+#dashboard_browser_nag a.browse-happy-link,
+#dashboard_browser_nag a.update-browser-link {
+	text-shadow: #D29A04 0 1px 0;
+}
+
 .ui-sortable .postbox h3 {
 	color: #464646;
 }
@@ -1820,4 +1870,4 @@
 .appearance_page_custom-header #upload-form p label {
 	color: #777;
 }
-/* end custom header page */
\ No newline at end of file
+/* end custom header page */
Index: wp-admin/css/dashboard.dev.css
===================================================================
--- wp-admin/css/dashboard.dev.css	(revision 17860)
+++ wp-admin/css/dashboard.dev.css	(working copy)
@@ -73,10 +73,44 @@
 	text-decoration: none;
 }
 
+#dashboard-widgets a.update-browser-link {
+	font-size:1.2em;
+	font-weight:bold;
+}
+
+#dashboard-widgets a.browse-happy-link,
+#dashboard-widgets a.update-browser-link,
 #dashboard-widgets h3 a {
 	text-decoration: underline;
 }
 
+#dashboard-widgets p.browser-update-nag {
+	padding-right:125px;
+}
+
+#dashboard-widgets .icon {
+	float: right;
+	width: 125px;
+	height: 135px;
+	margin: -35px auto 0;
+	background: -625px 0 url(../images/browsers-sprite.png) no-repeat;
+}
+#dashboard-widgets .chrome.icon {
+	background-position: 0 0;
+}
+#dashboard-widgets .firefox.icon {
+	background-position: -125px 0;
+}
+#dashboard-widgets .opera.icon {
+	background-position: -250px 0;
+}
+#dashboard-widgets .safari.icon {
+	background-position: -375px 0;
+}
+#dashboard-widgets .internetexplorer.icon {
+	background-position: -500px 0;
+}
+
 #dashboard-widgets h3 .postbox-title-action {
 	position: absolute;
 	right: 30px;
Index: wp-admin/images/browsers-sprite.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: wp-admin\images\browsers-sprite.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: wp-admin/includes/dashboard.php
===================================================================
--- wp-admin/includes/dashboard.php	(revision 17860)
+++ wp-admin/includes/dashboard.php	(working copy)
@@ -25,6 +25,16 @@
 
 	/* Register Widgets and Controls */
 
+	$response = wp_check_browser_version();
+
+	if ( $response['upgrade'] ) {
+		add_filter( 'postbox_classes_dashboard_dashboard_browser_nag', 'dashboard_browser_nag_class' );
+		if ( $response['insecure'] )
+			wp_add_dashboard_widget( 'dashboard_browser_nag', __( 'You are using an insecure browser!' ), 'wp_dashboard_browser_nag' );
+		else
+			wp_add_dashboard_widget( 'dashboard_browser_nag', __( 'Your browser is out of date!' ), 'wp_dashboard_browser_nag' );
+	}
+
 	// Right Now
 	if ( is_blog_admin() && current_user_can('edit_posts') )
 		wp_add_dashboard_widget( 'dashboard_right_now', __( 'Right Now' ), 'wp_dashboard_right_now' );
@@ -1147,7 +1157,74 @@
 }
 add_action( 'activity_box_end', 'wp_dashboard_quota' );
 
+// Display Browser Nag Meta Box
+function wp_dashboard_browser_nag() {
+	$response = wp_check_browser_version();
+
+	if ( $response['insecure'] ) {
+		$msg = sprintf( __( 'It looks like you\'re using an insecure version of %1$s. Using an outdated browser makes your computer unsafe.  For the best WordPress experience, please update your browser.' ), $response['name'] );
+	} else {
+		$msg = sprintf( __( 'It looks like you\'re using an old version of %1$s. Using an outdated browser makes your computer unsafe.  For the best WordPress experience, please update your browser.' ), $response['name'] );
+	}
+
+	$msg = "<div class='icon " . sanitize_html_class( strtolower( $response['name'] ) ) . "'></div><p class='browser-update-nag'>{$msg}</p>";
+	$msg .= sprintf( __( '<p><a href="%1$s" class="update-browser-link">Update %2$s</a> or learn how to <a href="%3$s" class="browse-happy-link">browse happy</a></p>' ), $response['update_url'], $response['name'], 'http://browsehappy.com/' );
+	$msg .= '<p><a href="" class="dismiss">' . __( 'Dismiss' ) . '</a></p>';
+	$msg .= '<div class="clear"></div>';
+
+	echo apply_filters( 'browse-happy-notice', $msg );
+}
+
+function dashboard_browser_nag_class( $classes ) {
+	$response = wp_check_browser_version();
+
+	if ( $response['insecure'] )
+		$classes[] = 'browser-insecure';
+
+	return $classes;
+}
+
 /**
+ * Check if the user needs a browser update
+ *
+ * @since 3.2
+ */
+function wp_check_browser_version() {
+	$key = md5( $_SERVER['HTTP_USER_AGENT'] );
+
+	if ( false === ($response = get_site_transient('browsehappy_' . $key) ) ) {
+		global $wp_version;
+
+		$options = array(
+			'body'			=> array( 'useragent' => $_SERVER['HTTP_USER_AGENT'] ),
+			'user-agent'	=> 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' )
+		);
+
+		$raw_response = wp_remote_post( 'http://api.wordpress.org/core/browse-happy/1.0/', $options );
+
+		if ( is_wp_error( $raw_response ) || 200 != $raw_response['response']['code'] )
+			return;
+
+		/**
+		 * Response should be an array with:
+		 *  'name' - string- A user friendly browser name
+		 *  'version' - string - The most recent version of the browser
+		 *  'current_version' - string - The version of the browser the user is using
+		 *  'upgrade' - boolean - Whether the browser needs an upgrade
+		 *  'insecure' - boolean - Whether the browser is deemed insecure
+		 */
+		$response = unserialize( $raw_response['body'] );
+
+		if ( ! $response )
+			return;
+
+		set_site_transient( 'browsehappy_' . $key, $response, 604800 ); // cache for 1 week
+	}
+
+	return $response;
+}
+
+/**
  * Empty function usable by plugins to output empty dashboard widget (to be populated later by JS).
  */
 function wp_dashboard_empty() {}
Index: wp-admin/js/postbox.dev.js
===================================================================
--- wp-admin/js/postbox.dev.js	(revision 17860)
+++ wp-admin/js/postbox.dev.js	(working copy)
@@ -18,6 +18,11 @@
 			$('.postbox h3 a').click( function(e) {
 				e.stopPropagation();
 			} );
+			$('.postbox a.dismiss').click( function(e) {
+				var hide_id = $(this).parents('.postbox').attr('id') + '-hide';
+				$( '#' + hide_id ).attr('checked', false).triggerHandler('click');
+				return false;
+			} );
 			$('.hide-postbox-tog').click( function() {
 				var box = $(this).val();
 
