diff --git a/feeds.module b/feeds.module
index 908b2f8..f2954f1 100644
--- a/feeds.module
+++ b/feeds.module
@@ -426,29 +426,52 @@ function feeds_theme() {
  *   Node object or FeedsImporter id.
  */
 function feeds_access($action, $param) {
+  $importer_ids = array();
   if (!in_array($action, array('import', 'clear', 'unlock'))) {
     // If $action is not one of the supported actions, we return access denied.
     return FALSE;
   }
 
-  $importer_id = FALSE;
   if (is_string($param)) {
     $importer_id = $param;
+    // If checking the access of a single importer build the array manually.
+    $importer_ids[$param] = $param;
   }
   elseif ($param instanceof FeedsImporter) {
-    $importer_id = $param->id;
+    $importer_ids[$param->id] = $param->id;
   }
   elseif ($param->type) {
     $importer_id = feeds_get_importer_id($param->type);
+    // If checking the access for a content type, check all importers available
+    // for it.
+    $importer_ids = feeds_get_importer_ids($param->type);
+  }
+
+  // Loop through all importers. if the user has access to one, they have access
+  // to the item.
+  foreach ($importer_ids as $importer_id) {
+    // Check for permissions if feed id is present, otherwise return FALSE.
+    if ($importer_id) {
+      if (user_access('administer feeds') || user_access($action . ' ' . $importer_id .' feeds')) {
+        return TRUE;
+      }
+    }
   }
+  return FALSE;
+}
 
-  // Check for permissions if feed id is present, otherwise return FALSE.
-  if ($importer_id) {
-    if (user_access('administer feeds') || user_access("{$action} {$importer_id} feeds")) {
-      return TRUE;
+/**
+ * Implements hook_node_prepare().
+ */
+function feeds_node_prepare($node) {
+  if ($importer_ids = feeds_get_importer_ids($node->type)) {
+    $node->feeds = array();
+    foreach ($importer_ids as $importer_id){
+      $source = feeds_source($importer_id, empty($node->nid) ? 0 : $node->nid);
+      $node->feeds[$importer_id] = array();
+      $node->feeds[$importer_id] += $source->configDefaults();
     }
   }
-  return FALSE;
 }
 
 /**
@@ -583,7 +606,7 @@ function feeds_entity_delete($entity, $type) {
  * Implements hook_node_validate().
  */
 function feeds_node_validate($node, $form, &$form_state) {
-  if (!$importer_id = feeds_get_importer_id($node->type)) {
+  if (!$importer_ids = feeds_get_importer_ids($node->type)) {
     return;
   }
   // Keep a copy of the title for subsequent node creation stages.
@@ -592,28 +615,30 @@ function feeds_node_validate($node, $form, &$form_state) {
   $last_title = &drupal_static('feeds_node_last_title');
   $last_feeds = &drupal_static('feeds_node_last_feeds');
 
-  // On validation stage we are working with a FeedsSource object that is
-  // not tied to a nid - when creating a new node there is no
-  // $node->nid at this stage.
-  $source = feeds_source($importer_id);
-
   // Node module magically moved $form['feeds'] to $node->feeds :P.
   // configFormValidate may modify $last_feed, smuggle it to update/insert stage
   // through a static variable.
-  $last_feeds = $node->feeds;
-  $source->configFormValidate($last_feeds);
-
-  // If node title is empty, try to retrieve title from feed.
-  if (trim($node->title) == '') {
-    try {
-      $source->addConfig($last_feeds);
-      if (!$last_title = $source->preview()->title) {
-        throw new Exception();
+  $last_feeds = isset($node->feeds) ? $node->feeds : array();
+
+  // On validation stage we are working with a FeedsSource object that is
+  // not tied to a nid - when creating a new node there is no
+  // $node->nid at this stage.
+  foreach ($importer_ids as $importer_id) {
+    $source = feeds_source($importer_id);
+    $source->configFormValidate($last_feeds[$importer_id]);
+
+    // If node title is empty, try to retrieve title from feed.
+    if (false && trim($node->title) == '') {
+      try {
+        $source->addConfig($last_feeds[$importer_id]);
+        if (!$last_title = $source->preview()->title) {
+          throw new Exception();
+        }
+      }
+      catch (Exception $e) {
+        drupal_set_message($e->getMessage(), 'error');
+        form_set_error('title', t('Could not retrieve title from feed.'), array('error' => array('title')));
       }
-    }
-    catch (Exception $e) {
-      drupal_set_message($e->getMessage(), 'error');
-      form_set_error('title', t('Could not retrieve title from feed.'));
     }
   }
 }
@@ -641,14 +666,16 @@ function feeds_node_presave($node) {
 function feeds_node_insert($node) {
   // Source attached to node.
   feeds_node_update($node);
-  if (isset($node->feeds) && $importer_id = feeds_get_importer_id($node->type)) {
-    $source = feeds_source($importer_id, $node->nid);
-    // Start import if requested.
-    if (feeds_importer($importer_id)->config['import_on_create'] && !isset($node->feeds['suppress_import'])) {
-      $source->startImport();
+  if (isset($node->feeds) && $importer_ids = feeds_get_importer_ids($node->type, $node->nid)) {
+    foreach ($importer_ids as $importer_id) {
+      $source = feeds_source($importer_id, $node->nid);
+      // Start import if requested.
+      if (feeds_importer($importer_id)->config['import_on_create'] && !isset($node->feeds['suppress_import'])) {
+        $source->startImport();
+      }
+      // Schedule source and importer.
+      $source->schedule();
     }
-    // Schedule the source.
-    $source->schedule();
   }
 }
 
@@ -657,10 +684,15 @@ function feeds_node_insert($node) {
  */
 function feeds_node_update($node) {
   // Source attached to node.
-  if (isset($node->feeds) && $importer_id = feeds_get_importer_id($node->type)) {
-    $source = feeds_source($importer_id, $node->nid);
-    $source->addConfig($node->feeds);
-    $source->save();
+  if (isset($node->feeds) && $importer_ids = feeds_get_importer_ids($node->type)) {
+    foreach ($importer_ids as $importer_id) {
+      $source = feeds_source($importer_id, $node->nid);
+      // Config may be empty if defined so by importer.
+      if ($node->feeds[$importer_id]) {
+        $source->addConfig($node->feeds[$importer_id]);
+      }
+      $source->save();
+    }
   }
 }
 
@@ -672,8 +704,10 @@ function feeds_node_delete($node) {
   // Make sure we don't leave any orphans behind: Do not use
   // feeds_get_importer_id() to determine importer id as the importer may have
   // been deleted.
-  if ($importer_id = db_query("SELECT id FROM {feeds_source} WHERE feed_nid = :nid", array(':nid' => $node->nid))->fetchField()) {
-    feeds_source($importer_id, $node->nid)->delete();
+  if ($importer_ids = db_query("SELECT id FROM {feeds_source} WHERE feed_nid = :nid", array(':nid' => $node->nid))) {
+    foreach ($importer_ids as $row) {
+      feeds_source($row->id, $node->nid)->delete();
+    }
   }
 }
 
@@ -681,26 +715,70 @@ function feeds_node_delete($node) {
  * Implements hook_form_BASE_FORM_ID_alter().
  */
 function feeds_form_node_form_alter(&$form, $form_state) {
-  if ($importer_id = feeds_get_importer_id($form['#node']->type)) {
-    // Set title to not required, try to retrieve it from feed.
-    if (isset($form['title'])) {
-      $form['title']['#required'] = FALSE;
-    }
-
-    // Enable uploads.
-    $form['#attributes']['enctype'] = 'multipart/form-data';
-
-    // Build form.
-    $source = feeds_source($importer_id, empty($form['#node']->nid) ? 0 : $form['#node']->nid);
+  if ($importer_ids = feeds_get_importer_ids($form['#node']->type)) {
     $form['feeds'] = array(
       '#type' => 'fieldset',
       '#title' => t('Feed'),
       '#tree' => TRUE,
       '#weight' => 0,
     );
-    $form['feeds'] += $source->configForm($form_state);
-    $form['#feed_id'] = $importer_id;
+    foreach ($importer_ids as $importer_id) {
+      // Set title to not required, try to retrieve it from feed.
+      if (isset($form['title'])) {
+        $form['title']['#required'] = FALSE;
+      }
+
+      // Enable uploads.
+      $form['#attributes']['enctype'] = 'multipart/form-data';
+
+      // Build form.
+      $source = feeds_source($importer_id, empty($form['#node']->nid) ? 0 : $form['#node']->nid);
+      $form['feeds'][$importer_id] = $source->configForm($form_state);
+      $form['#feed_id'] = $importer_id;
+    }
+  }
+}
+
+/**
+ * Gets an enabled importer configuration by content type.
+ *
+ * @param $content_type
+ *   A node type string.
+ * @param $feed_nid
+ *  Nid for feed.
+ *
+ * @return
+ *   A list of FeedsImporters attached to the given content type.
+ */
+function feeds_get_importer_ids($content_type, $feed_nid = NULL) {
+  $all_importers = _feeds_importer_digest();
+  $importers = array();
+  foreach ($all_importers as $importer => $type) {
+    if ($type == $content_type) {
+      $importers[$importer] = $importer;
+    }
+  }
+  // Sort those importers by weight.
+  if (!empty($importers)) {
+    $weights = _feeds_get_importer_weights($importers);
+    // Sort these arrays by key, then sort together.
+    ksort($weights);
+    ksort($importers);
+    array_multisort($weights, $importers);
+  }
+  return $importers;
+}
+
+function _feeds_get_importer_weights($importers, $sorted = TRUE){
+  foreach (feeds_importer_load_all() as $importer) {
+    if (isset($importers[$importer->id])) {
+      $importer_weights[$importer->id] = isset($importer->config['weight']) ? $importer->config['weight'] : '0';
+    }
+  }
+  if ($sorted) {
+    asort($importer_weights);
   }
+  return $importer_weights;
 }
 
 /**
diff --git a/feeds.pages.inc b/feeds.pages.inc
index eeeab90..76292be 100644
--- a/feeds.pages.inc
+++ b/feeds.pages.inc
@@ -131,26 +131,62 @@ function feeds_import_form_submit($form, &$form_state) {
  * Render a feeds import form on node/id/import pages.
  */
 function feeds_import_tab_form($form, &$form_state, $node) {
-  $importer_id = feeds_get_importer_id($node->type);
-  $source = feeds_source($importer_id, $node->nid);
+  $total_progress = 0;
+
+  $importer_ids = feeds_get_importer_ids($node->type, $node->nid);
 
   $form = array();
-  $form['#feed_nid'] = $node->nid;
-  $form['#importer_id'] = $importer_id;
-  $form['#redirect'] = 'node/' . $node->nid;
-  $form['source_status'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Status'),
-    '#tree' => TRUE,
-    '#value' => feeds_source_status($source),
-  );
-  $form = confirm_form($form, t('Import all content from source?'), 'node/' . $node->nid, '', t('Import'), t('Cancel'), 'confirm feeds update');
-  $progress = $source->progressImporting();
-  if ($progress !== FEEDS_BATCH_COMPLETE) {
-    $form['actions']['submit']['#disabled'] = TRUE;
-    $form['actions']['submit']['#value'] =
-      t('Importing (@progress %)', array('@progress' => number_format(100 * $progress, 0)));
+  if ($importer_ids) {
+    $form['#feed_nid'] = $node->nid;
+    $form['#redirect'] = 'node/' . $node->nid;
+    $form = confirm_form($form, t('Import all content from source?'), 'node/' . $node->nid, '', t('Import'), t('Cancel'), 'confirm feeds update');
+    foreach ($importer_ids as $importer_id => $weight) {
+      $source = feeds_source($importer_id, $node->nid);
+      $form[$importer_id]['source_status'] = array(
+        '#type' => 'fieldset',
+        '#title' => t('@source_name: Status', array('@source_name' => $source->importer->config['name'])),
+        '#tree' => TRUE,
+        '#value' => feeds_source_status($source),
+      );
+      $progress = $source->progressImporting();
+      $total_progress += $progress;
+    }
+    if (count($importer_ids) == 1) {
+      $form['importer_ids'] = array(
+        '#type' => 'value',
+        '#value' => array($importer_id),
+      );
+    }
+    else {
+      $options = array();
+      foreach ($importer_ids as $importer_id => $weight) {
+        $source = feeds_source($importer_id, $node->nid);
+        $options[$importer_id] = $source->importer->config['name'];
+      }
+      $form['importer_ids'] = array(
+        '#type' => 'checkboxes',
+        '#options' => $options,
+        '#default_value' => array_keys($options),
+        '#title' => t('Sources'),
+        '#description' => t('Select the sources to import.'),
+      );
+    }
+
+    if (count($importer_ids)) {
+      $progress = $total_progress / count($importer_ids);
+      if ($progress !== FEEDS_BATCH_COMPLETE) {
+        $form['actions']['submit']['#disabled'] = TRUE;
+        $form['actions']['submit']['#value'] =
+          t('Importing (@progress %)', array('@progress' => number_format(100 * $progress, 0)));
+      }
+    }
+  }
+  else {
+    $form['no_source'] = array(
+      '#markup' => t('No feeds sources added to node.'),
+    );
   }
+
   return $form;
 }
 
@@ -159,7 +195,9 @@ function feeds_import_tab_form($form, &$form_state, $node) {
  */
 function feeds_import_tab_form_submit($form, &$form_state) {
   $form_state['redirect'] = $form['#redirect'];
-  feeds_source($form['#importer_id'], $form['#feed_nid'])->startImport();
+  foreach (array_filter($form_state['values']['importer_ids']) as $importer_id) {
+    feeds_source($importer_id, $form['#feed_nid'])->startImport();
+  }
 }
 
 /**
@@ -169,31 +207,84 @@ function feeds_import_tab_form_submit($form, &$form_state) {
  * Therefore $node may be missing.
  */
 function feeds_delete_tab_form(array $form, array &$form_state, FeedsImporter $importer = NULL, $node = NULL) {
+  $total_progress = 0;
+
+  $form = array();
+
   if (empty($node)) {
     $source = feeds_source($importer->id);
     $form['#redirect'] = 'import/' . $source->id;
+    $importer_ids = array($importer->id);
   }
   else {
-    $importer_id = feeds_get_importer_id($node->type);
-    $source = feeds_source($importer_id, $node->nid);
-    $form['#redirect'] = 'node/' . $source->feed_nid;
+    $importer_ids = feeds_get_importer_ids($node->type, $node->nid);
+    $form['#redirect'] = 'node/' . $node->nid;
   }
-  // Form cannot pass on source object.
-  $form['#importer_id'] = $source->id;
-  $form['#feed_nid'] = $source->feed_nid;
-  $form['source_status'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Status'),
-    '#tree' => TRUE,
-    '#value' => feeds_source_status($source),
-  );
-  $form = confirm_form($form, t('Delete all items from source?'), $form['#redirect'], '', t('Delete'), t('Cancel'), 'confirm feeds update');
-  $progress = $source->progressClearing();
-  if ($progress !== FEEDS_BATCH_COMPLETE) {
-    $form['actions']['submit']['#disabled'] = TRUE;
-    $form['actions']['submit']['#value'] =
-      t('Deleting (@progress %)', array('@progress' => number_format(100 * $progress, 0)));
+  if ($importer_ids) {
+    // Form cannot pass on source object.
+    $form['#feed_nid'] = empty($node) ? '' : $node->nid;
+    foreach ($importer_ids as $import_id => $weight) {
+      $source = empty($node) ? $source : feeds_source($import_id, $node->nid);
+      if (!empty($node)) {
+        $form[$import_id]['source_status'] = array(
+          '#type' => 'fieldset',
+          '#title' => t('@source_name: Status', array('@source_name' => $source->importer->config['name'])),
+          '#tree' => TRUE,
+          '#value' => feeds_source_status($source),
+        );
+      }
+      else {
+        $form['source_status'] = array(
+          '#type' => 'fieldset',
+          '#title' => t('@source_name: Status', array('@source_name' => $source->importer->config['name'])),
+          '#tree' => TRUE,
+          '#value' => feeds_source_status($source),
+        );
+      }
+      $progress = $source->progressClearing();
+      $total_progress += $progress;
+    }
+
+    // Set importer ids. If this is a stand-alone form then importer_id will be
+    // passed.
+    if ($importer->id) {
+      $form['importer_ids'] = array(
+        '#type' => 'value',
+        '#value' => array($importer->id => $importer->id),
+      );
+    }
+    else {
+      $options = array();
+      foreach ($importer_ids as $importer_id => $weight) {
+        $source = feeds_source($importer_id, $node->nid);
+        $options[$importer_id] = $source->importer->config['name'];
+      }
+      $form['importer_ids'] = array(
+        '#type' => 'checkboxes',
+        '#options' => $options,
+        '#default_value' => array_keys($options),
+        '#title' => t('Sources'),
+        '#description' => t('Select the sources to delete items from.'),
+      );
+    }
+
+    $form = confirm_form($form, t('Delete all items from source?'), $form['#redirect'], '', t('Delete'), t('Cancel'), 'confirm feeds update');
+
+    if (count($importer_ids)) {
+      $progress = $total_progress / count($importer_ids);
+      if ($progress !== FEEDS_BATCH_COMPLETE) {
+        $form['actions']['submit']['#disabled'] = TRUE;
+        $form['actions']['submit']['#value'] =
+          t('Deleting (@progress %)', array('@progress' => number_format(100 * $progress, 0)));
+        }
+    }
   }
+  else {
+    $form['no_source'] = array(
+      '#markup' => t('No feeds sources added to node.'),
+    );
+  }
+
   return $form;
 }
 
@@ -203,7 +294,9 @@ function feeds_delete_tab_form(array $form, array &$form_state, FeedsImporter $i
 function feeds_delete_tab_form_submit($form, &$form_state) {
   $form_state['redirect'] = $form['#redirect'];
   $feed_nid = empty($form['#feed_nid']) ? 0 : $form['#feed_nid'];
-  feeds_source($form['#importer_id'], $feed_nid)->startClear();
+  foreach (array_filter($form_state['values']['importer_ids']) as $importer_id) {
+    feeds_source($importer_id, $feed_nid)->startClear();
+  }
 }
 
 /**
diff --git a/feeds_news/feeds_news.feeds_importer_default.inc b/feeds_news/feeds_news.feeds_importer_default.inc
index 3fa5ee7..2820269 100644
--- a/feeds_news/feeds_news.feeds_importer_default.inc
+++ b/feeds_news/feeds_news.feeds_importer_default.inc
@@ -106,7 +106,7 @@ function feeds_news_feeds_importer_default() {
           ),
           1 => array(
             'source' => 'xmlurl',
-            'target' => 'feeds_source',
+            'target' => 'feeds_source_feed',
             'unique' => 1,
           ),
         ),
diff --git a/feeds_ui/feeds_ui.test b/feeds_ui/feeds_ui.test
index 4b90a6d..713fd9f 100644
--- a/feeds_ui/feeds_ui.test
+++ b/feeds_ui/feeds_ui.test
@@ -108,8 +108,8 @@ class FeedsUIUserInterfaceTestCase extends FeedsWebTestCase {
     // Create a feed node.
     $edit = array(
       'title' => 'Development Seed',
-      'feeds[FeedsHTTPFetcher][source]' => $GLOBALS['base_url'] . '/' . drupal_get_path('module', 'feeds') . '/tests/feeds/developmentseed.rss2',
-      );
+      'feeds[test_feed][FeedsHTTPFetcher][source]' => $GLOBALS['base_url'] . '/' . drupal_get_path('module', 'feeds') . '/tests/feeds/developmentseed.rss2',
+    );
     $this->drupalPost('node/add/page', $edit, 'Save');
     $this->assertText('Basic page Development Seed has been created.');
 
diff --git a/includes/FeedsImporter.inc b/includes/FeedsImporter.inc
index 5286b1d..15bb7a8 100644
--- a/includes/FeedsImporter.inc
+++ b/includes/FeedsImporter.inc
@@ -193,6 +193,7 @@ class FeedsImporter extends FeedsConfigurable {
         'plugin_key' => 'FeedsNodeProcessor',
       ),
       'content_type' => '',
+      'weight' => 0,
       'update' => 0,
       'import_period' => 1800, // Refresh every 30 minutes by default.
       'expire_period' => 3600, // Expire every hour by default, this is a hidden setting.
@@ -220,6 +221,12 @@ class FeedsImporter extends FeedsConfigurable {
       '#description' => t('A description of this importer.'),
       '#default_value' => $config['description'],
     );
+    $form['weight'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Weight'),
+      '#description' => t('Determines the effective processing order of this feed relative to others that might run at the same time.'),
+      '#default_value' => $config['weight'],
+    );
     $node_types = node_type_get_names();
     array_walk($node_types, 'check_plain');
     $form['content_type'] = array(
diff --git a/includes/FeedsSource.inc b/includes/FeedsSource.inc
index da77ff4..49fb932 100644
--- a/includes/FeedsSource.inc
+++ b/includes/FeedsSource.inc
@@ -561,24 +561,25 @@ class FeedsSource extends FeedsConfigurable {
 
     // Store the source property of the fetcher in a separate column so that we
     // can do fast lookups on it.
+    // Only save if there is a source so they can be optional on enities.
     $source = '';
-    if (isset($config[get_class($this->importer->fetcher)]['source'])) {
-      $source = $config[get_class($this->importer->fetcher)]['source'];
-    }
-    $object = array(
-      'id' => $this->id,
-      'feed_nid' => $this->feed_nid,
-      'imported' => $this->imported,
-      'config' => $config,
-      'source' => $source,
-      'state' => isset($this->state) ? $this->state : FALSE,
-      'fetcher_result' => isset($this->fetcher_result) ? $this->fetcher_result : FALSE,
-    );
-    if (db_query_range("SELECT 1 FROM {feeds_source} WHERE id = :id AND feed_nid = :nid", 0, 1, array(':id' => $this->id, ':nid' => $this->feed_nid))->fetchField()) {
-      drupal_write_record('feeds_source', $object, array('id', 'feed_nid'));
-    }
-    else {
-      drupal_write_record('feeds_source', $object);
+    if (isset($config[get_class($this->importer->fetcher)]['source']) &&
+      $source = $config[get_class($this->importer->fetcher)]['source']) {
+      $object = array(
+        'id' => $this->id,
+        'feed_nid' => $this->feed_nid,
+        'imported' => $this->imported,
+        'config' => $config,
+        'source' => $source,
+        'state' => isset($this->state) ? $this->state : FALSE,
+        'fetcher_result' => isset($this->fetcher_result) ? $this->fetcher_result : FALSE,
+      );
+      if (db_query_range("SELECT 1 FROM {feeds_source} WHERE id = :id AND feed_nid = :nid", 0, 1, array(':id' => $this->id, ':nid' => $this->feed_nid))->fetchField()) {
+        drupal_write_record('feeds_source', $object, array('id', 'feed_nid'));
+      }
+      else {
+        drupal_write_record('feeds_source', $object);
+      }
     }
   }
 
diff --git a/plugins/FeedsHTTPFetcher.inc b/plugins/FeedsHTTPFetcher.inc
index 3761113..d0500d1 100644
--- a/plugins/FeedsHTTPFetcher.inc
+++ b/plugins/FeedsHTTPFetcher.inc
@@ -238,7 +238,7 @@ class FeedsHTTPFetcher extends FeedsFetcher {
     }
 
     if (!feeds_valid_url($values['source'], TRUE)) {
-      $form_key = 'feeds][' . get_class($this) . '][source';
+      $form_key = 'feeds][' . $this->id . '][' . get_class($this) . '][source';
       form_set_error($form_key, t('The URL %source is invalid.', array('%source' => $original_url)));
     }
     elseif ($this->config['auto_detect_feeds']) {
diff --git a/plugins/FeedsNodeProcessor.inc b/plugins/FeedsNodeProcessor.inc
index d3d3bb4..412f602 100644
--- a/plugins/FeedsNodeProcessor.inc
+++ b/plugins/FeedsNodeProcessor.inc
@@ -234,21 +234,20 @@ class FeedsNodeProcessor extends FeedsProcessor {
    * Override setTargetElement to operate on a target item that is a node.
    */
   public function setTargetElement(FeedsSource $source, $target_node, $target_element, $value) {
+    $id = $this->bundle();
+    if ($target_element == 'feeds_source_' . $id) {
+      // Get the class of the feed node importer's fetcher and set the source
+      // property. See feeds_node_update() how $node->feeds gets stored.
+      $class = get_class(feeds_importer($id)->fetcher);
+      $target_node->feeds[$id][$class]['source'] = $value;
+      // This effectively suppresses 'import on submission' feature.
+      // See feeds_node_insert().
+      $target_node->feeds['suppress_import'] = TRUE;
+    }
     switch ($target_element) {
       case 'created':
         $target_node->created = feeds_to_unixtime($value, REQUEST_TIME);
         break;
-      case 'feeds_source':
-        // Get the class of the feed node importer's fetcher and set the source
-        // property. See feeds_node_update() how $node->feeds gets stored.
-        if ($id = feeds_get_importer_id($this->bundle())) {
-          $class = get_class(feeds_importer($id)->fetcher);
-          $target_node->feeds[$class]['source'] = $value;
-          // This effectively suppresses 'import on submission' feature.
-          // See feeds_node_insert().
-          $target_node->feeds['suppress_import'] = TRUE;
-        }
-        break;
       case 'user_name':
         if ($user = user_load_by_name($value)) {
           $target_node->uid = $user->uid;
@@ -330,13 +329,15 @@ class FeedsNodeProcessor extends FeedsProcessor {
     }
 
     // If the target content type is a Feed node, expose its source field.
-    if ($id = feeds_get_importer_id($this->bundle())) {
-      $name = feeds_importer($id)->config['name'];
-      $targets['feeds_source'] = array(
-        'name' => t('Feed source'),
-        'description' => t('The content type created by this processor is a Feed Node, it represents a source itself. Depending on the fetcher selected on the importer "@importer", this field is expected to be for example a URL or a path to a file.', array('@importer' => $name)),
-        'optional_unique' => TRUE,
-      );
+    if ($ids = feeds_get_importer_ids($this->config['bundle'])) {
+      foreach ($ids as $id) {
+        $name = feeds_importer($id)->config['name'];
+        $targets['feeds_source_' . $id] = array(
+          'name' => t('Feed source ' . $name),
+          'description' => t('The content type created by this processor is a Feed Node, it represents a source itself. Depending on the fetcher selected on the importer "@importer", this field is expected to be for example a URL or a path to a file.', array('@importer' => $name)),
+          'optional_unique' => TRUE,
+        );
+      }
     }
 
     // Let other modules expose mapping targets.
@@ -351,7 +352,7 @@ class FeedsNodeProcessor extends FeedsProcessor {
   /**
    * Get nid of an existing feed item node if available.
    */
-  protected function existingEntityId(FeedsSource $source, FeedsParserResult $result) {
+  function existingEntityId(FeedsSource $source, FeedsParserResult $result) {
     if ($nid = parent::existingEntityId($source, $result)) {
       return $nid;
     }
@@ -366,11 +367,13 @@ class FeedsNodeProcessor extends FeedsProcessor {
         case 'title':
           $nid = db_query("SELECT nid FROM {node} WHERE title = :title AND type = :type", array(':title' => $value, ':type' => $this->bundle()))->fetchField();
           break;
-        case 'feeds_source':
-          if ($id = feeds_get_importer_id($this->bundle())) {
+      }
+      if (isset($this->config['content_type']) && $ids = feeds_get_importer_ids($this->config['content_type'])) {
+        foreach ($ids as $id) {
+          if ($target == 'feeds_source_' . $id) {
             $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;
+        }
       }
       if ($nid) {
         // Return with the first nid found.
diff --git a/tests/feeds.test b/tests/feeds.test
index b3ce145..9dcc2e2 100644
--- a/tests/feeds.test
+++ b/tests/feeds.test
@@ -249,7 +249,7 @@ class FeedsWebTestCase extends DrupalWebTestCase {
 
     // If content type not given, retrieve it.
     if (!$content_type) {
-      $result= db_select('feeds_importer', 'f')
+      $result = db_select('feeds_importer', 'f')
         ->condition('f.id', $id, '=')
         ->fields('f', array('config'))
         ->execute();
@@ -261,7 +261,7 @@ class FeedsWebTestCase extends DrupalWebTestCase {
     // Create a feed node.
     $edit = array(
       'title' => $title,
-      'feeds[FeedsHTTPFetcher][source]' => $feed_url,
+      'feeds[' . $id  . '][FeedsHTTPFetcher][source]' => $feed_url,
     );
     $this->drupalPost('node/add/' . str_replace('_', '-', $content_type), $edit, 'Save');
     $this->assertText('has been created.');
@@ -297,10 +297,10 @@ class FeedsWebTestCase extends DrupalWebTestCase {
    * @param $title
    *   Optional parameter to change title of feed node.
    */
-  public function editFeedNode($nid, $feed_url, $title = '') {
+  public function editFeedNode($nid, $feed_url, $id = 'syndication', $title = '') {
     $edit = array(
       'title' => $title,
-      'feeds[FeedsHTTPFetcher][source]' => $feed_url,
+      'feeds[' . $id . '][FeedsHTTPFetcher][source]' => $feed_url,
     );
     // Check that the update was saved.
     $this->drupalPost('node/' . $nid . '/edit', $edit, 'Save');
diff --git a/tests/feeds_processor_node.test b/tests/feeds_processor_node.test
index ff9e421..6d113bc 100644
--- a/tests/feeds_processor_node.test
+++ b/tests/feeds_processor_node.test
@@ -394,8 +394,8 @@ class FeedsRSStoNodesTest extends FeedsWebTestCase {
   /**
    * Test validation of feed URLs.
    */
-  public function testFeedURLValidation() {
-    $edit['feeds[FeedsHTTPFetcher][source]'] = 'invalid://url';
+  function testFeedURLValidation($id = 'syndication') {
+    $edit['feeds[' . $id . '][FeedsHTTPFetcher][source]'] = 'invalid://url';
     $this->drupalPost('node/add/page', $edit, 'Save');
     $this->assertText('The URL invalid://url is invalid.');
   }
@@ -403,7 +403,7 @@ class FeedsRSStoNodesTest extends FeedsWebTestCase {
   /**
    * Test using non-normal URLs like feed:// and webcal://.
    */
-  public function testOddFeedSchemes() {
+  function testOddFeedSchemes($id = 'syndication') {
     $url = $GLOBALS['base_url'] . '/' . drupal_get_path('module', 'feeds') . '/tests/feeds/developmentseed.rss2';
 
     $schemes = array('feed', 'webcal');
@@ -411,7 +411,7 @@ class FeedsRSStoNodesTest extends FeedsWebTestCase {
     foreach ($schemes as $scheme) {
       $feed_url = strtr($url, array('http://' => $scheme . '://', 'https://' => $scheme . '://'));
 
-      $edit['feeds[FeedsHTTPFetcher][source]'] = $feed_url;
+      $edit['feeds[' . $id  . '][FeedsHTTPFetcher][source]'] = $feed_url;
       $this->drupalPost('node/add/page', $edit, 'Save');
       $this->assertText('Basic page Development Seed - Technological Solutions for Progressive Organizations has been created.');
       $this->assertText('Created 10 nodes.');
@@ -423,7 +423,7 @@ class FeedsRSStoNodesTest extends FeedsWebTestCase {
   /**
    * Test that feed elements and links are not found on non-feed nodes.
    */
-  public function testNonFeedNodeUI() {
+  function testNonFeedNodeUI($id = 'syndication') {
     // There should not be feed links on an article node.
     $non_feed_node = $this->drupalCreateNode(array('type' => 'article'));
     $this->drupalGet('node/' . $non_feed_node->nid);
@@ -432,7 +432,7 @@ class FeedsRSStoNodesTest extends FeedsWebTestCase {
 
     // Navigate to a non-feed node form, there should be no Feed field visible.
     $this->drupalGet('node/add/article');
-    $this->assertNoFieldByName('feeds[FeedsHTTPFetcher][source]');
+    $this->assertNoFieldByName('feeds[' . $id . '][FeedsHTTPFetcher][source]');
   }
 
   /**
diff --git a/tests/feeds_scheduler.test b/tests/feeds_scheduler.test
index 3eef89c..5a71987 100644
--- a/tests/feeds_scheduler.test
+++ b/tests/feeds_scheduler.test
@@ -157,6 +157,7 @@ class FeedsSchedulerTestCase extends FeedsWebTestCase {
     $this->drupalLogout();
     sleep(1);
     $this->cronRun();
+    sleep(1);
     // There should be 20 feeds_source_expire jobs now, and all last fields should be reset.
     $this->assertEqual(count($nids), db_query("SELECT COUNT(*) FROM {job_schedule} WHERE type = 'syndication' AND name = 'feeds_source_expire' AND last <> 0 AND scheduled = 0 AND period = 3600")->fetchField());
     $new_max_last = db_query("SELECT MAX(last) FROM {job_schedule} WHERE type = 'syndication' AND name = 'feeds_source_import' AND period = 0")->fetchField();
