Index: wp-admin/css/wp-admin.dev.css
===================================================================
--- wp-admin/css/wp-admin.dev.css	(revision 14603)
+++ wp-admin/css/wp-admin.dev.css	(working copy)
@@ -3696,14 +3696,48 @@
 }
 
 /* Custom Header */
+.appearance_page_custom-header #headimg  {
+	position: relative;
+}
 
-table#available-headers td {
-	padding: 0 20px 10px 0;
+.appearance_page_custom-header #headimg img {
+	z-index: -1;
+	width: 100%;
+	height: 100%;
+	top: 0;
+	left: 0;
+	position: absolute;
 }
-table#available-headers label input {
-	margin-right: 8px;
+
+.appearance_page_custom-header #headimg h1 {
+	font-family: 'Trebuchet MS', 'Lucida Grande', Verdana,Arial, Sans-Serif;
+	font-size: 18px;
+	font-weight: bold;
+	margin: 0;
+	padding-top: 5%;
+	text-align: center;
 }
-table#available-headers label img {
+
+.appearance_page_custom-header #headimg #desc {
+	font-family: 'Lucida Grande', Verdana, Arial, Sans-Serif;
+	font-size: 10px;
+	text-align: center;
+}
+
+.appearance_page_custom-header #uploadForm p label {
+	font-size: 11px;
+}
+
+.appearance_page_custom-header  #available-headers .default-header {
+	float: left;
+	margin: 0 20px 20px 0;
+}
+
+.appearance_page_custom-header #available-headers label input {
+	margin-right: 10px;
+}
+
+.appearance_page_custom-header #available-headers label img {
 	vertical-align: middle;
 }
 
Index: wp-admin/custom-header.php
===================================================================
--- wp-admin/custom-header.php	(revision 14603)
+++ wp-admin/custom-header.php	(working copy)
@@ -50,7 +50,7 @@
 	 * @param callback $admin_image_div_callback Optional custom image div output callback.
 	 * @return Custom_Image_Header
 	 */
