diff --git a/feeds.module b/feeds.module
index 42924fb..4ddddca 100644
--- a/feeds.module
+++ b/feeds.module
@@ -239,17 +239,24 @@ function feeds_theme() {
  *   Node object or FeedsImporter id.
  */
 function feeds_access($action, $param) {
+  $importer_ids = array();
+
   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->type) {
-    $importer_id = feeds_get_importer_id($param->type);
-  }
-
-  // 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;
+    // 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;
@@ -328,29 +335,39 @@ function feeds_nodeapi(&$node, $op, $form) {
   // Break out node processor related nodeapi functionality.
   _feeds_nodeapi_node_processor($node, $op);
 
-  if ($importer_id = feeds_get_importer_id($node->type)) {
-    switch ($op) {
+  if ($importer_ids = feeds_get_importer_ids($node->type)) {
+     switch ($op) {
+       case 'prepare':
+         $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();
+        }
+      break;
       case 'validate':
         // 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
-        $node_feeds = $node->feeds;
-        $source->configFormValidate($node_feeds);
-
-        // If node title is empty, try to retrieve title from feed.
-        if (trim($node->title) == '') {
-          try {
-            $source->addConfig($node_feeds);
-            if (!$last_title = $source->preview()->getTitle()) {
-              throw new Exception();
+        foreach($importer_ids as $importer_id){
+          $source = feeds_source($importer_id);
+  
+          // Node module magically moved $form['feeds'] to $node->feeds :P
+          $node_feeds = $node->feeds;
+          $source->configFormValidate($node_feeds[$importer_id]);
+
+          // If node title is empty, try to retrieve title from feed.
+          if (trim($node->title) == '') {
+            try {
+              $source->addConfig($node_feeds[$importer_id]);
+              if (!$last_title = $source->preview()->getTitle()) {
+                throw new Exception();
+              }
+            }
+            catch (Exception $e) {
+              drupal_set_message($e->getMessage(), 'error');
+              form_set_error('title', t('Could not retrieve title from feed.'), 'error');
             }
-          }
-          catch (Exception $e) {
-            drupal_set_message($e->getMessage(), 'error');
-            form_set_error('title', t('Could not retrieve title from feed.'), 'error');
           }
         }
         break;
@@ -366,30 +383,34 @@ function feeds_nodeapi(&$node, $op, $form) {
         if (empty($node_feeds)) {
           $node_feeds = $node->feeds;
         }
-        // Add configuration to feed source and save.
-        $source = feeds_source($importer_id, $node->nid);
-        $source->addConfig($node_feeds);
-        $source->save();
-
-        // Refresh feed if import on create is selected and suppress_import is
-        // not set.
-        if ($op == 'insert' && feeds_importer($importer_id)->config['import_on_create'] && !isset($node_feeds['suppress_import'])) {
-          feeds_batch_set(t('Importing'), 'import', $importer_id, $node->nid);
-        }
-        // Add source to schedule, make sure importer is scheduled, too.
-        if ($op == 'insert') {
-          $source->schedule();
-          $source->importer->schedule();
+        foreach($importer_ids as $importer_id){
+          // Add configuration to feed source and save.
+          $source = feeds_source($importer_id, $node->nid);
+          $source->addConfig($node_feeds[$importer_id]);
+          $source->save();
+
+          // Refresh feed if import on create is selected and suppress_import is
+          // not set.
+          if ($op == 'insert' && feeds_importer($importer_id)->config['import_on_create'] && !isset($node_feeds[$importer_id]['suppress_import'])) {
+            feeds_batch_set(t('Importing'), 'import', $importer_id, $node->nid);
+          }
+          // Add source to schedule, make sure importer is scheduled, too.
+          if ($op == 'insert') {
+            $source->schedule();
+            $source->importer->schedule();
+          }
         }
         $node_feeds = NULL;
         break;
       case 'delete':
-        $source = feeds_source($importer_id, $node->nid);
-        if ($source->importer->processor->config['delete_with_source']) {
-          feeds_batch_set(t('Deleting'), 'clear', $importer_id, $node->nid);
+        foreach($importer_ids as $importer_id){
+          $source = feeds_source($importer_id, $node->nid);
+          if ($source->importer->processor->config['delete_with_source']) {
+            feeds_batch_set(t('Deleting'), 'clear', $importer_id, $node->nid);
+          }
+          // Remove attached source.
+          $source->delete();
         }
-        // Remove attached source.
-        $source->delete();
         break;
     }
   }
@@ -453,21 +474,27 @@ function feeds_taxonomy($op = NULL, $type = NULL, $term = NULL) {
  */
 function feeds_form_alter(&$form, $form_state, $form_id) {
   if ($form['#id'] == 'node-form') {
-    if ($importer_id = feeds_get_importer_id($form['type']['#value'])) {
+    if ($importer_ids = feeds_get_importer_ids($form['type']['#value'])) {
       // Set title to not required, try to retrieve it from feed.
       $form['title']['#required'] = FALSE;
       // Enable uploads.
       $form['#attributes']['enctype'] = 'multipart/form-data';
 
       // Build form.
-      $source = feeds_source($importer_id, empty($form['nid']['#value']) ? 0 : $form['nid']['#value']);
       $form['feeds'] = array(
         '#type' => 'fieldset',
         '#title' => t('Feed'),
         '#tree' => TRUE,
       );
-      $form['feeds'] += $source->configForm($form_state);
-      $form['#feed_id'] = $importer_id;
+      foreach($importer_ids as $importer_id){
+        $source = feeds_source($importer_id, empty($form['nid']['#value']) ? 0 : $form['nid']['#value']);
+        $config_form = $source->configForm($form_state);
+        foreach(element_children($config_form) as $type) {
+          $config_form[$type]['source']['#title'] = $source->importer->config['name'];
+        }
+        $form['feeds'][$importer_id] = $config_form;
+        $form['#feed_ids'][] = $importer_id;
+      }
     }
   }
 }
@@ -494,13 +521,16 @@ function feeds_form_alter(&$form, $form_state, $form_id) {
  *   source to be imported.
  */
 function feeds_batch_set($title, $method, $importer_id, $feed_nid = 0) {
+
+  foreach((array)$importer_id as $id){
+    $operations[]=array('feeds_batch', array($method, $id, $feed_nid));
+  }
   $batch = array(
     'title' => $title,
-    'operations' => array(
-      array('feeds_batch', array($method, $importer_id, $feed_nid)),
-    ),
+    'operations' => $operations,
     'progress_message' => '',
   );
+  
   batch_set($batch);
 }
 
@@ -518,6 +548,14 @@ function feeds_batch_set($title, $method, $importer_id, $feed_nid = 0) {
  *   Batch context.
  */
 function feeds_batch($method, $importer_id, $feed_nid = 0, &$context) {
+  if($feed_nid){
+    $node=db_fetch_object(db_query("select * from {node} where nid=%d", $feed_nid));
+    $context['message']=t("running: %importer for %node_title", array('%importer'=>$importer_id, '%node_title'=>$node->title));
+  }
+  else{
+    $context['message']=t("importing from: %importer", array('%importer'=>$importer_id));
+    
+  }
   $context['finished'] = 1;
   try {
     $context['finished'] = feeds_source($importer_id, $feed_nid)->$method();
@@ -588,6 +626,37 @@ function feeds_get_importer_id($content_type) {
 }
 
 /**
+ * Gets an enabled importer configuration by content type.
+ *
+ * @param $content_type
+ *   A node type string.
+ *
+ * @return
+ *   A list of FeedsImporters attached to the given content type.
+ */
+function feeds_get_importer_ids($content_type) {
+  $all_importers = _feeds_importer_digest();
+  foreach($all_importers as $importer=>$type){
+    if($type==$content_type){
+      $importers[$importer]=$importer;
+    }
+  }
+  return isset($importers) ? $importers : array();
+}
+
+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;
+}
+
+/**
  * Helper function for feeds_get_importer_id() and feeds_enabled_importers().
  */
 function _feeds_importer_digest() {
diff --git a/feeds.pages.inc b/feeds.pages.inc
index 24f64c6..c4cef2e 100644
--- a/feeds.pages.inc
+++ b/feeds.pages.inc
@@ -53,7 +53,8 @@ function feeds_import_form(&$form_state, $importer_id) {
     '#type' => 'fieldset',
     '#tree' => TRUE,
   );
-  $form['feeds'] += $source->configForm($form_state);
+  $form['feeds'][$importer_id]=array();
+  $form['feeds'][$importer_id] += $source->configForm($form_state);
   $form['submit'] = array(
     '#type' => 'submit',
     '#value' => t('Import'),
@@ -76,7 +77,7 @@ function feeds_import_form_submit($form, &$form_state) {
 
   // Save source and import.
   $source = feeds_source($form['#importer_id']);
-  $source->addConfig($form_state['values']['feeds']);
+  $source->addConfig($form_state['values']['feeds'][$form['#importer_id']]);
   $source->save();
 
   // Refresh feed if import on create is selected.
@@ -93,13 +94,16 @@ function feeds_import_form_submit($form, &$form_state) {
  * Render a feeds import form on node/id/import pages.
  */
 function feeds_import_tab_form(&$form_state, $node) {
-  $importer_id = feeds_get_importer_id($node->type);
-
+  $importer_ids = feeds_get_importer_ids($node->type);
+  $importer_ids = feeds_get_importer_weights($importer_ids);
   $form = array();
   $form['#feed_nid'] = $node->nid;
-  $form['#importer_id'] = $importer_id;
   $form['#redirect'] = 'node/'. $node->nid;
-  return confirm_form($form, t('Import all content from feed?'), 'node/'. $node->nid, '', t('Import'), t('Cancel'), 'confirm feeds update');
+  foreach($importer_ids as $importer_id=>$weight){
+    $form['#importer_ids'][] = $importer_id;
+  }
+  //TODO: should make this show the name of the feed/feeds
+  return confirm_form($form, t('Import all content from feeds?'), 'node/'. $node->nid, '', t('Import'), t('Cancel'), 'confirm feeds update');
 }
 
 /**
@@ -107,7 +111,7 @@ function feeds_import_tab_form(&$form_state, $node) {
  */
 function feeds_import_tab_form_submit($form, &$form_state) {
   $form_state['redirect'] = $form['#redirect'];
-  feeds_batch_set(t('Importing'), 'import', $form['#importer_id'], $form['#feed_nid']);
+  feeds_batch_set(t('Importing'), 'import', $form['#importer_ids'], $form['#feed_nid']);
 }
 
 /**
@@ -121,12 +125,12 @@ function feeds_delete_tab_form(&$form_state, $importer_id, $node = NULL) {
     $form['#redirect'] = 'import/'. $importer_id;
   }
   else {
-    $importer_id = feeds_get_importer_id($node->type);
+    $importer_ids = feeds_get_importer_ids($node->type);
     $form['#feed_nid'] = $node->nid;
     $form['#redirect'] = 'node/'. $node->nid;
   }
   // Form cannot pass on feed object.
-  $form['#importer_id'] = $importer_id;
+  $form['#importer_ids'] = $importer_ids;
   return confirm_form($form, t('Delete all items from feed?'), $form['#redirect'], '', t('Delete'), t('Cancel'), 'confirm feeds update');
 }
 
@@ -136,7 +140,7 @@ function feeds_delete_tab_form(&$form_state, $importer_id, $node = NULL) {
 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_batch_set(t('Deleting'), 'clear', $form['#importer_id'], $feed_nid);
+  feeds_batch_set(t('Deleting'), 'clear', $form['#importer_ids'], $feed_nid);
 }
 
 /**
diff --git a/includes/FeedsImporter.inc b/includes/FeedsImporter.inc
index e3d8591..8cb94bd 100644
--- a/includes/FeedsImporter.inc
+++ b/includes/FeedsImporter.inc
@@ -213,6 +213,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.
@@ -238,6 +239,12 @@ class FeedsImporter extends FeedsConfigurable {
       '#description' => t('A description of this configuration.'),
       '#default_value' => $this->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' => $this->config['weight'],
+    );
     $form['content_type'] = array(
       '#type' => 'select',
       '#title' => t('Attach to content type'),
diff --git a/plugins/FeedsFeedNodeProcessor.inc b/plugins/FeedsFeedNodeProcessor.inc
index 1181bd5..b4afc67 100644
--- a/plugins/FeedsFeedNodeProcessor.inc
+++ b/plugins/FeedsFeedNodeProcessor.inc
@@ -151,8 +151,10 @@ class FeedsFeedNodeProcessor extends FeedsProcessor {
     if ($target_element == 'source') {
       // Get the class of the feed node importer's fetcher and set the source
       // property. See feeds_nodeapi() how $node->feeds gets stored.
-      $class = get_class($this->feedNodeImporter()->fetcher);
-      $target_node->feeds[$class]['source'] = $value;
+      foreach($this->feedNodeImporter() as $importer_id=>$importer){
+        $class = get_class($importer->fetcher);
+        $target_node->feeds[$importer_id][$class]['source'] = $value;
+      }
     }
     elseif ($target_element == 'body') {
       $target_node->teaser = $value;
@@ -201,7 +203,13 @@ class FeedsFeedNodeProcessor extends FeedsProcessor {
     // We only support one unique target: source
     foreach ($this->uniqueTargets($batch) as $target => $value) {
       if ($target == 'source') {
-        return db_result(db_query("SELECT fs.feed_nid FROM {node} n JOIN {feeds_source} fs ON n.nid = fs.feed_nid WHERE fs.id = '%s' AND fs.source = '%s'", $this->feedNodeImporter()->id, $value));
+        foreach($this->feedNodeImporter() as $importer){
+          $id=$importer->id;
+          $feed_nid=db_result(db_query("SELECT fs.feed_nid FROM {node} n JOIN {feeds_source} fs ON n.nid = fs.feed_nid WHERE fs.id = '%s' AND fs.source = '%s'", $id, $value));
+          if($feed_nid){
+            return $feed_nid;
+          }
+        }
       }
     }
     return 0;
@@ -211,8 +219,11 @@ class FeedsFeedNodeProcessor extends FeedsProcessor {
    * Helper for retrieving the importer object for the feed nodes to produce.
    */
   protected function feedNodeImporter() {
-   if ($id = feeds_get_importer_id($this->config['content_type'])) {
-      return feeds_importer($id);
+    if ($ids = feeds_get_importer_ids($this->config['content_type'])) {
+      foreach($ids as $id){
+        $importers[$id]=feeds_importer($id);
+      } 
+      return $importers;
     }
     else {
       throw new Exception(t('Content type to be created is not a valid Feed content type.'));
