diff --git a/plugins/FeedsPlugin.inc b/plugins/FeedsPlugin.inc
index ac63f2d46c6477bd1a4a766ee0ed9fb7cf99b3b9..259eedb551f4efadec4bcb5b0c4e4e92f97f85f5 100644
--- a/plugins/FeedsPlugin.inc
+++ b/plugins/FeedsPlugin.inc
@@ -98,7 +98,7 @@ abstract class FeedsPlugin extends FeedsConfigurable implements FeedsSourceInter
    *
    * @todo: Use CTools Plugin API.
    */
-  protected static function loadMappers() {
+  public static function loadMappers() {
     static $loaded = FALSE;
     if (!$loaded) {
       $path = drupal_get_path('module', 'feeds') . '/mappers';
diff --git a/tests/feeds_mapper_taxonomy.test b/tests/feeds_mapper_taxonomy.test
index 94dd188f58cccd21565893f969c9bbf423724215..2c6dfb65cb3dc33568a4cc70870373c230ad8f00 100644
--- a/tests/feeds_mapper_taxonomy.test
+++ b/tests/feeds_mapper_taxonomy.test
@@ -112,7 +112,7 @@ class FeedsMapperTaxonomyTestCase extends FeedsMapperTestCase {
   }
 
   /**
-   * Test inheriting taxonomy from the feed node.
+   * Tests inheriting taxonomy from the feed node.
    */
   function testInheritTaxonomy() {
 
@@ -152,120 +152,165 @@ class FeedsMapperTaxonomyTestCase extends FeedsMapperTestCase {
   }
 
   /**
-   * Test aggregating RSS categories to taxonomy.
+   * Tests searching taxonomy terms by name.
    */
-  /*
-  function testRSSCategoriesToTaxonomy() {
-    // Add mapping to tags vocabulary.
-    $this->addMappings('syndication',
-      array(
-        array(
-          'source' => 'tags',
-          'target' => 'taxonomy:1',
-        ),
-      )
-    );
-
-    // Aggregate feed node with "Tag" vocabulary.
-    $nid = $this->createFeedNode();
-    // Assert 10 items aggregated after creation of the node.
-    $this->assertText('Created 10 nodes');
-    // There should be 30 terms and 44 term-node relations.
-    $this->assertEqual(30, db_query("SELECT count(*) FROM {term_data}")->fetchField(), "Found correct number of terms.");
-    $this->assertEqual(44, db_query("SELECT count(*) FROM {term_node}")->fetchField(), "Found correct number of term-node relations.");
-
-    // Take a look at the actual terms on frontpage.
-    $this->drupalGet('node');
+  public function testSearchByName() {
     $terms = array(
-      'authentication',
-      'custom mapping',
-      'data visualization',
       'Drupal',
-      'Drupal planet',
-      'faceted search',
-      'GeoDC',
-      'graphs',
-      'interface',
-      'intranet',
       'localization',
       'localization client',
       'localization server',
-      'map-basec browser',
-      'mapbox',
-      'microfinance',
-      'MIX Market',
       'open atrium',
-      'open data',
-      'open source',
-      'Peru',
-      'salesforce',
-      'siteminder',
-      'siteminder module',
-      'software freedom day',
       'translation',
       'translation server',
-      'usability',
-      'Washington DC',
-      'World Bank',
+      'Drupal planet',
     );
+
+    $this->setSettings('syndication', 'FeedsNodeProcessor', array(
+      'skip_hash_check' => TRUE,
+      'update_existing' => 2,
+    ));
+    $mappings = array(
+      5 => array(
+        'source' => 'tags',
+        'target' => 'field_tags',
+        'term_search' => 0,
+      ),
+    );
+    $this->addMappings('syndication', $mappings);
+    $nid = $this->createFeedNode('syndication', NULL, 'Syndication');
+    $this->assertText('Created 10 nodes.');
+    // Check that terms we not auto-created.
+    $this->drupalGet('node/2');
+    foreach ($terms as $term) {
+      $this->assertNoTaxonomyTerm($term);
+    }
+    $this->drupalGet('node/3');
+    $this->assertNoTaxonomyTerm('Washington DC');
+
+    // Change the mapping configuration.
+    $this->removeMappings('syndication', $mappings);
+    // Turn on autocreate.
+    $mappings[5]['autocreate'] = TRUE;
+    $this->addMappings('syndication', $mappings);
+    $this->drupalPost('node/' . $nid . '/import', array(), t('Import'));
+    $this->assertText('Updated 10 nodes.');
+
+    $this->drupalGet('node/2');
     foreach ($terms as $term) {
       $this->assertTaxonomyTerm($term);
     }
+    $this->drupalGet('node/3');
+    $this->assertTaxonomyTerm('Washington DC');
 
-    // Delete all items, all associations are gone.
-    $this->drupalPost("node/$nid/delete-items", array(), 'Delete');
-    $this->assertText('Deleted 10 nodes');
-    $this->assertEqual(30, db_query("SELECT count(*) FROM {term_data}")->fetchField(), "Found correct number of terms.");
-    $this->assertEqual(0, db_query("SELECT count(*) FROM {term_node}")->fetchField(), "Found correct number of term-node relations.");
+    $names = db_query('SELECT name FROM {taxonomy_term_data}')->fetchCol();
+    $this->assertEqual(count($names), 31, 'Found correct number of terms in the database.');
 
-    // Remove "Tag" setting, import again.
-    $edit = array(
-      'tags' => FALSE,
-    );
-    $this->drupalPost('admin/content/taxonomy/edit/vocabulary/1', $edit, 'Save');
-    $this->drupalPost("node/$nid/import", array(), 'Import');
-    $this->assertText('Created 10 nodes');
+    // Run import again. This verifys that the terms we found by name.
+    $this->drupalPost('node/' . $nid . '/import', array(), t('Import'));
+    $this->assertText('Updated 10 nodes.');
+    $names = db_query('SELECT name FROM {taxonomy_term_data}')->fetchCol();
+    $this->assertEqual(count($names), 31, 'Found correct number of terms in the database.');
+  }
 
-    // We should only get one term-node association per node.
-    $this->assertEqual(30, db_query("SELECT count(*) FROM {term_data}")->fetchField(), "Found correct number of terms.");
-    $this->assertEqual(10, db_query("SELECT count(*) FROM {term_node}")->fetchField(), "Found correct number of term-node relations.");
+  /**
+   * Tests mapping to taxonomy terms by tid.
+   */
+  public function testSearchByID() {
+    // Create 10 terms. The first one was created in setup.
+    $terms = array(1);
+    foreach (range(2, 10) as $i) {
+      $term = (object) array(
+        'name' => 'term' . $i,
+        'vid' => 1,
+      );
+      taxonomy_term_save($term);
+      $terms[] = $term->tid;
+    }
 
-    // Delete all items.
-    $this->drupalPost("node/$nid/delete-items", array(), 'Delete');
+    FeedsPlugin::loadMappers();
 
-    // Set vocabulary to multiple terms, import again.
-    $edit = array(
-      'multiple' => TRUE,
+    $entity = new stdClass();
+    $target = 'field_tags';
+    $mapping = array(
+      'term_search' => FEEDS_TAXONOMY_SEARCH_TERM_ID,
     );
-    $this->drupalPost('admin/content/taxonomy/edit/vocabulary/1', $edit, 'Save');
-    $this->drupalPost("node/$nid/import", array(), 'Import');
-    $this->assertText('Created 10 nodes');
 
-    // We should get all term-node associations again.
-    $this->assertEqual(30, db_query("SELECT count(*) FROM {term_data}")->fetchField(), "Found correct number of terms.");
-    $this->assertEqual(44, db_query("SELECT count(*) FROM {term_node}")->fetchField(), "Found correct number of term-node relations.");
+    taxonomy_feeds_set_target(NULL, $entity, $target, $terms, $mapping);
+    $this->assertEqual(count($entity->field_tags[LANGUAGE_NONE]), 10);
 
-    // Delete all items.
-    $this->drupalPost("node/$nid/delete-items", array(), 'Delete');
+    // Test a second mapping with a bogus term id.
+    taxonomy_feeds_set_target(NULL, $entity, $target, array(1234), $mapping);
+    $this->assertEqual(count($entity->field_tags[LANGUAGE_NONE]), 10);
+  }
 
-    // Remove a term, import again.
-    $this->drupalPost('admin/content/taxonomy/edit/term/1', array(), 'Delete');
-    $this->drupalPost(NULL, array(), 'Delete');
-    $this->assertText('Deleted term');
-    $this->drupalPost("node/$nid/import", array(), 'Import');
-    $this->assertText('Created 10 nodes');
+  /**
+   * Tests mapping to a taxonomy term's guid.
+   */
+  public function testSearchByGUID() {
+    // Create 10 terms. The first one was created in setup.
+    $tids = array(1);
+    foreach (range(2, 10) as $i) {
+      $term = (object) array(
+        'name' => 'term' . $i,
+        'vid' => 1,
+      );
+      taxonomy_term_save($term);
+      $tids[] = $term->tid;
+    }
+
+    // Create a bunch of bogus imported terms.
+    $guids = array();
+    foreach ($tids as $tid) {
+      $guid = 100 * $tid;
+      $guids[] = $guid;
+      $record = array(
+        'entity_type' => 'taxonomy_term',
+        'entity_id' => $tid,
+        'id' => 'does_not_exist',
+        'feed_nid' => 0,
+        'imported' => REQUEST_TIME,
+        'url' => '',
+        'guid' => $guid,
+      );
+      drupal_write_record('feeds_item', $record);
+    }
+
+    FeedsPlugin::loadMappers();
+
+    $entity = new stdClass();
+    $target = 'field_tags';
+    $mapping = array(
+      'term_search' => FEEDS_TAXONOMY_SEARCH_TERM_GUID,
+    );
+
+    taxonomy_feeds_set_target(NULL, $entity, $target, $guids, $mapping);
+    $this->assertEqual(count($entity->field_tags[LANGUAGE_NONE]), 10);
+    foreach ($entity->field_tags[LANGUAGE_NONE] as $delta => $values) {
+      $this->assertEqual($tids[$delta], $values['tid'], 'Correct term id foud.');
+    }
 
-    // This term should now be missing from term-node associations.
-    $this->assertEqual(29, db_query("SELECT count(*) FROM {term_data}")->fetchField(), "Found correct number of terms.");
-    $this->assertEqual(39, db_query("SELECT count(*) FROM {term_node}")->fetchField(), "Found correct number of term-node relations.");
+    // Test a second mapping with a bogus term id.
+    taxonomy_feeds_set_target(NULL, $entity, $target, array(1234), $mapping);
+    $this->assertEqual(count($entity->field_tags[LANGUAGE_NONE]), 10);
+    foreach ($entity->field_tags[LANGUAGE_NONE] as $delta => $values) {
+      $this->assertEqual($tids[$delta], $values['tid'], 'Correct term id foud.');
+    }
   }
-  */
 
   /**
-   * Helper, finds node style taxonomy term markup in DOM.
+   * Finds node style taxonomy term markup in DOM.
    */
   public function assertTaxonomyTerm($term) {
     $term = check_plain($term);
     $this->assertPattern('/<a href="\/.*taxonomy\/term\/[0-9]+">' . $term . '<\/a>/', 'Found ' . $term);
   }
+
+  /**
+   * Asserts that the term does not exist on a node page.
+   */
+  public function assertNoTaxonomyTerm($term) {
+    $term = check_plain($term);
+    $this->assertNoPattern('/<a href="\/.*taxonomy\/term\/[0-9]+">' . $term . '<\/a>/', 'Did not find ' . $term);
+  }
 }