Index: wp-includes/theme.php
===================================================================
--- wp-includes/theme.php	(revision 23296)
+++ wp-includes/theme.php	(working copy)
@@ -1057,6 +1057,7 @@
 		'thumbnail_url' => '',
 		'width'         => get_theme_support( 'custom-header', 'width' ),
 		'height'        => get_theme_support( 'custom-header', 'height' ),
+		'alt'           => get_theme_mod( 'header_alt_text' ),
 	);
 	return (object) wp_parse_args( $data, $default );
 }
Index: wp-content/themes/twentyten/header.php
===================================================================
--- wp-content/themes/twentyten/header.php	(revision 23296)
+++ wp-content/themes/twentyten/header.php	(working copy)
@@ -87,12 +87,14 @@
 						if ( function_exists( 'get_custom_header' ) ) {
 							$header_image_width  = get_custom_header()->width;
 							$header_image_height = get_custom_header()->height;
+							$header_image_alt    = get_custom_header()->alt;
 						} else {
 							$header_image_width  = HEADER_IMAGE_WIDTH;
 							$header_image_height = HEADER_IMAGE_HEIGHT;
+							$header_image_alt    = '';
 						}
 					?>
-						<img src="<?php header_image(); ?>" width="<?php echo $header_image_width; ?>" height="<?php echo $header_image_height; ?>" alt="" />
+						<img src="<?php header_image(); ?>" width="<?php echo $header_image_width; ?>" height="<?php echo $header_image_height; ?>" alt="<?php echo esc_attr( $header_image_alt ); ?>" />
 					<?php endif; ?>
 			</div><!-- #branding -->
 
Index: wp-content/themes/twentytwelve/header.php
===================================================================
--- wp-content/themes/twentytwelve/header.php	(revision 23296)
+++ wp-content/themes/twentytwelve/header.php	(working copy)
@@ -47,7 +47,7 @@
 
 		<?php $header_image = get_header_image();
 		if ( ! empty( $header_image ) ) : ?>
-			<a href="<?php echo esc_url( home_url( '/' ) ); ?>"><img src="<?php echo esc_url( $header_image ); ?>" class="header-image" width="<?php echo get_custom_header()->width; ?>" height="<?php echo get_custom_header()->height; ?>" alt="" /></a>
+			<a href="<?php echo esc_url( home_url( '/' ) ); ?>"><img src="<?php echo esc_url( $header_image ); ?>" class="header-image" width="<?php echo get_custom_header()->width; ?>" height="<?php echo get_custom_header()->height; ?>" alt="<?php echo esc_attr( get_custom_header()->alt ); ?>" /></a>
 		<?php endif; ?>
 	</header><!-- #masthead -->
 
Index: wp-content/themes/twentyeleven/header.php
===================================================================
--- wp-content/themes/twentyeleven/header.php	(revision 23296)
+++ wp-content/themes/twentyeleven/header.php	(working copy)
@@ -102,12 +102,14 @@
 						if ( function_exists( 'get_custom_header' ) ) {
 							$header_image_width  = get_custom_header()->width;
 							$header_image_height = get_custom_header()->height;
+							$header_image_alt    = get_custom_header()->alt;
 						} else {
 							$header_image_width  = HEADER_IMAGE_WIDTH;
 							$header_image_height = HEADER_IMAGE_HEIGHT;
+							$header_image_alt    = '';
 						}
 						?>
-					<img src="<?php header_image(); ?>" width="<?php echo $header_image_width; ?>" height="<?php echo $header_image_height; ?>" alt="" />
+					<img src="<?php header_image(); ?>" width="<?php echo $header_image_width; ?>" height="<?php echo $header_image_height; ?>" alt="<?php echo esc_attr( $header_image_alt ); ?>" />
 				<?php endif; // end check for featured image or standard header ?>
 			</a>
 			<?php endif; // end check for removed header image ?>
Index: wp-admin/custom-header.php
===================================================================
--- wp-admin/custom-header.php	(revision 23296)
+++ wp-admin/custom-header.php	(working copy)
@@ -202,6 +202,11 @@
 
 		$this->updated = true;
 
+		if ( isset( $_POST['alt-text'] ) ) {
+			check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );
+			set_theme_mod( 'header_alt_text', esc_html( sanitize_text_field( strip_tags( stripslashes( $_POST['alt-text'] ) ) ) ) );
+		}
+
 		if ( isset( $_POST['resetheader'] ) ) {
 			check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );
 			$this->reset_header_image();
@@ -626,6 +631,12 @@
 	</p>
 </td>
 </tr>
+<tr valign="top">
+<th scope="row"><?php _e( 'Alternative Text' ); ?></th>
+	<td>
+		<input type="text" name="alt-text" class="regular-text" value="<?php echo esc_attr( get_theme_mod( 'header_alt_text' ) ); ?>" />
+	</td>
+</tr>
 </tbody>
 </table>
 <?php endif;
