diff --git a/mappers/file.inc b/mappers/file.inc
index 2cc5dc3..3aa006e 100644
--- a/mappers/file.inc
+++ b/mappers/file.inc
@@ -20,15 +20,34 @@ function file_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_nam
     $info = field_info_field($name);
 
     if (in_array($info['type'], array('file', 'image'))) {
+
       $targets[$name] = array(
         'name' => check_plain($instance['label']),
+        'name' => t('@name: URL', array('@name' => $instance['label'])),
         'callback' => 'file_feeds_set_target',
-        'description' => t('The @label field of the node.', array('@label' => $instance['label'])),
+        'description' => t('The url to fetch @type fro for @label field.', array('@type' => $info['type'], '@label' => $instance['label'])),
       );
+
+      if($info['type'] == 'image') {
+        $targets[$name .':title'] = array(
+          'name' => check_plain($instance['label'] . ' description'),
+          'name' => t('@name: Title', array('@name' => $instance['label'])),
+          'callback' => 'file_feeds_set_target',
+          'description' => t('Image description for @label field.', array('@label' => $instance['label'])),
+        );
+        $targets[$name .':alt'] = array(
+          'name' => check_plain($instance['label'] . ' description'),
+          'name' => t('@name: Alternative text', array('@name' => $instance['label'])),
+          'callback' => 'file_feeds_set_target',
+          'description' => t('Image alt-text for @label field .', array('@label' => $instance['label'])),
+        );
+        // @todo: also add display as sub-field?
+      }
     }
   }
 }
 
+
 /**
  * Callback for mapping. Here is where the actual mapping happens.
  *
@@ -42,53 +61,70 @@ function file_feeds_set_target($source, $entity, $target, $value) {
   }
   module_load_include('inc', 'file');
 
-  // Make sure $value is an array of objects of type FeedsEnclosure.
+  // Make sure $value is an array 
   if (!is_array($value)) {
     $value = array($value);
   }
-  foreach ($value as $k => $v) {
-    if (!($v instanceof FeedsEnclosure)) {
-      if (is_string($v)) {
-        $value[$k] = new FeedsEnclosure($v, file_get_mimetype($v));
-      }
-      else {
-        unset($value[$k]);
+
+  list($field_name, $sub_field) = explode(':', $target, 2);
+  $field = isset($entity->$field_name) ? $entity->$field_name : array('und' => array());
+
+  if(!isset($sub_field)) {
+    foreach ($value as $k => $v) {
+      if (!($v instanceof FeedsEnclosure)) {
+        if (is_string($v)) {
+          $value[$k] = new FeedsEnclosure($v, file_get_mimetype($v));
+        }
+        else {
+          unset($value[$k]);
+        }
       }
     }
-  }
-  if (empty($value)) {
-    return;
-  }
+    //This is really just a small optimization? Code will work in any case
+    if (empty($value)) {
+      return;
+    }
 
-  // Determine file destination.
-  // @todo This needs review and debugging.
-  list($entity_id, $vid, $bundle_name) = entity_extract_ids($entity->feeds_item->entity_type, $entity);
-  $instance_info = field_info_instance($entity->feeds_item->entity_type, $target, $bundle_name);
-  $info = field_info_field($target);
-  $data = array();
-  if (!empty($entity->uid)) {
-    $data[$entity->feeds_item->entity_type] = $entity;
+    // Determine file destination.
+    // @todo This needs review and debugging.
+    list($entity_id, $vid, $bundle_name) = entity_extract_ids($entity->feeds_item->entity_type, $entity);
+    $instance_info = field_info_instance($entity->feeds_item->entity_type, $target, $bundle_name);
+    $info = field_info_field($target);
+    $data = array();
+    if (!empty($entity->uid)) {
+      $data[$entity->feeds_item->entity_type] = $entity;
+    }
+    $destination = file_field_widget_uri($info, $instance_info, $data);
   }
-  $destination = file_field_widget_uri($info, $instance_info, $data);
 
   // Populate entity.
   $i = 0;
   $field = isset($entity->$target) ? $entity->$target : array();
   foreach ($value as $v) {
-    try {
-      $file = $v->getFile($destination);
-    }
-    catch (Exception $e) {
-      watchdog_exception('Feeds', $e, nl2br(check_plain($e)));
+    if(!isset($field['und'][$i])) {
+      $field['und'][$i] = array();
     }
-    if ($file) {
-      $field['und'][$i] = (array)$file;
-      $field['und'][$i]['display'] = 1; // @todo: Figure out how to properly populate this field.
-      if ($info['cardinality'] == 1) {
-        break;
+    if(!isset($sub_field)) {
+      try {
+        $file = $v->getFile($destination);
       }
-      $i++;
+      catch (Exception $e) {
+        watchdog_exception('Feeds', $e, nl2br(check_plain($e)));
+      }
+      if ($file) {
+        unset($file->title);
+        unset($file->alt);
+        $field['und'][$i] = (array)$file + $field['und'][$i];
+        $field['und'][$i]['display'] = 1; // @todo: Figure out how to properly populate this field.
+      }
+    }
+    else {
+      $field['und'][$i][$sub_field] = $v;
+    }
+    if ($info['cardinality'] == 1) {
+      break;
     }
+    $i++;
   }
   $entity->{$target} = $field;
 }
diff --git a/plugins/FeedsProcessor.inc b/plugins/FeedsProcessor.inc
old mode 100755
new mode 100644
