Index: tags/2.3.1/wp-admin/edit-post-rows.php
===================================================================
--- tags/2.3/wp-admin/edit-post-rows.php	(revision 6293)
+++ tags/2.3.1/wp-admin/edit-post-rows.php	(revision 6293)
@@ -1,2 +1,3 @@
+<?php if ( ! defined('ABSPATH') ) die(); ?>
 <table class="widefat">
 	<thead>
Index: tags/2.3.1/wp-admin/import/mt.php
===================================================================
--- tags/2.3/wp-admin/import/mt.php	(revision 6293)
+++ tags/2.3.1/wp-admin/import/mt.php	(revision 6293)
@@ -31,5 +31,5 @@
 <?php _e('Or use <code>mt-export.txt</code> in your <code>/wp-content/</code> directory'); ?></p>
 <p class="submit">
-<input type="submit" value="<?php _e(sprintf('Import %s', 'mt-export.txt &raquo;')); ?>" />
+<input type="submit" value="<?php echo attribute_escape(__('Import mt-export.txt &raquo;')); ?>" />
 </p>
 </form>
Index: tags/2.3.1/wp-admin/import/utw.php
===================================================================
--- tags/2.3/wp-admin/import/utw.php	(revision 6293)
+++ tags/2.3.1/wp-admin/import/utw.php	(revision 6293)
@@ -158,5 +158,5 @@
 		$tags_added = $this->tag2post();
 
-		echo '<p>' . sprintf( __('Done! <strong>%s</strong> tags where added!'), $tags_added ) . '<br /></p>';
+		echo '<p>' . sprintf( __('Done! <strong>%s</strong> tags were added!'), $tags_added ) . '<br /></p>';
 
 		echo '<form action="admin.php?import=utw&amp;step=4" method="post">';
Index: tags/2.3.1/wp-admin/import/wp-cat2tag.php
===================================================================
--- tags/2.3/wp-admin/import/wp-cat2tag.php	(revision 6293)
+++ tags/2.3.1/wp-admin/import/wp-cat2tag.php	(revision 6293)
@@ -64,5 +64,5 @@
 		print '</ul>';
 
-		print '<p class="submit"><input type="submit" name="maybe_convert_all_cats" value="' . __('Convert All Categories') . '" /> <input type="submit" name="submit" value="' . __('Convert &raquo;') . '" /></p>';
+		print '<p class="submit"><input type="submit" name="submit" value="' . __('Convert &raquo;') . '" /></p>';
 		print '</form>';
 	}
@@ -141,8 +141,20 @@
 						if ( !$wpdb->get_var("SELECT object_id FROM $wpdb->term_relationships WHERE object_id = '$post' AND term_taxonomy_id = '$id'") )						
 							$wpdb->query("INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id) VALUES ('$post', '$id')");
+						clean_post_cache($post);
 					}
 				} else {
+					$tt_ids = $wpdb->get_col("SELECT term_taxonomy_id FROM $wpdb->term_taxonomy WHERE term_id = '{$category->term_id}' AND taxonomy = 'category'");
+					if ( $tt_ids ) {
+						$posts = $wpdb->get_col("SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id IN (" . join(',', $tt_ids) . ") GROUP BY object_id");
+						foreach ( (array) $posts as $post )
+							clean_post_cache($post);
+					}
+
 					// Change the category to a tag.
 					$wpdb->query("UPDATE $wpdb->term_taxonomy SET taxonomy = 'post_tag' WHERE term_id = '{$category->term_id}' AND taxonomy = 'category'");
+
+					$terms = $wpdb->get_col("SELECT term_id FROM $wpdb->term_taxonomy WHERE parent = '{$category->term_id}' AND taxonomy = 'category'");
+					foreach ( (array) $terms as $term )
+						clean_category_cache($term);
 
 					// Set all parents to 0 (root-level) if their parent was the converted tag
@@ -161,39 +173,7 @@
 	}
 
