diff --git a/plugins/destinations/fields.inc b/plugins/destinations/fields.inc
old mode 100644
new mode 100755
index 10b404a..2cda91a
--- a/plugins/destinations/fields.inc
+++ b/plugins/destinations/fields.inc
@@ -100,6 +100,65 @@ abstract class MigrateFieldHandler extends MigrateHandler {
   }
 }
 
+/**
+ * Base class to provide simplify creating field handlers for fields with a
+ * single value.
+ *
+ * To use it just extend it and pass the field types and value to the parent
+ * constructor:
+ *
+ * class MigrateEmailFieldHandler extends MigrateSimpleFieldHandler {
+ *   public function __construct() {
+ *     parent::__construct(array('link'), 'url');
+ *   }
+ * }
+ */
+abstract class MigrateSimpleFieldHandler extends MigrateFieldHandler {
+  protected $fieldValueKey = 'value';
+
+  protected $skipEmpty = FALSE;
+
+  /**
+   * Construct a simple field handler.
+   *
+   * @param $options
+   *   Array of options (rather than unamed parameters so you don't have to
+   *   what TRUE or FALSE means). The following keys are used:
+   *   - 'value_key' string with the name of the key in the fields value array.
+   *   - 'skip_empty' Boolean indicating that empty values should not be saved.
+   */
+  public function __construct($options) {
+    if (isset($options['value_key'])) {
+      $this->fieldValueKey = $options['value_key'];
+    }
+    if (isset($options['skip_empty'])) {
+      $this->skipEmpty = $options['skip_empty'];
+    }
+  }
+
+  public function prepare(stdClass $entity, array $instance, array $values) {
+    $arguments = array();
+    if (isset($values['arguments'])) {
+      $arguments = $values['arguments'];
+      unset($values['arguments']);
+    }
+    $language = $this->getFieldLanguage($entity, $field_info, $arguments);
+
+    // Let the derived class skip empty values.
+    if ($this->skipEmpty) {
+      $values = array_filter($values);
+    }
+
+    // Setup the Field API array for saving.
+    $delta = 0;
+    foreach ($values as $value) {
+      $return[$language][$delta][$this->fieldValueKey] = $value;
+      $delta++;
+    }
+    return isset($return) ? $return : NULL;
+  }
+}
+
 class MigrateTextFieldHandler extends MigrateFieldHandler {
   public function __construct() {
     $this->registerTypes(array('text', 'text_long', 'text_with_summary'));
@@ -153,27 +212,15 @@ class MigrateTextFieldHandler extends MigrateFieldHandler {
   }
 }
 
-class MigrateValueFieldHandler extends MigrateFieldHandler {
+class MigrateValueFieldHandler extends MigrateSimpleFieldHandler {
   public function __construct() {
+    parent::__construct(array(
+      'value_key' => 'value',
+      'skip_empty' => FALSE,
+    ));
     $this->registerTypes(array('value', 'list', 'list_boolean', 'list_integer',
       'list_float', 'list_text', 'number_integer', 'number_decimal', 'number_float'));
   }
-
-  public function prepare($entity, array $field_info, array $instance, array $values) {
-    $migration = Migration::currentMigration();
-    $arguments = (isset($values['arguments']))? $values['arguments']: array();
-    $language = $this->getFieldLanguage($entity, $field_info, $arguments);
-    // Setup the standard Field API array for saving.
-    $delta = 0;
-    foreach ($values as $value) {
-      $return[$language][$delta]['value'] = $value;
-      $delta++;
-    }
-    if (!isset($return)) {
-      $return = NULL;
-    }
-    return $return;
-  }
 }
 
 class MigrateTaxonomyTermReferenceFieldHandler extends MigrateFieldHandler {
@@ -632,63 +679,22 @@ class MigrateFileFieldHandler extends MigrateFieldHandler {
 
 // TODO: node_reference and user_reference are contrib fields - should be moved
 // to CCK, or migrate_extras
-class MigrateNodeReferenceFieldHandler extends MigrateFieldHandler {
+class MigrateNodeReferenceFieldHandler extends MigrateSimpleFieldHandler {
   public function __construct() {
+    parent::__construct(array(
+      'value_key' => 'nid',
+      'skip_empty' => TRUE,
+    ));
     $this->registerTypes(array('node_reference'));
   }
-
-  public function prepare($entity, array $field_info, array $instance, array $values) {
-    $migration = Migration::currentMigration();
-    if (isset($values['arguments'])) {
-      $arguments = $values['arguments'];
-      unset($values['arguments']);
-    }
-    else {
-      $arguments = array();
-    }
-
-    $language = $this->getFieldLanguage($entity, $field_info, $arguments);
-
-    // Setup the standard Field API array for saving.
-    $delta = 0;
-    $return = array();
-    foreach ($values as $value) {
-      // Don't save empty references
-      if ($value) {
-        $return[$language][$delta]['nid'] = $value;
-        $delta++;
-      }
-    }
-    return $return;
-  }
 }
 
-class MigrateUserReferenceFieldHandler extends MigrateFieldHandler {
+class MigrateUserReferenceFieldHandler extends MigrateSimpleFieldHandler {
   public function __construct() {
+    parent::__construct(array(
+      'value_key' => 'uid',
+      'skip_empty' => TRUE,
+    ));
     $this->registerTypes(array('user_reference'));
   }
-
-  public function prepare($entity, array $field_info, array $instance, array $values) {
-    $migration = Migration::currentMigration();
-    if (isset($values['arguments'])) {
-      $arguments = $values['arguments'];
-      unset($values['arguments']);
-    }
-    else {
-      $arguments = array();
-    }
-    $language = $this->getFieldLanguage($entity, $field_info, $arguments);
-
-    // Setup the standard Field API array for saving.
-    $delta = 0;
-    $return = array();
-    foreach ($values as $value) {
-      // Don't save empty references
-      if ($value) {
-        $return[$language][$delta]['uid'] = $value;
-        $delta++;
-      }
-    }
-    return $return;
-  }
 }
