Index: wp-admin/css/colors-classic.dev.css
===================================================================
--- wp-admin/css/colors-classic.dev.css	(revision 17848)
+++ wp-admin/css/colors-classic.dev.css	(working copy)
@@ -641,6 +641,61 @@
 	border-color: #D1E5EE;
 }
 
+#dashboard_browser_nag_insecure.postbox {
+	background-color: #AC1B1B;
+	border-color: #AC1B1B;
+}
+
+#dashboard_browser_nag_update.postbox {
+	background-color: #E7A904;
+	border-color: #EDC048;
+}
+
+#dashboard_browser_nag_insecure.postbox,
+#dashboard_browser_nag_update.postbox {
+	-moz-box-shadow: none;
+	-webkit-box-shadow: none;
+	box-shadow:none;
+}
+
+#dashboard_browser_nag_insecure.postbox h3 {
+	border-bottom-color: #CD5A5A;
+}
+
+#dashboard_browser_nag_update.postbox h3 {
+	border-bottom-color: #F6E2AC;
+}
+
+#dashboard_browser_nag_insecure.postbox h3,
+#dashboard_browser_nag_update.postbox h3 {
+	background:none;
+	text-shadow: none;
+	-moz-box-shadow: none;
+	-webkit-box-shadow: none;
+	box-shadow: none;
+}
+.ui-sortable #dashboard_browser_nag_insecure.postbox,
+.ui-sortable #dashboard_browser_nag_insecure.postbox h3,
+.ui-sortable #dashboard_browser_nag_update.postbox,
+.ui-sortable #dashboard_browser_nag_update.postbox h3 {
+	color: #fff;
+}
+
+#dashboard_browser_nag_insecure a,
+#dashboard_browser_nag_update a {
+	color: #fff;
+}
+
+#dashboard_browser_nag_insecure a.browse-happy-link,
+#dashboard_browser_nag_insecure a.update-browser-link {
+	text-shadow: #871B15 0 1px 0;
+}
+
+#dashboard_browser_nag_update a.browse-happy-link,
+#dashboard_browser_nag_update 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 17848)
+++ wp-admin/css/colors-fresh.dev.css	(working copy)
@@ -665,6 +665,60 @@
 	background-color: #f9f9f9;
 }
 
+#dashboard_browser_nag_insecure.postbox {
+	background-color: #AC1B1B;
+	border-color: #AC1B1B;
+}
+
+#dashboard_browser_nag_update.postbox {
+	background-color: #E7A904;
+	border-color: #EDC048;
+}
+
+#dashboard_browser_nag_insecure.postbox,
+#dashboard_browser_nag_update.postbox {
+	-moz-box-shadow: none;
+	-webkit-box-shadow: none;
+	box-shadow:none;
+}
+
+#dashboard_browser_nag_insecure.postbox h3 {
+	border-bottom-color: #CD5A5A;
+}
+
+#dashboard_browser_nag_update.postbox h3 {
+	border-bottom-color: #F6E2AC;
+}
+
+#dashboard_browser_nag_insecure.postbox h3,
+#dashboard_browser_nag_update.postbox h3 {
+	text-shadow: none;
+	-moz-box-shadow: none;
+	-webkit-box-shadow: none;
+	box-shadow: none;
+}
+.ui-sortable #dashboard_browser_nag_insecure.postbox,
+.ui-sortable #dashboard_browser_nag_insecure.postbox h3,
+.ui-sortable #dashboard_browser_nag_update.postbox,
+.ui-sortable #dashboard_browser_nag_update.postbox h3 {
+	color: #fff;
+}
+
+#dashboard_browser_nag_insecure a,
+#dashboard_browser_nag_update a {
+	color: #fff;
+}
+
+#dashboard_browser_nag_insecure a.browse-happy-link,
+#dashboard_browser_nag_insecure a.update-browser-link {
+	text-shadow: #871B15 0 1px 0;
+}
+
+#dashboard_browser_nag_update a.browse-happy-link,
+#dashboard_browser_nag_update a.update-browser-link {
+	text-shadow: #D29A04 0 1px 0;
+}
+
 .ui-sortable .postbox h3 {
 	color: #464646;
 }
