Index: wp-admin/custom-header.php
===================================================================
--- wp-admin/custom-header.php	(revision 17243)
+++ wp-admin/custom-header.php	(working copy)
@@ -168,27 +168,24 @@
 			return;
 
 		$this->updated = true;
-
+                check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );
 		if ( isset( $_POST['resetheader'] ) ) {
-			check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );
+			
 			remove_theme_mod( 'header_image' );
 			return;
 		}
 
 		if ( isset( $_POST['resettext'] ) ) {
-			check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );
 			remove_theme_mod('header_textcolor');
 			return;
 		}
 
 		if ( isset( $_POST['removeheader'] ) ) {
-			check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );
 			set_theme_mod( 'header_image', '' );
 			return;
 		}
 
 		if ( isset( $_POST['text-color'] ) ) {
-			check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );
 			$_POST['text-color'] = str_replace( '#', '', $_POST['text-color'] );
 			if ( 'blank' == $_POST['text-color'] ) {
 				set_theme_mod( 'header_textcolor', 'blank' );
@@ -200,11 +197,14 @@
 		}
 
 		if ( isset($_POST['default-header']) ) {
-			check_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );
 			$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']));
 		}
+
+                if ( isset($_POST['alt-text']) ) {
+			set_theme_mod('header_alt', esc_html($_POST['alt-text']));
+		}
 	}
 
 	/**
@@ -456,7 +456,7 @@
 	<?php } ?>
 </td>
 </tr>
-<?php if ( current_theme_supports( 'custom-header-uploads' ) ) : ?>
+
 <tr valign="top">
 <th scope="row"><?php _e( 'Upload Image' ); ?></th>
 <td>
@@ -468,12 +468,12 @@
 		<input type="file" id="upload" name="import" />
 		<input type="hidden" name="action" value="save" />
 		<?php wp_nonce_field( 'custom-header-upload', '_wpnonce-custom-header-upload' ) ?>
-		<?php submit_button( __( 'Upload' ), 'button', 'submit', false ); ?>
+		<input type="submit" class="button" value="<?php esc_attr_e( 'Upload' ); ?>" />
 	</p>
 	</form>
 </td>
 </tr>
-<?php endif; ?>
+
 </tbody>
 </table>
 
@@ -484,24 +484,31 @@
 <tr valign="top">
 <th scope="row"><?php _e( 'Default Images' ); ?></th>
 <td>
-<?php if ( current_theme_supports( 'custom-header-uploads' ) ) : ?>
 	<p><?php _e( 'If you don&lsquo;t want to upload your own image, you can use one of these cool headers.' ) ?></p>
-<?php else: ?>
-	<p><?php _e( 'You can use one of these cool headers.' ) ?>
-<?php endif; ?>
 	<?php
 		$this->show_default_header_selector();
 	?>
 </td>
 </tr>
 	<?php endif;
+	if ( get_header_image() ) :
+ ?>
+<tr valign="top">
+<th scope="row"><?php _e( 'Alternative Text' ); ?></th>
+<td>
+<fieldset>
+    <legend class="screen-reader-text">
+        <span><?php _e( 'Alternative Text' ); ?></span>
+    </legend>
+    <input type="text" name="alt-text" id="alt-text" value="<?php echo esc_html(get_background_alt()) ?>" />
+</fieldset></td>
+</tr>
 
-	if ( get_header_image() ) : ?>
 <tr valign="top">
 <th scope="row"><?php _e( 'Remove Image' ); ?></th>
 <td>
 	<p><?php _e( 'This will remove the header image. You will not be able to restore any customizations.' ) ?></p>
-	<?php submit_button( __( 'Remove Header Image' ), 'button', 'removeheader', false ); ?>
+	<input type="submit" class="button" name="removeheader" value="<?php esc_attr_e( 'Remove Header Image' ); ?>" />
 </td>
 </tr>
 	<?php endif;
@@ -511,7 +518,7 @@
 <th scope="row"><?php _e( 'Reset Image' ); ?></th>
 <td>
 	<p><?php _e( 'This will restore the original header image. You will not be able to restore any customizations.' ) ?></p>
-	<?php submit_button( __( 'Restore Original Header Image' ), 'button', 'resetheader', false ); ?>
+	<input type="submit" class="button" name="resetheader" value="<?php esc_attr_e( 'Restore Original Header Image' ); ?>" />
 </td>
 </tr>
 	<?php endif; ?>
@@ -550,7 +557,7 @@
 <th scope="row"><?php _e('Reset Text Color'); ?></th>
 <td>
 	<p><?php _e( 'This will restore the original header text. You will not be able to restore any customizations.' ) ?></p>
-	<?php submit_button( __( 'Restore Original Header Text' ), 'button', 'resettext', false ); ?>
+	<input type="submit" class="button" name="resettext" value="<?php esc_attr_e( 'Restore Original Header Text' ); ?>" />
 </td>
 </tr>
 	<?php } ?>
@@ -559,11 +566,8 @@
 </table>
 	<?php endif;
 
-do_action( 'custom_header_options' );
-
 wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?>
-
-<?php submit_button( null, 'primary', 'save-header-options' ); ?>
+<p class="submit"><input type="submit" class="button-primary" name="save-header-options" value="<?php esc_attr_e( 'Save Changes' ); ?>" /></p>
 </form>
 </div>
 
@@ -576,9 +580,6 @@
 	 */
 	function step_2() {
 		check_admin_referer('custom-header-upload', '_wpnonce-custom-header-upload');
-		if ( ! current_theme_supports( 'custom-header-uploads' ) )
-			wp_die( 'Cheatin&#8217; uh?' );
-
 		$overrides = array('test_form' => false);
 		$file = wp_handle_upload($_FILES['import'], $overrides);
 
@@ -637,6 +638,7 @@
 		<img src="<?php echo esc_url( $url ); ?>" id="upload" width="<?php echo $width; ?>" height="<?php echo $height; ?>" />
 	</div>
 
+	<p class="submit">
 	<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 ); ?>"/>
