diff --git a/mappers/taxonomy.inc b/mappers/taxonomy.inc
old mode 100644
new mode 100755
index de150ad..3694b20
--- a/mappers/taxonomy.inc
+++ b/mappers/taxonomy.inc
@@ -91,8 +91,26 @@ function taxonomy_feeds_set_target(&$node, $key, $terms) {
       // 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 {
