diff --git a/mappers/field.inc b/mappers/field.inc
index 43d62c4..3930ece 100644
--- a/mappers/field.inc
+++ b/mappers/field.inc
@@ -44,6 +44,11 @@ function field_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_na
         'callback' => $callback,
         'description' => t('The @label field of the node.', array('@label' => $instance['label'])),
       );
+      // If any modules implement hook_feeds_node_processor_unique(), add
+      // checkboxes.
+      if (count(module_implements('feeds_node_processor_unique')) > 0) {
+        $targets[$name]['optional_unique'] = TRUE;
+      }
     }
   }
 }
diff --git a/plugins/FeedsNodeProcessor.inc b/plugins/FeedsNodeProcessor.inc
index 53caa50..c6ec6f5 100644
--- a/plugins/FeedsNodeProcessor.inc
+++ b/plugins/FeedsNodeProcessor.inc
@@ -362,6 +362,9 @@ class FeedsNodeProcessor extends FeedsProcessor {
             $nid = db_query("SELECT fs.feed_nid FROM {node} n JOIN {feeds_source} fs ON n.nid = fs.feed_nid WHERE fs.id = :id AND fs.source = :source", array(':id' => $id, ':source' => $value))->fetchField();
           }
           break;
+        default:
+          // Allow other modules to provide the ID of an existing node.
+          $nid = module_invoke_all('feeds_node_processor_unique', $value, $source, $target, $this->config);
       }
       if ($nid) {
         // Return with the first nid found.
