Index: wp-admin/options.php
===================================================================
--- wp-admin/options.php	(revision 20450)
+++ wp-admin/options.php	(working copy)
@@ -134,6 +134,48 @@
 		}
 	}
 
+	// Handle mismatched WWW / non-WWW 
+	if ( ( 'general' == $option_page ) && !is_multisite() ) {
+		// grab my two URLS
+			$siteurl = $_POST['siteurl'];
+			$homeurl = $_POST['home'];
+						
+			$site_root	= parse_url($siteurl, PHP_URL_HOST);
+			$home_root	= parse_url($homeurl, PHP_URL_HOST);
+			
+			if($home_root !== $site_root) {
+
+				// get other parts of siteurl
+				$scheme	= parse_url($homeurl, PHP_URL_SCHEME);
+				$host	= parse_url($homeurl, PHP_URL_HOST);
+				$port	= parse_url($siteurl, PHP_URL_PORT);
+				$path	= parse_url($homeurl, PHP_URL_PATH);
+
+				// check for port in URL
+				if(!empty($port)) {
+					$port = ':'.parse_url($siteurl, PHP_URL_PORT);
+				} else {
+					$port = '';
+				}
+
+				// check for path in URL				
+				if(!empty($path)) {
+					$path = parse_url($siteurl, PHP_URL_PATH);
+				} else {
+					$path = '';
+				}
+				
+				// swap out URL host
+				$host	= str_replace($home_root, $site_root, $host);
+
+				// now rebuild it
+				$home = $scheme.'://'.$host.$port.$path;
+				
+				// and post it for saving
+				$_POST['home'] = $home;
+			}
+	}
+
 	if ( $options ) {
 		foreach ( $options as $option ) {
 			if ( $unregistered )