@@ -644,8 +646,7 @@
 	<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-crop-image' ) ?>
-
-	<?php submit_button( __( 'Crop and Publish' ) ); ?>
+	<input type="submit" class="button-primary" value="<?php esc_attr_e( 'Crop and Publish' ); ?>" />
 	</p>
 </form>
 </div>
@@ -659,9 +660,6 @@
 	 */
 	function step_3() {
 		check_admin_referer('custom-header-crop-image');
-		if ( ! current_theme_supports( 'custom-header-uploads' ) )
-			wp_die( 'Cheatin&#8217; uh?' );
-
 		if ( $_POST['oitar'] > 1 ) {
 			$_POST['x1'] = $_POST['x1'] * $_POST['oitar'];
 			$_POST['y1'] = $_POST['y1'] * $_POST['oitar'];
Index: wp-content/themes/twentyten/header.php
===================================================================
--- wp-content/themes/twentyten/header.php	(revision 17243)
+++ wp-content/themes/twentyten/header.php	(working copy)
@@ -72,9 +72,9 @@
 							( /* $src, $width, $height */ $image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'post-thumbnail' ) ) &&
 							$image[1] >= HEADER_IMAGE_WIDTH ) :
 						// Houston, we have a new header image!
-						echo get_the_post_thumbnail( $post->ID );
-					elseif ( get_header_image() ) : ?>
-						<img src="<?php header_image(); ?>" width="<?php echo HEADER_IMAGE_WIDTH; ?>" height="<?php echo HEADER_IMAGE_HEIGHT; ?>" alt="" />
+						echo get_the_post_thumbnail( $post->ID, 'post-thumbnail' );
+					else : ?>
+                                <img src="<?php header_image(); ?>" width="<?php echo HEADER_IMAGE_WIDTH; ?>" height="<?php echo HEADER_IMAGE_HEIGHT; ?>" alt="<?php header_alt(); ?>" />
 					<?php endif; ?>
 			</div><!-- #branding -->
 
Index: wp-includes/theme.php
===================================================================
--- wp-includes/theme.php	(revision 17243)
+++ wp-includes/theme.php	(working copy)
@@ -166,7 +166,7 @@
  * The description will have the tags filtered with the following HTML elements
  * whitelisted. The <b>'a'</b> element with the <em>href</em> and <em>title</em>
  * attributes. The <b>abbr</b> element with the <em>title</em> attribute. The
- * <b>acronym</b> element with the <em>title</em> attribute allowed. The
+ * <b>acronym<b> element with the <em>title</em> attribute allowed. The
  * <b>code</b>, <b>em</b>, and <b>strong</b> elements also allowed.
  *
  * The style.css file must contain theme name, theme URI, and description. The
@@ -239,7 +239,7 @@
 		if ( empty( $theme_data['AuthorURI'] ) ) {
 			$theme_data['Author'] = $theme_data['AuthorName'];
 		} else {
-			$theme_data['Author'] = sprintf( '<a href="%1$s" title="%2$s">%3$s</a>', $theme_data['AuthorURI'], esc_attr__( 'Visit author homepage' ), $theme_data['AuthorName'] );
+			$theme_data['Author'] = sprintf( '<a href="%1$s" title="%2$s">%3$s</a>', $theme_data['AuthorURI'], __( 'Visit author homepage' ), $theme_data['AuthorName'] );
 		}
 	}
 
@@ -267,6 +267,9 @@
 	if ( isset($wp_themes) )
 		return $wp_themes;
 
+	/* Register the default root as a theme directory */
+	register_theme_directory( get_theme_root() );
+
 	if ( !$theme_files = search_theme_directories() )
 		return false;
 
@@ -385,8 +388,8 @@
 		$template_files = array_unique($template_files);
 		$stylesheet_files = array_unique($stylesheet_files);
 