-	function convert_all_confirm() {
-		print '<div class="narrow">';
-
-		print '<h3>' . __('Confirm') . '</h3>';
-
-		print '<p>' . __('You are about to convert all categories to tags. Are you sure you want to continue?') . '</p>';
-
-		print '<form action="admin.php?import=wp-cat2tag" method="post">';
-		wp_nonce_field('import-cat2tag');
-		print '<p style="text-align:center" class="submit"><input type="submit" value="' . __('Yes') . '" name="yes_convert_all_cats" />&nbsp;&nbsp;&nbsp;&nbsp;<input type="submit" value="' . __('No') . '" name="no_dont_do_it" /></p>';
-		print '</form>';
-
-		print '</div>';
-	}
-
-	function convert_all() {
-		global $wpdb;
-
-		$this->populate_all_categories();
-		foreach ( $this->all_categories as $category )
-			$this->categories_to_convert[] = $category->term_id;
-		$this->convert_them();
-	}
-
 	function init() {
 
-		if (isset($_POST['maybe_convert_all_cats'])) {
-			$step = 3;
-		} elseif (isset($_POST['yes_convert_all_cats'])) {
-			$step = 4;
-		} elseif (isset($_POST['no_dont_do_it'])) {
-			die('no_dont_do_it');
-		} else {
-			$step = (isset($_GET['step'])) ? (int) $_GET['step'] : 1;
-		}
+		$step = (isset($_GET['step'])) ? (int) $_GET['step'] : 1;
 
 		$this->header();
@@ -215,12 +195,4 @@
 					$this->convert_them();
 				break;
-
-				case 3 :
-					$this->convert_all_confirm();
-				break;
-
-				case 4 :
-					$this->convert_all();
-				break;
 			}
 		}
Index: tags/2.3.1/wp-admin/includes/template.php
===================================================================
--- tags/2.3/wp-admin/includes/template.php	(revision 6293)
+++ tags/2.3.1/wp-admin/includes/template.php	(revision 6293)
@@ -39,4 +39,5 @@
 		$edit = "<a href='categories.php?action=edit&amp;cat_ID=$category->term_id' class='edit'>".__( 'Edit' )."</a></td>";
 		$default_cat_id = (int) get_option( 'default_category' );
+		$default_link_cat_id = (int) get_option( 'default_link_category' );
 
 		if ( $category->term_id != $default_cat_id )
@@ -494,5 +495,5 @@
 				$current = '';
 
-			echo "\n\t<option value='$item->ID'$current>$pad $item->post_title</option>";
+			echo "\n\t<option value='$item->ID'$current>$pad " . wp_specialchars($item->post_title) . "</option>";
 			parent_dropdown( $default, $item->ID, $level +1 );
 		}
Index: tags/2.3.1/wp-admin/includes/upgrade.php
===================================================================
--- tags/2.3/wp-admin/includes/upgrade.php	(revision 6293)
+++ tags/2.3.1/wp-admin/includes/upgrade.php	(revision 6293)
@@ -534,4 +534,5 @@
 	// Convert categories to terms.
 	$tt_ids = array();
