Index: wp-includes/taxonomy.php
===================================================================
--- wp-includes/taxonomy.php	(revision 23294)
+++ wp-includes/taxonomy.php	(working copy)
@@ -2065,9 +2065,25 @@
 	$name = stripslashes($name);
 	$description = stripslashes($description);
 
-	if ( empty($slug) )
-		$slug = sanitize_title($name);
+	if ( empty( $slug ) ) {
+		$name = trim( $name );
 
+		// check for a term like "$$$" so it isn't repeatedly added
+		if ( preg_match_all( '#[^a-zA-Z0-9]#', $name, $matches ) && count( $matches[0] ) === strlen( $name ) ) {
+			$exists = $wpdb->get_row( $wpdb->prepare( "SELECT term_id, slug FROM $wpdb->terms WHERE name = %s", $name ) );
+			if ( ! empty( $exists ) ) {
+				if ( term_exists( $exists->term_id, $taxonomy ) )
+					return new WP_Error( 'term_exists', __( 'A term with the name provided already exists.' ) );
+
+				// use the existing slug or the term will never match in term_exists
+				$slug = $exists->slug;
+			}
+
+		} else {
+			$slug = sanitize_title( $name );
+		}
+	}
+
 	$term_group = 0;
 	if ( $alias_of ) {
 		$alias = $wpdb->get_row( $wpdb->prepare( "SELECT term_id, term_group FROM $wpdb->terms WHERE slug = %s", $alias_of) );
Index: wp-includes/formatting.php
===================================================================
--- wp-includes/formatting.php	(revision 23294)
+++ wp-includes/formatting.php	(working copy)
@@ -980,6 +980,11 @@
 		$title = utf8_uri_encode($title, 200);
 	}
 
+	// let's assume that "+" next to a char followed by a space is not entered as space but as "plus"
+	// and that "-" directly next to a char followed by a space is not a dash but is "minus"
+	$title = preg_replace( array( '#([^-])-\s#', '#([^-])-$#' ), array( '$1-minus ', '$1-minus' ), $title );
+	$title = preg_replace( array( '#([^+])\+\s#', '#([^+])\+$#' ), array( '$1-plus ', '$1-plus' ), $title );
+
 	$title = strtolower($title);
 	$title = preg_replace('/&.+?;/', '', $title); // kill entities
 	$title = str_replace('.', '-', $title);
