Index: src/wp-includes/taxonomy.php
===================================================================
--- src/wp-includes/taxonomy.php	(revision 25483)
+++ src/wp-includes/taxonomy.php	(working copy)
@@ -2099,9 +2099,25 @@
 	$name = wp_unslash($name);
 	$description = wp_unslash($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: src/wp-includes/formatting.php
===================================================================
--- src/wp-includes/formatting.php	(revision 25483)
+++ src/wp-includes/formatting.php	(working copy)
@@ -1006,6 +1006,7 @@
 		$title = utf8_uri_encode($title, 200);
 	}
 
+	$title = wp_humanize_plus_minus( $title );
 	$title = strtolower($title);
 	$title = preg_replace('/&.+?;/', '', $title); // kill entities
 	$title = str_replace('.', '-', $title);
@@ -3426,3 +3427,31 @@
 
 	return false;
 }
+
+/**
+ * Convert +/- to plus/minus
+ *
+ * @param string $str Input string.
+ * @return string Formatted string.
+ */
+function wp_humanize_plus_minus( $str ) {
+	$replacements = array(
+		'--' => '-minus-minus',
+		'++' => '-plus-plus'
+	);
+
+	$new_str = str_replace( array_keys( $replacements ), array_values( $replacements ), $str );
+
+	$patterns = array(
+		'#([^-])-\s#' => '$1-minus ',
+		'#([^-])-$#' => '$1-minus',
+		'#([^+]+)\+\s#' => '$1-plus ',
+		'#([^+]+)\+$#' => '$1-plus',
+	);
+
+	$new_str = preg_replace( array_keys( $patterns ), array_values( $patterns ), $new_str );
+	if ( $new_str !== $str )
+		$new_str = wp_humanize_plus_minus( $new_str );
+
+	return $new_str;
+}
\ No newline at end of file
