Index: /trunk/wp-admin/options-general.php
===================================================================
--- /trunk/wp-admin/options-general.php	(revision 12506)
+++ /trunk/wp-admin/options-general.php	(revision 12507)
@@ -140,9 +140,21 @@
 $current_offset = get_option('gmt_offset');
 $tzstring = get_option('timezone_string');
-if (empty($tzstring)) { // set the Etc zone if no timezone string exists
-	if ($current_offset < 0) $offnum = - ceil($current_offset);
-	else $offnum = - floor($current_offset);
-	$tzstring = 'Etc/GMT' . (($offnum >= 0) ? '+' : '') . $offnum;
+
+$check_zone_info = true;
+
+// Remove old Etc mappings.  Fallback to gmt_offset.
+if ( false !== strpos($tzstring,'Etc/GMT') )
+	$tzstring = '';
+
+if (empty($tzstring)) { // Create a UTC+- zone if no timezone string exists
+	$check_zone_info = false;
+	if ( 0 == $current_offset )
+		$tzstring = 'UTC+0';
+	elseif ($current_offset < 0)
+		$tzstring = 'UTC' . $current_offset;
+	else
+		$tzstring = 'UTC+' . $current_offset;
 }
+
 ?>
 <th scope="row"><label for="timezone_string"><?php _e('Timezone') ?></label></th>
@@ -161,5 +173,5 @@
 <br />
 <span>
-<?php if ($tzstring) : ?>
+<?php if ($check_zone_info && $tzstring) : ?>
 	<?php
 	$now = localtime(time(),true);
Index: /trunk/wp-admin/options.php
===================================================================
--- /trunk/wp-admin/options.php	(revision 12506)
+++ /trunk/wp-admin/options.php	(revision 12507)
@@ -66,4 +66,10 @@
 		if ( !empty($_POST['time_format']) && isset($_POST['time_format_custom']) && '\c\u\s\t\o\m' == stripslashes( $_POST['time_format'] ) )
 			$_POST['time_format'] = $_POST['time_format_custom'];
+		// Map UTC+- timezones to gmt_offsets and set timezone_string to empty.
+		if ( !empty($_POST['timezone_string']) && preg_match('/^UTC[+-]/', $_POST['timezone_string']) ) {
+			$_POST['gmt_offset'] = $_POST['timezone_string'];
+			$_POST['gmt_offset'] = preg_replace('/UTC\+?/', '', $_POST['gmt_offset']);
+			$_POST['timezone_string'] = '';
+		}
 	}
 
Index: /trunk/wp-includes/functions.php
===================================================================
--- /trunk/wp-includes/functions.php	(revision 12506)
+++ /trunk/wp-includes/functions.php	(revision 12507)
@@ -3394,5 +3394,5 @@
 	static $mo_loaded = false;
 
-	$continents = array( 'Africa', 'America', 'Antarctica', 'Arctic', 'Asia', 'Atlantic', 'Australia', 'Europe', 'Indian', 'Pacific', 'Etc' );
+	$continents = array( 'Africa', 'America', 'Antarctica', 'Arctic', 'Asia', 'Atlantic', 'Australia', 'Europe', 'Indian', 'Pacific');
 
 	// Load translations for continents and cities
@@ -3408,7 +3408,4 @@
 		$zone = explode( '/', $zone );
 		if ( !in_array( $zone[0], $continents ) ) {
-			continue;
-		}
-		if ( 'Etc' === $zone[0] && in_array( $zone[1], array( 'UCT', 'GMT', 'GMT0', 'GMT+0', 'GMT-0', 'Greenwich', 'Universal', 'Zulu' ) ) ) {
 			continue;
 		}
@@ -3453,5 +3450,5 @@
 			// Continent optgroup
 			if ( !isset( $zonen[$key - 1] ) || $zonen[$key - 1]['continent'] !== $zone['continent'] ) {
-				$label = ( 'Etc' === $zone['continent'] ) ? __( 'Manual offsets' ) : $zone['t_continent'];
+				$label = $zone['t_continent'];
 				$structure[] = '<optgroup label="'. esc_attr( $label ) .'">';
 			}
@@ -3459,19 +3456,10 @@
 			// Add the city to the value
 			$value[] = $zone['city'];
-			if ( 'Etc' === $zone['continent'] ) {
-				if ( 'UTC' === $zone['city'] ) {
-					$display = '';
-				} else {
-					$display = str_replace( 'GMT', '', $zone['city'] );
-					$display = strtr( $display, '+-', '-+' ) . ':00';
-				}
-				$display = sprintf( __( 'UTC %s' ), $display );
-			} else {
-				$display = $zone['t_city'];
-				if ( !empty( $zone['subcity'] ) ) {
-					// Add the subcity to the value
-					$value[] = $zone['subcity'];
-					$display .= ' - ' . $zone['t_subcity'];
-				}
+
+			$display = $zone['t_city'];
+			if ( !empty( $zone['subcity'] ) ) {
+				// Add the subcity to the value
+				$value[] = $zone['subcity'];
+				$display .= ' - ' . $zone['t_subcity'];
 			}
 		}
@@ -3491,4 +3479,34 @@
 	}
 
+	// Do UTC
+	$structure[] = '<optgroup label="'. esc_attr__( 'UTC' ) .'">';
+	$selected = '';
+	if ( 'UTC' === $selected_zone )
+		$selected = 'selected="selected" ';
+	$structure[] = '<option ' . $selected . 'value="' . esc_attr( 'UTC' ) . '">' . __('UTC') . '</option>';
+	$structure[] = '</optgroup>';
+
+	// Do manual UTC offsets
+	$structure[] = '<optgroup label="'. esc_attr__( 'Manual Offsets' ) .'">';
+	$offset_range = array (-12, -11.5, -11, -10.5, -10, -9.5, -9, -8.5, -8, -7.5, -7, -6.5, -6, -5.5, -5, -4.5, -4, -3.5, -3, -2.5, -2, -1.5, -1, -0.5,
+		0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 5.75, 6, 6.5, 7, 7.5, 8, 8.5, 8.75, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.75, 13, 13.75, 14);
+	foreach ( $offset_range as $offset ) {
+		if ( 0 <= $offset )
+			$offset_name = '+' . $offset;
+		else
+			$offset_name = (string) $offset;
+
+		$offset_value = $offset_name;
+		$offset_name = str_replace(array('.25','.5','.75'), array(':15',':30',':45'), $offset_name);
+		$offset_name = 'UTC' . $offset_name;
+		$offset_value = 'UTC' . $offset_value;
+		$selected = '';
+		if ( $offset_value === $selected_zone )
+			$selected = 'selected="selected" ';
+		$structure[] = '<option ' . $selected . 'value="' . esc_attr( $offset_value ) . '">' . esc_html( $offset_name ) . "</option>";
+		
+	}
+	$structure[] = '</optgroup>';
+
 	return join( "\n", $structure );
 }
