diff --git mappers/nodereference.inc mappers/nodereference.inc
new file mode 100644
index 0000000..305e743
--- /dev/null
+++ mappers/nodereference.inc
@@ -0,0 +1,121 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Implementation of Feeds API for mapping nodereference.module fields (CCK).
+ */
+
+/**
+ * Implementation of hook_feeds_node_processor_targets_alter().
+ *
+ * @see FeedsNodeProcessor::getMappingTargets()
+ */
+function nodereference_feeds_node_processor_targets_alter(&$targets, $content_type) {
+  $info = content_types($content_type);
+  if (isset($info['fields']) && is_array($info['fields'])) {
+    foreach ($info['fields'] as $field_name => $field) {
+      if ($field['type'] == 'nodereference') {
+        $field_label = isset($field['widget']['label']) ? $field['widget']['label'] : $field_name;
+        $targets[$field_name . ':title'] = array(
+          'name' => t('@field_label (by title)', array('@field_label' => $field_label)),
+          'callback' => 'nodereference_feeds_set_target',
+          'description' => t('The CCK node reference @field_label of the node, matched by node title.', array('@field_label' => $field_label)),
+          'real_target' => $field_name,
+        );
+        $targets[$field_name . ':nid'] = array(
+          'name' => t('@field_label (by nid)', array('@field_label' => $field_label)),
+          'callback' => 'nodereference_feeds_set_target',
+          'description' => t('The CCK node reference @field_label of the node, matched by node ID.', array('@field_label' => $field_label)),
+          'real_target' => $field_name,
+        );
+        $targets[$field_name . ':url'] = array(
+          'name' => t('@field_label (by Feeds URL)', array('@field_label' => $field_label)),
+          'callback' => 'nodereference_feeds_set_target',
+          'description' => t('The CCK node reference @field_label of the node, matched by Feeds URL.', array('@field_label' => $field_label)),
+          'real_target' => $field_name,
+        );
+        $targets[$field_name . ':guid'] = array(
+          'name' => t('@field_label (by Feeds GUID)', array('@field_label' => $field_label)),
+          'callback' => 'nodereference_feeds_set_target',
+          'description' => t('The CCK node reference @field_label of the node, matched by Feeds GUID.', array('@field_label' => $field_label)),
+          'real_target' => $field_name,
+        );
+      }
+    }
+  }
+}
+
+/**
+ * Implementation of hook_feeds_set_target().
+ *
+ * The actual field mapping happens in this callback function.
+ *
+ * @param obj $node
+ *   The node to to be created or updated.
+ * @param str $target
+ *   The name of the field on the node to be mapped.
+ * @param str|array $value
+ *   The value(s) of the source feed item element to be mapped.
+ */
+function nodereference_feeds_set_target($node, $target, $value) {
+  // Determine whether we are matching against title, nid, URL, or GUID.
+  list($target, $match_key) = explode(':', $target, 2);
+
+  // Load field definition.
+  $field_info = content_fields($target, $node->type);
+
+  // Allow for multiple-value fields.
+  $value = is_array($value) ? $value : array($value);
+
+  // Allow importing to the same target with multiple mappers.
+  $field = isset($node->{$target}) ? $node->{$target} : array();
+
+  // Match values against nodes and add to field.
+  foreach ($value as $v) {
+    $nids = array();
+    $v = trim($v);
+
+    switch ($match_key) {
+      case 'url':
+      case 'guid':
+        // Lookup node ID by Feeds unique value.
+        $result = db_query("SELECT nid FROM {feeds_node_item} WHERE %s = '%s'", $match_key, $v);
+        // Since GUID and URL are only guaranteed to be unique per feed,
+        // multiple nids from different feeds may result.
+        while ($row = db_fetch_array($result)) {
+          $nids[] = $row['nid'];
+        }
+        // Ensure nids are valid node ids for this field.
+        $nids = !empty($nids) ? array_keys(_nodereference_potential_references($field_info, '', NULL, $nids)) : array();
+        break;
+
+      case 'title':
+        // Validate title.
+        if ((is_string($v) && $v !== '') || is_numeric($v)) {
+          // Lookup potential exact matches for the value.
+          $nids = array_keys(_nodereference_potential_references($field_info, $v, 'equals', array()));
+        }
+        break;
+
+      case 'nid':
+        // Ensure nid is a valid node id for this field.
+        $nids = array_keys(_nodereference_potential_references($field_info, '', NULL, array($v)));
+        break;
+    }
+
+    if (empty($nids)) {
+      // Alert if no matches were found.
+      drupal_set_message(t("'%value' does not match a valid node %key for the '%field' field.", array('%value' => $v, '%key' => $match_key, '%field' => $target)));
+    }
+    else {
+      // Add the reference (ignoring duplicates).
+      foreach ($nids as $nid) {
+        $field[] = array('nid' => $nid);  
+      }
+    }
+
+  }
+
+  $node->{$target} = $field;
+}
diff --git tests/feeds/nodereference.csv tests/feeds/nodereference.csv
new file mode 100644
index 0000000..c336126
--- /dev/null
+++ tests/feeds/nodereference.csv
@@ -0,0 +1,4 @@
+title,ref
+title a,10
+title b,20
+title c,30
diff --git tests/feeds_mapper_nodereference.test tests/feeds_mapper_nodereference.test
new file mode 100644
index 0000000..49fb33d
--- /dev/null
+++ tests/feeds_mapper_nodereference.test
@@ -0,0 +1,134 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Test case for CCK field mapper mappers/nodereference.inc.
+ */
+
+require_once(drupal_get_path('module', 'feeds') . '/tests/feeds_mapper_test.inc');
+
+/**
+ * Class for testing Feeds nodereference mapper.
+ */
+class FeedsMapperNodereferenceTestCase extends FeedsMapperTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => t('Mapper: Nodereference'),
+      'description' => t('Test Feeds Mapper support for Nodereference CCK fields. <strong>Requires CCK module</strong>.'),
+      'group' => t('Feeds'),
+    );
+  }
+
+  /**
+   * Set up the test.
+   */
+  function setUp() {
+    // Call parent setup with required modules.
+    parent::setUp('ctools', 'job_scheduler', 'feeds', 'feeds_ui', 'content', 'nodereference');
+
+    // Create user and login.
+    $this->drupalLogin($this->drupalCreateUser(
+      array(
+        'administer content types',
+        'administer feeds',
+        'administer nodes',
+        'administer site configuration',
+      )
+    ));
+  }
+
+  /**
+   * Basic test loading an rss file.
+   */
+  function test() {
+
+    // Create content type.
+    $typename = $this->createContentType(NULL, array(
+      'ref' => array(
+        'type' => 'nodereference',
+        'settings' => array(
+          'multiple' => 1,  // Sets to unlimited.
+          'referenceable_types[story]' => TRUE,
+        ),
+      ),
+    ));
+
+    $rss = simplexml_load_file($this->absolutePath() . '/tests/feeds/developmentseed_changes.rss2');
+    $categories = $rss->xpath('//category');
+
+    foreach ($categories as &$category) {
+      $category = (string) $category;
+    }
+    $categories = array_unique($categories);
+    foreach ($categories as $category) {
+      $this->drupalPost('node/add/story', array('title' => $category), t('Save'));
+    }
+
+    // Create and configure importer.
+    $this->createImporterConfiguration('Nodereference', 'ref_test_title');
+    $this->setSettings('ref_test_title', NULL, array('content_type' => '','import_period' => FEEDS_SCHEDULE_NEVER));
+    $this->setPlugin('ref_test_title', 'FeedsFileFetcher');
+    $this->setSettings('ref_test_title', 'FeedsNodeProcessor', array('content_type' => $typename));
+    $this->addMappings('ref_test_title', array(
+      array(
+        'source' => 'title',
+        'target' => 'title',
+      ),
+      array(
+        'source' => 'tags',
+        'target' => 'field_ref:title',
+      ),
+    ));
+
+    // Import file.
+    $this->importFile('ref_test_title', $this->absolutePath() . '/tests/feeds/developmentseed_changes.rss2');
+    $this->assertText('Created 10 '. $typename .' nodes.');
+
+    foreach ($rss->xpath('//item') as $item) {
+      $feed_item = node_load(array('title' => $item->title));
+      $this->drupalGet('node/' . $feed_item->nid);
+      foreach ($item->category as $category) {
+        $this->assertText((string) $category);
+      }
+    }
+
+    // Delete everything and start over for nid test
+    $this->drupalPost('import/ref_test_title/delete-items', array(), 'Delete');
+
+    // Create and configure importer.
+    $this->createImporterConfiguration('Nodereference', 'ref_test_nid');
+    $this->setSettings('ref_test_nid', NULL, array('content_type' => '','import_period' => FEEDS_SCHEDULE_NEVER));
+    $this->setPlugin('ref_test_nid', 'FeedsFileFetcher');
+    $this->setPlugin('ref_test_nid', 'FeedsCSVParser');
+    $this->setSettings('ref_test_nid', 'FeedsNodeProcessor', array('content_type' => $typename));
+    $this->addMappings('ref_test_nid', array(
+      array(
+        'source' => 'title',
+        'target' => 'title',
+      ),
+      array(
+        'source' => 'ref',
+        'target' => 'field_ref:nid',
+      ),
+    ));
+
+    // Import file.
+    $this->importFile('ref_test_nid', $this->absolutePath() . '/tests/feeds/nodereference.csv');
+    $this->assertText('Created 3 '. $typename .' nodes.');
+    $this->drupalGet('node/' . node_load(array('title' => 'title a'))->nid);
+    $this->assertText('custom mapping');
+    $this->drupalGet('node/' . node_load(array('title' => 'title b'))->nid);
+    $this->assertText('MIX Market');
+    $this->drupalGet('node/' . node_load(array('title' => 'title c'))->nid);
+    $this->assertText('usability');
+  }
+
+  /**
+   * Override parent::getFormFieldsNames().
+   */
+  protected function getFormFieldsNames($field_name, $index) {
+    return array("field_{$field_name}[{$index}][nid]");
+  }
+}
