Index: mappers/taxonomy.inc
===================================================================
--- mappers/taxonomy.inc	(revision 4194)
+++ mappers/taxonomy.inc	(working copy)
@@ -92,8 +92,25 @@
       // Make sure there aren't any terms with a comma (=tag delimiter) in it.
       $terms[$k] = preg_replace('/\s*,\s*/', ' ', $v);
     }
-    // Simply add a comma separated list to the node for a "tags" vocabulary.
     $terms = array_merge($terms, drupal_explode_tags($node->taxonomy['tags'][$vocabulary->vid]));
+
+    // Build an array of terms from the node keyed by lowercase name (see below).
+    $node_terms = array();
+    if (is_array($node->taxonomy)) {
+      foreach ($node->taxonomy as $tid => $term) {
+        if (is_object($term) && $term->vid == $vocabulary->vid) {
+          $node_terms[strtolower($term->name)] = $term->name;
+        }
+      }
+    }
+    // Make an associative array of new terms to diff by key (lowercase name).
+    $new_terms = array_combine(array_map('strtolower', $terms), $terms);
+
+    // Remove tags that are already set as term objects, since taxonomy_node_save() does not de-duplicate them.
+    // @see http://drupal.org/node/933758
+    $terms = array_values(array_diff_key($new_terms, $node_terms));
+
+    // Simply add a comma separated list to the node for a "tags" vocabulary.
     $node->taxonomy['tags'][$vocabulary->vid] = implode(',', $terms);
   }
   else {
