--- mappers/taxonomy.inc	2011-02-23 19:33:26.000000000 -0700
+++ mappers/taxonomy.inc	2011-02-23 19:38:55.000000000 -0700
@@ -91,6 +91,22 @@
     // Merge existing tags with new terms.
     $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));
+
     // Use drupal_implode_tags() to add a comma separated list to the node for a "tags" vocabulary.
     $node->taxonomy['tags'][$vocabulary->vid] = drupal_implode_tags($terms);
   }
