Index: taxonomy.module
===================================================================
--- taxonomy.module	(revision 296)
+++ taxonomy.module	(working copy)
@@ -468,6 +468,11 @@
  *   Status constant indicating if term was inserted or updated.
  */
 function taxonomy_save_term(&$form_values) {
+  if (!$form_values['tid'] && $form_values['name']) {
+    if ($existing_terms = taxonomy_get_term_by_name($form_values['name'], $form_values['vid'])) {
+      $form_values['tid'] = $existing_terms[0]->tid;
+    }
+  }
   if ($form_values['tid'] && $form_values['name']) {
     db_query("UPDATE {term_data} SET name = '%s', description = '%s', weight = %d WHERE tid = %d", $form_values['name'], $form_values['description'], $form_values['weight'], $form_values['tid']);
     $hook = 'update';
@@ -1098,8 +1103,16 @@
  * @return
  *   An array of matching term objects.
  */
-function taxonomy_get_term_by_name($name) {
-  $db_result = db_query(db_rewrite_sql("SELECT t.tid, t.* FROM {term_data} t WHERE LOWER('%s') LIKE LOWER(t.name)", 't', 'tid'), trim($name));
+function taxonomy_get_term_by_name($name, $vid = NULL) {
+  if ($vid === NULL) {
+    $query = db_rewrite_sql("SELECT t.tid, t.* FROM {term_data} t WHERE LOWER('%s') LIKE LOWER(t.name)", 't', 'tid');
+    $args  = array(trim($name));
+  }
+  else {
+    $query = db_rewrite_sql("SELECT t.tid, t.* FROM {term_data} t WHERE LOWER('%s') LIKE LOWER(t.name) AND t.vid=%d", 't', 'tid');
+    $args  = array(trim($name), $vid);
+  }
+  $db_result = db_query($query, $args);
   $result = array();
   while ($term = db_fetch_object($db_result)) {
     $result[] = $term;
