Index: wp-includes/post.php
===================================================================
--- wp-includes/post.php	(revision 14262)
+++ wp-includes/post.php	(working copy)
@@ -2296,9 +2296,8 @@
 	// Escape data pulled from DB.
 	$post = add_magic_quotes($post);
 
-	// Passed post category list overwrites existing category list if not empty.
-	if ( isset($postarr['post_category']) && is_array($postarr['post_category'])
-			 && 0 != count($postarr['post_category']) )
+	// Passed post category list overwrites existing category list if is set array.
+	if ( isset($postarr['post_category']) && is_array($postarr['post_category']) )
 		$post_cats = $postarr['post_category'];
 	else
 		$post_cats = $post['post_category'];
Index: wp-admin/includes/post.php
===================================================================
--- wp-admin/includes/post.php	(revision 14262)
+++ wp-admin/includes/post.php	(working copy)
@@ -174,6 +174,24 @@
 				break;
 		}
 	}
+	
+	//taxonomy stuff
+	$taxonomies = get_object_taxonomies( $post_data );
+	foreach ( $taxonomies as $taxonomy_name ) {
+		$taxonomy_obj = get_taxonomy( $taxonomy_name );
+		if ( current_user_can( $taxonomy_obj->assign_cap ) ) {
+			if ( $taxonomy_obj->hierarchical && $taxonomy_obj->show_ui ) {
+				if ( $taxonomy_name == 'category' ) {
+					if ( !isset( $post_data['post_category'] ) )
+						$post_data['post_category'] = array();	//no terms selected, set an empty set
+				}
+				elseif ( !isset( $post_data['tax_input'][$taxonomy_name] ))
+					$post_data['tax_input'][$taxonomy_name] = array(); //no terms selected, set an empty set
+			}
+		}
+		elseif ( isset( $post_data['tax_input'][$taxonomy_name] ) )
+			unset( $post_data['tax_input'][$taxonomy_name] ); //user can't assign to this taxonomy, clear it
+	}
 
 	// Meta Stuff
 	if ( isset($post_data['meta']) && $post_data['meta'] ) {
