Index: wp-includes/default-filters.php
===================================================================
--- wp-includes/default-filters.php	(revision 18623)
+++ wp-includes/default-filters.php	(working copy)
@@ -204,6 +204,7 @@
 add_action( 'wp_head',             'rsd_link'                               );
 add_action( 'wp_head',             'wlwmanifest_link'                       );
 add_action( 'wp_head',             'index_rel_link'                         );
+add_action( 'wp_head', 			   '_wp_render_title_tag',			  5		);
 add_action( 'wp_head',             'parent_post_rel_link',            10, 0 );
 add_action( 'wp_head',             'start_post_rel_link',             10, 0 );
 add_action( 'wp_head',             'adjacent_posts_rel_link_wp_head', 10, 0 );
Index: wp-includes/general-template.php
===================================================================
--- wp-includes/general-template.php	(revision 18623)
+++ wp-includes/general-template.php	(working copy)
@@ -617,6 +617,150 @@
 }
 
 /**
+ * Display <title> tag with contents
+ * 
+ * When using add_theme_support to add support for this function, one can set a few variables:
+ * 'sep' string, for the separator used in title tags
+ * 'home-title' string, for the homepage title. Only used for the blog page when the blog page is also the frontpage.
+ * 'frontpage-title' string, for the front page when it's not the posts page.
+ * 'show-sitename' boolean, defaults to true. When set to false the site name will not be added to titles.
+ *
+ * @since 3.3
+ */
+function _wp_render_title_tag() {
+	if ( ! current_theme_supports( 'title-tag' ) )
+		return;
+	
+	// Allow early filtering, if this returns a title skip all the logic below and print it, if it returns false, bail completely
+	if ( null !== $pre = apply_filters( 'pre_wp_title_tag', null ) ) {
+		if ( $pre )
+			echo '<title>' . $pre . "<title>\n";
+		return;
+	}
+
+	global $page, $paged, $wp_locale;
+	
+	// Options that can be passed along:
+	$options = get_theme_support( 'title-tag' );
+	$options = $options[0];
+
+	$show_sitename = true;
+	if ( isset( $options['show-sitename'] ) )
+		$show_sitename = $options['show-sitename'];
+		
+	$title = array();
+	
+	$m = get_query_var('m');
+	$year = get_query_var('year');
+	$monthnum = get_query_var('monthnum');
+	$day = get_query_var('day');
+
+	if ( is_home() && is_front_page() ) {
+		if ( isset($options['home-title']) && $options['home-title'] ) {
+			$title[] = $options['home-title'];
+		} else {
+			$title[] = get_bloginfo('name');
+
+			// Add a page number if necessary:
+			if ( $paged >= 2 || $page >= 2 )
+				$title[] = sprintf( __( 'Page %s' ), max( $paged, $page ) );
+
+			if ( '' != $desc = get_bloginfo( 'description', 'display' ) )
+				$title[] = $desc; 
+		}
+	// If we're on the blog page and that page is not the homepage, use the container page's title
+	} elseif ( is_home() && !is_front_page() ) {
+		$_post = get_post( get_option('page_for_posts') );
+		$title[] = $_post->post_title;
+
+		// Add a page number if necessary:
+		if ( $paged >= 2 || $page >= 2 )
+			$title[] = sprintf( __( 'Page %s' ), max( $paged, $page ) );
+
+		if ( $show_sitename )
+			$title[] = get_bloginfo('name');
+	} elseif ( !is_home() && is_front_page() ) {
+		if ( isset( $options['frontpage-title'] ) && $options['frontpage-title'] ) {
+			$title[] = $options['frontpage-title'];
+		} else {
+			$title[] = single_post_title( '', false );
+
+			if ( $show_sitename )
+				$title[] = get_bloginfo('name');
+		}
+	} else {
+		// If we're on a post / page
+		if ( is_singular() ) {
+			$title[] = single_post_title( '', false );
+		}
+		
+		// If we're on a category or tag archive
+		elseif ( is_category() || is_tag() ) {
+			$title[] = single_term_title( '', false );
+		}
+		
+		// If we're on a taxonomy archive
+		elseif ( is_tax() ) {
+			$term = get_queried_object();
+			$tax = get_taxonomy( $term->taxonomy );
+			$title[] = single_term_title( $tax->labels->name, false );
+		}
+
+		// If we're on an author archive
+		elseif ( is_author() ) {
+			$author = get_queried_object();
+			$title[] = $author->display_name;
+		}
+
+		// If we're on a post type archive
+		elseif ( is_post_type_archive() ) {
+			$title[] = post_type_archive_title( '', false );
+		}
+		
+		// If it's a date archive
+		elseif ( is_archive() && !empty($year) ) {
+			$t = '';
+			if ( !empty($monthnum) ) {
+				$month = $wp_locale->get_month($monthnum);
+				if ( !empty($day) )
+					$t .= zeroise($day, 2) . ' ';
+				$t .= $month . ' ';
+			} 
+			$title[] = $t . $year;
+		}
+
+		// If it's a search
+		elseif ( is_search() ) {
+			/* translators: 1: search phrase */
+			$title[] = sprintf(__('Search Results for "%1$s"'), strip_tags( get_query_var('s') ) );
+		}
+
+		// If it's a 404 page
+		elseif ( is_404() ) {
+			$title[] = __('Page not found');
+		}
+		
+		// Add a page number if necessary:
+		if ( $paged >= 2 || $page >= 2 )
+			$title[] = sprintf( __( 'Page %s' ), max( $paged, $page ) );
+		
+		if ( $show_sitename )
+			$title[] = get_bloginfo('name');
+	}
+	$title = apply_filters( 'wp_title_tag_array', $title );	
+
+	// sep, defaults to - as the separator between two parts of the title
+	$sep = '-';
+	if ( isset($options['sep']) )
+		$sep = $options['sep'];
+
+	$title = implode( " $sep ", $title );
+	
+	$title = apply_filters( 'wp_title_tag', $title, $sep );	
+	echo "<title>" . $title . "</title>\n";
+}
+
+/**
  * Display or retrieve page title for post.
  *
  * This is optimized for single.php template file for displaying the post title.
Index: wp-content/themes/twentyeleven/header.php
===================================================================
--- wp-content/themes/twentyeleven/header.php	(revision 18623)
+++ wp-content/themes/twentyeleven/header.php	(working copy)
@@ -24,27 +24,6 @@
 <head>
 <meta charset="<?php bloginfo( 'charset' ); ?>" />
 <meta name="viewport" content="width=device-width" />
-<title><?php
-	/*
-	 * Print the <title> tag based on what is being viewed.
-	 */
-	global $page, $paged;
-
-	wp_title( '|', true, 'right' );
-
-	// Add the blog name.
-	bloginfo( 'name' );
-
-	// Add the blog description for the home/front page.
-	$site_description = get_bloginfo( 'description', 'display' );
-	if ( $site_description && ( is_home() || is_front_page() ) )
-		echo " | $site_description";
-
-	// Add a page number if necessary:
-	if ( $paged >= 2 || $page >= 2 )
-		echo ' | ' . sprintf( __( 'Page %s', 'twentyeleven' ), max( $paged, $page ) );
-
-	?></title>
 <link rel="profile" href="http://gmpg.org/xfn/11" />
 <link rel="stylesheet" type="text/css" media="all" href="<?php bloginfo( 'stylesheet_url' ); ?>" />
 <link rel="pingback" href="<?php bloginfo( 'pingback_url' ); ?>" />
Index: wp-content/themes/twentyeleven/functions.php
===================================================================
--- wp-content/themes/twentyeleven/functions.php	(revision 18623)
+++ wp-content/themes/twentyeleven/functions.php	(working copy)
@@ -109,6 +109,13 @@
 	// This theme uses Featured Images (also known as post thumbnails) for per-post/per-page Custom Header images
 	add_theme_support( 'post-thumbnails' );
 
+	// Add support for Title tags
+	// sep is the separator between parts of the title
+	// show-sitename determines whether the sitename is shown (at the end of the title)
+	// home-title sets the title for the homepage, which defaults to SITE NAME -sep- SITE DESCRIPTION
+	// frontpage-title is used when the frontpage does not display the latest posts but a page instead
+	add_theme_support( 'title-tag', array( 'sep' => '-', 'show-sitename' => true, 'home-title' => false, 'frontpage-title' => get_bloginfo('name') ) );
+
 	// The next four constants set how Twenty Eleven supports custom headers.
 
 	// The default header text color
