Index: wp-includes/formatting.php
===================================================================
--- wp-includes/formatting.php	(revision 10191)
+++ wp-includes/formatting.php	(working copy)
@@ -2158,4 +2158,33 @@
 	return $str;
 }
 
+/**
+ * Implodes an array and adds a final conjuction.
+ * 
+ * Given the array <code>array('John', 'Paul', 'George', 'Ringo')</code> it will
+ * return the string <code>'John, Paul, George and Ringo'</code>.
+ * 
+ * @package WordPress
+ * @since 2.7
+ * 
+ * @internal
+ * @param array $array
+ * @param string $glue
+ * @param string $conjuction
+ * @return string
+ */
+function _implode_nicely( $array, $glue = ', ', $conjuction = 'and' ) {
+	if ( !is_array($array) || count($array) == 0 )
+		return;
+	
+	$last_value = array_pop($array);
+	
+	if ( count($array) > 0 )
+		$output = implode($glue, $array) . " $conjuction $last_value";
+	else
+		$output = $last_value;
+	
+	return $output;
+}
+
 ?>
Index: wp-includes/general-template.php
===================================================================
--- wp-includes/general-template.php	(revision 10191)
+++ wp-includes/general-template.php	(working copy)
@@ -581,6 +581,56 @@
 }
 
 /**
+ * Outputs tag titles for tag intersections and unions.
+ * 
+ * @package WordPress
+ * @since 2.7
+ * 
+ * @global $wpdb object
+ * @param $tag_wrapper string
+ * @return string
+ */
+function multiple_tag_titles($format = '&#8216;%s&#8217;') {
+	global $wpdb;
+
+	if ( !is_tag() )
+		return;
+	
+	if ( $tag_slugs = get_query_var('tag_slug__and') )
+		$connective = __('and');
+	elseif ( $tag_slugs = get_query_var('tag_slug__in') )
+		$connective = __('or');
+	else
+		$single_tag = intval( get_query_var('tag_id') );
+	
+	$tags = array();
+	if ( $tag_slugs ) {
+		foreach ( $tag_slugs as $tag_slug ) {
+			$tag = get_term_by('slug', $tag_slug, 'post_tag', OBJECT, 'display');
+			if ( !is_wp_error($tag) && !empty($tag->name) )
+				$tags[] = $tag->name;
+		}
+	} elseif ( $single_tag ) {
+		$tag = &get_term($single_tag, 'post_tag', OBJECT, 'display');
+		if ( is_wp_error($tag) || empty($tag->name) )
+			return false;
+		else
+			$tags[] = $tag->name;
+	} else {
+		return;
+	}
+
+	if ( strlen($format) > 0 ) {
+		foreach ( $tags as $index => $tag )
+			$tags[$index] = sprintf($format, $tag);
+	}
+		
+	$tags = _implode_nicely($tags, __(', '), $connective);
+	$tags = apply_filters('multiple_tag_titles', $tags);
+	return $tags;
+}
+
+/**
  * Display or retrieve page title for post archive based on date.
  *
  * Useful for when the template only needs to display the month and year, if
Index: wp-content/themes/default/archive.php
===================================================================
--- wp-content/themes/default/archive.php	(revision 10191)
+++ wp-content/themes/default/archive.php	(working copy)
@@ -15,7 +15,7 @@
  	  <?php /* If this is a category archive */ if (is_category()) { ?>
 		<h2 class="pagetitle">Archive for the &#8216;<?php single_cat_title(); ?>&#8217; Category</h2>
  	  <?php /* If this is a tag archive */ } elseif( is_tag() ) { ?>
-		<h2 class="pagetitle">Posts Tagged &#8216;<?php single_tag_title(); ?>&#8217;</h2>
+		<h2 class="pagetitle">Posts Tagged <?php echo multiple_tag_titles(); ?></h2>
  	  <?php /* If this is a daily archive */ } elseif (is_day()) { ?>
 		<h2 class="pagetitle">Archive for <?php the_time('F jS, Y'); ?></h2>
  	  <?php /* If this is a monthly archive */ } elseif (is_month()) { ?>
