diff --git a/modules/salesforce_mapping/includes/salesforce_mapping.fieldmap_type.inc b/modules/salesforce_mapping/includes/salesforce_mapping.fieldmap_type.inc
index 4117017..7529deb 100644
--- a/modules/salesforce_mapping/includes/salesforce_mapping.fieldmap_type.inc
+++ b/modules/salesforce_mapping/includes/salesforce_mapping.fieldmap_type.inc
@@ -150,7 +150,7 @@ function salesforce_mapping_related_entity_fieldmap_push_value($fieldmap, $entit
  * Pull value callback for property fieldmap type.
  */
 function salesforce_mapping_related_entity_fieldmap_pull_value($entity_wrapper, $sf_object, $field_map) {
-  $mapped_objects = salesforce_mapping_object_load_by_sfid($sf_object[$field_map['salesforce_field']['name']]);
+  $mapped_objects = salesforce_mapping_object_load_by_sfid($sf_object[$field_map['salesforce_field']['name']], $field_map->drupal_bundle);
   $info = $entity_wrapper->info();
   if ($mapped_objects && !isset($info['relation_type'])) {
     $entity = entity_load_single($mapped_objects->entity_type, $mapped_objects->entity_id);
@@ -256,7 +256,7 @@ function salesforce_mapping_relation_endpoints_fieldmap_pull_value($entity_wrapp
 
   // Load each related Drupal entity.
   foreach ($field_map['salesforce_field'] as $sf_field) {
-    $mapped_object = salesforce_mapping_object_load_by_sfid($sf_object[$sf_field['name']]);
+    $mapped_object = salesforce_mapping_object_load_by_sfid($sf_object[$sf_field['name']], $field_map->drupal_bundle);
     if ($mapped_object) {
       $entity = entity_load_single($mapped_object->entity_type, $mapped_object->entity_id);
       $values[] = entity_metadata_wrapper($mapped_object->entity_type, $entity);
diff --git a/modules/salesforce_mapping/includes/salesforce_mapping_object.admin.inc b/modules/salesforce_mapping/includes/salesforce_mapping_object.admin.inc
index 0afa48e..6641899 100644
--- a/modules/salesforce_mapping/includes/salesforce_mapping_object.admin.inc
+++ b/modules/salesforce_mapping/includes/salesforce_mapping_object.admin.inc
@@ -136,7 +136,7 @@ function salesforce_mapping_object_form_validate($form, &$form_state) {
     $values['salesforce_id'] = $sf_object['Id'];
 
     // Check for existing mapping based on the Salesforce Id.
-    $mapping_object_sf = salesforce_mapping_object_load_by_sfid($values['salesforce_id'], TRUE);
+    $mapping_object_sf = salesforce_mapping_object_load_by_sfid($values['salesforce_id'], $mapping->drupal_bundle, TRUE);
 
     if ($mapping_object_sf &&
       (empty($mapping_object->salesforce_mapping_object_id) || $mapping_object_sf->salesforce_mapping_object_id != $mapping_object->salesforce_mapping_object_id)) {
@@ -366,6 +366,10 @@ function salesforce_mapping_object_overview_page() {
       'data' => t('Salesforce object'),
       'field' => 'salesforce_id',
     ),
+    'entity_bundle' => array(
+      'data' => t('Entity bundle'),
+      'field' => 'entity_bundle',
+    ),
     'last_sync_action' => array(
       'data' => t('Action'),
       'field' => 'last_sync_action',
diff --git a/modules/salesforce_mapping/includes/salesforce_mapping_object.controller.inc b/modules/salesforce_mapping/includes/salesforce_mapping_object.controller.inc
index 3684238..b878ab8 100644
--- a/modules/salesforce_mapping/includes/salesforce_mapping_object.controller.inc
+++ b/modules/salesforce_mapping/includes/salesforce_mapping_object.controller.inc
@@ -11,6 +11,17 @@
 class SalesforceMappingObjectController extends EntityAPIController {
 
   /**
+   * Implements EntityAPIControllerInterface save.
+   */
+  public function save($entity) {
+    if (!isset($entity->entity_bundle)) {
+      $wrapper = entity_metadata_wrapper($entity->entity_type, $entity->entity_id);
+      $entity->entity_bundle = $wrapper->getBundle();
+    }
+    return parent::save($entity);
+  }
+
+  /**
    * Override to include revision history and select properties.
    */
   public function buildContent($entity, $view_mode = 'full', $langcode = NULL, $content = array()) {
@@ -18,6 +29,7 @@ class SalesforceMappingObjectController extends EntityAPIController {
 
     $render_props = array(
       'salesforce_id',
+      'entity_bundle',
       'last_sync_message',
       'last_sync_action',
       'last_sync_status',
@@ -51,6 +63,10 @@ class SalesforceMappingObjectController extends EntityAPIController {
         'data' => t('Salesforce object'),
         'field' => 'salesforce_id',
       ),
+      'entity_bundle' => array(
+        'data' => t('Entity bundle'),
+        'field' => 'entity_bundle',
+      ),
       'last_sync_action' => array(
         'data' => t('Action'),
         'field' => 'last_sync_action',
@@ -80,4 +96,5 @@ class SalesforceMappingObjectController extends EntityAPIController {
 
     return $build;
   }
+
 }
diff --git a/modules/salesforce_mapping/includes/salesforce_mapping_object.entity.inc b/modules/salesforce_mapping/includes/salesforce_mapping_object.entity.inc
index 34a00d1..5ed7dc3 100644
--- a/modules/salesforce_mapping/includes/salesforce_mapping_object.entity.inc
+++ b/modules/salesforce_mapping/includes/salesforce_mapping_object.entity.inc
@@ -17,6 +17,7 @@ class SalesforceMappingObject extends Entity {
     $salesforce_id,
     $entity_id,
     $entity_type,
+    $entity_bundle,
     $created,
     $entity_updated,
     $last_sync,
diff --git a/modules/salesforce_mapping/salesforce_mapping.install b/modules/salesforce_mapping/salesforce_mapping.install
index c042cf6..61a71a7 100644
--- a/modules/salesforce_mapping/salesforce_mapping.install
+++ b/modules/salesforce_mapping/salesforce_mapping.install
@@ -187,6 +187,13 @@ function salesforce_mapping_schema() {
         'not null' => TRUE,
         'default' => '',
       ),
+      'entity_bundle' => array(
+        'description' => 'Drupal entity bundle.',
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+      ),
       'created' => array(
         'description' => 'The Unix timestamp when the object mapping was created.',
         'type' => 'int',
@@ -229,11 +236,11 @@ function salesforce_mapping_schema() {
     'primary key' => array('salesforce_mapping_object_id'),
     'indexes' => array(
       'drupal_entity' => array('entity_type', 'entity_id'),
-      'salesforce_object' => array('salesforce_id'),
+      'salesforce_object' => array('salesforce_id', 'entity_bundle'),
       'salesforce_mapping_object_revision' => array('revision_id'),
     ),
     'unique keys' => array(
-      'salesforce' => array('salesforce_id'),
+      'salesforce' => array('salesforce_id', 'entity_bundle'),
       'salesforce_drupal' => array('entity_type', 'entity_id'),
       'revision_id' => array('revision_id'),
     ),
@@ -282,6 +289,13 @@ function salesforce_mapping_schema() {
         'not null' => TRUE,
         'default' => '',
       ),
+      'entity_bundle' => array(
+        'description' => 'Drupal entity bundle.',
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+      ),
       'created' => array(
         'description' => 'The Unix timestamp when the object mapping was created.',
         'type' => 'int',
@@ -324,7 +338,7 @@ function salesforce_mapping_schema() {
     'primary key' => array('revision_id'),
     'indexes' => array(
       'drupal_entity' => array('entity_type', 'entity_id'),
-      'salesforce_object' => array('salesforce_id'),
+      'salesforce_object' => array('salesforce_id', 'entity_bundle'),
       'salesforce_mapping_object_id' => array('salesforce_mapping_object_id'),
     ),
     'foreign keys' => array(
@@ -636,4 +650,4 @@ function salesforce_mapping_update_7304(&$sandbox) {
 function salesforce_mapping_update_7305(&$sandbox) {
   db_drop_field('salesforce_mapping', 'updated');
   cache_clear_all('schema', 'cache');
-}
\ No newline at end of file
+}
diff --git a/modules/salesforce_mapping/salesforce_mapping.module b/modules/salesforce_mapping/salesforce_mapping.module
index 0c66fc7..976e506 100644
--- a/modules/salesforce_mapping/salesforce_mapping.module
+++ b/modules/salesforce_mapping/salesforce_mapping.module
@@ -441,9 +441,10 @@ function salesforce_mapping_object_load_by_drupal($entity_type, $entity_id, $res
  * @return array
  *   Entities that match the given $salesforce_id.
  */
-function salesforce_mapping_object_load_by_sfid($salesforce_id, $reset = FALSE) {
+function salesforce_mapping_object_load_by_sfid($salesforce_id, $bundle, $reset = FALSE) {
   $conditions = array(
     'salesforce_id' => $salesforce_id,
+    'entity_bundle' => $bundle
   );
   return salesforce_mapping_object_load(FALSE, $conditions, $reset);
 }
diff --git a/modules/salesforce_pull/salesforce_pull.module b/modules/salesforce_pull/salesforce_pull.module
index 8742bfb..9bedc98 100644
--- a/modules/salesforce_pull/salesforce_pull.module
+++ b/modules/salesforce_pull/salesforce_pull.module
@@ -107,6 +107,8 @@ function salesforce_pull_get_updated_records() {
       $soql->addCondition('LastModifiedDate', $last_sync, '>');
     }
 
+    drupal_alter("salesforce_pre_query", $soql, $mapping);
+
     // If Record Type is specified, restrict query.
     if (count($mapped_record_types) > 0) {
       $soql->addCondition('RecordTypeId', $mapped_record_types, 'IN');
@@ -162,7 +164,7 @@ function salesforce_pull_process_records($sf_object) {
 
   foreach ($sf_mappings as $sf_mapping) {
     // Mapping object exists?
-    $mapping_object = salesforce_mapping_object_load_by_sfid($sf_object['Id']);
+    $mapping_object = salesforce_mapping_object_load_by_sfid($sf_object['Id'], $sf_mapping->drupal_bundle);
     $exists = $mapping_object ? TRUE : FALSE;
     if ($exists && ($sf_mapping->sync_triggers & SALESFORCE_MAPPING_SYNC_SF_UPDATE)) {
       try {
@@ -287,6 +289,7 @@ function salesforce_pull_process_records($sf_object) {
       $mapping_object = entity_create('salesforce_mapping_object', array(
         'salesforce_id' => $sf_object['Id'],
         'entity_type' => $sf_mapping->drupal_entity_type,
+        'entity_bundle' => $sf_mapping->drupal_bundle,
         'entity_id' => $entity_id,
         'entity_updated' => $entity_updated,
         'last_sync' => time(),
@@ -403,6 +406,7 @@ function salesforce_pull_process_deleted_records() {
  *   sObject of the Salesforce record.
  */
 function salesforce_pull_map_fields($field_maps, &$entity_wrapper, $sf_object) {
+  drupal_alter('salesforce_pull_entity_values', $entity_wrapper, $field_maps, $sf_object);
   foreach ($field_maps as $field_map) {
     if ($field_map['direction'] == 'sync' || $field_map['direction'] == 'sf_drupal') {
 
diff --git a/modules/salesforce_push/salesforce_push.module b/modules/salesforce_push/salesforce_push.module
index 7e711c1..8bb38d8 100644
--- a/modules/salesforce_push/salesforce_push.module
+++ b/modules/salesforce_push/salesforce_push.module
@@ -177,6 +177,7 @@ function salesforce_push_sync_rest($entity_type, $entity, $mapping, $sf_sync_tri
       $mapped_objects = entity_create('salesforce_mapping_object', array(
         'entity_id' => $entity_id,
         'entity_type' => $entity_type,
+        'entity_bundle' => $mapping->entity_bundle,
         'salesforce_id' => $data['id'],
         'last_sync_message' => t('Mapping object created via !function.', array('!function' => __FUNCTION__)),
         'last_sync_status' => SALESFORCE_MAPPING_STATUS_SUCCESS,
@@ -389,6 +390,7 @@ function salesforce_push_process_soap_results($op, $results, $synced_entities) {
           $mapped_objects = entity_create('salesforce_mapping_object', array(
             'entity_id' => $entity_id,
             'entity_type' => $wrapper->type(),
+            'entity_bundle' => $wrapper->getBundle(),
             'salesforce_id' => $result->id,
             'last_sync_message' => t('Mapping object created via !function.', array('!function' => __FUNCTION__)),
           ));
diff --git a/salesforce.api.php b/salesforce.api.php
index f8dd4bf..c8ef166 100644
--- a/salesforce.api.php
+++ b/salesforce.api.php
@@ -86,6 +86,20 @@ function hook_salesforce_pull_entity_value_alter(&$value, $field_map, $sf_object
 }
 
 /**
+ * Alter values mapped to an entity from a Salesforce object.
+ *
+ * @param array $field_maps
+ *   Array of field maps.
+ * @param object $entity_wrapper
+ *   Entity wrapper object.
+ * @param object $sf_object
+ *   sObject of the Salesforce record.
+ */
+function hook_salesforce_pull_entity_values_alter(&$entity_wrapper, &$field_maps, $sf_object) {
+
+}
+
+/**
  * Alter a SOQL select query before it is executed.
  *
  * @param SalesforceSelectQuery $query