+	$have_tags = false;
 	$categories = $wpdb->get_results("SELECT * FROM $wpdb->categories ORDER BY cat_ID");
 	foreach ($categories as $category) {
@@ -580,4 +581,5 @@
 
 		if ( !empty($category->tag_count) ) {
+			$have_tags = true;
 			$count = (int) $category->tag_count;
 			$taxonomy = 'post_tag';
@@ -594,5 +596,9 @@
 	}
 
-	$posts = $wpdb->get_results("SELECT * FROM $wpdb->post2cat");
+	$select = 'post_id, category_id';
+	if ( $have_tags )
+		$select .= ', rel_type';
+
+	$posts = $wpdb->get_results("SELECT $select FROM $wpdb->post2cat GROUP BY post_id, category_id");
 	foreach ( $posts as $post ) {
 		$post_id = (int) $post->post_id;
@@ -659,5 +665,5 @@
 		update_option('default_link_category', $default_link_cat);
 	} else {
-		$links = $wpdb->get_results("SELECT * FROM $wpdb->link2cat");
+		$links = $wpdb->get_results("SELECT link_id, category_id FROM $wpdb->link2cat GROUP BY link_id, category_id");
 		foreach ( $links as $link ) {
 			$link_id = (int) $link->link_id;
@@ -1003,5 +1009,4 @@
 						// Add the column list to the index create string
 						$index_string .= ' ('.$index_columns.')';
-						error_log("Index string: $index_string", 0);
 						if(!(($aindex = array_search($index_string, $indices)) === false)) {
 							unset($indices[$aindex]);
Index: tags/2.3.1/wp-admin/includes/upload.php
===================================================================
--- tags/2.3/wp-admin/includes/upload.php	(revision 6293)
+++ tags/2.3.1/wp-admin/includes/upload.php	(revision 6293)
@@ -32,4 +32,7 @@
 	$src_base = str_replace($src, '', $src_base);
 
+	if ( !trim($post_title) )
+		$post_title = basename($src);
+
 	$r = '';
 
@@ -40,5 +43,7 @@
 	if ( $href )
 		$r .= "</a>\n";
-	$r .= "\t\t\t\t<span class='upload-file-size'>".size_format(filesize($filesystem_path))."</span>\n";
+	$size = @filesize($filesystem_path);
+	if ( !empty($size) )
+		$r .= "\t\t\t\t<span class='upload-file-size'>".size_format($size)."</span>\n";
 	$r .= "\n\t\t<div class='upload-file-data'>\n\t\t\t<p>\n";
 	$r .= "\t\t\t\t<input type='hidden' name='attachment-url-$id' id='attachment-url-$id' value='$src' />\n";
Index: tags/2.3.1/wp-admin/link-import.php
===================================================================
--- tags/2.3/wp-admin/link-import.php	(revision 6293)
+++ tags/2.3.1/wp-admin/link-import.php	(revision 6293)
@@ -46,8 +46,8 @@
 <?php _e('Category:') ?> <select name="cat_id">
 <?php
-$categories = get_categories('hide_empty=0');
+$categories = get_terms('link_category', 'get=all');
 foreach ($categories as $category) {
 ?>
-<option value="<?php echo $category->cat_ID; ?>"><?php echo wp_specialchars(apply_filters('link_category', $category->cat_name)); ?></option>
+<option value="<?php echo $category->term_id; ?>"><?php echo wp_specialchars(apply_filters('link_category', $category->name)); ?></option>
 <?php
 } // end foreach
Index: tags/2.3.1/wp-admin/link.php
===================================================================
--- tags/2.3/wp-admin/link.php	(revision 6293)
+++ tags/2.3.1/wp-admin/link.php	(revision 6293)
@@ -3,4 +3,7 @@
 
 wp_reset_vars(array('action', 'cat_id', 'linkurl', 'name', 'image', 'description', 'visible', 'target', 'category', 'link_id', 'submit', 'order_by', 'links_show_cat_id', 'rating', 'rel', 'notes', 'linkcheck[]'));
+
+if ( ! current_user_can('manage_links') )
+	wp_die( __('You do not have sufficient permissions to edit the links for this blog.') );
 
 if ('' != $_POST['deletebookmarks'])
@@ -14,10 +17,6 @@
 
 switch ($action) {
-		case 'deletebookmarks' :
+	case 'deletebookmarks' :
 		check_admin_referer('bulk-bookmarks');
-
-		// check the current user's level first.
-		if (!current_user_can('manage_links'))
-			wp_die(__('Cheatin&#8217; uh?'));
 
 		//for each link id (in $linkcheck[]) change category to selected value
@@ -42,8 +41,4 @@
 		check_admin_referer('bulk-bookmarks');
 
-		// check the current user's level first.
-		if (!current_user_can('manage_links'))
-			wp_die(__('Cheatin&#8217; uh?'));
-
 		//for each link id (in $linkcheck[]) change category to selected value
 		if (count($linkcheck) == 0) {
@@ -64,5 +59,5 @@
 		add_link();
 
-		wp_redirect(wp_get_referer().'?added=true');
+		wp_redirect( wp_get_referer() . '?added=true' );
 		exit;
 		break;
@@ -82,7 +77,4 @@
 		check_admin_referer('delete-bookmark_' . $link_id);
 
-		if (!current_user_can('manage_links'))
-			wp_die(__('Cheatin&#8217; uh?'));
-
 		wp_delete_link($link_id);
 
@@ -98,7 +90,4 @@
 		$submenu_file = 'link-manager.php';
 		$title = __('Edit Link');
-		include_once ('admin-header.php');
-		if (!current_user_can('manage_links'))
-			wp_die(__('You do not have sufficient permissions to edit the links for this blog.'));
 
 		$link_id = (int) $_GET['link_id'];
@@ -107,5 +96,7 @@
 			wp_die(__('Link not found.'));
 
+		include_once ('admin-header.php');
 		include ('edit-link-form.php');
+		include ('admin-footer.php');
 		break;
 
@@ -113,5 +104,3 @@
 		break;
 }
-
-include ('admin-footer.php');
 ?>
Index: tags/2.3.1/wp-includes/bookmark.php
===================================================================
--- tags/2.3/wp-includes/bookmark.php	(revision 6293)
+++ tags/2.3.1/wp-includes/bookmark.php	(revision 6293)
@@ -114,5 +114,5 @@
 	if (!empty($category_query)) {
 		$category_query .= ") AND taxonomy = 'link_category'";
-		$join = " LEFT JOIN $wpdb->term_relationships AS tr ON ($wpdb->links.link_id = tr.object_id) LEFT JOIN $wpdb->term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id";
+		$join = " INNER JOIN $wpdb->term_relationships AS tr ON ($wpdb->links.link_id = tr.object_id) INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id";
 	}
 
Index: tags/2.3.1/wp-includes/canonical.php
===================================================================
--- tags/2.3/wp-includes/canonical.php	(revision 6293)
+++ tags/2.3.1/wp-includes/canonical.php	(revision 6293)
@@ -5,5 +5,5 @@
 	global $wp_rewrite, $posts, $is_IIS;
 
-	if ( is_feed() || is_trackback() || is_search() || is_comments_popup() || is_admin() || $is_IIS || ( isset($_POST) && count($_POST) ) )
+	if ( is_feed() || is_trackback() || is_search() || is_comments_popup() || is_admin() || $is_IIS || ( isset($_POST) && count($_POST) ) || is_preview() )
 		return;
 
Index: tags/2.3.1/wp-includes/default-filters.php
===================================================================
--- tags/2.3/wp-includes/default-filters.php	(revision 6293)
+++ tags/2.3.1/wp-includes/default-filters.php	(revision 6293)
@@ -26,7 +26,16 @@
 }
 
-// URL
+// Save URL
 $filters = array('pre_comment_author_url', 'pre_user_url', 'pre_link_url', 'pre_link_image',
-	'pre_link_rss', 'comment_url');
+	'pre_link_rss');
+foreach ( $filters as $filter ) {
+	add_filter($filter, 'strip_tags');
+	add_filter($filter, 'trim');
+	add_filter($filter, 'sanitize_url');
+	add_filter($filter, 'wp_filter_kses');
+}
+
+// Display URL
+$filters = array('user_url', 'link_url', 'link_image', 'link_rss', 'comment_url');
 foreach ( $filters as $filter ) {
 	add_filter($filter, 'strip_tags');
@@ -128,4 +137,5 @@
 // Actions
 add_action('wp_head', 'rsd_link');
+add_action('wp_head', 'wlwmanifest_link');
 add_action('wp_head', 'locale_stylesheet');
 add_action('publish_future_post', 'wp_publish_post', 10, 1);
Index: tags/2.3.1/wp-includes/formatting.php
===================================================================
--- tags/2.3/wp-includes/formatting.php	(revision 6293)
+++ tags/2.3.1/wp-includes/formatting.php	(revision 6293)
@@ -1088,5 +1088,5 @@
 }
 
-function clean_url( $url, $protocols = null ) {
+function clean_url( $url, $protocols = null, $context = 'display' ) {
 	$original_url = $url;
 
@@ -1104,5 +1104,8 @@
 		$url = 'http://' . $url;
 
-	$url = preg_replace('/&([^#])(?![a-z]{2,8};)/', '&#038;$1', $url);
+	// Replace ampersands ony when displaying.
+	if ( 'display' == $context )
+		$url = preg_replace('/&([^#])(?![a-z]{2,8};)/', '&#038;$1', $url);
+
 	if ( !is_array($protocols) )
 		$protocols = array('http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet');
@@ -1110,5 +1113,9 @@
 		return '';
 
-	return apply_filters('clean_url', $url, $original_url);
+	return apply_filters('clean_url', $url, $original_url, $context);
+}
+
+function sanitize_url( $url, $protocols = null ) {
+	return clean_url( $url, $protocols, 'db');
 }
 
Index: tags/2.3.1/wp-includes/functions.php
===================================================================
--- tags/2.3/wp-includes/functions.php	(revision 6293)
+++ tags/2.3.1/wp-includes/functions.php	(revision 6293)
@@ -727,7 +727,10 @@
 
 function wp($query_vars = '') {
-	global $wp;
+	global $wp, $wp_query, $wp_the_query;
 
 	$wp->main($query_vars);
+
+	if( !isset($wp_the_query) )
+		$wp_the_query = $wp_query;
 }
 
Index: tags/2.3.1/wp-includes/general-template.php
===================================================================
--- tags/2.3/wp-includes/general-template.php	(revision 6293)
+++ tags/2.3.1/wp-includes/general-template.php	(revision 6293)
@@ -828,4 +828,9 @@
 function rsd_link() {
 	echo '	<link rel="EditURI" type="application/rsd+xml" title="RSD" href="' . get_bloginfo('wpurl') . "/xmlrpc.php?rsd\" />\n";
+}
+
+function wlwmanifest_link() {
+	echo ' <link rel="wlwmanifest" type="application/wlwmanifest+xml" href="'
+		. get_bloginfo('wpurl') . '/wp-includes/wlwmanifest.xml" /> ';
 }
 
Index: tags/2.3.1/wp-includes/pluggable.php
===================================================================
--- tags/2.3/wp-includes/pluggable.php	(revision 6293)
+++ tags/2.3.1/wp-includes/pluggable.php	(revision 6293)
@@ -226,4 +226,5 @@
 	// Set the from name and email
 	$phpmailer->From = apply_filters( 'wp_mail_from', $from_email );
+	$phpmailer->Sender = apply_filters( 'wp_mail_from', $from_email );
 	$phpmailer->FromName = apply_filters( 'wp_mail_from_name', $from_name );
 
@@ -437,5 +438,5 @@
 	$allowed_hosts = (array) apply_filters('allowed_redirect_hosts', array($wpp['host']), $lp['host']);
 
-	if ( isset($lp['host']) && !in_array($lp['host'], $allowed_hosts) )
+	if ( isset($lp['host']) && ( !in_array($lp['host'], $allowed_hosts) && $lp['host'] != strtolower($wpp['host'])) )
 		$location = get_option('siteurl') . '/wp-admin/';
 
Index: tags/2.3.1/wp-includes/post.php
===================================================================
--- tags/2.3/wp-includes/post.php	(revision 6293)
+++ tags/2.3.1/wp-includes/post.php	(revision 6293)
@@ -103,5 +103,5 @@
 	} elseif ( is_object($post) ) {
 		if ( 'page' == $post->post_type )
-			return get_page($post, $output);
+			return get_page($post, $output, $filter);
 		if ( !isset($post_cache[$blog_id][$post->ID]) )
 			$post_cache[$blog_id][$post->ID] = &$post;
@@ -112,10 +112,10 @@
 			$_post = & $post_cache[$blog_id][$post];
 		elseif ( $_post = wp_cache_get($post, 'pages') )
-			return get_page($_post, $output);
+			return get_page($_post, $output, $filter);
 		else {
 			$query = "SELECT * FROM $wpdb->posts WHERE ID = '$post' LIMIT 1";
 			$_post = & $wpdb->get_row($query);
 			if ( 'page' == $_post->post_type )
-				return get_page($_post, $output);
+				return get_page($_post, $output, $filter);
 			$post_cache[$blog_id][$post] = & $_post;
 		}
@@ -973,5 +973,5 @@
 // Retrieves page data given a page ID or page object.
 // Handles page caching.
-function &get_page(&$page, $output = OBJECT) {
+function &get_page(&$page, $output = OBJECT, $filter = 'raw') {
 	global $wpdb, $blog_id;
 
@@ -986,5 +986,5 @@
 	} elseif ( is_object($page) ) {
 		if ( 'post' == $page->post_type )
-			return get_post($page, $output);
+			return get_post($page, $output, $filter);
 		wp_cache_add($page->ID, $page, 'pages');
 		$_page = $page;
@@ -999,10 +999,10 @@
 				wp_cache_add($_page->ID, $_page, 'pages');
 			} elseif ( isset($GLOBALS['post_cache'][$blog_id][$page]) ) { // it's actually a page, and is cached
-				return get_post($page, $output);
+				return get_post($page, $output, $filter);
 			} else { // it's not in any caches, so off to the DB we go
 				// Why are we using assignment for this query?
 				$_page = & $wpdb->get_row("SELECT * FROM $wpdb->posts WHERE ID= '$page' LIMIT 1");
 				if ( 'post' == $_page->post_type )
-					return get_post($_page, $output);
+					return get_post($_page, $output, $filter);
 				// Potential issue: we're not checking to see if the post_type = 'page'
 				// So all non-'post' posts will get cached as pages.
@@ -1011,4 +1011,6 @@
 		}
 	}
+
+	$_page = sanitize_post($_page, $filter);
 
 	// at this point, one way or another, $_post contains the page object
@@ -1202,5 +1204,5 @@
 
 	if ( empty($pages) )
-		return array();
+		return apply_filters('get_pages', array(), $r);
 
 	// Update cache.
Index: tags/2.3.1/wp-includes/query.php
===================================================================
--- tags/2.3/wp-includes/query.php	(revision 6293)
+++ tags/2.3.1/wp-includes/query.php	(revision 6293)
@@ -933,5 +933,5 @@
 
 		if ( !empty($q['category__in']) ) {
-			$join = " LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) ";
+			$join = " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) ";
 			$whichcat .= " AND $wpdb->term_taxonomy.taxonomy = 'category' ";
 			$include_cats = "'" . implode("', '", $q['category__in']) . "'";
@@ -949,13 +949,4 @@
 		}
 
-		if ( !empty($q['category__and']) ) {
-			$count = 0;
-			foreach ( $q['category__and'] as $category_and ) {
-				$join .= " LEFT JOIN $wpdb->term_relationships AS tr$count ON ($wpdb->posts.ID = tr$count.object_id) LEFT JOIN $wpdb->term_taxonomy AS tt$count ON (tr$count.term_taxonomy_id = tt$count.term_taxonomy_id) ";
-				$whichcat .= " AND tt$count.term_id = '$category_and' ";
-				$count++;
-			}
-		}
-
 		// Category stuff for nice URLs
 		if ( '' != $q['category_name'] ) {
@@ -983,5 +974,5 @@
 			$q['cat'] = $reqcat;
 
-			$join = " LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) ";
+			$join = " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) ";
 			$whichcat = " AND $wpdb->term_taxonomy.taxonomy = 'category' ";
 			$in_cats = array($q['cat']);
@@ -1025,5 +1016,5 @@
 
 		if ( !empty($q['tag__in']) ) {
-			$join = " LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) ";
+			$join = " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) ";
 			$whichcat .= " AND $wpdb->term_taxonomy.taxonomy = 'post_tag' ";
 			$include_tags = "'" . implode("', '", $q['tag__in']) . "'";
@@ -1035,5 +1026,5 @@
 
 		if ( !empty($q['tag_slug__in']) ) {
-			$join = " LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) LEFT JOIN $wpdb->terms ON ($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id) ";
+			$join = " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) INNER JOIN $wpdb->terms ON ($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id) ";
 			$whichcat .= " AND $wpdb->term_taxonomy.taxonomy = 'post_tag' ";
 			$include_tags = "'" . implode("', '", $q['tag_slug__in']) . "'";
@@ -1052,26 +1043,30 @@
 		}
 
-		if ( !empty($q['tag__and']) ) {
-			$count = 0;
-			foreach ( $q['tag__and'] as $tag_and ) {
-				$join .= " LEFT JOIN $wpdb->term_relationships AS tr$count ON ($wpdb->posts.ID = tr$count.object_id) LEFT JOIN $wpdb->term_taxonomy AS tt$count ON (tr$count.term_taxonomy_id = tt$count.term_taxonomy_id) ";
-				$whichcat .= " AND tt$count.term_id = '$tag_and' ";
-				$count++;
-			}
-			$reqtag = is_term( $q['tag__and'][0], 'post_tag' );
-			if ( !empty($reqtag) )
-				$q['tag_id'] = $reqtag['term_id'];
-		}
-
-		if ( !empty($q['tag_slug__and']) ) {
-			$count = 0;
-			foreach ( $q['tag_slug__and'] as $tag_and ) {
-				$join .= " LEFT JOIN $wpdb->term_relationships AS tr$count ON ($wpdb->posts.ID = tr$count.object_id) LEFT JOIN $wpdb->term_taxonomy AS tt$count ON (tr$count.term_taxonomy_id = tt$count.term_taxonomy_id) LEFT JOIN $wpdb->terms AS term$count ON (tt$count.term_id = term$count.term_id) ";
-				$whichcat .= " AND term$count.slug = '$tag_and' ";
-				$count++;
-			}
-			$reqtag = is_term( $q['tag_slug__and'][0], 'post_tag' );
-			if ( !empty($reqtag) )
-				$q['tag_id'] = $reqtag['term_id'];
+		// Tag and slug intersections.
+		$intersections = array('category__and' => 'category', 'tag__and' => 'post_tag', 'tag_slug__and' => 'post_tag');
+		foreach ($intersections as $item => $taxonomy) {
+			if ( empty($q[$item]) ) continue;
+
+			if ( $item != 'category__and' ) {
+				$reqtag = is_term( $q[$item][0], 'post_tag' );
+				if ( !empty($reqtag) )
+					$q['tag_id'] = $reqtag['term_id'];
+			}
+
+			$taxonomy_field = $item == 'tag_slug__and' ? 'slug' : 'term_id';
+
+			$q[$item] = array_unique($q[$item]);
+			$tsql = "SELECT p.ID FROM $wpdb->posts p INNER JOIN $wpdb->term_relationships tr ON (p.ID = tr.object_id) INNER JOIN $wpdb->term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id) INNER JOIN $wpdb->terms t ON (tt.term_id = t.term_id)";
+			$tsql .= " WHERE tt.taxonomy = '$taxonomy' AND t.$taxonomy_field IN ('" . implode("', '", $q[$item]) . "')";
+			$tsql .= " GROUP BY p.ID HAVING count(p.ID) = " . count($q[$item]);
+
+			$post_ids = $wpdb->get_col($tsql);
+
+			if ( count($post_ids) )
+				$whichcat .= " AND $wpdb->posts.ID IN (" . implode(', ', $post_ids) . ") ";
+			else {
+				$whichcat = " AND 0 = 1";
+				break;
+			}
 		}
 
Index: tags/2.3.1/wp-includes/script-loader.php
===================================================================
--- tags/2.3/wp-includes/script-loader.php	(revision 6293)
+++ tags/2.3.1/wp-includes/script-loader.php	(revision 6293)
@@ -422,3 +422,23 @@
 	$wp_scripts->enqueue( $handle );
 }
+
+function wp_prototype_before_jquery( $js_array ) {
+	if ( false === $jquery = array_search( 'jquery', $js_array ) )
+		return $js_array;
+
+	if ( false === $prototype = array_search( 'prototype', $js_array ) )
+		return $js_array;
+
+	if ( $prototype < $jquery )
+		return $js_array;
+
+	unset($js_array[$prototype]);
+
+	array_splice( $js_array, $jquery, 0, 'prototype' );
+
+	return $js_array;
+}
+
+add_filter( 'print_scripts_array', 'wp_prototype_before_jquery' );
+
 ?>
Index: tags/2.3.1/wp-includes/taxonomy.php
===================================================================
--- tags/2.3/wp-includes/taxonomy.php	(revision 6293)
+++ tags/2.3.1/wp-includes/taxonomy.php	(revision 6293)
@@ -1358,5 +1358,5 @@
 
 	// Get the object and term ids and stick them in a lookup table
-	$results = $wpdb->get_results("SELECT object_id, term_taxonomy_id FROM $wpdb->term_relationships LEFT JOIN $wpdb->posts ON object_id = ID WHERE term_taxonomy_id IN (".join(',', array_keys($term_ids)).") AND post_type = 'post' AND post_status = 'publish'");
+	$results = $wpdb->get_results("SELECT object_id, term_taxonomy_id FROM $wpdb->term_relationships INNER JOIN $wpdb->posts ON object_id = ID WHERE term_taxonomy_id IN (".join(',', array_keys($term_ids)).") AND post_type = 'post' AND post_status = 'publish'");
 	foreach ( $results as $row ) {
 		$id = $term_ids[$row->term_taxonomy_id];
Index: tags/2.3.1/wp-includes/version.php
===================================================================
--- tags/2.3/wp-includes/version.php	(revision 6293)
+++ tags/2.3.1/wp-includes/version.php	(revision 6293)
@@ -3,5 +3,5 @@
 // This holds the version number in a separate file so we can bump it without cluttering the SVN
 
-$wp_version = '2.3';
+$wp_version = '2.3.1';
 $wp_db_version = 6124;
 
Index: tags/2.3.1/wp-includes/widgets.php
===================================================================
--- tags/2.3/wp-includes/widgets.php	(revision 6293)
+++ tags/2.3.1/wp-includes/widgets.php	(revision 6293)
@@ -787,5 +787,5 @@
 
 	$dims = array( 'width' => 350, 'height' => 170 );
-	$class = array( 'classname' => 'widget_catgories' );
+	$class = array( 'classname' => 'widget_categories' );
 
 	for ( $i = 1; $i <= 9; $i++ ) {
@@ -1002,5 +1002,5 @@
 	if ( $_POST["rss-submit-$number"] ) {
 		$newoptions[$number]['items'] = (int) $_POST["rss-items-$number"];
-		$url = clean_url(strip_tags(stripslashes($_POST["rss-url-$number"])));
+		$url = sanitize_url(strip_tags(stripslashes($_POST["rss-url-$number"])));
 		$newoptions[$number]['title'] = trim(strip_tags(stripslashes($_POST["rss-title-$number"])));
 		if ( $url !== $options[$number]['url'] ) {
Index: tags/2.3.1/wp-includes/wlwmanifest.xml
===================================================================
--- tags/2.3.1/wp-includes/wlwmanifest.xml	(revision 6293)
+++ tags/2.3.1/wp-includes/wlwmanifest.xml	(revision 6293)
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" ?>
+
+<manifest xmlns="http://schemas.microsoft.com/wlw/manifest/weblog">
+
+  <options>
+    <clientType>WordPress</clientType>
+	<supportsKeywords>Yes</supportsKeywords>
+  </options>
+  
+  <weblog>
+    <serviceName>WordPress</serviceName>
+    <imageUrl>images/wlw/wp-icon.png</imageUrl>
+    <watermarkImageUrl>images/wlw/wp-watermark.png</watermarkImageUrl>
+    <homepageLinkText>View site</homepageLinkText>
+    <adminLinkText>Dashboard</adminLinkText>
+    <adminUrl>
+      <![CDATA[ 
+			{blog-postapi-url}/../wp-admin/ 
+		]]>
+    </adminUrl>
+    <postEditingUrl>
+      <![CDATA[ 
+			{blog-postapi-url}/../wp-admin/post.php?action=edit&post={post-id} 
+		]]>
+    </postEditingUrl>
+  </weblog>
+
+  <buttons>
+    <button>
+      <id>0</id>
+      <text>Manage Comments</text>
+      <imageUrl>images/wlw/wp-comments.png</imageUrl>
+      <clickUrl>
+        <![CDATA[ 
+				{blog-postapi-url}/../wp-admin/edit-comments.php
+			]]>
+      </clickUrl>
+    </button>
+
+  </buttons>
+
+</manifest>
+
Index: tags/2.3.1/wp-login.php
===================================================================
--- tags/2.3/wp-login.php	(revision 6293)
+++ tags/2.3.1/wp-login.php	(revision 6293)
@@ -23,4 +23,6 @@
 //Set a cookie now to see if they are supported by the browser.
 setcookie(TEST_COOKIE, 'WP Cookie check', 0, COOKIEPATH, COOKIE_DOMAIN);
+if ( SITECOOKIEPATH != COOKIEPATH )
+	setcookie(TEST_COOKIE, 'WP Cookie check', 0, SITECOOKIEPATH, COOKIE_DOMAIN);
 
 // Rather than duplicating this HTML all over the place, we'll stick it in function
Index: tags/2.3.1/wp-mail.php
===================================================================
--- tags/2.3/wp-mail.php	(revision 6293)
+++ tags/2.3.1/wp-mail.php	(revision 6293)
@@ -61,10 +61,13 @@
 			}
 
-			// Set the author using the email address (To or Reply-To, the last used)
+			// Set the author using the email address (From or Reply-To, the last used)
 			// otherwise use the site admin
-			if (preg_match('/From: /', $line) | preg_match('/Reply-To: /', $line))  {
-				$author=trim($line);
-				if ( ereg("([a-zA-Z0-9\_\-\.]+@[\a-zA-z0-9\_\-\.]+)", $author , $regs) ) {
-					$author = $regs[1];
+			if ( preg_match('/(From|Reply-To): /', $line) )  {
+				if ( preg_match('|[a-z0-9_.-]+@[a-z0-9_.-]+(?!.*<)|i', $line, $matches) )
+					$author = $matches[0];
+				else
+					$author = trim($line);
+				$author = sanitize_email($author);
+				if ( is_email($author) ) {
 					echo "Author = {$author} <p>";
 					$author = $wpdb->escape($author);
