Index: mappers/taxonomy.inc
===================================================================
--- mappers/taxonomy.inc	(revision 124)
+++ mappers/taxonomy.inc	(working copy)
@@ -88,9 +88,23 @@
   }
 
   if ($vocabulary->tags) {
-    foreach ($terms as $k => $v) {
+    foreach (array_keys($terms) as $key) {
       // Make sure there aren't any terms with a comma (=tag delimiter) in it.
-      $terms[$k] = preg_replace('/\s*,\s*/', ' ', $v);
+      $terms[$key] = preg_replace('/\s*,\s*/', ' ', $terms[$key]);
+
+      // Remove tags that are already set as term objects, since taxonomy_node_save() does not de-duplicate them.
+      // @see http://drupal.org/node/933758
+      if (is_array($node->taxonomy)) {
+        foreach ($node->taxonomy as $tid => $term) {
+          if (is_object($term) && $term->vid == $vocabulary->vid) {
+            if (strtolower($terms[$key]) === strtolower($term->name)) {
+              // Unset one or the other, but not both.  It probably does not matter which one.
+              unset($terms[$key]);
+              // unset($node->taxonomy[$tid]);
+            }
+          }
+        }
+      }
     }
     // 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]));
