Index: wp-includes/wp-db.php
===================================================================
--- wp-includes/wp-db.php	(revision 5496)
+++ wp-includes/wp-db.php	(working copy)
@@ -34,6 +34,9 @@
 	var $optiongroups;
 	var $optiongroup_options;
 	var $postmeta;
+	var $terms;
+	var $term_taxonomy;
+	var $term_relationships;
 
 	var $charset;
 	var $collate;
Index: wp-includes/post.php
===================================================================
--- wp-includes/post.php	(revision 5496)
+++ wp-includes/post.php	(working copy)
@@ -459,10 +459,8 @@
 
 	$post_id = (int) $post_id;
 	
-	if ( !isset( $tag_cache[$blog_id][$post_id] ) )
-		update_post_category_cache( $post_id ); // loads $tag_cache
-
-	return $tag_cache[$blog_id][$post_id];
+	$tags = get_object_terms($post_id, 'post_tag');
+	return $tags;
 }
 
 function wp_get_recent_posts($num = 10) {
@@ -792,76 +790,11 @@
 	
 	if ( !$post_id )
 		return false;
-	
-	// prevent warnings for unintialized variables
-	$tag_ids = array();
 
 	if ( empty($tags) )
 		$tags = array();
 	$tags = (is_array($tags)) ? $tags : explode( ',', $tags );
-	
-	foreach ( $tags as $tag ) {
-		$tag = trim( $tag );
-		if ( !$tag_slug = sanitize_title( $tag ) )
-			continue; // discard
-		if ( !$tag_id = tag_exists( $tag ) )
-			$tag_id = wp_create_tag( $tag );
-		$tag_ids[] = $tag_id;
-	}
-
-	if ( empty($tag_ids) && ( !empty($tags) || $append ) )
-		return false;
-	
-	$tag_ids = array_unique( $tag_ids );
-	
-	// First the old tags
-	$old_tags = $wpdb->get_col("
-		SELECT category_id
-		FROM $wpdb->post2cat
-		WHERE post_id = '$post_id' AND rel_type = 'tag'");
-	
-	if ( !$old_tags ) {
-		$old_tags = array();
-	} else {
-		$old_tags = array_unique( $old_tags );
-	}
-	
-	// Delete any?
-	$delete_tags = array_diff( $old_tags, $tag_ids);
-	if ( $delete_tags && !$append ) {
-		foreach ( $delete_tags as $del ) {
-			$wpdb->query("
-				DELETE FROM $wpdb->post2cat
-				WHERE category_id = '$del'
-					AND post_id = '$post_id'
-					AND rel_type = 'tag'
-				");
-		}
-	}
-	
-	// Add any?
-	$add_tags = array_diff( $tag_ids, $old_tags );
-	if ( $add_tags ) {
-		foreach ( $add_tags as $new_tag ) {
-			$new_tag = (int) $new_tag;
-			if ( !empty($new_tag) )
-				$wpdb->query("
-					INSERT INTO $wpdb->post2cat (post_id, category_id, rel_type) 
-					VALUES ('$post_id', '$new_tag', 'tag')");
-		}
-	}
-	
-	// Update category counts.
-	$all_affected_tags = array_unique( array_merge( $tag_ids, $old_tags ) );
-	foreach ( $all_affected_tags as $tag_id ) {
-		$count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->post2cat, $wpdb->posts WHERE $wpdb->posts.ID=$wpdb->post2cat.post_id AND post_status = 'publish' AND post_type = 'post' AND category_id = '$tag_id' AND rel_type = 'tag'" );
-		$wpdb->query( "UPDATE $wpdb->categories SET tag_count = '$count', type = type | " . TAXONOMY_TAG . " WHERE cat_ID = '$tag_id'" );
-		if ( $count == 0 )
-			$wpdb->query( "UPDATE $wpdb->categories SET type = type & ~". TAXONOMY_TAG . " WHERE cat_ID = '$tag_id'" );
-		clean_category_cache( $tag_id );
-		do_action( 'edit_category', $tag_id );
-		do_action( 'edit_tag', $tag_id );
-	}
+	add_term_relationship($tags, $post_id, 'post_tag');
 }
 
 function wp_set_post_categories($post_ID = 0, $post_categories = array()) {
Index: wp-includes/version.php
===================================================================
--- wp-includes/version.php	(revision 5496)
+++ wp-includes/version.php	(working copy)
@@ -3,6 +3,6 @@
 // This holds the version number in a separate file so we can bump it without cluttering the SVN
 
 $wp_version = '2.3-alpha';
-$wp_db_version = 5200;
+$wp_db_version = 5495;
 
 ?>
Index: wp-settings.php
===================================================================
--- wp-settings.php	(revision 5496)
+++ wp-settings.php	(working copy)
@@ -116,6 +116,9 @@
 $wpdb->options        = $wpdb->prefix . 'options';
 $wpdb->postmeta       = $wpdb->prefix . 'postmeta';
 $wpdb->usermeta       = $wpdb->prefix . 'usermeta';
+$wpdb->terms          = $wpdb->prefix . 'terms';
+$wpdb->term_taxonomy  = $wpdb->prefix . 'term_taxonomy';
+$wpdb->term_relationships = $wpdb->prefix . 'term_relationships';
 
 if ( defined('CUSTOM_USER_TABLE') )
 	$wpdb->users = CUSTOM_USER_TABLE;
@@ -168,6 +171,7 @@
 require (ABSPATH . WPINC . '/version.php');
 require (ABSPATH . WPINC . '/deprecated.php');
 require (ABSPATH . WPINC . '/script-loader.php');
+require (ABSPATH . WPINC . '/taxonomy.php');
 
 if (strpos($_SERVER['PHP_SELF'], 'install.php') === false) {
     // Used to guarantee unique hash cookies
Index: wp-admin/admin-functions.php
===================================================================
--- wp-admin/admin-functions.php	(revision 5496)
+++ wp-admin/admin-functions.php	(working copy)
@@ -664,16 +664,13 @@
 	if ( !$post_id )
 		return false;
 
-	$tags = $wpdb->get_results( "
-		     SELECT category_id, cat_name
-		     FROM $wpdb->categories, $wpdb->post2cat
-		     WHERE $wpdb->post2cat.category_id = cat_ID AND $wpdb->post2cat.post_id = '$post_id' AND rel_type = 'tag'
-		     " );
+	$tags = wp_get_post_tags($post_id);
+
 	if ( !$tags )
 		return false;
 
 	foreach ( $tags as $tag )
-		$tag_names[] = $tag->cat_name;
+		$tag_names[] = $tag->term_name;
 	$tags_to_edit = join( ', ', $tag_names );
 	$tags_to_edit = attribute_escape( $tags_to_edit );
 	$tags_to_edit = apply_filters( 'tags_to_edit', $tags_to_edit );
Index: wp-admin/admin-db.php
===================================================================
--- wp-admin/admin-db.php	(revision 5496)
+++ wp-admin/admin-db.php	(working copy)
@@ -286,23 +286,14 @@
 	if (! $tag_nicename = sanitize_title($tag_name))
 		return 0;
 
-	return (int) $wpdb->get_var("SELECT cat_ID FROM $wpdb->categories WHERE category_nicename = '$tag_nicename' AND ( type & " . TAXONOMY_TAG .  " != 0 )");
+	return is_term($tag_name, 'post_tag');
 }
 
 function wp_create_tag($tag_name) {
 	if ( $id = tag_exists($tag_name) )
 		return $id;
-	$tag_array = array('cat_name' => $tag_name, 'type' => TAXONOMY_TAG);
 
-	if ( $id = category_object_exists($tag_name) ) {
-		$category = get_category($id);
-		$tag_array['type'] = $category->type | $tag_array['type'];
-		$tag_array['cat_ID'] = $id;
-		$id = wp_update_category($tag_array);
-		return $id;
-	} else {
-		return wp_insert_category($tag_array);
-	}
+	$tag_id = add_term($tag_name, 'post_tag');	
 }
 
 function wp_delete_user($id, $reassign = 'novalue') {
Index: wp-admin/upgrade-schema.php
===================================================================
--- wp-admin/upgrade-schema.php	(revision 5496)
+++ wp-admin/upgrade-schema.php	(working copy)
@@ -10,21 +10,30 @@
 		$charset_collate .= " COLLATE $wpdb->collate";
 }
 
-$wp_queries="CREATE TABLE $wpdb->categories (
-  cat_ID bigint(20) NOT NULL auto_increment,
-  cat_name varchar(55) NOT NULL default '',
-  category_nicename varchar(200) NOT NULL default '',
-  category_description longtext NOT NULL,
-  category_parent bigint(20) NOT NULL default '0',
-  category_count bigint(20) NOT NULL default '0',
-  link_count bigint(20) NOT NULL default '0',
-  tag_count bigint(20) NOT NULL default '0',
-  posts_private tinyint(1) NOT NULL default '0',
-  links_private tinyint(1) NOT NULL default '0',
-  type tinyint NOT NULL default '1',
-  PRIMARY KEY  (cat_ID),
-  KEY category_nicename (category_nicename)
+$wp_queries="CREATE TABLE $wpdb->terms (
+ term_id bigint(20) NOT NULL auto_increment,
+ term_name varchar(55) NOT NULL default '',
+ term_slug varchar(200) NOT NULL default '',
+ term_group bigint(10) NOT NULL default 0,
+ PRIMARY KEY  (term_id),
+ UNIQUE KEY term_slug (term_slug)
 ) $charset_collate;
+CREATE TABLE $wpdb->term_taxonomy (
+ term_taxonomy_id bigint(20) NOT NULL auto_increment,
+ term_id bigint(20) NOT NULL default 0,
+ taxonomy varchar(32) NOT NULL default '',
+ term_description longtext NOT NULL,
+ parent bigint(20) NOT NULL default 0,
+ count bigint(20) NOT NULL default 0,
+ PRIMARY KEY (term_taxonomy_id),
+ UNIQUE KEY (term_id, taxonomy)
+) $charset_collate;
+CREATE TABLE $wpdb->term_relationships (
+ object_id bigint(20) NOT NULL default 0,
+ term_taxonomy_id bigint(20) NOT NULL default 0,
+ PRIMARY KEY  (object_id),
+ KEY (term_taxonomy_id)
+) $charset_collate;
 CREATE TABLE $wpdb->comments (
   comment_ID bigint(20) unsigned NOT NULL auto_increment,
   comment_post_ID int(11) NOT NULL default '0',
@@ -45,13 +54,6 @@
   KEY comment_approved (comment_approved),
   KEY comment_post_ID (comment_post_ID)
 ) $charset_collate;
-CREATE TABLE $wpdb->link2cat (
-  rel_id bigint(20) NOT NULL auto_increment,
-  link_id bigint(20) NOT NULL default '0',
-  category_id bigint(20) NOT NULL default '0',
-  PRIMARY KEY  (rel_id),
-  KEY link_id (link_id,category_id)
-) $charset_collate;
 CREATE TABLE $wpdb->links (
   link_id bigint(20) NOT NULL auto_increment,
   link_url varchar(255) NOT NULL default '',
@@ -86,14 +88,6 @@
   PRIMARY KEY  (option_id,blog_id,option_name),
   KEY option_name (option_name)
 ) $charset_collate;
-CREATE TABLE $wpdb->post2cat (
-  rel_id bigint(20) NOT NULL auto_increment,
-  post_id bigint(20) NOT NULL default '0',
-  category_id bigint(20) NOT NULL default '0',
-  rel_type varchar(64) NOT NULL default 'category',
-  PRIMARY KEY  (rel_id),
-  KEY post_id (post_id,category_id)
-) $charset_collate;
 CREATE TABLE $wpdb->postmeta (
   meta_id bigint(20) NOT NULL auto_increment,
   post_id bigint(20) NOT NULL default '0',
@@ -404,4 +398,4 @@
 	}
 }
 
-?>
\ No newline at end of file
+?>
