diff --git a/name.migrate.inc b/name.migrate.inc
index 0e63532..5ffe09f 100644
--- a/name.migrate.inc
+++ b/name.migrate.inc
@@ -1,49 +1,74 @@
 <?php
 
 /**
- * @file
- * Support for migration into Name fields.
+ * Primary value passed to this field must be the 'given' name.
+ * it cannot be NULL, but may be an empty string.
+ *
+ * Arguments are used to specify all the other values:
+ * 'title' => array('source_field' => 'title'),
+ * 'middle' => array('source_field' => 'middle'),
+ * 'family' => array('source_field' => 'family'),
+ * 'generational' => array('source_field' => 'generational'),
+ * 'credentials' => array('source_field' => 'credentials'),
+ *
+ * Add the source field mappings to the argument array then add null mappings to
+ * avoid having fields flagged as as unmapped:
+ * @code
+ *   $arguments = array(
+ *    'title' => array('source_field' => 'profile_title'),
+ *    'middle' => array('source_field' => 'profile_middle_name'),
+ *    'family' => array('source_field' => 'profile_last_name'),
+ *   );
+ *   // The given name should be passed in as the primary value.
+ *   $this->addFieldMapping('field_name', 'profile_first_name')
+ *        ->arguments($arguments);
+ *   // Since the excerpt is mapped via an argument, add a null mapping so it's
+ *   // not flagged as unmapped.
+ *   $this->addFieldMapping(NULL, 'profile_title');
+ *   $this->addFieldMapping(NULL, 'profile_middle_name');
+ *   $this->addFieldMapping(NULL, 'profile_last_name');
+ * @endcode
  */
-class NameMigrateFieldHandler extends MigrateFieldHandler {
-
-  /**
-   * Declares the types of fields used.
-   */
+class MigrateNameHandler extends MigrateFieldHandler {
   public function __construct() {
     $this->registerTypes(array('name'));
   }
 
-  /**
-   * Converts incoming data into the proper field arrays for Name fields.
-   *
-   * @param object $entity
-   *   The destination entity which will hold the field arrays.
-   * @param array $field_info
-   *   Metadata for the field being populated.
-   * @param array $instance
-   *   Metadata for this instance of the field being populated.
-   * @param array $values
-   *   Array of values to be fielded.
-   *
-   * @return array|null
-   *   An array of name fields.
-   */
   public function prepare($entity, array $field_info, array $instance, array $values) {
-    $language = $this->getFieldLanguage($entity, $field_info, array());
+    // Get arguments, if any.
+    $arguments = array();
+    if (isset($values['arguments'])) {
+      $arguments = array_filter($values['arguments']);
+      unset($values['arguments']);
+    }
+
+    // Get language.
+    $language = $this->getFieldLanguage($entity, $field_info, $arguments);
 
-    $return = array();
+    // Get name-specific field settings.
+    $components = array_filter($field_info['settings']['components']);
 
     // Setup the standard Field API array for saving.
     $delta = 0;
-    foreach ($values as $name) {
-      foreach (_name_translations() as $key => $label) {
-        $return[$language][$delta][$key] = isset($name[$key]) ? $name[$key] : NULL;
+    foreach ($values as $value) {
+      // Handle multivalue arguments (especially for subfields).
+      $delta_arguments = array();
+      foreach ($arguments as $name => $argument) {
+        if (is_array($argument) && isset($argument[$delta])) {
+          $delta_arguments[$name] = $argument[$delta];
+        }
+        else {
+          $delta_arguments[$name] = $argument;
+        }
+      }
+      $item = array('given' => $value) + array_intersect_key($delta_arguments, $field_info['columns']);
+      $item = array_intersect_key($item, $components);
+      if (array_filter($item)) {
+        $return[$language][$delta] = $item;
       }
       $delta++;
     }
-    if (empty($return)) {
-      $return = NULL;
-    }
-    return $return;
+
+    return isset($return[$language]) ? $return : NULL;
   }
 }