-		$template_dir = $template_directory;
-		$stylesheet_dir = $theme_root . '/' . $stylesheet;
+		$template_dir = dirname($template_files[0]);
+		$stylesheet_dir = dirname($stylesheet_files[0]);
 
 		if ( empty($template_dir) )
 			$template_dir = '/';
@@ -396,14 +399,10 @@
 		// Check for theme name collision.  This occurs if a theme is copied to
 		// a new theme directory and the theme header is not updated.  Whichever
 		// theme is first keeps the name.  Subsequent themes get a suffix applied.
-		// The Twenty Ten, Default and Classic themes always trump their pretenders.
+		// The Default and Classic themes always trump their pretenders.
 		if ( isset($wp_themes[$name]) ) {
-			$trump_cards = array(
-				'classic'   => 'WordPress Classic',
-				'default'   => 'WordPress Default',
-				'twentyten' => 'Twenty Ten',
-			);
-			if ( isset( $trump_cards[ $stylesheet ] ) && $name == $trump_cards[ $stylesheet ] ) {
+			if ( ('WordPress Default' == $name || 'WordPress Classic' == $name) &&
+					 ('default' == $stylesheet || 'classic' == $stylesheet) ) {
 				// If another theme has claimed to be one of our default themes, move
 				// them aside.
 				$suffix = $wp_themes[$name]['Stylesheet'];
@@ -467,14 +466,9 @@
  *
  * @since 2.9.0
  *
- * @return array|string An arry of theme roots keyed by template/stylesheet or a single theme root if all themes have the same root.
+ * @return array Theme roots
  */
 function get_theme_roots() {
-	global $wp_theme_directories;
-
-	if ( count($wp_theme_directories) <= 1 )
-		return '/themes';
-
 	$theme_roots = get_site_transient( 'theme_roots' );
 	if ( false === $theme_roots ) {
 		get_themes();
@@ -519,7 +513,7 @@
 	$theme_names = array_keys($themes);
 	$current_template = get_option('template');
 	$current_stylesheet = get_option('stylesheet');
-	$current_theme = 'Twenty Ten';
+	$current_theme = 'WordPress Default';
 
 	if ( $themes ) {
 		foreach ( (array) $theme_names as $theme_name ) {
@@ -594,7 +588,7 @@
 
 		while ( ($theme_dir = readdir($themes_dir)) !== false ) {
 			if ( is_dir($theme_root . '/' . $theme_dir) && is_readable($theme_root . '/' . $theme_dir) ) {
-				if ( $theme_dir[0] == '.' || $theme_dir == 'CVS' )
+				if ( $theme_dir{0} == '.' || $theme_dir == 'CVS' )
 					continue;
 
 				$stylish_dir = @opendir($theme_root . '/' . $theme_dir);
@@ -617,7 +611,7 @@
 					$found_subdir_themes = false;
 					while ( ($theme_subdir = readdir($theme_subdirs)) !== false ) {
 						if ( is_dir( $subdir . '/' . $theme_subdir) && is_readable($subdir . '/' . $theme_subdir) ) {
-							if ( $theme_subdir[0] == '.' || $theme_subdir == 'CVS' )
+							if ( $theme_subdir{0} == '.' || $theme_subdir == 'CVS' )
 								continue;
 
 							$stylish_dir = @opendir($subdir . '/' . $theme_subdir);
@@ -651,15 +645,17 @@
  * Does not have trailing slash.
  *
  * @since 1.5.0
+ * @param $stylesheet_or_template The stylesheet or template name of the theme
  * @uses apply_filters() Calls 'theme_root' filter on path.
  *
- * @param string $stylesheet_or_template The stylesheet or template name of the theme
  * @return string Theme path.
  */
 function get_theme_root( $stylesheet_or_template = false ) {
-	if ( $stylesheet_or_template ) {
-		if ( $theme_root = get_raw_theme_root($stylesheet_or_template) )
-			$theme_root = WP_CONTENT_DIR . $theme_root;
+	if ($stylesheet_or_template) {
+		$theme_roots = get_theme_roots();
+
+		if ( ! empty( $theme_roots[$stylesheet_or_template] ) )
+			$theme_root = WP_CONTENT_DIR . $theme_roots[$stylesheet_or_template];
 		else
 			$theme_root = WP_CONTENT_DIR . '/themes';
 	} else {
@@ -675,79 +671,48 @@
  * Does not have trailing slash.
  *
  * @since 1.5.0
+ * @param $stylesheet_or_template The stylesheet or template name of the theme
  *
- * @param string $stylesheet_or_template The stylesheet or template name of the theme
  * @return string Themes URI.
  */
 function get_theme_root_uri( $stylesheet_or_template = false ) {
-	if ( $stylesheet_or_template ) {
-		if ( $theme_root = get_raw_theme_root($stylesheet_or_template) )
-			$theme_root_uri = content_url( $theme_root );
-		else
-			$theme_root_uri = content_url( 'themes' );
-	} else {
+	$theme_roots = get_theme_roots();
+
+	if ( isset( $theme_roots[$stylesheet_or_template] ) && $theme_roots[$stylesheet_or_template] )
+		$theme_root_uri = content_url( $theme_roots[$stylesheet_or_template] );
+	else
 		$theme_root_uri = content_url( 'themes' );
-	}
 
 	return apply_filters( 'theme_root_uri', $theme_root_uri, get_option('siteurl'), $stylesheet_or_template );
 }
 
 /**
- * Get the raw theme root relative to the content directory with no filters applied.
+ * Retrieve path to file without the use of extension.
  *
- * @since 3.1.0
- *
- * @param string $stylesheet_or_template The stylesheet or template name of the theme
- * @return string Theme root
- */
-function get_raw_theme_root( $stylesheet_or_template, $no_cache = false ) {
-	global $wp_theme_directories;
-
-	if ( count($wp_theme_directories) <= 1 )
-		return '/themes';
-
-	$theme_root = false;
-
-	// If requesting the root for the current theme, consult options to avoid calling get_theme_roots()
-	if ( !$no_cache ) {
-		if ( get_option('stylesheet') == $stylesheet_or_template )
-			$theme_root = get_option('stylesheet_root');
-		elseif ( get_option('template') == $stylesheet_or_template )
-			$theme_root = get_option('template_root');
-	}
-
-	if ( empty($theme_root) ) {
-		$theme_roots = get_theme_roots();
-		if ( !empty($theme_roots[$stylesheet_or_template]) )
-			$theme_root = $theme_roots[$stylesheet_or_template];
-	}
-
-	return $theme_root;
-}
-
-/**
- * Retrieve path to a template
- *
- * Used to quickly retrieve the path of a template without including the file
- * extension. It will also check the parent theme, if the file exists, with
- * the use of {@link locate_template()}. Allows for more generic template location
+ * Used to quickly retrieve the path of file without including the file
+ * extension. It will also check the parent template, if the file exists, with
+ * the use of {@link locate_template()}. Allows for more generic file location
  * without the use of the other get_*_template() functions.
  *
+ * Can be used with include() or require() to retrieve path.
+ * <code>
+ * if( '' != get_query_template( '404' ) )
+ *     include( get_query_template( '404' ) );
+ * </code>
+ * or the same can be accomplished with
+ * <code>
+ * if( '' != get_404_template() )
+ *     include( get_404_template() );
+ * </code>
+ *
  * @since 1.5.0
  *
  * @param string $type Filename without extension.
- * @param array $templates An optional list of template candidates
  * @return string Full path to file.
  */
-function get_query_template( $type, $templates = array() ) {
+function get_query_template($type) {
 	$type = preg_replace( '|[^a-z0-9-]+|', '', $type );
-
-	if ( empty( $templates ) )
-		$templates = array("{$type}.php");
-
-	$templates = apply_filters( "{$type}_template_hierarchy", $templates );
-
-	return apply_filters( "{$type}_template", locate_template( $templates ) );
+	return apply_filters("{$type}_template", locate_template(array("{$type}.php")));
 }
 
 /**
@@ -780,15 +745,7 @@
  * @return string
  */
 function get_archive_template() {
-	$post_type = get_query_var( 'post_type' );
-
-	$templates = array();
-
-	if ( $post_type )
-		$templates[] = "archive-{$post_type}.php";
-	$templates[] = 'archive.php';
-
-	return get_query_template( 'archive', $templates );
+	return get_query_template('archive');
 }
 
 /**
@@ -799,15 +756,20 @@
  * @return string
  */
 function get_author_template() {
-	$author = get_queried_object();
+	$author_id = absint( get_query_var( 'author' ) );
+	$author = get_user_by( 'id', $author_id );
+	$author = $author->user_nicename;
 
 	$templates = array();
 
-	$templates[] = "author-{$author->user_nicename}.php";
-	$templates[] = "author-{$author->ID}.php";
+	if ( $author )
+		$templates[] = "author-{$author}.php";
+	if ( $author_id )
+		$templates[] = "author-{$author_id}.php";
 	$templates[] = 'author.php';
 
-	return get_query_template( 'author', $templates );
+	$template = locate_template( $templates );
+	return apply_filters( 'author_template', $template );
 }
 
 /**
@@ -823,15 +785,19 @@
  * @return string
  */
 function get_category_template() {
-	$category = get_queried_object();
+	$cat_ID = absint( get_query_var('cat') );
+	$category = get_category( $cat_ID );
 
 	$templates = array();
 
-	$templates[] = "category-{$category->slug}.php";
-	$templates[] = "category-{$category->term_id}.php";
+	if ( !is_wp_error($category) )
+		$templates[] = "category-{$category->slug}.php";
+
+	$templates[] = "category-$cat_ID.php";
 	$templates[] = "category.php";
 
-	return get_query_template( 'category', $templates );
+	$template = locate_template($templates);
+	return apply_filters('category_template', $template);
 }
 
 /**
@@ -847,15 +813,19 @@
  * @return string
  */
 function get_tag_template() {
-	$tag = get_queried_object();
+	$tag_id = absint( get_query_var('tag_id') );
+	$tag_name = get_query_var('tag');
 
 	$templates = array();
 
-	$templates[] = "tag-{$tag->slug}.php";
-	$templates[] = "tag-{$tag->term_id}.php";
+	if ( $tag_name )
+		$templates[] = "tag-$tag_name.php";
+	if ( $tag_id )
+		$templates[] = "tag-$tag_id.php";
 	$templates[] = "tag.php";
 
-	return get_query_template( 'tag', $templates );
+	$template = locate_template($templates);
+	return apply_filters('tag_template', $template);
 }
 
 /**
@@ -870,22 +840,25 @@
  * template is used. If none of the files exist, then it will fall back on to
  * index.php.
  *
- * @since 2.5.0
+ * @since unknown (2.6.0 most likely)
  * @uses apply_filters() Calls 'taxonomy_template' filter on found path.
  *
  * @return string
  */
 function get_taxonomy_template() {
-	$term = get_queried_object();
-	$taxonomy = $term->taxonomy;
+	$taxonomy = get_query_var('taxonomy');
+	$term = get_query_var('term');
 
 	$templates = array();
+	if ( $taxonomy && $term )
+		$templates[] = "taxonomy-$taxonomy-$term.php";
+	if ( $taxonomy )
+		$templates[] = "taxonomy-$taxonomy.php";
 
-	$templates[] = "taxonomy-$taxonomy-{$term->slug}.php";
-	$templates[] = "taxonomy-$taxonomy.php";
 	$templates[] = "taxonomy.php";
 
-	return get_query_template( 'taxonomy', $templates );
+	$template = locate_template($templates);
+	return apply_filters('taxonomy_template', $template);
 }
 
 /**
@@ -912,9 +885,8 @@
  * @return string
  */
 function get_home_template() {
-	$templates = array( 'home.php', 'index.php' );
-
-	return get_query_template( 'home', $templates );
+	$template = locate_template(array('home.php', 'index.php'));
+	return apply_filters('home_template', $template);
 }
 
 /**
@@ -928,9 +900,7 @@
  * @return string
  */
 function get_front_page_template() {
-	$templates = array('front-page.php');
-
-	return get_query_template( 'front_page', $templates );
+	return apply_filters( 'front_page_template', locate_template( array('front-page.php') ) );
 }
 
 /**
@@ -945,13 +915,15 @@
  * @return string
  */
 function get_page_template() {
-	$id = get_queried_object_id();
+	global $wp_query;
+
+	$id = (int) $wp_query->get_queried_object_id();
 	$template = get_post_meta($id, '_wp_page_template', true);
 	$pagename = get_query_var('pagename');
 
 	if ( !$pagename && $id > 0 ) {
 		// If a static page is set as the front page, $pagename will not be set. Retrieve it from the queried object
-		$post = get_queried_object();
+		$post = $wp_query->get_queried_object();
 		$pagename = $post->post_name;
 	}
 
@@ -967,7 +939,7 @@
 		$templates[] = "page-$id.php";
 	$templates[] = "page.php";
 
-	return get_query_template( 'page', $templates );
+	return apply_filters('page_template', locate_template($templates));
 }
 
 /**
@@ -1000,14 +972,11 @@
  * @return string
  */
 function get_single_template() {
-	$object = get_queried_object();
+	global $wp_query;
 
-	$templates = array();
-
-	$templates[] = "single-{$object->post_type}.php";
-	$templates[] = "single.php";
-
-	return get_query_template( 'single', $templates );
+	$object = $wp_query->get_queried_object();
+	$templates = array('single-' . $object->post_type . '.php', 'single.php');
+	return apply_filters('single_template', locate_template($templates));
 }
 
 /**
@@ -1050,13 +1019,13 @@
  * @return string
  */
 function get_comments_popup_template() {
-	$template = get_query_template( 'comments_popup', array( 'comments-popup.php' ) );
+	$template = locate_template(array("comments-popup.php"));
 
 	// Backward compat code will be removed in a future release
 	if ('' == $template)
 		$template = ABSPATH . WPINC . '/theme-compat/comments-popup.php';
 
-	return $template;
+	return apply_filters('comments_popup_template', $template);
 }
 
 /**
@@ -1067,14 +1036,17 @@
  *
  * @since 2.7.0
  *
- * @param string|array $template_names Template file(s) to search for, in order.
+ * @param array $template_names Array of template files to search for in priority order.
  * @param bool $load If true the template file will be loaded if it is found.
  * @param bool $require_once Whether to require_once or require. Default true. Has no effect if $load is false.
  * @return string The template filename if one is located.
  */
 function locate_template($template_names, $load = false, $require_once = true ) {
+	if ( !is_array($template_names) )
+		return '';
+
 	$located = '';
-	foreach ( (array) $template_names as $template_name ) {
+	foreach ( $template_names as $template_name ) {
 		if ( !$template_name )
 			continue;
 		if ( file_exists(STYLESHEETPATH . '/' . $template_name)) {
@@ -1143,10 +1115,6 @@
 	if ( !current_user_can( 'switch_themes' ) )
 		return;
 
-	// Admin Thickbox requests
-	if ( isset( $_GET['preview_iframe'] ) )
-		show_admin_bar( false );
-
 	$_GET['template'] = preg_replace('|[^a-z0-9_./-]|i', '', $_GET['template']);
 
 	if ( validate_file($_GET['template']) )
@@ -1239,27 +1207,17 @@
 /**
  * Switches current theme to new template and stylesheet names.
  *
- * @since 2.5.0
+ * @since unknown
  * @uses do_action() Calls 'switch_theme' action on updated theme display name.
  *
  * @param string $template Template name
  * @param string $stylesheet Stylesheet name.
  */
 function switch_theme($template, $stylesheet) {
-	global $wp_theme_directories;
-
 	update_option('template', $template);
 	update_option('stylesheet', $stylesheet);
-	if ( count($wp_theme_directories) > 1 ) {
-		update_option('template_root', get_raw_theme_root($template, true));
-		update_option('stylesheet_root', get_raw_theme_root($stylesheet, true));
-	}
 	delete_option('current_theme');
 	$theme = get_current_theme();
-	if ( is_admin() && false === get_option( "theme_mods_$stylesheet" ) ) {
-		$default_theme_mods = (array) get_option( "mods_$theme" );
-		add_option( "theme_mods_$stylesheet", $default_theme_mods );
-	}
 	do_action('switch_theme', $theme);
 }
 
@@ -1291,35 +1249,10 @@
 		return false;
 	}
 
-	if ( is_child_theme() && ! file_exists( get_stylesheet_directory() . '/style.css' ) ) {
-		switch_theme( WP_DEFAULT_THEME, WP_DEFAULT_THEME );
-		return false;
-	}
-
 	return true;
 }
 
 /**
- * Retrieve all theme modifications.
- *
- * @since 3.1.0
- *
- * @return array Theme modifications.
- */
-function get_theme_mods() {
-	$theme_slug = get_option( 'stylesheet' );
-	if ( false === ( $mods = get_option( "theme_mods_$theme_slug" ) ) ) {
-		$theme_name = get_current_theme();
-		$mods = get_option( "mods_$theme_name" ); // Deprecated location.
-		if ( is_admin() && false !== $mods ) {
-			update_option( "theme_mods_$theme_slug", $mods );
-			delete_option( "mods_$theme_name" );
-		}
-	}
-	return $mods;
-}
-
-/**
  * Retrieve theme modification value for the current theme.
  *
  * If the modification name does not exist, then the $default will be passed
@@ -1334,13 +1267,15 @@
  * @param bool|string $default
  * @return string
  */
-function get_theme_mod( $name, $default = false ) {
-	$mods = get_theme_mods();
+function get_theme_mod($name, $default = false) {
+	$theme = get_current_theme();
 
-	if ( isset( $mods[ $name ] ) )
-		return apply_filters( "theme_mod_$name", $mods[ $name ] );
+	$mods = get_option( "mods_$theme" );
 
-	return apply_filters( "theme_mod_$name", sprintf( $default, get_template_directory_uri(), get_stylesheet_directory_uri() ) );
+	if ( isset($mods[$name]) )
+		return apply_filters( "theme_mod_$name", $mods[$name] );
+
+	return apply_filters( "theme_mod_$name", sprintf($default, get_template_directory_uri(), get_stylesheet_directory_uri()) );
 }
 
 /**
@@ -1351,13 +1286,15 @@
  * @param string $name Theme modification name.
  * @param string $value theme modification value.
  */
-function set_theme_mod( $name, $value ) {
-	$mods = get_theme_mods();
+function set_theme_mod($name, $value) {
+	$theme = get_current_theme();
 
-	$mods[ $name ] = $value;
+	$mods = get_option("mods_$theme");
 
-	$theme = get_option( 'stylesheet' );
-	update_option( "theme_mods_$theme", $mods );
+	$mods[$name] = $value;
+
+	update_option("mods_$theme", $mods);
+	wp_cache_delete("mods_$theme", 'options');
 }
 
 /**
@@ -1372,18 +1309,20 @@
  * @return null
  */
 function remove_theme_mod( $name ) {
-	$mods = get_theme_mods();
+	$theme = get_current_theme();
 
-	if ( ! isset( $mods[ $name ] ) )
+	$mods = get_option("mods_$theme");
+
+	if ( !isset($mods[$name]) )
 		return;
 
-	unset( $mods[ $name ] );
+	unset($mods[$name]);
 
-	if ( empty( $mods ) )
+	if ( empty($mods) )
 		return remove_theme_mods();
 
-	$theme = get_option( 'stylesheet' );
-	update_option( "theme_mods_$theme", $mods );
+	update_option("mods_$theme", $mods);
+	wp_cache_delete("mods_$theme", 'options');
 }
 
 /**
@@ -1392,8 +1331,9 @@
  * @since 2.1.0
  */
 function remove_theme_mods() {
-	delete_option( 'theme_mods_' . get_option( 'stylesheet' ) );
-	delete_option( 'mods_' . get_current_theme() );
+	$theme = get_current_theme();
+
+	delete_option("mods_$theme");
 }
 
 /**
@@ -1428,16 +1368,9 @@
  * @return string
  */
 function get_header_image() {
-	$default = defined( 'HEADER_IMAGE' ) ? HEADER_IMAGE : '';
+	$default = defined('HEADER_IMAGE') ? HEADER_IMAGE : '';
 
-	$url = get_theme_mod( 'header_image', $default );
-
-	if ( is_ssl() )
-		$url = str_replace( 'http://', 'https://', $url );
-	else
-		$url = str_replace( 'https://', 'http://', $url );
-
-	return $url;
+	return get_theme_mod('header_image', $default);
 }
 
 /**
@@ -1464,49 +1397,20 @@
  * @param callback $admin_header_callback Call on custom header administration screen.
  * @param callback $admin_image_div_callback Output a custom header image div on the custom header administration screen. Optional.
  */
-function add_custom_image_header( $header_callback, $admin_header_callback, $admin_image_div_callback = '' ) {
-	if ( ! empty( $header_callback ) )
+function add_custom_image_header($header_callback, $admin_header_callback, $admin_image_div_callback = '') {
+	if ( ! empty($header_callback) )
 		add_action('wp_head', $header_callback);
 
-	add_theme_support( 'custom-header', array( 'callback' => $header_callback ) );
-	add_theme_support( 'custom-header-uploads' );
+	add_theme_support( 'custom-header' );
 
 	if ( ! is_admin() )
 		return;
-
-	global $custom_image_header;
-
-	require_once( ABSPATH . 'wp-admin/custom-header.php' );
-	$custom_image_header = new Custom_Image_Header( $admin_header_callback, $admin_image_div_callback );
-	add_action( 'admin_menu', array( &$custom_image_header, 'init' ) );
+	require_once(ABSPATH . 'wp-admin/custom-header.php');
+	$GLOBALS['custom_image_header'] =& new Custom_Image_Header($admin_header_callback, $admin_image_div_callback);
+	add_action('admin_menu', array(&$GLOBALS['custom_image_header'], 'init'));
 }
 
 /**
- * Remove image header support.
- *
- * @since 3.1.0
- * @see add_custom_image_header()
- *
- * @return bool Whether support was removed.
- */
-function remove_custom_image_header() {
-	if ( ! current_theme_supports( 'custom-header' ) )
-		return false;
-
-	$callback = get_theme_support( 'custom-header' );
-	remove_action( 'wp_head', $callback[0]['callback'] );
-	_remove_theme_support( 'custom-header' );
-	remove_theme_support( 'custom-header-uploads' );
-
-	if ( is_admin() ) {
-		remove_action( 'admin_menu', array( &$GLOBALS['custom_image_header'], 'init' ) );
-		unset( $GLOBALS['custom_image_header'] );
-	}
-
-	return true;
-}
-
-/**
  * Register a selection of default headers to be displayed by the custom header admin UI.
  *
  * @since 3.0.0
@@ -1528,7 +1432,7 @@
  * @see register_default_headers()
  * @since 3.0.0
  *
- * @param string|array $header The header string id (key of array) to remove, or an array thereof.
+ * @param string|array The header string id (key of array) to remove, or an array thereof.
  * @return True on success, false on failure.
  */
 function unregister_default_headers( $header ) {
@@ -1566,6 +1470,28 @@
 }
 
 /**
+ * Retrieve background image alt attribute for custom background.
+ *
+ * @uses HEADER_ALT
+ *
+ * @return string
+ */
+function get_header_alt() {
+	$default = defined('HEADER_ALT') ? HEADER_ALT : '';
+
+	return get_theme_mod('header_alt', $default);
+}
+
+/**
+ * Display background image alt attribute.
+ *
+ *
+ */
+function header_alt() {
+	echo get_header_alt();
+}
+
+/**
  * Retrieve value for custom background color.
  *
  * @since 3.0.0
@@ -1603,49 +1529,25 @@
  * @param callback $admin_header_callback Call on custom background administration screen.
  * @param callback $admin_image_div_callback Output a custom background image div on the custom background administration screen. Optional.
  */
-function add_custom_background( $header_callback = '', $admin_header_callback = '', $admin_image_div_callback = '' ) {
-	if ( isset( $GLOBALS['custom_background'] ) )
+function add_custom_background($header_callback = '', $admin_header_callback = '', $admin_image_div_callback = '') {
+	if ( isset($GLOBALS['custom_background']) )
 		return;
 
-	if ( empty( $header_callback ) )
+	if ( empty($header_callback) )
 		$header_callback = '_custom_background_cb';
 
-	add_action( 'wp_head', $header_callback );
+	add_action('wp_head', $header_callback);
 
-	add_theme_support( 'custom-background', array( 'callback' => $header_callback ) );
+	add_theme_support( 'custom-background' );
 
 	if ( ! is_admin() )
 		return;
-	require_once( ABSPATH . 'wp-admin/custom-background.php' );
-	$GLOBALS['custom_background'] =& new Custom_Background( $admin_header_callback, $admin_image_div_callback );
-	add_action( 'admin_menu', array( &$GLOBALS['custom_background'], 'init' ) );
+	require_once(ABSPATH . 'wp-admin/custom-background.php');
+	$GLOBALS['custom_background'] =& new Custom_Background($admin_header_callback, $admin_image_div_callback);
+	add_action('admin_menu', array(&$GLOBALS['custom_background'], 'init'));
 }
 
 /**
- * Remove custom background support.
- *
- * @since 3.1.0
- * @see add_custom_background()
- *
- * @return bool Whether support was removed.
- */
-function remove_custom_background() {
-	if ( ! current_theme_supports( 'custom-background' ) )
-		return false;
-
-	$callback = get_theme_support( 'custom-background' );
-	remove_action( 'wp_head', $callback[0]['callback'] );
-	_remove_theme_support( 'custom-background' );
-
-	if ( is_admin() ) {
-		remove_action( 'admin_menu', array( &$GLOBALS['custom_background'], 'init' ) );
-		unset( $GLOBALS['custom_background'] );
-	}
-
-	return true;
-}
-
-/**
  * Default custom background callback.
  *
  * @since 3.0.0
@@ -1694,10 +1596,6 @@
  * the theme root. It also accepts an array of stylesheets.
  * It is optional and defaults to 'editor-style.css'.
  *
- * Supports RTL stylesheets automatically by searching for the -rtl prefix, e.g.
- * editor-style-rtl.css. If an array of stylesheets is passed to add_editor_style(),
- * RTL is only added for the first stylesheet.
- *
  * @since 3.0.0
  *
  * @param mixed $stylesheet Optional. Stylesheet name or array thereof, relative to theme root.
@@ -1722,22 +1620,6 @@
 }
 
 /**
- * Removes all visual editor stylesheets.
- *
- * @since 3.1.0
- *
- * @return bool True on success, false if there were no stylesheets to remove.
- */
-function remove_editor_styles() {
-	if ( ! current_theme_supports( 'editor-style' ) )
-		return false;
-	_remove_theme_support( 'editor-style' );
-	if ( is_admin() )
-		$GLOBALS['editor_styles'] = array();
-	return true;
-}
-
-/**
  * Allows a theme to register its support of a certain feature
  *
  * Must be called in the theme's functions.php file to work.
@@ -1754,27 +1636,9 @@
 		$_wp_theme_features[$feature] = true;
 	else
 		$_wp_theme_features[$feature] = array_slice( func_get_args(), 1 );
-
-	if ( $feature == 'post-formats' && is_array( $_wp_theme_features[$feature][0] ) )
-		$_wp_theme_features[$feature][0] = array_intersect( $_wp_theme_features[$feature][0], array_keys( get_post_format_slugs() ) );
 }
 
 /**
- * Gets the theme support arguments passed when registering that support
- *
- * @since 3.1
- * @param string $feature the feature to check
- * @return array The array of extra arguments
- */
-function get_theme_support( $feature ) {
-	global $_wp_theme_features;
-	if ( !isset( $_wp_theme_features[$feature] ) )
-		return false;
-	else
-		return $_wp_theme_features[$feature];
-}
-
-/**
  * Allows a theme to de-register its support of a certain feature
  *
  * Should be called in the theme's functions.php file. Generally would
@@ -1789,16 +1653,7 @@
 	// Blacklist: for internal registrations not used directly by themes.
 	if ( in_array( $feature, array( 'custom-background', 'custom-header', 'editor-style', 'widgets', 'menus' ) ) )
 		return false;
-	return _remove_theme_support( $feature );
-}
 
-/**
- * Do not use. Removes theme support internally, ignorant of the blacklist.
- *
- * @access private
- * @since 3.1.0
- */
-function _remove_theme_support( $feature ) {
 	global $_wp_theme_features;
 
 	if ( ! isset( $_wp_theme_features[$feature] ) )
