Index: wordpress/wp-includes/taxonomy.php
===================================================================
--- wordpress/wp-includes/taxonomy.php	(revision 21157)
+++ wordpress/wp-includes/taxonomy.php	(working copy)
@@ -2241,12 +2241,12 @@
 function wp_unique_term_slug($slug, $term) {
 	global $wpdb;
 
-	if ( ! term_exists( $slug ) )
-		return $slug;
+	if ( ! term_exists( $slug ) && ! apply_filters( 'wp_unique_is_bad_term_slug', false, $slug, $term ) )
+		return apply_filters( 'wp_unique_term_slug', $slug, $term );
 
 	// If the taxonomy supports hierarchy and the term has a parent, make the slug unique
 	// by incorporating parent slugs.
-	if ( is_taxonomy_hierarchical($term->taxonomy) && !empty($term->parent) ) {
+	if ( is_taxonomy_hierarchical($term->taxonomy) && !empty($term->parent) || apply_filters( 'wp_unique_is_bad_term_slug', false, $slug, $term ) ) {
 		$the_parent = $term->parent;
 		while ( ! empty($the_parent) ) {
 			$parent_term = get_term($the_parent, $term->taxonomy);
@@ -2254,7 +2254,7 @@
 				break;
 			$slug .= '-' . $parent_term->slug;
 			if ( ! term_exists( $slug ) )
-				return $slug;
+				return apply_filters( 'wp_unique_term_slug', $slug, $term );
 
 			if ( empty($parent_term->parent) )
 				break;
@@ -2268,7 +2268,7 @@
 	else
 		$query = $wpdb->prepare( "SELECT slug FROM $wpdb->terms WHERE slug = %s", $slug );
 
-	if ( $wpdb->get_var( $query ) ) {
+	if ( $wpdb->get_var( $query ) || apply_filters( 'wp_unique_is_bad_term_slug', false, $slug, $term ) ) {
 		$num = 2;
 		do {
 			$alt_slug = $slug . "-$num";
@@ -2278,7 +2278,7 @@
 		$slug = $alt_slug;
 	}
 
-	return $slug;
+	return apply_filters( 'wp_unique_term_slug', $slug, $term );
 }
 
 /**
