diff --git a/feeds.module b/feeds.module
index f581d3f..dbd213b 100644
--- a/feeds.module
+++ b/feeds.module
@@ -1249,3 +1249,26 @@ function feeds_api_version() {
   $version = feeds_ctools_plugin_api('feeds', 'plugins');
   return $version['version'];
 }
+
+/**
+ * Filters empty field values.
+ *
+ * This is used as a post-process callback for field targets.
+ *
+ * @param FeedsSource $source
+ *   The feed source.
+ * @param object $entity
+ *   The entity being created or updated.
+ * @param string $target
+ *   The target being mapped.
+ * @param array $target_info
+ *   The target info array.
+ */
+function feeds_filter_empty_field_items(FeedsSource $source, $entity, $target, array $target_info) {
+  $field = $target;
+  if (!empty($target_info['real_target'])) {
+    $field = $target_info['real_target'];
+  }
+
+  $entity->{$field}['und'] = _field_filter_items(field_info_field($field), $entity->{$field}['und']);
+}
diff --git a/mappers/date.inc b/mappers/date.inc
index 8ff4cbb..12e54c6 100644
--- a/mappers/date.inc
+++ b/mappers/date.inc
@@ -21,6 +21,7 @@ function date_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_nam
         'callback' => 'date_feeds_set_target',
         'description' => t('The start date for the @name field. Also use if mapping both start and end.', array('@name' => $instance['label'])),
         'real_target' => $name,
+        'post_process' => 'feeds_filter_empty_field_items',
       );
       $targets[$name . ':end'] = array(
         'name' => t('@name: End', array('@name' => $instance['label'])),
@@ -33,41 +34,28 @@ function date_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_nam
 }
 
 /**
- * Implements hook_feeds_set_target().
- *
- * @param $node
- *   The target node.
- * @param $field_name
- *   The name of field on the target node to map to.
- * @param $feed_element
- *   The value to be mapped. Should be either a (flexible) date string
- *   or a FeedsDateTimeElement object.
- *
+ * Callback for setting target values.
  */