Index: wp-admin/css/dashboard.dev.css
===================================================================
--- wp-admin/css/dashboard.dev.css	(revision 17848)
+++ 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 17848)
+++ wp-admin/includes/dashboard.php	(working copy)
@@ -25,6 +25,15 @@
 
 	/* Register Widgets and Controls */
 
+	$response = wp_check_browser_version();
+
+	if ( $response['upgrade'] ) {
+		if ( $response['insecure'] )
+			wp_add_dashboard_widget( 'dashboard_browser_nag_insecure', __( 'You are using an insecure browser!' ), 'wp_dashboard_browser_nag' );
+		else
+			wp_add_dashboard_widget( 'dashboard_browser_nag_update', __( '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,6 +1156,28 @@
 }
 add_action( 'activity_box_end', 'wp_dashboard_quota' );
 
+// Display Browser Nag Meta Box
+function wp_dashboard_browser_nag() {
+	$response = wp_check_browser_version();
+
+	/**
+	 * @todo add to API?
+	 */
+	if ( empty( $response['update_url'] ) ) {
+		$response['update_url'] = '';
+	}
+
+	$insecure = $response['insecure']? 'insecure' : 'old';
+
+	$msg = sprintf( __( 'It looks like you\'re using and 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 .= '<div class="clear"></div>';
+
+	echo apply_filters( 'browse-happy-notice', $msg );
+}
+
+
 /**
  * Empty function usable by plugins to output empty dashboard widget (to be populated later by JS).
  */
Index: wp-includes/functions.php
===================================================================
--- wp-includes/functions.php	(revision 17848)
+++ wp-includes/functions.php	(working copy)
@@ -85,16 +85,6 @@
 	global $wp_locale;
 	$i = $unixtimestamp;
 
-	if ( false === $i ) {
-		if ( ! $gmt )
-			$i = current_time( 'timestamp' );
-		else
-			$i = time();
-		// we should not let date() interfere with our
-		// specially computed timestamp
-		$gmt = true;
-	}
-
 	// store original value for language with untypical grammars
 	// see http://core.trac.wordpress.org/ticket/9396
 	$req_format = $dateformatstring;
@@ -600,7 +590,7 @@
 
 	wp_protect_special_option( $option );
 
-	/* 
+	/*
 	 * FIXME the next two lines of code are not necessary and should be removed.
 	 * @see http://core.trac.wordpress.org/ticket/13480
 	 */
@@ -2876,26 +2866,26 @@
  * @param string $title Error title.
  * @param string|array $args Optional arguements to control behaviour.
  */
-function _xmlrpc_wp_die_handler( $message, $title = '', $args = array() ) { 
+function _xmlrpc_wp_die_handler( $message, $title = '', $args = array() ) {
 	global $wp_xmlrpc_server;
 	$defaults = array( 'response' => 500 );
 
 	$r = wp_parse_args($args, $defaults);
 
-	if ( $wp_xmlrpc_server ) { 
-		$error = new IXR_Error( $r['response'] , $message); 
-		$wp_xmlrpc_server->output( $error->getXml() ); 
+	if ( $wp_xmlrpc_server ) {
+		$error = new IXR_Error( $r['response'] , $message);
+		$wp_xmlrpc_server->output( $error->getXml() );
 	}
 	die();
 }
 
 /**
  * Filter to enable special wp_die handler for xmlrpc requests.
- * 
+ *
  * @since 3.2.0
  * @access private
  */
-function _xmlrpc_wp_die_filter() { 
+function _xmlrpc_wp_die_filter() {
 	return '_xmlrpc_wp_die_handler';
 }
 
@@ -4556,4 +4546,43 @@
 	@header( 'X-Frame-Options: SAMEORIGIN' );
 }
 
+/**
+ * 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;
+}
 ?>