-	function Custom_Image_Header($admin_header_callback, $admin_image_div_callback = '') {
+	function Custom_Image_Header( $admin_header_callback, $admin_image_div_callback = '' ) {
 		$this->admin_header_callback = $admin_header_callback;
 		$this->admin_image_div_callback = $admin_image_div_callback;
 	}
@@ -61,16 +61,16 @@
 	 * @since 2.1.0
 	 */
 	function init() {
-		if ( ! current_user_can('edit_theme_options') )
+		if ( ! current_user_can( 'edit_theme_options' ) )
 			return;
 
-		$page = add_theme_page(__('Header'), __('Header'), 'edit_theme_options', 'custom-header', array(&$this, 'admin_page'));
+		$page = add_theme_page( __( 'Header' ), __( 'Header' ), 'edit_theme_options', 'custom-header', array( &$this, 'admin_page' ) );
 
-		add_action("admin_print_scripts-$page", array(&$this, 'js_includes'));
-		add_action("admin_print_styles-$page", array(&$this, 'css_includes'));
-		add_action("admin_head-$page", array(&$this, 'take_action'), 50);
-		add_action("admin_head-$page", array(&$this, 'js'), 50);
-		add_action("admin_head-$page", $this->admin_header_callback, 51);
+		add_action( "admin_print_scripts-$page", array( &$this, 'js_includes' ) );
+		add_action( "admin_print_styles-$page", array( &$this, 'css_includes' ) );
+		add_action( "admin_head-$page", array( &$this, 'take_action' ), 50);
+		add_action( "admin_head-$page", array( &$this, 'js' ), 50 );
+		add_action( "admin_head-$page", $this->admin_header_callback, 51 );
 	}
 
 	/**
@@ -99,10 +99,10 @@
 	function js_includes() {
 		$step = $this->step();
 
-		if ( 1 == $step )
+		if ( ( 1 == $step || 3 == $step ) && !defined( 'NO_HEADER_TEXT' ) )
 			wp_enqueue_script('farbtastic');
 		elseif ( 2 == $step )
-			wp_enqueue_script('jcrop');
+			wp_enqueue_script( 'imgareaselect' );
 	}
 
 	/**
@@ -113,10 +113,10 @@
 	function css_includes() {
 		$step = $this->step();
 
-		if ( 1 == $step )
+		if ( ( 1 == $step || 3 == $step ) && !defined( 'NO_HEADER_TEXT' ) )
 			wp_enqueue_style('farbtastic');
 		elseif ( 2 == $step )
-			wp_enqueue_style('jcrop');
+			wp_enqueue_style( 'imgareaselect' );
 	}
 
 	/**
@@ -127,29 +127,42 @@
 	function take_action() {
 		if ( ! current_user_can('edit_theme_options') )
 			return;
+			
+		if ( empty( $_POST ) )
+			return;
+			
+		if ( isset( $_POST['resetheader'] ) ) {
+			check_admin_referer( 'custom-header' );
+			remove_theme_mod( 'header_image' );
+			return;
+		}
+		
+		if ( isset( $_POST['resettext'] ) ) {
+			check_admin_referer( 'custom-header' );
+			remove_theme_mod('header_textcolor');
+			return;
+		}
 
-		if ( isset( $_POST['textcolor'] ) ) {
+		if ( isset( $_POST['text-color'] ) ) {
 			check_admin_referer('custom-header');
-			if ( 'blank' == $_POST['textcolor'] ) {
-				set_theme_mod('header_textcolor', 'blank');
+			$_POST['text-color'] = str_replace( '#', '', $_POST['text-color'] );
+			if ( 'blank' == $_POST['text-color'] ) {
+				set_theme_mod( 'header_textcolor', 'blank' );
 			} else {
-				$color = preg_replace('/[^0-9a-fA-F]/', '', $_POST['textcolor']);
+				$color = preg_replace( '/[^0-9a-fA-F]/', '', $_POST['text-color'] );
 				if ( strlen($color) == 6 || strlen($color) == 3 )
 					set_theme_mod('header_textcolor', $color);
 			}
 		}
 
-		if ( isset($_POST['resetheader']) ) {
-			check_admin_referer('custom-header');
-			remove_theme_mods();
-		}
-
 		if ( isset($_POST['default-header']) ) {
 			check_admin_referer('custom-header');
 			$this->process_default_headers();
 			if ( isset($this->default_headers[$_POST['default-header']]) )
 				set_theme_mod('header_image', esc_url($this->default_headers[$_POST['default-header']]['url']));
 		}
+		
+		$this->updated = true;
 	}
 
 	/**
@@ -179,39 +192,19 @@
 	 * @since 3.0.0
 	 */
 	function show_default_header_selector() {
-		echo '<table id="available-headers" cellspacing="0" cellpadding="0">';
+		echo '<div id="available-headers">';
 
-		$headers = array_keys($this->default_headers);
-		$table = array();
-		$rows = ceil(count($headers) / 3);
-		for ( $row = 1; $row <= $rows; $row++ ) {
-			for ( $col = 1; $col <= 3; $col++ ) {
-				$table[$row][$col] = array_shift($headers);
-			}
+		foreach ( $this->default_headers as $header_key => $header ) {
+			$header_thumbnail = $header['thumbnail_url'];
+			$header_url = $header['url'];
+			$header_desc = $header['description'];
+			echo '<div class="default-header">';
+			echo '<label><input name="default-header" type="radio" value="' . esc_attr($header_key) . '" ' . checked($header_url, get_theme_mod( 'header_image' ), false) . ' />';
+			echo '<img src="' . $header_thumbnail . '" alt="' . esc_attr($header_desc) .'" title="' . esc_attr($header_desc) .'" /></label>';
+			echo '</div>';
 		}
-
-		foreach ( $table as $row => $cols ) {
-			echo '<tr>';
-			foreach ( $cols as $col => $header_key ) {
-				if ( !$header_key )
-					continue;
-				$class = array('available-header');
-				if ( $row == 1 ) $class[] = 'top';
-				if ( $col == 1 ) $class[] = 'left';
-				if ( $row == $rows ) $class[] = 'bottom';
-				if ( $col == 3 ) $class[] = 'right';
-				if ( !isset($this->headers[$header_key]))
-				echo '<td class="' . join(' ', $class) . '">';
-				$header_thumbnail = $this->default_headers[$header_key]['thumbnail_url'];
-				$header_url = $this->default_headers[$header_key]['url'];
-				$header_desc = $this->default_headers[$header_key]['description'];
-				echo '<label><input name="default-header" type="radio" value="' . esc_attr($header_key) . '" ' . checked($header_url, get_header_image(), false) . ' />';
-				echo '<img src="' . $header_thumbnail . '" alt="' . esc_attr($header_desc) .'" /></label>';
-				echo  '</td>';
-			}
-			echo '</tr>';
-		}
-		echo '</table>';
+		
+		echo '<div class="clear"></div></div>';
 	}
 
 	/**
@@ -221,86 +214,97 @@
 	 */
 	function js() {
 		$step = $this->step();
-		if ( 1 == $step )
+		if ( ( 1 == $step || 3 == $step ) && !defined( 'NO_HEADER_TEXT' ) )
 			$this->js_1();
 		elseif ( 2 == $step )
 			$this->js_2();
 	}
 
 	/**
-	 * Display Javascript based on Step 1.
+	 * Display Javascript based on Step 1 and 3.
 	 *
 	 * @since 2.6.0
 	 */
 	function js_1() { ?>
 <script type="text/javascript">
-	var buttons = ['#name', '#desc', '#pickcolor', '#defaultcolor'];
+	var text_objects = ['#name', '#desc', '#text-color-row'];
 	var farbtastic;
+	var default_color = '#<?php echo HEADER_TEXTCOLOR; ?>';
+	var old_color = null;
 
 	function pickColor(color) {
 		jQuery('#name').css('color', color);
 		jQuery('#desc').css('color', color);
-		jQuery('#textcolor').val(color);
+		jQuery('#text-color').val(color);
 		farbtastic.setColor(color);
 	}
+	
+	function toggle_text(s) {
+		if (jQuery(s).attr('id') == 'showtext' && jQuery('#text-color').val() != 'blank')
+			return;
+		
+		if (jQuery(s).attr('id') == 'hidetext' && jQuery('#text-color').val() == 'blank')
+			return;
 
+		if (jQuery('#text-color').val() == 'blank') {
+			//Show text
+			if (old_color == '#blank')
+				old_color = default_color;
+	
+			jQuery( text_objects.toString() ).show();
+			jQuery('#text-color').val(old_color);
+			jQuery('#name').css('color', old_color);
+			jQuery('#desc').css('color', old_color);
+			pickColor(old_color); 
+		} else {
+			//Hide text
+			jQuery( text_objects.toString() ).hide();
+			old_color = jQuery('#text-color').val();
+			jQuery('#text-color').val('blank');
+		}
+	}
+
 	jQuery(document).ready(function() {
 		jQuery('#pickcolor').click(function() {
 			jQuery('#colorPickerDiv').show();
 		});
 
-		jQuery('#hidetext').click(function() {
-			toggle_text();
+		jQuery('input[name="hidetext"]').click(function() {
+			toggle_text(this);
 		});
+		
+		jQuery('#defaultcolor').click(function() {
+			pickColor(default_color);
+			jQuery('#text-color').val(default_color)
+		});
+		
+		jQuery('#text-color').keyup(function() {
+			var _hex = jQuery('#text-color').val();
+			var hex = _hex;
+			if ( hex[0] != '#' )
+				hex = '#' + hex;
+			hex = hex.replace(/[^#a-fA-F0-9]+/, '');
+			if ( hex != _hex )
+				jQuery('#text-color').val(hex);
+			if ( hex.length == 4 || hex.length == 7 )
+				pickColor( hex );
+		});
+		
+		jQuery(document).mousedown(function(){
+			jQuery('#colorPickerDiv').each( function() {
+				var display = jQuery(this).css('display');
+				if (display == 'block')
+					jQuery(this).fadeOut(2);
+			});
+		});
 
 		farbtastic = jQuery.farbtastic('#colorPickerDiv', function(color) { pickColor(color); });
 		pickColor('#<?php echo get_theme_mod('header_textcolor', HEADER_TEXTCOLOR); ?>');
 
-		<?php if ( 'blank' == get_theme_mod('header_textcolor', HEADER_TEXTCOLOR) ) { ?>
+		<?php if ( 'blank' == get_theme_mod( 'header_textcolor', HEADER_TEXTCOLOR ) || defined( 'NO_HEADER_TEXT' ) ) { ?>
 		toggle_text();
 		<?php } ?>
-	});
-
-	jQuery(document).mousedown(function(){
-		// Make the picker disappear, since we're using it in an independant div
-		hide_picker();
-	});
-
-	function colorDefault() {
-		pickColor('#<?php echo HEADER_TEXTCOLOR; ?>');
-	}
-
-	function hide_picker(what) {
-		var update = false;
-		jQuery('#colorPickerDiv').each(function(){
-			var id = jQuery(this).attr('id');
-			if (id == what) {
-				return;
-			}
-			var display = jQuery(this).css('display');
-			if (display == 'block') {
-				jQuery(this).fadeOut(2);
-			}
 		});
-	}
-
-	function toggle_text(force) {
-		if (jQuery('#textcolor').val() == 'blank') {
-			//Show text
-			jQuery( buttons.toString() ).show();
-			jQuery('#textcolor').val('<?php echo HEADER_TEXTCOLOR; ?>');
-			jQuery('#hidetext').val('<?php _e('Hide Text'); ?>');
-		}
-		else {
-			//Hide text
-			jQuery( buttons.toString() ).hide();
-			jQuery('#textcolor').val('blank');
-			jQuery('#hidetext').val('<?php _e('Show Text'); ?>');
-		}
-	}
-
-
-
 </script>
 <?php
 	}
@@ -315,42 +319,29 @@
 	function onEndCrop( coords ) {
 		jQuery( '#x1' ).val(coords.x);
 		jQuery( '#y1' ).val(coords.y);
-		jQuery( '#x2' ).val(coords.x2);
-		jQuery( '#y2' ).val(coords.y2);
-		jQuery( '#width' ).val(coords.w);
-		jQuery( '#height' ).val(coords.h);
+		jQuery('#width').val(coords.w);
+		jQuery('#height').val(coords.h);
 	}
 
-	// with a supplied ratio
 	jQuery(document).ready(function() {
 		var xinit = <?php echo HEADER_IMAGE_WIDTH; ?>;
 		var yinit = <?php echo HEADER_IMAGE_HEIGHT; ?>;
-		var ratio = xinit / yinit;
+		var ratio = xinit +  ':' + yinit;
 		var ximg = jQuery('#upload').width();
 		var yimg = jQuery('#upload').height();
 
-		//set up default values
-		jQuery( '#x1' ).val(0);
-		jQuery( '#y1' ).val(0);
-		jQuery( '#x2' ).val(xinit);
-		jQuery( '#y2' ).val(yinit);
-		jQuery( '#width' ).val(xinit);
-		jQuery( '#height' ).val(yinit);
-
-		if ( yimg < yinit || ximg < xinit ) {
-			if ( ximg / yimg > ratio ) {
-				yinit = yimg;
-				xinit = yinit * ratio;
-			} else {
-				xinit = ximg;
-				yinit = xinit / ratio;
-			}
-		}
-
-		jQuery('#upload').Jcrop({
+		jQuery('#upload').imgAreaSelect({
+			handles: true,
+			keys: true,
 			aspectRatio: ratio,
-			setSelect: [ 0, 0, xinit, yinit ],
-			onSelect: onEndCrop
+			maxHeight: <?php echo HEADER_IMAGE_HEIGHT; ?>,
+			maxWidth: <?php echo HEADER_IMAGE_WIDTH; ?>,
+			onSelectChange: function(img, c) {
+				jQuery('#x1').val(c.x1);
+				jQuery('#y1').val(c.y1);
+				jQuery('#width').val(c.width);
+				jQuery('#height').val(c.height);
+			},
 		});
 	});
 </script>
@@ -368,89 +359,130 @@
 
 <div class="wrap">
 <?php screen_icon(); ?>
-<h2><?php _e('Your Header Image'); ?></h2>
+<h2><?php _e( 'Custom Header' ); ?></h2>
 
-<?php
-if ( isset($_GET['updated']) && $_GET['updated'] ) { ?>
+<?php if ( ! empty( $this->updated ) ) { ?>
 <div id="message" class="updated">
 <p><?php printf( __( 'Header updated. <a href="%s">Visit your site</a> to see how it looks.' ), home_url( '/' ) ); ?></p>
 </div>
-<?php }
+<?php } ?>
 
-if ( get_theme_mod('header_image') || empty($this->default_headers) ) :
-?>
-<p><?php _e('This is your header image. You can change the text color or upload and crop a new image.'); ?></p>
-<?php
+<h3><?php _e( 'Header Image' ) ?></h3>
+<table class="form-table">
+<tbody>
 
-if ( $this->admin_image_div_callback ) {
-  call_user_func($this->admin_image_div_callback);
-} else {
-?>
-<div id="headimg" style="background-image: url(<?php esc_url(header_image()) ?>);">
-<h1><a onclick="return false;" href="<?php bloginfo('url'); ?>" title="<?php bloginfo('name'); ?>" id="name"><?php bloginfo('name'); ?></a></h1>
-<div id="desc"><?php bloginfo('description');?></div>
-</div>
-<?php } ?>
+	<?php if ( get_header_image() ) { ?>
+<tr valign="top">
+<th scope="row"><?php _e( 'Current Image' ); ?></th>
+<td >
+	<?php if ( $this->admin_image_div_callback ) {
+	  call_user_func( $this->admin_image_div_callback );
+	} else {
+	?>
+	<div id="headimg" style="color:#<?php echo get_theme_mod( 'header_textcolor', HEADER_TEXTCOLOR ); ?>;max-width:<?php echo HEADER_IMAGE_WIDTH; ?>px;;height:<?php echo HEADER_IMAGE_HEIGHT; ?>px">
+		<img id="image" src="<?php esc_url ( header_image() ) ?>" />
+		<?php
+		$style = '';
+		if ( 'blank' == get_theme_mod('header_textcolor', HEADER_TEXTCOLOR) || defined( 'NO_HEADER_TEXT' ) )
+			$style = " style='display:none'";
+		?>
+		<h1 id="name"<?php echo $style; ?>><?php bloginfo( 'name' ); ?></h1>
+		<div id="desc"<?php echo $style; ?>><?php bloginfo( 'description' ); ?></div>
+	</div>
+	<?php } ?>
+</td>
+</tr>
+	<?php } ?>
 
-<?php if ( !defined( 'NO_HEADER_TEXT' ) ) { ?>
-<form method="post" action="<?php echo admin_url('themes.php?page=custom-header&amp;updated=true') ?>">
-<input type="button" class="button" value="<?php esc_attr_e('Hide Text'); ?>" onclick="hide_text()" id="hidetext" />
-<input type="button" class="button" value="<?php esc_attr_e('Select a Text Color'); ?>" id="pickcolor" /><input type="button" class="button" value="<?php esc_attr_e('Use Original Color'); ?>" onclick="colorDefault()" id="defaultcolor" />
-<?php wp_nonce_field('custom-header'); ?>
-<input type="hidden" name="textcolor" id="textcolor" value="#<?php esc_attr(header_textcolor()) ?>" /><input name="submit" type="submit" class="button" value="<?php esc_attr_e('Save Changes'); ?>" /></form>
-<?php } ?>
+<tr valign="top">
+<th scope="row"><?php _e( 'Upload Image' ); ?></th>
+<td>
+	<p><?php _e( 'Here you can upload a custom header image to be shown at the top of your site instead of the default one. On the next screen you will be able to crop the image.' ); ?><br />
+	<?php printf( __( 'Images of exactly <strong>%1$d x %2$d pixels</strong> will be used as-is.' ), HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT ); ?></p>
+	<form enctype="multipart/form-data" id="uploadForm" method="post" action="<?php echo esc_attr( add_query_arg( 'step', 2 ) ) ?>">
+	<label><input type="checkbox" value="1" name="transparency"/> <?php _e( 'Retain transparency (If you want to upload a transparent image, you should enable this option.)' ); ?></label>
+	<p>
+		<label for="upload"><?php _e( 'Choose an image from your computer:' ); ?></label><br />
+		<input type="file" id="upload" name="import" />
+		<input type="hidden" name="action" value="save" />
+		<?php wp_nonce_field( 'custom-header' ) ?>
+		<input type="submit" class="button" value="<?php esc_attr_e( 'Upload' ); ?>" />
+	</p>
+	</form>
+</td>
+</tr>
+<form method="post" action="<?php echo esc_attr( add_query_arg( 'step', 1 ) ) ?>">
+	<?php if ( ! empty( $this->default_headers ) ) { ?>
+<tr valign="top">
+<th scope="row"><?php _e( 'Default Images' ); ?></th>
+<td>
+	<p><?php _e( 'If you didn&lsquo;t want to upload your own image, you can use one of these cool headers.' ) ?></p>
+	<?php
+		$this->show_default_header_selector();
+	?>
+</td>
+</tr>
+	<?php }
 
-<div id="colorPickerDiv" style="z-index: 100;background:#eee;border:1px solid #ccc;position:absolute;display:none;"> </div>
-</div>
-<?php
-else:
-	echo '<p>' . __('Choose one of these cool headers, or upload your own image below.') . '</p>';
-	echo '<form method="post" action="' . admin_url('themes.php?page=custom-header&amp;updated=true') . '">';
-	wp_nonce_field('custom-header');
-	$this->show_default_header_selector();
-	echo '<input type="submit" class="button" value="' . esc_attr__('Save Changes') . '"  />';
-	echo '</form>';
-	echo '</div>';
-endif;
-?>
-<div class="wrap">
-<h3><?php _e('Upload New Header Image'); ?></h3><p><?php _e('Here you can upload a custom header image to be shown at the top of your site instead of the default one. On the next screen you will be able to crop the image.'); ?> <?php printf(__('Images of exactly <strong>%1$d x %2$d pixels</strong> will be used as-is.'), HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT); ?></p>
+	if ( get_theme_mod( 'header_image' ) && defined( 'HEADER_IMAGE' ) ) { ?>
+<tr valign="top">
+<th scope="row"><?php _e( 'Reset Header Image' ); ?></th>
+<td>
+	<p><?php _e( 'This will restore the original header image. You will not be able to retrieve any customizations.' ) ?></p>
+	<input type="submit" class="button" name="resetheader" value="<?php esc_attr_e( 'Restore Original Header Image' ); ?>" />
+</td>
+</tr>
+	<?php } ?>
+</tbody>
+</table>
 
-<form enctype="multipart/form-data" id="uploadForm" method="POST" action="<?php echo esc_attr(add_query_arg('step', 2)) ?>">
-<label for="upload"><?php _e('Choose an image from your computer:'); ?></label><br /><input type="file" id="upload" name="import" />
-<input type="hidden" name="action" value="save" />
-<?php wp_nonce_field('custom-header') ?>
-<p class="submit">
-<input type="submit" value="<?php esc_attr_e('Upload'); ?>" />
-</p>
-</form>
+	<?php if ( !defined( 'NO_HEADER_TEXT' ) ) { ?>
+<h3><?php _e( 'Header Text' ) ?></h3>
+<table class="form-table">
+<tbody>
+<tr valign="top" class="hide-if-no-js">
+<th scope="row"><?php _e( 'Display Text' ); ?></th>
+<td>
+	<p>
+	<?php $hidetext = get_theme_mod( 'header_textcolor', HEADER_TEXTCOLOR ); ?>
+	<label><input type="radio" value="1" name="hidetext" id="hidetext"<?php checked( 'blank' == $hidetext  ? true : false ); ?> /> <?php _e( 'No' ); ?></label>
+	<label><input type="radio" value="0" name="hidetext" id="showtext"<?php checked( 'blank' == $hidetext  ? false : true ); ?> /> <?php _e( 'Yes' ); ?></label>
+	</p>
+</td>
+</tr>
 
-</div>
+<tr valign="top" id="text-color-row">
+<th scope="row"><?php _e( 'Text Color' ); ?></th>
+<td>
+	<p>
+		<input type="text" name="text-color" id="text-color" value="#<?php echo esc_attr( get_theme_mod( 'header_textcolor', HEADER_TEXTCOLOR ) ); ?>" />
+		<span class="description hide-if-js"><?php _e( 'If you want to hide header text, add <strong>#blank</strong> as text color.' );?></span>
+		<input type="button" class="button hide-if-no-js" value="<?php esc_attr_e( 'Select a Color' ); ?>" id="pickcolor" />
+		<div id="colorPickerDiv" style="z-index: 100; background:#eee; border:1px solid #ccc; position:absolute; display:none;"></div>
+	</p>
+</td>
+</tr>
 
-		<?php if ( get_theme_mod('header_image') || get_theme_mod('header_textcolor') ) : ?>
-<div class="wrap">
-<h3><?php _e('Reset Header Image and Color'); ?></h3>
-<form method="post" action="<?php echo esc_attr(add_query_arg('step', 1)) ?>">
-<?php
-wp_nonce_field('custom-header');
-if ( !empty($this->default_headers) ) {
-?>
-<p><?php _e('Use one of these cool headers.') ?></p>
-<?php
-	$this->show_default_header_selector();
-?>
-	<input type="submit" class="button" name="resetheader" value="<?php esc_attr_e('Save Changes'); ?>" />
-<?php
-} else {
-?>
-<p><?php _e('This will restore the original header image and color. You will not be able to retrieve any customizations.') ?></p>
-<input type="submit" class="button" name="resetheader" value="<?php esc_attr_e('Restore Original Header'); ?>" />
-<?php } ?>
+	<?php if ( defined( 'HEADER_TEXTCOLOR' ) && get_theme_mod( 'header_textcolor' ) ) { ?>
+<tr valign="top">
+<th scope="row"><?php _e( 'Reset Header Text' ); ?></th>
+<td>
+	<p><?php _e( 'This will restore the original header text. You will not be able to retrieve any customizations.' ) ?></p>
+	<input type="submit" class="button" name="resettext" value="<?php esc_attr_e( 'Restore Original Header Text' ); ?>" />
+</td>
+</tr>
+	<?php } ?>
+
+</tbody>
+</table>
+	<?php } 
+
+	wp_nonce_field( 'custom-header' ); ?>
+<p class="submit"><input type="submit" class="button-primary" name="save-header-options" value="<?php esc_attr_e( 'Save Changes' ); ?>" /></p>
 </form>
 </div>
-		<?php endif;
 
-	}
+<?php }
 
 	/**
 	 * Display second step of custom header image page.
@@ -458,13 +490,14 @@
 	 * @since 2.1.0
 	 */
 	function step_2() {
-		check_admin_referer('custom-header');
-		$overrides = array('test_form' => false);
-		$file = wp_handle_upload($_FILES['import'], $overrides);
+		check_admin_referer( 'custom-header' );
 
-		if ( isset($file['error']) )
-		die( $file['error'] );
+		$overrides = array( 'test_form' => false );
+		$file = wp_handle_upload( $_FILES['import'], $overrides );
 
+		if ( isset( $file['error'] ) )
+			wp_die( $file['error'],  __( 'Image Upload Error' ) );
+
 		$url = $file['url'];
 		$type = $file['type'];
 		$file = $file['file'];
@@ -472,10 +505,11 @@
 
 		// Construct the object array
 		$object = array(
-		'post_title' => $filename,
-		'post_content' => $url,
-		'post_mime_type' => $type,
-		'guid' => $url);
+			'post_title' => $filename,
+			'post_content' => __( 'This is your header image, if you delete it, you will lost your header image.' ),
+			'post_mime_type' => $type,
+			'guid' => $url
+		);
 
 		// Save the data
 		$id = wp_insert_attachment($object, $file);
@@ -491,7 +525,8 @@
 			return $this->finished();
 		} elseif ( $width > HEADER_IMAGE_WIDTH ) {
 			$oitar = $width / HEADER_IMAGE_WIDTH;
-			$image = wp_crop_image($file, 0, 0, $width, $height, HEADER_IMAGE_WIDTH, $height / $oitar, false, str_replace(basename($file), 'midsize-'.basename($file), $file));
+			$transparency = ( isset( $_POST['transparency'] ) && 1 == $_POST['transparency'] ) ? true : false;
+			$image = wp_crop_image( $file, 0, 0, $width, $height, HEADER_IMAGE_WIDTH, $height / $oitar, false, str_replace( basename( $file ), 'midsize-'.basename( $file ), $file ), $transparency );
 			if ( is_wp_error( $image ) )
 				wp_die( __( 'Image could not be processed.  Please go back and try again.' ), __( 'Image Processing Error' ) );
 
@@ -503,30 +538,34 @@
 		} else {
 			$oitar = 1;
 		}
+
+		// Check for transparency
+		$transparency = 0;
+		if ( isset( $_POST['transparency'] ) && 1 == $_POST['transparency'] )
+			$transparency = 1;
 		?>
 
 <div class="wrap">
+<?php screen_icon(); ?>
+<h2><?php _e( 'Crop Header Image' ); ?></h2>
 
-<form method="POST" action="<?php echo esc_attr(add_query_arg('step', 3)) ?>">
+<form method="post" action="<?php echo esc_attr( add_query_arg( 'step', 3 ) ); ?>">
+	<p class="hide-if-no-js"><?php _e( 'Choose the part of the image you want to use as your header.' ); ?></p>
+	<p class="hide-if-js"><strong><?php _e( 'You need Javascript to choose a part of the image.' ); ?></strong></p>
+	<p><?php printf( __( 'Images smaller then <strong>%1$d x %2$d pixels</strong> will be zoomed.' ), HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT ); ?></p>
+	<div id="crop_image" style="position: relative">
+		<img src="<?php echo esc_url( $url ); ?>" id="upload" width="<?php echo $width; ?>" height="<?php echo $height; ?>" />
+	</div>
 
-<p><?php _e('Choose the part of the image you want to use as your header.'); ?></p>
-<div id="testWrap" style="position: relative">
-<img src="<?php echo $url; ?>" id="upload" width="<?php echo $width; ?>" height="<?php echo $height; ?>" />
-</div>
-
-<p class="submit">
-<input type="hidden" name="x1" id="x1" />
-<input type="hidden" name="y1" id="y1" />
-<input type="hidden" name="x2" id="x2" />
-<input type="hidden" name="y2" id="y2" />
-<input type="hidden" name="width" id="width" />
-<input type="hidden" name="height" id="height" />
-<input type="hidden" name="attachment_id" id="attachment_id" value="<?php echo esc_attr($id); ?>" />
-<input type="hidden" name="oitar" id="oitar" value="<?php echo esc_attr($oitar); ?>" />
-<?php wp_nonce_field('custom-header') ?>
-<input type="submit" value="<?php esc_attr_e('Crop Header'); ?>" />
-</p>
-
+	<input type="hidden" name="x1" id="x1" value="0"/>
+	<input type="hidden" name="y1" id="y1" value="0"/>
+	<input type="hidden" name="width" id="width" value="<?php echo esc_attr( $width ); ?>"/>
+	<input type="hidden" name="height" id="height" value="<?php echo esc_attr( $height ); ?>"/>
+	<input type="hidden" name="attachment_id" id="attachment_id" value="<?php echo esc_attr( $id ); ?>" />
+	<input type="hidden" name="oitar" id="oitar" value="<?php echo esc_attr( $oitar ); ?>" />
+	<input type="hidden" name="transparency" id="transparency" value="<?php echo esc_attr( $transparency ); ?>"/>
+	<?php wp_nonce_field( 'custom-header-crop-image' ) ?>
+	<p class="submit"><input type="submit" value="<?php esc_attr_e( 'Crop Header' ); ?>" /></p>
 </form>
 </div>
 		<?php
@@ -538,7 +577,8 @@
 	 * @since 2.1.0
 	 */
 	function step_3() {
-		check_admin_referer('custom-header');
+		check_admin_referer( 'custom-header-crop-image' );
+
 		if ( $_POST['oitar'] > 1 ) {
 			$_POST['x1'] = $_POST['x1'] * $_POST['oitar'];
 			$_POST['y1'] = $_POST['y1'] * $_POST['oitar'];
@@ -546,11 +586,14 @@
 			$_POST['height'] = $_POST['height'] * $_POST['oitar'];
 		}
 
+		$transparency = ( isset( $_POST['transparency'] ) && 1 == $_POST['transparency'] ) ? true : false;
+
 		$original = get_attached_file( $_POST['attachment_id'] );
 
-		$cropped = wp_crop_image($_POST['attachment_id'], $_POST['x1'], $_POST['y1'], $_POST['width'], $_POST['height'], HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT);
+		// Crop the image
+		$cropped = wp_crop_image( $_POST['attachment_id'], $_POST['x1'], $_POST['y1'], $_POST['width'], $_POST['height'], HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT, false, false, $transparency );
 		if ( is_wp_error( $cropped ) )
-			wp_die( __( 'Image could not be processed.  Please go back and try again.' ), __( 'Image Processing Error' ) );
+			wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) );
 
 		$cropped = apply_filters('wp_create_file_in_uploads', $cropped, $_POST['attachment_id']); // For replication
 
@@ -562,7 +605,7 @@
 		$object = array(
 			'ID' => $_POST['attachment_id'],
 			'post_title' => basename($cropped),
-			'post_content' => $url,
+			'post_content' => __( 'This is your header image, if you delete it, you will lost your header image.' ),
 			'post_mime_type' => 'image/jpeg',
 			'guid' => $url
 		);
@@ -587,8 +630,8 @@
 	 * @since 2.1.0
 	 */
 	function finished() {
-		$_GET['updated'] = 1;
-	  $this->step_1();
+		$this->updated = true;
+		$this->step_1();
 	}
 
 	/**
Index: wp-admin/includes/image.php
===================================================================
--- wp-admin/includes/image.php	(revision 14603)
+++ wp-admin/includes/image.php	(working copy)
@@ -41,9 +41,10 @@
  * @param int $dst_h The destination height.
  * @param int $src_abs Optional. If the source crop points are absolute.
  * @param string $dst_file Optional. The destination file to write to.
+ * @param bool $dst_transparency Optional. The destination file type. Transparency = PNG.
  * @return string|WP_Error|false New filepath on success, WP_Error or false on failure.
  */
-function wp_crop_image( $src_file, $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $src_abs = false, $dst_file = false ) {
+function wp_crop_image( $src_file, $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $src_abs = false, $dst_file = false, $dst_transparency = false ) {
 	if ( is_numeric( $src_file ) ) // Handle int as attachment ID
 		$src_file = get_attached_file( $src_file );
 
@@ -63,16 +64,21 @@
 		imageantialias( $dst, true );
 
 	imagecopyresampled( $dst, $src, 0, 0, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h );
-
 	imagedestroy( $src ); // Free up memory
 
 	if ( ! $dst_file )
 		$dst_file = str_replace( basename( $src_file ), 'cropped-' . basename( $src_file ), $src_file );
 
-	$dst_file = preg_replace( '/\\.[^\\.]+$/', '.jpg', $dst_file );
+	$type = '.jpeg';
+	if ( $dst_transparency )
+		$type = '.png';
 
-	if ( imagejpeg( $dst, $dst_file, apply_filters( 'jpeg_quality', 90, 'wp_crop_image' ) ) )
+	$dst_file = preg_replace( '/\\.[^\\.]+$/', $type, $dst_file );
+
+	if ( $dst_transparency && imagepng( $dst, $dst_file) )
 		return $dst_file;
+	elseif ( imagejpeg( $dst, $dst_file) )
+		return $dst_file;
 	else
 		return false;
 }
Index: wp-content/themes/twentyten/functions.php
===================================================================
--- wp-content/themes/twentyten/functions.php	(revision 14603)
+++ wp-content/themes/twentyten/functions.php	(working copy)
@@ -112,7 +112,7 @@
 	set_post_thumbnail_size( HEADER_IMAGE_WIDTH, HEADER_IMAGE_HEIGHT, true );
 
 	// Don't support text inside the header image.
-	define( 'NO_HEADER_TEXT', true );
+	//define( 'NO_HEADER_TEXT', true );
 
 	// Add a way for the custom header to be styled in the admin panel that controls
 	// custom headers. See twentyten_admin_header_style(), below.
@@ -185,13 +185,11 @@
 function twentyten_admin_header_style() {
 ?>
 <style type="text/css">
-#headimg {
-	height: <?php echo HEADER_IMAGE_HEIGHT; ?>px;
-	width: <?php echo HEADER_IMAGE_WIDTH; ?>px;
+/* Shows the same border as on front page */
+.appearance_page_custom-header #headimg {
+	border-bottom: 1px solid #000000;
+	border-top: 4px solid #000000;
 }
-#headimg h1, #headimg #desc {
-	display: none;
-}
 </style>
 <?php
 }