-function date_feeds_set_target($source, $entity, $target, $feed_element) {
+function date_feeds_set_target($source, $entity, $target, array $values) {
   list($field_name, $sub_field) = explode(':', $target, 2);
 
-  if (!is_array($feed_element)) {
-    $feed_element = array($feed_element);
-  }
-
   $delta = 0;
-  foreach ($feed_element as $f) {
+  foreach ($values as $value) {
 
-    if (!($feed_element instanceof FeedsDateTimeElement)) {
+    if (!($value instanceof FeedsDateTimeElement)) {
 
-      if (empty($f) || !is_numeric($f) && is_string($f) && !date_create($f)) {
-        $f = new FeedsDateTimeElement(NULL, NULL);
+      if (!strlen($value) || !is_numeric($value) && is_string($value) && !date_create($value)) {
+        $value = new FeedsDateTimeElement(NULL, NULL);
       }
       elseif ($sub_field == 'end') {
-        $f = new FeedsDateTimeElement(NULL, $f);
+        $value = new FeedsDateTimeElement(NULL, $value);
       }
       else {
-        $f = new FeedsDateTimeElement($f, NULL);
+        $value = new FeedsDateTimeElement($value, NULL);
       }
     }
 
-    $f->buildDateField($entity, $field_name, $delta);
+    $value->buildDateField($entity, $field_name, $delta);
     $delta++;
   }
 }
diff --git a/mappers/file.inc b/mappers/file.inc
index aa967b9..1ba181f 100644
--- a/mappers/file.inc
+++ b/mappers/file.inc
@@ -21,6 +21,7 @@ function file_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_nam
         'callback' => 'file_feeds_set_target',
         'description' => t('The URI of the @label field.', array('@label' => $instance['label'])),
         'real_target' => $name,
+        'post_process' => 'feeds_filter_empty_field_items',
       );
 
       if ($info['type'] == 'image') {
@@ -48,57 +49,42 @@ function file_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_nam
  * user has decided to map to and $value contains the value of the feed item
  * element the user has picked as a source.
  */
-function file_feeds_set_target($source, $entity, $target, $value) {
-  if (empty($value)) {
-    return;
-  }
-
-  // Make sure $value is an array of objects of type FeedsEnclosure.
-  if (!is_array($value)) {
-    $value = array($value);
-  }
-
+function file_feeds_set_target($source, $entity, $target, array $values) {
   // Add default of uri for backwards compatibility.
   list($field_name, $sub_field) = explode(':', $target . ':uri');
   $info = field_info_field($field_name);
 
   if ($sub_field == 'uri') {
 
-    foreach ($value as $k => $v) {
+    foreach ($values as $k => $v) {
       if (!($v instanceof FeedsEnclosure)) {
         if (is_string($v)) {
-          $value[$k] = new FeedsEnclosure($v, file_get_mimetype($v));
+          $values[$k] = new FeedsEnclosure($v, file_get_mimetype($v));
         }
         else {
-          unset($value[$k]);
+          $values[$k] = FALSE;
         }
       }
     }
-    if (empty($value)) {
-      return;
-    }
 
-    static $destination;
-    if (!$destination) {
-      $entity_type = $source->importer->processor->entityType();
-      $bundle = $source->importer->processor->bundle();
+    $entity_type = $source->importer->processor->entityType();
+    $bundle = $source->importer->processor->bundle();
 
-      $instance_info = field_info_instance($entity_type, $field_name, $bundle);
+    $instance_info = field_info_instance($entity_type, $field_name, $bundle);
 
-      // Determine file destination.
-      // @todo This needs review and debugging.
-      $data = array();
-      if (!empty($entity->uid)) {
-        $data[$entity_type] = $entity;
-      }
-      $destination = file_field_widget_uri($info, $instance_info, $data);
+    // Determine file destination.
+    // @todo This needs review and debugging.
+    $data = array();
+    if (!empty($entity->uid)) {
+      $data[$entity_type] = $entity;
     }
+    $destination = file_field_widget_uri($info, $instance_info, $data);
   }
 
   // Populate entity.
   $field = isset($entity->$field_name) ? $entity->$field_name : array(LANGUAGE_NONE => array());
   $delta = 0;
-  foreach ($value as $v) {
+  foreach ($values as $value) {
     if ($info['cardinality'] == $delta) {
       break;
     }
@@ -110,18 +96,20 @@ function file_feeds_set_target($source, $entity, $target, $value) {
     switch ($sub_field) {
       case 'alt':
       case 'title':
-        $field[LANGUAGE_NONE][$delta][$sub_field] = $v;
+        $field[LANGUAGE_NONE][$delta][$sub_field] = $value;
         break;
 
       case 'uri':
-        try {
-          $file = $v->getFile($destination);
-          $field[LANGUAGE_NONE][$delta] += (array) $file;
-          // @todo: Figure out how to properly populate this field.
-          $field[LANGUAGE_NONE][$delta]['display'] = 1;
-        }
-        catch (Exception $e) {
-          watchdog_exception('Feeds', $e, nl2br(check_plain($e)));
+        if ($value) {
+          try {
+            $file = $value->getFile($destination);
+            $field[LANGUAGE_NONE][$delta] += (array) $file;
+            // @todo: Figure out how to properly populate this field.
+            $field[LANGUAGE_NONE][$delta]['display'] = 1;
+          }
+          catch (Exception $e) {
+            watchdog_exception('Feeds', $e, nl2br(check_plain($e)));
+          }
         }
         break;
     }
diff --git a/mappers/link.inc b/mappers/link.inc
index 45a86f7..5e8886a 100644
--- a/mappers/link.inc
+++ b/mappers/link.inc
@@ -20,6 +20,7 @@ function link_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_nam
           'callback' => 'link_feeds_set_target',
           'description' => t('The @label field of the entity.', array('@label' => $instance['label'])),
           'real_target' => $name,
+          'post_process' => 'feeds_filter_empty_field_items',
         );
       }
       if (array_key_exists('title', $info['columns'])) {
@@ -30,6 +31,10 @@ function link_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_nam
           'real_target' => $name,
         );
       }
+      // Only set the post_process for one column.
+      if (!isset($targets[$name . ':url']) && isset($targets[$name . ':title'])) {
+        $targets[$name . ':title']['post_process'] = 'feeds_filter_empty_field_items';
+      }
     }
   }
 }
@@ -41,15 +46,7 @@ function link_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_nam
  * user has decided to map to and $value contains the value of the feed item
  * element the user has picked as a source.
  */
-function link_feeds_set_target($source, $entity, $target, $value) {
-  if (empty($value)) {
-    return;
-  }
-
-  // Handle non-multiple value fields.
-  if (!is_array($value)) {
-    $value = array($value);
-  }
+function link_feeds_set_target($source, $entity, $target, array $values) {
 
   // Iterate over all values.
   list($field_name, $column) = explode(':', $target);
@@ -58,19 +55,20 @@ function link_feeds_set_target($source, $entity, $target, $value) {
   $field = isset($entity->$field_name) ? $entity->$field_name : array();
   $delta = 0;
 
-  foreach ($value as $v) {
+  foreach ($values as $value) {
     if ($info['cardinality'] == $delta) {
       break;
     }
 
-    if (is_object($v) && ($v instanceof FeedsElement)) {
-      $v = $v->getValue();
+    if (is_object($value) && ($value instanceof FeedsElement)) {
+      $value = $value->getValue();
     }
 
-    if (is_scalar($v)) {
-      $field['und'][$delta][$column] = $v;
+    if (is_scalar($value)) {
+      $field['und'][$delta][$column] = $value;
       $delta++;
     }
   }
+
   $entity->$field_name = $field;
 }
diff --git a/mappers/number.inc b/mappers/number.inc
index b64c4ee..3566cfd 100644
--- a/mappers/number.inc
+++ b/mappers/number.inc
@@ -27,6 +27,7 @@ function number_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_n
         'name' => check_plain($instance['label']),
         'callback' => 'number_feeds_set_target',
         'description' => t('The @label field of the entity.', array('@label' => $instance['label'])),
+        'post_process' => 'feeds_filter_empty_field_items',
       );
     }
   }
@@ -37,14 +38,7 @@ function number_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_n
  *
  * Ensure that $value is a numeric to avoid database errors.
  */
-function number_feeds_set_target($source, $entity, $target, $value) {
-
-  // Do not perform the regular empty() check here. 0 is a valid value. That's
-  // really just a performance thing anyway.
-
-  if (!is_array($value)) {
-    $value = array($value);
-  }
+function number_feeds_set_target($source, $entity, $target, array $values) {
 
   $info = field_info_field($target);
 
@@ -54,18 +48,18 @@ function number_feeds_set_target($source, $entity, $target, $value) {
   // Allow for multiple mappings to the same target.
   $delta = count($field['und']);
 
-  foreach ($value as $v) {
+  foreach ($values as $value) {
 
     if ($info['cardinality'] == $delta) {
       break;
     }
 
-    if (is_object($v) && ($v instanceof FeedsElement)) {
-      $v = $v->getValue();
+    if (is_object($value) && ($value instanceof FeedsElement)) {
+      $value = $value->getValue();
     }
 
-    if (is_numeric($v)) {
-      $field['und'][$delta]['value'] = $v;
+    if (is_numeric($value)) {
+      $field['und'][$delta]['value'] = $value;
       $delta++;
     }
   }
diff --git a/mappers/path.inc b/mappers/path.inc
index 47ae0fc..c628e61 100644
--- a/mappers/path.inc
+++ b/mappers/path.inc
@@ -33,14 +33,17 @@ function path_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_nam
  * user has decided to map to and $value contains the value of the feed item
  * element the user has picked as a source.
  */
-function path_feeds_set_target($source, $entity, $target, $value, $mapping) {
-  if (empty($value)) {
-    $value = '';
-  }
+function path_feeds_set_target($source, $entity, $target, array $values, $mapping) {
+
+  $alias = FALSE;
 
-  // Path alias cannot be multi-valued, so use the first value.
-  if (is_array($value)) {
-    $value = $value[0];
+  // Path alias cannot be multi-valued, so use the first non-empty value.
+  foreach ($values as $value) {
+    $value = ltrim(trim($value), '/');
+    if (strlen($path)) {
+      $alias = $value;
+      break;
+    }
   }
 
   $entity->path = array();
@@ -61,11 +64,11 @@ function path_feeds_set_target($source, $entity, $target, $value, $mapping) {
   $entity->path['pathauto'] = FALSE;
   // Allow pathauto to set the path alias if the option is set, and this value
   // is empty.
-  if (!empty($mapping['pathauto_override']) && !$value) {
+  if (!empty($mapping['pathauto_override']) && $alias === FALSE) {
     $entity->path['pathauto'] = TRUE;
   }
   else {
-    $entity->path['alias'] = ltrim($value, '/');
+    $entity->path['alias'] = $alias;
   }
 }
 
diff --git a/mappers/profile.inc b/mappers/profile.inc
index 0dd62de..00fdf3a 100644
--- a/mappers/profile.inc
+++ b/mappers/profile.inc
@@ -30,6 +30,6 @@ function profile_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_
 /**
  * Set the user profile target after import.
  */
-function profile_feeds_set_target($source, $entity, $target, $value, $mapping) {
-  $entity->$target = $value;
+function profile_feeds_set_target($source, $entity, $target, array $values, $mapping) {
+  $entity->$target = reset($values);
 }
diff --git a/mappers/taxonomy.inc b/mappers/taxonomy.inc
index 02ac54e..842035b 100644
--- a/mappers/taxonomy.inc
+++ b/mappers/taxonomy.inc
@@ -67,6 +67,7 @@ function taxonomy_feeds_processor_targets_alter(&$targets, $entity_type, $bundle
         'description' => t('The @label field of the entity.', array('@label' => $instance['label'])),
         'summary_callback' => 'taxonomy_feeds_summary_callback',
         'form_callback' => 'taxonomy_feeds_form_callback',
+        'post_process' => 'feeds_filter_empty_field_items',
       );
     }
   }
@@ -77,17 +78,7 @@ function taxonomy_feeds_processor_targets_alter(&$targets, $entity_type, $bundle
  *
  * @todo Do not create new terms for non-autotag fields.
  */
-function taxonomy_feeds_set_target($source, $entity, $target, $terms, $mapping = array()) {
-
-  // Allow mapping the string '0' to a term name.
-  if (empty($terms) && $terms != 0) {
-    return;
-  }
-
-  // Handle non-multiple values.
-  if (!is_array($terms)) {
-    $terms = array($terms);
-  }
+function taxonomy_feeds_set_target($source, $entity, $target, array $terms, $mapping = array()) {
 
   // Add in default values.
   $mapping += array(
diff --git a/mappers/text.inc b/mappers/text.inc
index 48447d7..5507d90 100644
--- a/mappers/text.inc
+++ b/mappers/text.inc
@@ -25,6 +25,7 @@ function text_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_nam
         'name' => check_plain($instance['label']),
         'callback' => 'text_feeds_set_target',
         'description' => t('The @label field of the entity.', array('@label' => $instance['label'])),
+        'post_process' => 'feeds_filter_empty_field_items',
       );
     }
   }
@@ -33,14 +34,7 @@ function text_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_nam
 /**
  * Callback for mapping text fields.
  */
-function text_feeds_set_target($source, $entity, $target, $value) {
-  if (empty($value)) {
-    return;
-  }
-
-  if (!is_array($value)) {
-    $value = array($value);
-  }
+function text_feeds_set_target($source, $entity, $target, array $values) {
 
   if (isset($source->importer->processor->config['input_format'])) {
     $format = $source->importer->processor->config['input_format'];
@@ -54,18 +48,18 @@ function text_feeds_set_target($source, $entity, $target, $value) {
   // Allow for multiple mappings to the same target.
   $delta = count($field['und']);
 
-  foreach ($value as $v) {
+  foreach ($values as $value) {
 
     if ($info['cardinality'] == $delta) {
       break;
     }
 
-    if (is_object($v) && ($v instanceof FeedsElement)) {
-      $v = $v->getValue();
+    if (is_object($value) && ($value instanceof FeedsElement)) {
+      $value = $value->getValue();
     }
 
-    if (is_scalar($v)) {
-      $field['und'][$delta]['value'] = $v;
+    if (is_scalar($value)) {
+      $field['und'][$delta]['value'] = (string) $value;
 
       if (isset($format)) {
         $field['und'][$delta]['format'] = $format;
diff --git a/plugins/FeedsProcessor.inc b/plugins/FeedsProcessor.inc
index c2b0af5..83d85d7 100755
--- a/plugins/FeedsProcessor.inc
+++ b/plugins/FeedsProcessor.inc
@@ -506,12 +506,30 @@ abstract class FeedsProcessor extends FeedsPlugin {
           isset($targets[$this->id][$mapping['target']]['callback']) &&
           function_exists($targets[$this->id][$mapping['target']]['callback'])) {
         $callback = $targets[$this->id][$mapping['target']]['callback'];
+
+        // All target callbacks expect an array.
+        if (!is_array($value)) {
+          $value = array($value);
+        }
         $callback($source, $target_item, $mapping['target'], $value, $mapping);
       }
       else {
         $this->setTargetElement($source, $target_item, $mapping['target'], $value, $mapping);
       }
     }
+
+    foreach ($this->config['mappings'] as $mapping) {
+      $target = $mapping['target'];
+      if (isset($targets[$this->id][$target]) &&
+          is_array($targets[$this->id][$target]) &&
+          isset($targets[$this->id][$target]['post_process']) &&
+          function_exists($targets[$this->id][$target]['post_process'])) {
+
+        $callback = $targets[$this->id][$target]['post_process'];
+        $callback($source, $target_item, $target, $targets[$this->id][$target]);
+      }
+    }
+
     return $target_item;
   }
 
