diff --git a/field_collection.module" b/field_collection.module
index c820057..3de727a 100644
--- a/field_collection.module
+++ b/field_collection.module
@@ -1983,3 +1983,153 @@ function field_collection_devel_generate($object, $field, $instance, $bundle) {
     'revision_id' => $field_collection->revision_id,
   );
 }
+
+/**
+ * Implements hook_feeds_processor_targets_alter()
+ */
+function field_collection_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_name) {
+  foreach (field_info_instances($entity_type, $bundle_name) as $name => $instance) {
+    $info = field_info_field($name);
+    if ($info['type'] == 'field_collection') {
+      $new_targets = array();
+      feeds_alter('feeds_processor_targets', $new_targets, 'field_collection_item', $info['field_name']);
+      foreach ($new_targets as $sub_name => $target) {
+        $new_name = $info['field_name'] . ':' . $sub_name;
+        $targets[$new_name] = $target;
+        if (isset($target['name'])) {
+          $targets[$new_name]['name'] = $instance['label'] . ': ' . $target['name'];
+        }
+
+        // We override callback for now and retrieve original later.
+        $targets[$new_name]['callback'] = 'field_collection_feeds_set_target';
+      }
+    }
+  }
+}
+
+/**
+ * Process Field Collection items
+ */
+function field_collection_feeds_set_target($source, $entity, $target, $value) {
+  static $sub_targets = array();
+
+  $args = explode(':', $target);
+  $target = array_shift($args);
+  $sub_target = implode(':', $args);
+
+  // Retrieve the submapping so we can pass it to the callback
+  $sub_mapping = array();
+  $config = $source->importer()->getConfig();
+  if (!empty($config['processor']['config']['mappings'])) {
+    foreach ( $config['processor']['config']['mappings'] as $mapping ) {
+      if ( $mapping['target'] == $target . ':' . $sub_target ) {
+        $sub_mapping = $mapping;
+        $sub_mapping['target'] = $sub_target;
+        break;
+      }
+    }
+  }
+  // Now we retrieve old callbacks and keep then on a static cache
+  if (!isset($sub_targets[$target])) {
+    feeds_alter('feeds_processor_targets', $sub_targets[$target], 'field_collection_item', $target, $sub_mapping);
+  }
+  $_sub_targets = $sub_targets[$target];
+
+  $value = is_array($value) ? $value : array($value);
+  $info = field_info_field($target);
+
+  // Iterate over all values.
+  $delta = 0;
+  $field = isset($entity->$target) ? $entity->$target : array();
+  $language = (isset($entity->language)) ? $entity->language : LANGUAGE_NONE;
+
+  foreach ($value as $v) {
+    if (isset($field[$language][$delta]['entity'])) {
+      $field_collection_item = $field[$language][$delta]['entity'];
+    }
+    elseif (isset($field[$language][$delta]['value'])) {
+      $field_collection_item = field_collection_item_load($field[$language][$delta]['value']);
+    }
+    if (empty($field_collection_item)) {
+      $field_collection_item = entity_create('field_collection_item', array('field_name' => $target));
+    }
+
+    // Hack: feeds mapping callbacks (at least text_feeds_set_target), seem to
+    // want an empty array for a Field Collection item target, to be sure the
+    // item is iterated over at least once.
+    unset($field_collection_item->$sub_target);
+
+    // let's see if the field in the field collection has multiple cardinality
+    // in case the field is complex type such as field_url:title, field_url:link
+    $sub_field = explode(':', $sub_target);
+    $sub_field_info = field_info_field($sub_field[0]);
+    if (isset($_sub_targets[$sub_target]['callback']) && function_exists($_sub_targets[$sub_target]['callback'])) {
+      $callback = $_sub_targets[$sub_target]['callback'];
+      
+      // When updating a reference field that only allows 1 value, the
+      // source value gets appended to the target's existing array of values
+      // and would result in no update being made. To work around this, the 
+      // reference field values and emptied before we continue.
+      if ($sub_field_info['cardinality'] == 1 && $callback == 'references_feeds_set_target') {
+        $field_collection_item->{$sub_field_info['field_name']} = array();
+      }
+      
+      if($sub_field_info['cardinality'] == 1) {
+        $callback($source, $field_collection_item, $sub_target, $v, $sub_mapping);
+      }
+      else {
+        $callback($source, $field_collection_item, $sub_target, $value, $sub_mapping);
+      }
+    }
+    $field[$language][$delta]['entity'] = $field_collection_item;
+    $field[$language][$delta]['value'] = $field_collection_item->item_id;
+    unset($field_collection_item);
+    if ($info['cardinality'] == 1) {
+      break;
+    }
+    if ($sub_field_info['cardinality'] == 1) {
+      $delta++;
+    }
+  }
+  $entity->{$target} = $field;
+}
+
+/**
+ * Implements hook_feeds_presave().
+ */
+function field_collection_feeds_presave($source, $entity) {
+  // Do not save any empty field collection items that may have been created
+  // during the mapping process. Since the mapping is done field by field in
+  // field_collection_feeds_set_target(), we have to wait until this hook (when
+  // the field collection item is fully built up) before we can check if it's
+  // empty.
+  $config = $source->importer()->getConfig();
+  if (!empty($config['processor']['config']['mappings'])) {
+    // Find all field collection mappings.
+    foreach ($config['processor']['config']['mappings'] as $mapping) {
+      if (isset($mapping['target'])) {
+        $args = explode(':', $mapping['target']);
+        $field_name = array_shift($args);
+        if (($field = field_info_field($field_name)) && $field['type'] == 'field_collection') {
+          // If the field collection item is empty, do not save it.
+          if (!empty($entity->{$field_name})) {
+            foreach ($entity->{$field_name} as $langcode => &$items) {
+              foreach ($items as $delta => $item) {
+                if (isset($item['entity']) && field_collection_item_is_empty($item['entity'])) {
+                  unset($items[$delta]);
+                }
+              }
+              // Clean up the final array.
+              if (empty($items)) {
+                unset($entity->{$field_name}[$langcode]);
+              }
+              else {
+                $items = array_values($items);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
