diff --git a/salesforce_api/salesforce_api.module b/salesforce_api/salesforce_api.module
index c63b1c0..10053f6 100644
--- a/salesforce_api/salesforce_api.module
+++ b/salesforce_api/salesforce_api.module
@@ -1036,8 +1036,8 @@ function salesforce_api_fieldmap_export_create($name, $drupal_data = NULL) {
 
     // Don't try to update or create fields to which those actions do not apply.
     if ((!$updateable && !$createable)
-      || (empty($drupal_data->salesforce->sfid) && !$createable)
-      || (!empty($drupal_data->salesforce->sfid) && !$updateable)) {
+      || (empty($drupal_data->salesforce[$name]->sfid) && !$createable)
+      || (!empty($drupal_data->salesforce[$name]->sfid) && !$updateable)) {
       continue;
     }
     // See if it's a special field
@@ -1227,13 +1227,14 @@ function salesforce_api_id_load($oid, $entity_name, $bundle_name = NULL) {
   else {
     $result = db_query("SELECT sfid, name FROM {salesforce_object_map} WHERE drupal_entity = :drupal_entity AND drupal_bundle = :drupal_bundle AND oid = :oid", array(':drupal_entity' => $entity_name, 'drupal_bundle' => $bundle_name, ':oid' => $oid));
   }
-  $data = $result->fetchObject();
-  // Return an empty array if no data was found.
+  // return an array of all the SF IDs and their map
+  $data = $result->fetchAllAssoc('name');
+  // Return FALSE if no data was found.
   if (!$data) {
-    return (object) array('sfid' => NULL, 'name' => NULL);
+    return FALSE;
   }
   else {
-    // Otherwise return the Salesforce object type and ID.
+    // Otherwise return the array of the Salesforce objects type and IDs.
     return $data;
   }
 }
@@ -1409,6 +1410,28 @@ function salesforce_api_search_for_duplicates($direction, $entity_name, $bundle_
 }
 
 /**
+ * Implement of the hook_sf_find_match
+ * To avoid duplication of data for the fieldmaps with the same Drupal Entity type/bundle and the same SF Object
+ *
+ */
+function salesforce_api_sf_find_match($direction, $entity_name, $bundle_name, $entity, $fieldmap_name) {
+  if ($direction == 'export') {
+    if (!empty($entity->salesforce)) {
+      $this_fieldmap = salesforce_api_salesforce_fieldmap_load($fieldmap_name);
+      foreach ($entity->salesforce as $salesforce) {
+        $fieldmap = salesforce_api_salesforce_fieldmap_load($salesforce->name);
+        if ($fieldmap->drupal_entity == $entity_name && $fieldmap->drupal_bundle == $bundle_name && $fieldmap->salesforce != 'PricebookEntry' && $fieldmap->salesforce == $this_fieldmap->salesforce) {
+          $existent_fieldmap_name = $fieldmap->name;
+          $existent_salesforce = (array)$salesforce;
+          return $entity->salesforce[$existent_fieldmap_name]->sfid;
+        }
+      }
+    }
+  }
+  // TO DO : what about importing?
+}
+
+/**
  * Implements hook_theme().
  *
  * Registers theme callback for admin screen
diff --git a/sf_entity/sf_entity.module b/sf_entity/sf_entity.module
index cfbeaf7..0216e71 100644
--- a/sf_entity/sf_entity.module
+++ b/sf_entity/sf_entity.module
@@ -40,12 +40,15 @@ function sf_entity_menu() {
     }
     $parts = explode('/', $uri['path']);
     $page_args = array('sf_entity_salesforce_form', $entity);
+    $page_fieldmap_args = array('sf_entity_salesforce_fieldmap_form', $entity);
     $access_args = array($entity);
     foreach ($parts as $i => $part) {
       if ($part == '__ENTITY_ID__') {
         $parts[$i] = '%' . $entity;
         $page_args[] = $i;
+        $page_fieldmap_args[] = $i;
         $access_args[] = $i;
+        $arg_id = $i;
       }
       elseif ($part == '__ENTITY_VID__' || $part == '__ENTITY_BUNDLE__') {
         $parts[$i] = '%';
@@ -61,6 +64,15 @@ function sf_entity_menu() {
       'access arguments' => $access_args,
       'type' => MENU_LOCAL_TASK,
       );
+    $page_fieldmap_args[] = $arg_id+2;
+    $items[$uri.'/%salesforce_api_fieldmap'] = array(
+      'title' => 'Salesforce',
+      'page callback' => 'drupal_get_form',
+      'page arguments' => $page_fieldmap_args,
+      'access callback' => 'sf_entity_salesforce_form_access',
+      'access arguments' => $access_args,
+      'tab parent' => $uri.'/%',
+      );
   }
   return $items;
 }
@@ -124,31 +136,10 @@ function sf_entity_save($entity, $type, $op) {
   // If this is an update, and the node already has a Salesforce mapping,
   // try to load it. If the load fails, we need to fetch the appropriate
   // fieldmap. Either way, we're upserting the Salesforce record.
-  $salesforce = (object) array('name' => NULL, 'sfid' => NULL);
   list($oid, $vid, $bundle) = entity_extract_ids($type, $entity);
-  if ($oid) {
-    $salesforce = salesforce_api_id_load($oid, $type, $bundle);
-  }
-
-  // If we have an existing link, attempt to load the associated map.
-  if (!empty($salesforce->name)) {
-    $map = salesforce_api_salesforce_fieldmap_load($salesforce->name);
-  }
-
-  // If the Salesforce link wasn't found, or if it was found but associated to a
-  // non-existent map, load any maps associated with this entity type.
-  // @todo: Determine why this isn't loading maps that should be there.
-  if (empty($salesforce->name) || empty($map)) {
-    $maps = salesforce_api_salesforce_fieldmap_load_by(array('drupal_entity' => $type, 'drupal_bundle' => $bundle));
-    if (empty($maps)) {
-      return;
-    }
-  }
-  // Otherwise, assign the single map as an array so we only have to write
-  // the preceding logic once.
-  else {
-    $maps = array($map->name => $map);
-  }
+  
+  // get all entity fieldmaps related
+  $maps = salesforce_api_salesforce_fieldmap_load_by(array('drupal_entity' => $type, 'drupal_bundle' => $bundle));
 
   foreach ($maps as $map) {
     $auto_create = $map->automatic & SALESFORCE_AUTO_SYNC_CREATE;
@@ -156,33 +147,27 @@ function sf_entity_save($entity, $type, $op) {
     if ((!$auto_create && $op == 'insert')
           || (!$auto_update && $op == 'update')) {
       unset($maps[$map->name]);
+    } else {
+      // only maps that have automatic updates
+      // Check if there is more than one fieldmap in the result.
+      // @todo: Is it necessary to use AND instead of &&
+      if (user_access('administer salesforce') AND next($maps)) {
+        if (!empty($map->description)) {
+          $description = '(' . $map->description . ')';
+        }
+        drupal_set_message(t('Warning: more than one "automatic" salesforce mapping detected. Used fieldmap !map_name @map_description.', array('!map_name' => l($map->name, SALESFORCE_PATH_FIELDMAPS . '/' . $map->name . '/edit'), '@map_description' => $description)), 'warning');
+      }
+      
+      $sfid = isset($entity->salesforce[$map->name]->sfid) ? $entity->salesforce[$map->name]->sfid : NULL;
+    
+      // Finally, export the entity to Salesforce.
+      try {
+        sf_entity_export($entity, $map->name, $sfid);
+      } catch (Exception $e) {
+        salesforce_api_log(SALESFORCE_LOG_SOME, 'Exception while attempting to export entity: ' . $e->getMessage(), array(), WATCHDOG_ERROR, l('view', entity_uri($type, $entity)));
+      }
     }
   }
-
-  // If all our maps were unset, abort this procedure.
-  if (empty($maps)) {
-    return;
-  }
-
-  // Otherwise, use the first fieldmap.
-  $map = reset($maps);
-  $salesforce->name = $map->name;
-
-  // Check if there is more than one fieldmap in the result.
-  // @todo: Is it necessary to use AND instead of &&
-  if (user_access('administer salesforce') AND next($maps)) {
-    if (!empty($map->description)) {
-      $description = '(' . $map->description . ')';
-    }
-    drupal_set_message(t('Warning: more than one "automatic" salesforce mapping detected. Used fieldmap !map_name @map_description.', array('!map_name' => l($map->name, SALESFORCE_PATH_FIELDMAPS . '/' . $map->name . '/edit'), '@map_description' => $description)), 'warning');
-  }
-
-  // Finally, export the entity to Salesforce.
-  try {
-    sf_entity_export($entity, $salesforce->name, $salesforce->sfid);
-  } catch (Exception $e) {
-    salesforce_api_log(SALESFORCE_LOG_SOME, 'Exception while attempting to export entity: ' . $e->getMessage(), array(), WATCHDOG_ERROR, l('view', entity_uri($type, $entity)));
-  }
 }
 
 /**
@@ -448,185 +433,272 @@ function sf_entity_salesforce_form($form, &$form_state, $entity_type, $entity) {
     '#value' => array($oid, $vid, $bundle),
   );
 
-  if ($entity->salesforce->sfid) {
-    // Retrieve the object from Salesforce.
-    $sf_data = salesforce_api_retrieve(array($entity->salesforce->sfid), $entity->salesforce->name);
-    // Check to see if sf_data is an array of objects
-    if (is_array($sf_data) && count($sf_data) > 0) {
-      $sf_data = $sf_data[0];
-    }
-    // If $sf_data is empty, we assume the record is deleted. retrieve() does
-    // not return the ENTITY_IS_DELETED error that upsert() does.
-    if (!$sf_data && SALESFORCE_DELETED_POLICY_UPSERT == variable_get('salesforce_api_entity_deleted_policy', SALESFORCE_DELETED_POLICY_UPSERT)) {
-      drupal_set_message(t('Unable to retrieve Salesforce data for record !sfid. Drupal and Salesforce records have been unlinked.', array('!sfid' => $entity->salesforce->sfid)), 'warning');
-      // Unlink the object and reload the entity, resetting the cache
-      salesforce_api_id_unlink(array('oid' => $oid, 'name' => $entity->salesforce->name));
-      $entity = entity_load($entity_type, array($oid), array(), TRUE);
-    }
-    elseif (!$sf_data) {
-      drupal_set_message(t('Unable to retrieve Salesforce data for record !sfid.', array('!sfid' => $entity->salesforce->sfid)), 'warning');
+  $options = salesforce_api_fieldmap_options($entity_type, $bundle);
+  // if isset linked SF objects
+  if (isset($entity->salesforce) && is_array($entity->salesforce)) {
+    $destination = drupal_get_destination();
+    $path = $destination['destination'];
+    foreach ($entity->salesforce as $fieldmap => $sf) {
+      $fieldmap = salesforce_api_fieldmap_load($fieldmap);
+      $items[] = array(
+      'data' => l($fieldmap->description, $path.'/'.$fieldmap->name),
+      ); 
     }
+  
+    $form['fieldmaps'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Fieldmaps already linked'),
+      '#collapsible' => TRUE,
+      //'#description' => t('These fields have been mapped through fieldmap <a href="!url">@index</a>.', array('!url' => url(SALESFORCE_PATH_FIELDMAPS . '/' . $map->name . '/edit'), '@index' => $map->name)),
+    );
+    $form['fieldmaps']['fieldmaps_links'] = array(
+      '#markup' => theme('item_list', array('items' => $items)),
+    );
+    $options = array_diff_key($options, $entity->salesforce);
   }
-
-  $options = salesforce_api_fieldmap_options($entity_type, $bundle);
   // Display an export button if the entity hasn't been exported before,
   // or doesn't currently have a linked object in Salesforce.
-  if (isset($entity->salesforce->sfid) && empty($entity->salesforce->sfid) ||
-      !isset($entity->salesforce->sfid)) {
-      $form['export'] = array(
-        '#type' => 'fieldset',
-        '#title' => t('Export to Salesforce'),
-        '#description' => t('This @entity may be exported to Salesforce using any fieldmap listed below.', array('@entity' => strtolower($info['label']))),
-      );
+  $form['export'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Export to Salesforce'),
+    '#description' => t('This @entity may be exported to Salesforce using any fieldmap listed below.', array('@entity' => strtolower($info['label']))),
+  );
 
-    if (!empty($options)) {
-      // Add the export form.
-      $form['export']['fieldmap'] = array(
-        '#type' => 'select',
-        '#title' => t('Export fieldmap'),
-        '#options' => $options,
-      );
+  if (!empty($options)) {
+    // Add the export form.
+    $form['export']['fieldmap'] = array(
+      '#type' => 'select',
+      '#title' => t('Export fieldmap'),
+      '#options' => $options,
+    );
 
-      $form['export']['manual_linking'] = array(
-        '#type' => 'fieldset',
-        '#collapsible' => TRUE,
-        '#collapsed' => TRUE,
-        '#title' => t('Manual linking'),
-      );
+    $form['export']['manual_linking'] = array(
+      '#type' => 'fieldset',
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE,
+      '#title' => t('Manual linking'),
+    );
 
-      $form['export']['manual_linking']['sfid'] = array(
-        '#type' => 'textfield',
-        '#title' => t('Salesforce ID'),
-        '#description' => t('If this entity already has a corresponding object
-        in Salesforce, enter the Salesforce ID to manually link the entities.'),
-        '#size' => 18,
-        '#maxlength' => 18,
-      );
+    $form['export']['manual_linking']['sfid'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Salesforce ID'),
+      '#description' => t('If this entity already has a corresponding object
+      in Salesforce, enter the Salesforce ID to manually link the entities.'),
+      '#size' => 18,
+      '#maxlength' => 18,
+    );
 
-      $form['export']['submit'] = array(
-        '#type' => 'submit',
-        '#value' => t('Export'),
+    $form['export']['submit'] = array(
+      '#type' => 'submit',
+      '#value' => t('Export'),
+    );
+  }
+  else {
+    $form['export']['notice'] = array(
+      '#type' => 'item',
+      '#title' => t('No @entity fieldmaps', array('@entity' => $entity_type . ':' . $bundle)),
+      '#markup' => t('You have not created any @entity fieldmaps. Please <a href="/!url">go create a fieldmap</a> and come back.', array('@entity' => strtolower($info['label']), '!url' => SALESFORCE_PATH_FIELDMAPS)),
       );
-    }
-    else {
-      $form['export']['notice'] = array(
-        '#type' => 'item',
-        '#title' => t('No @entity fieldmaps', array('@entity' => $entity_type . ':' . $bundle)),
-        '#markup' => t('You have not created any @entity fieldmaps. Please <a href="/!url">go create a fieldmap</a> and come back.', array('@entity' => strtolower($info['label']), '!url' => SALESFORCE_PATH_FIELDMAPS)),
-        );
-    }
   }
-  elseif(isset($entity->salesforce->sfid) && !empty($entity->salesforce->sfid)) {
-    // Otherwise add synchronization information.
-    $form['sfid'] = array(
+
+  return $form;
+}
+
+/**
+ * Displays the Salesforce synchronization form.
+ */
+function sf_entity_salesforce_fieldmap_form($form, &$form_state, $entity_type, $entity, $map) {
+  if(!isset($entity->salesforce[$map->name])) {
+    drupal_not_found();
+    exit;
+  }
+  list($oid, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
+  // Fail out if the entity doesn't exist!
+  if (!$oid || !$bundle) {
+    drupal_not_found();
+    exit;
+  }
+
+  $destination = drupal_get_destination();
+  $path = str_replace('/'.$map->name, '', $destination['destination']);
+  foreach ($entity->salesforce as $fieldmap => $sf) {
+    $fieldmap = salesforce_api_fieldmap_load($fieldmap);
+    $items[] = array(
+    'data' => l($fieldmap->description, $path.'/'.$fieldmap->name),
+    ); 
+  }
+
+  $form['fieldmaps'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Fieldmaps already linked'),
+    '#collapsible' => TRUE,
+    //'#description' => t('These fields have been mapped through fieldmap <a href="!url">@index</a>.', array('!url' => url(SALESFORCE_PATH_FIELDMAPS . '/' . $map->name . '/edit'), '@index' => $map->name)),
+  );
+  $form['fieldmaps']['fieldmaps_links'] = array(
+    '#markup' => theme('item_list', array('items' => $items)),
+  );
+
+  if (isset($form_state['storage']['confirm'])) {
+    $form['entity'] = array(
       '#type' => 'value',
-      '#value' => $entity->salesforce->sfid,
+      '#value' => $entity,
     );
-    $form['fieldmap'] = array(
+    $form['entity_type'] = array(
       '#type' => 'value',
-      '#value' => $entity->salesforce->name,
+      '#value' => $entity_type,
     );
+    return confirm_form($form, 'Are you sure you want to unlink this entity from Salesforce?', entity_uri($entity_type, $entity), 'Unlinking this object will remove the connection between the Drupal object and the Salesforce record. This action will <strong>not</strong> delete the Drupal object or the Salesforce record. This cannot be undone.', 'Unlink', 'Cancel');
+  }
 
-    // Load the fieldmap data.
-    $map = salesforce_api_salesforce_fieldmap_load($entity->salesforce->name);
-    $sf_object_definition = salesforce_api_fieldmap_objects_load('salesforce', 'salesforce', $map->salesforce);
-    $export_data = salesforce_api_fieldmap_export_create($entity->salesforce->name, $entity);
-
-    $header = array(t('Field name'), t('Drupal @type value', array('@type' => salesforce_api_fieldmap_object_label('drupal', $map->drupal_entity, $map->drupal_bundle))), t('Salesforce @type value', array('@type' => salesforce_api_fieldmap_object_label('salesforce', 'salesforce', $map->salesforce))));
-    $rows = array();
-
-    foreach ($map->fields as $sf_fieldname => $drupal_fieldname) {
-      $row = array();
-      $row[] = $sf_object_definition['fields'][$sf_fieldname]['label'];
-      $row[] = isset($export_data->$sf_fieldname)
-        ? $export_data->$sf_fieldname : '&nbsp;';
-      $row[] = isset($sf_data->$sf_fieldname)
-        ? $sf_data->$sf_fieldname : '&nbsp;';
-      $rows[] = $row;
-    }
 
-    $form['mapped'] = array(
-      '#type' => 'fieldset',
-      '#title' => t('Mapped field values'),
-      '#description' => t('These fields have been mapped through fieldmap <a href="!url">@index</a>.', array('!url' => url(SALESFORCE_PATH_FIELDMAPS . '/' . $entity->salesforce->name . '/edit'), '@index' => $entity->salesforce->name)),
-    );
-    $form['mapped']['fieldmap_values'] = array(
-      '#markup' => theme('table', array('header' => $header, 'rows' => $rows)),
-    );
+  // Set the entity page title.
+  drupal_set_title(t('@entity_name: Salesforce (@map_name) Export/Import', array('@entity_name' => entity_label($entity_type, $entity), '@map_name' => $map->name)));
 
-    $form['mapped']['export_values'] = array(
-      '#type' => 'submit',
-      '#value' => t('Export'),
-      '#attributes' => array('class' => array('sf-confirm')),
-    );
-    $form['mapped']['import_values'] = array(
-      '#type' => 'submit',
-      '#value' => t('Import'),
-      '#attributes' => array('class' => array('sf-confirm')),
+  // Build the $form array
+  $info = entity_get_info($entity_type);
+  $form = array();
+
+  $form['entity info'] = array(
+    '#type' => 'value',
+    '#value' => $info,
     );
-    $form['mapped']['unlink'] = array(
-      '#type' => 'submit',
-      '#value' => t('Unlink from Salesforce object...'),
-      '#attributes' => array('class' => array('sf-confirm')),
+  $form['entity type'] = array(
+    '#type' => 'value',
+    '#value' => $entity_type,
     );
+  $form['entity keys'] = array(
+    '#type' => 'value',
+    '#value' => array($oid, $vid, $bundle),
+  );
 
-    // Create a table for the unmapped fields.
-    $header = array(t('Field name'), t('Salesforce @type value', array('@type' => salesforce_api_fieldmap_object_label('salesforce', 'salesforce', $map->salesforce))));
-    $rows = array();
 
-    foreach ((array) $sf_data as $key => $value) {
-      if (!isset($map->fields[$key]) && isset($sf_object_definition['fields'][$key])) {
-        $rows[] = array(
-          $sf_object_definition['fields'][$key]['label'],
-          $value,
-        );
-      }
+  if ($entity->salesforce[$map->name]->sfid) {
+    // Retrieve the object from Salesforce.
+    $sf_data = salesforce_api_retrieve(array($entity->salesforce[$map->name]->sfid), $map->name);
+    // Check to see if sf_data is an array of objects
+    if (is_array($sf_data) && count($sf_data) > 0) {
+      $sf_data = $sf_data[0];
     }
-
-    if (count($rows) > 0) {
-      $form['unmapped'] = array(
-        '#type' => 'fieldset',
-        '#title' => t('Unmapped fields'),
-        '#description' => t('These fields are available on Salesforce but are not currently mapped through the fieldmap used for this @entity.', array('@entity' => strtolower($info['label']))),
-        '#collapsible' => TRUE,
-        '#collapsed' => TRUE,
-      );
-      $form['unmapped']['unmapped_fields'] = array(
-        '#markup' => theme('table', array('header' => $header, 'rows' => $rows)),
-      );
+    // If $sf_data is empty, we assume the record is deleted. retrieve() does
+    // not return the ENTITY_IS_DELETED error that upsert() does.
+    if (!$sf_data && SALESFORCE_DELETED_POLICY_UPSERT == variable_get('salesforce_api_entity_deleted_policy', SALESFORCE_DELETED_POLICY_UPSERT)) {
+      drupal_set_message(t('Unable to retrieve Salesforce data for record !sfid. Drupal and Salesforce records have been unlinked.', array('!sfid' => $entity->salesforce->sfid)), 'warning');
+      // Unlink the object and reload the entity, resetting the cache
+      salesforce_api_id_unlink(array('oid' => $oid, 'name' => $map->name));
+      $entity = entity_load($entity_type, array($oid), array(), TRUE);
+    }
+    elseif (!$sf_data) {
+      drupal_set_message(t('Unable to retrieve Salesforce data for record !sfid.', array('!sfid' => $entity->salesforce[$map->name]->sfid)), 'warning');
     }
+  }
+
+  $options = salesforce_api_fieldmap_options($entity_type, $bundle);
+   // Otherwise add synchronization information.
+  $form['sfid'] = array(
+    '#type' => 'value',
+    '#value' => $entity->salesforce[$map->name]->sfid,
+  );
+  $form['fieldmap'] = array(
+    '#type' => 'value',
+    '#value' => $map->name,
+  );
+
+  $sf_object_definition = salesforce_api_fieldmap_objects_load('salesforce', 'salesforce', $map->salesforce);
+  $export_data = salesforce_api_fieldmap_export_create($map->name, $entity);
+
+  $header = array(t('Field name'), t('Drupal @type value', array('@type' => salesforce_api_fieldmap_object_label('drupal', $map->drupal_entity, $map->drupal_bundle))), t('Salesforce @type value', array('@type' => salesforce_api_fieldmap_object_label('salesforce', 'salesforce', $map->salesforce))));
+  $rows = array();
+
+  foreach ($map->fields as $sf_fieldname => $drupal_fieldname) {
+    $row = array();
+    $row[] = $sf_object_definition['fields'][$sf_fieldname]['label'];
+    $row[] = isset($export_data->$sf_fieldname)
+      ? $export_data->$sf_fieldname : '&nbsp;';
+    $row[] = isset($sf_data->$sf_fieldname)
+      ? $sf_data->$sf_fieldname : '&nbsp;';
+    $rows[] = $row;
+  }
+
+  $form['mapped'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Mapped field values'),
+    '#description' => t('These fields have been mapped through fieldmap <a href="!url">@index</a>.', array('!url' => url(SALESFORCE_PATH_FIELDMAPS . '/' . $map->name . '/edit'), '@index' => $map->name)),
+  );
+  $form['mapped']['fieldmap_values'] = array(
+    '#markup' => theme('table', array('header' => $header, 'rows' => $rows)),
+  );
 
-    $rows = array();
+  $form['mapped']['export_values'] = array(
+    '#type' => 'submit',
+    '#value' => t('Export'),
+    '#attributes' => array('class' => array('sf-confirm')),
+  );
+  $form['mapped']['import_values'] = array(
+    '#type' => 'submit',
+    '#value' => t('Import'),
+    '#attributes' => array('class' => array('sf-confirm')),
+  );
+  $form['mapped']['unlink'] = array(
+    '#type' => 'submit',
+    '#value' => t('Unlink from Salesforce object...'),
+    '#attributes' => array('class' => array('sf-confirm')),
+  );
 
-    foreach (salesforce_api_fieldmap_system_fields() as $key => $value) {
+  // Create a table for the unmapped fields.
+  $header = array(t('Field name'), t('Salesforce @type value', array('@type' => salesforce_api_fieldmap_object_label('salesforce', 'salesforce', $map->salesforce))));
+  $rows = array();
+
+  foreach ((array) $sf_data as $key => $value) {
+    if (!isset($map->fields[$key]) && isset($sf_object_definition['fields'][$key])) {
       $rows[] = array(
-        $value['label'],
-        $sf_data->$key,
+        $sf_object_definition['fields'][$key]['label'],
+        $value,
       );
     }
+  }
 
-    $form['system'] = array(
+  if (count($rows) > 0) {
+    $form['unmapped'] = array(
       '#type' => 'fieldset',
-      '#title' => t('System fields'),
-      '#description' => t('These fields provide additional system information about the Salesforce object but cannot be exported to Salesforce.'),
+      '#title' => t('Unmapped fields'),
+      '#description' => t('These fields are available on Salesforce but are not currently mapped through the fieldmap used for this @entity.', array('@entity' => strtolower($info['label']))),
       '#collapsible' => TRUE,
       '#collapsed' => TRUE,
     );
-    $form['system']['system_fields'] = array(
+    $form['unmapped']['unmapped_fields'] = array(
       '#markup' => theme('table', array('header' => $header, 'rows' => $rows)),
     );
+  }
 
-    $form['raw'] = array(
-      '#type' => 'fieldset',
-      '#title' => t('Raw data'),
-      '#collapsible' => TRUE,
-      '#collapsed' => TRUE,
-    );
-    $form['raw']['data'] = array(
-      '#markup' => '<pre>' . print_r($sf_data, TRUE) . '</pre>',
+  $rows = array();
+
+  foreach (salesforce_api_fieldmap_system_fields() as $key => $value) {
+    $rows[] = array(
+      $value['label'],
+      $sf_data->$key,
     );
   }
 
+  $form['system'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('System fields'),
+    '#description' => t('These fields provide additional system information about the Salesforce object but cannot be exported to Salesforce.'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+  $form['system']['system_fields'] = array(
+    '#markup' => theme('table', array('header' => $header, 'rows' => $rows)),
+  );
+
+  $form['raw'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Raw data'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+  $form['raw']['data'] = array(
+    '#markup' => '<pre>' . print_r($sf_data, TRUE) . '</pre>',
+  );
   return $form;
 }
 
@@ -671,14 +743,15 @@ function sf_entity_salesforce_form_submit($form, &$form_state) {
       if (!isset($form_state['storage']['confirm'])) {
         $form_state['storage']['confirm'] = TRUE;
         $form_state['rebuild'] = TRUE;
+        $form_state['storage']['values'] = $form_state['values']; 
       }
       else {
         unset($form_state['storage']['confirm']);
         $entity = $form_state['values']['entity'];
         $entity_type = $form_state['values']['entity_type'];
         list($oid, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
-        salesforce_api_id_unlink(array('oid' => $oid, 'name' => $entity->salesforce->name));
-        drupal_set_message(t('The %type !oid has been unlinked from Salesforce record !sfid.', array('%type' => $entity_type, '!oid' => $oid, '!sfid' => $entity->salesforce->sfid)));
+        salesforce_api_id_unlink(array('oid' => $oid, 'name' => $form_state['storage']['values']['fieldmap']));
+        drupal_set_message(t('The %type !oid has been unlinked from Salesforce record !sfid.', array('%type' => $entity_type, '!oid' => $oid, '!sfid' => $form_state['storage']['values']['sfid'])));
       }
       break;
   }
@@ -722,7 +795,7 @@ function sf_entity_export($entity, $name, $sfid = NULL) {
     $matches = salesforce_api_search_for_duplicates('export', $map->drupal_entity, $map->drupal_bundle, $entity, $name);
     if (!empty($matches)) {
       $sfid = reset($matches);
-      $entity->salesforce->sfid = $sfid;
+      $entity->salesforce[$name]->sfid = $sfid;
       salesforce_api_id_save($id, $sfid, $name, $map->drupal_entity, $map->drupal_bundle);
       $entity = entity_load($map->drupal_entity, array($id), array(), TRUE);
     }
@@ -771,7 +844,7 @@ function sf_entity_export($entity, $name, $sfid = NULL) {
       && SALESFORCE_DELETED_POLICY_UPSERT == variable_get('salesforce_api_entity_deleted_policy', SALESFORCE_DELETED_POLICY_UPSERT)) {
       // If the entity is deleted, unlink ALL the linked drupal objects.
       salesforce_api_id_unlink(array('sfid' => $object->Id));
-      $entity->salesforce->sfid = $object->Id = NULL;
+      $entity->salesforce[$name]->sfid = $object->Id = NULL;
 
       // Look for any matching records which we might want to update instead of
       // creating duplicates. Assume that salesforce_api_search_for_duplicates()
@@ -779,7 +852,7 @@ function sf_entity_export($entity, $name, $sfid = NULL) {
       $matches = salesforce_api_search_for_duplicates('export', $map->drupal_entity, $map->drupal_bundle, $entity, $name);
       if (!empty($matches)) {
         $sfid = reset($matches);
-        $entity->salesforce->sfid = $sfid;
+        $entity->salesforce[$name]->sfid = $sfid;
       }
 
       salesforce_api_log(SALESFORCE_LOG_SOME, 'Salesforce record deleted. Attempting to unlink and upsert. <pre>%response</pre>',
@@ -993,7 +1066,7 @@ function sf_entity_import($sf_data, $name, $id = NULL, $options = array()) {
         || (($map->automatic & SALESFORCE_AUTO_SYNC_UPDATE) && !$create)
         || (!empty($options['extra-linked']) && $options['extra-linked'] == TRUE)) {
       // Store the Salesforce ID for the entity and return TRUE.
-      salesforce_api_id_save($id, $entity->salesforce->sfid, $name, $map->drupal_entity, $map->drupal_bundle);
+      salesforce_api_id_save($id, $entity->salesforce[$name]->sfid, $name, $map->drupal_entity, $map->drupal_bundle);
     }
   }
   // Allow modules to respond after an import.
