Index: wp-admin/css/wp-admin.dev.css
===================================================================
--- wp-admin/css/wp-admin.dev.css	(revision 14368)
+++ wp-admin/css/wp-admin.dev.css	(working copy)
@@ -3708,14 +3708,40 @@
 }
 
 /* Custom Header */
+.appearance_page_custom-header #headimg, .appearance_page_custom-header img#upload {
+	border: 1px solid #000;
+}
 
-table#available-headers td {
-	padding: 0 20px 10px 0;
+.appearance_page_custom-header #headimg h1 {
+	font-family: 'Trebuchet MS', 'Lucida Grande', Verdana,Arial, Sans-Serif;
+	font-size: 2em;
+	font-weight: bold;
+	margin: 0;
+	padding-top: 70px;
+	text-align: center;
 }
-table#available-headers label input {
-	margin-right: 8px;
+
+.appearance_page_custom-header td p label {
+	margin-right: 10px;
 }
-table#available-headers label img {
+
+.appearance_page_custom-header #uploadForm p label {
+	font-size: 11px;
+}
+
+.appearance_page_custom-header #headimg #desc {
+	font-family: 'Lucida Grande', Verdana, Arial, Sans-Serif;
+	font-size: 0.8em;
+	text-align: center;
+}
+
+.appearance_page_custom-header table#available-headers td {
+	padding: 0 20px 20px 0;
+}
+.appearance_page_custom-header table#available-headers label input {
+	margin-right: 10px;
+}
+.appearance_page_custom-header table#available-headers label img {
 	vertical-align: middle;
 }
 
Index: wp-admin/custom-header.php
===================================================================
--- wp-admin/custom-header.php	(revision 14368)
+++ 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('switch_themes') )
+		if ( ! current_user_can( 'edit_theme_options' ) )
 			return;
 
-		$page = add_theme_page(__('Header'), __('Header'), 'switch_themes', '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 ) && NO_HEADER_TEXT != 1 )
 			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 ) && NO_HEADER_TEXT != 1 )
 			wp_enqueue_style('farbtastic');
 		elseif ( 2 == $step )
-			wp_enqueue_style('jcrop');
+			wp_enqueue_style('imgareaselect');
 	}
 
 	/**
@@ -125,31 +125,43 @@
 	 * @since 2.6.0
 	 */
 	function take_action() {
-		if ( ! current_user_can('switch_themes') )
+		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'] ) {
+			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;
 	}
 
 	/**
@@ -221,86 +233,99 @@
 	 */
 	function js() {
 		$step = $this->step();
-		if ( 1 == $step )
+		if ( ( 1 == $step || 3 == $step ) && NO_HEADER_TEXT != 1 )
 			$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); ?>');
+		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
 	}
@@ -313,44 +338,31 @@
 	function js_2() { ?>
 <script type="text/javascript">
 	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('#x1').val(coords.x);
+		jQuery('#y1').val(coords.y);
+		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 +380,129 @@
 
 <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>
+	<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="background-image: url(<?php esc_url ( header_image() ) ?>);color:#<?php echo get_theme_mod( 'header_textcolor', HEADER_TEXTCOLOR ); ?>">
+		<?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' ) ) { ?>
+<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' ) && HEADER_TEXTCOLOR && get_theme_mod( 'header_textcolor' ) != 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 +510,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,61 +525,67 @@
 
 		// 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);
+		$id = wp_insert_attachment( $object, $file );
 
-		list($width, $height, $type, $attr) = getimagesize( $file );
+		list( $width, $height, $type, $attr ) = getimagesize( $file );
 
 		if ( $width == HEADER_IMAGE_WIDTH && $height == HEADER_IMAGE_HEIGHT ) {
 			// Add the meta-data
 			wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) );
 
-			set_theme_mod('header_image', esc_url($url));
-			do_action('wp_create_file_in_uploads', $file, $id); // For replication
+			set_theme_mod( 'header_image', esc_url( $url ) );
+			do_action( 'wp_create_file_in_uploads', $file, $id ); // For replication
 			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' ) );
 
-			$image = apply_filters('wp_create_file_in_uploads', $image, $id); // For replication
+			$image = apply_filters( 'wp_create_file_in_uploads', $image, $id ); // For replication
 
-			$url = str_replace(basename($url), basename($image), $url);
+			$url = str_replace( basename( $url ), basename( $image ), $url );
 			$width = $width / $oitar;
 			$height = $height / $oitar;
 		} 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' ) ?>
+	<p class="submit"><input type="submit" value="<?php esc_attr_e( 'Crop Header' ); ?>" /></p>
 </form>
 </div>
 		<?php
@@ -538,7 +597,8 @@
 	 * @since 2.1.0
 	 */
 	function step_3() {
-		check_admin_referer('custom-header');
+		check_admin_referer( 'custom-header' );
+
 		if ( $_POST['oitar'] > 1 ) {
 			$_POST['x1'] = $_POST['x1'] * $_POST['oitar'];
 			$_POST['y1'] = $_POST['y1'] * $_POST['oitar'];
@@ -546,35 +606,38 @@
 			$_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'], $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
+		$cropped = apply_filters( 'wp_create_file_in_uploads', $cropped, $_POST['attachment_id'] ); // For replication
 
-		$parent = get_post($_POST['attachment_id']);
+		$parent = get_post( $_POST['attachment_id'] );
 		$parent_url = $parent->guid;
-		$url = str_replace(basename($parent_url), basename($cropped), $parent_url);
+		$url = str_replace( basename( $parent_url ), basename( $cropped ), $parent_url );
 
 		// Construct the object array
 		$object = array(
 			'ID' => $_POST['attachment_id'],
-			'post_title' => basename($cropped),
-			'post_content' => $url,
+			'post_title' => basename( $cropped ),
+			'post_content' => __( 'This is your header image, if you delete it, you will lost your header image.' ),
 			'post_mime_type' => 'image/jpeg',
 			'guid' => $url
 		);
 
 		// Update the attachment
-		wp_insert_attachment($object, $cropped);
+		wp_insert_attachment( $object, $cropped );
 		wp_update_attachment_metadata( $_POST['attachment_id'], wp_generate_attachment_metadata( $_POST['attachment_id'], $cropped ) );
 
-		set_theme_mod('header_image', $url);
+		set_theme_mod( 'header_image', $url );
 
 		// cleanup
-		$medium = str_replace(basename($original), 'midsize-'.basename($original), $original);
+		$medium = str_replace( basename( $original ), 'midsize-'.basename( $original ), $original );
 		@unlink( apply_filters( 'wp_delete_file', $medium ) );
 		@unlink( apply_filters( 'wp_delete_file', $original ) );
 
@@ -587,8 +650,8 @@
 	 * @since 2.1.0
 	 */
 	function finished() {
-		$_GET['updated'] = 1;
-	  $this->step_1();
+		$this->updated = true;
+		$this->step_1();
 	}
 
 	/**
@@ -597,8 +660,9 @@
 	 * @since 2.1.0
 	 */
 	function admin_page() {
-		if ( ! current_user_can('switch_themes') )
-			wp_die(__('You do not have permission to customize headers.'));
+		if ( ! current_user_can( 'edit_theme_options' ) )
+			wp_die( __( 'You do not have permission to customize headers.' ) );
+
 		$step = $this->step();
 		if ( 1 == $step )
 			$this->step_1();
Index: wp-admin/includes/image.php
===================================================================
--- wp-admin/includes/image.php	(revision 14368)
+++ 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;
 }
