diff --git a/modules/salesforce_mapping/salesforce_mapping.module b/modules/salesforce_mapping/salesforce_mapping.module
index 938c6ddc493b15e3dc7c98da5910543aa74a5a0f..5a987a598e1778eda0d2bed1047c6d06f1f9073e 100644
--- a/modules/salesforce_mapping/salesforce_mapping.module
+++ b/modules/salesforce_mapping/salesforce_mapping.module
@@ -316,8 +316,9 @@ function salesforce_mapping_entity_view(array &$build, EntityInterface $entity,
 /**
  * Implements hook_field_extra_fields().
  */
-function salesforce_mapping_field_extra_fields() {
+function salesforce_mapping_entity_extra_field_info() {
   // Include Salesforce data for mapped entities.
+  // @TODO: these don't actually show up on the entity view. Have to implement hook_entity_view as well?
   $extra = [];
   $mappings = salesforce_mapping_load_multiple();
   foreach ($mappings as $mapping) {
@@ -345,57 +346,28 @@ function salesforce_mapping_field_extra_fields() {
  * Ensures drupal entity has an update timestamp.
  */
 function salesforce_mapping_entity_update(EntityInterface $entity) {
-  // @TODO: update this. it is broked.
-  return;
-  // Check if mapping exists.
-
-  if (!salesforce_mapping_load_by_drupal($entity->getEntityTypeId())) {
-    return;
-  }
-  $sf_mapped_object = salesforce_mapped_object_load_by_entity($entity);
-  if ($sf_mapped_object) {
-    // Triggering the sf mapping's save callback updates its timestamp.
-    $sf_mapped_object->entity_updated = $entity->changed;
-    $sf_mapped_object->save();
+  // Check for mappings (much faster than looking for mapped objects.)
+  try {
+    salesforce_mapping_load_by_drupal($entity->getEntityTypeId());
   }
-}
-
-/**
- * Get the Salesforce fieldmap types array.
- *
- * @see hook_salesforce_mapping_fieldmap_type()
- * @see hook_salesforce_mapping_fieldmap_type_alter()
- *
- * @param string $fieldmap_type
- *   The fieldmap type, e.g. property, for which the info shall be returned, or
- *   NULL to return an array with info about all types.
- */
-function salesforce_mapping_get_fieldmap_types($fieldmap_type = NULL) {
-  // Use the advanced drupal_static() pattern, since this is called very often.
-  static $drupal_static_fast;
-  if (!isset($drupal_static_fast)) {
-    $drupal_static_fast['salesforce_fieldmap_type'] = & drupal_static(__FUNCTION__);
+  catch (Exception $e) {
+    return;
   }
-  $salesforce_fieldmap_type = & $drupal_static_fast['salesforce_fieldmap_type'];
-
-  if (empty($salesforce_fieldmap_type)) {
-    if ($cache = cache()->get('salesforce:fieldmap_type')) {
-      $salesforce_fieldmap_type = $cache->data;
-    }
-    else {
-      $salesforce_fieldmap_type = module_invoke_all('salesforce_mapping_fieldmap_type');
 
-      // Let other modules alter the fieldmap type.
-      drupal_alter('salesforce_fieldmap_type', $salesforce_fieldmap_type);
-      cache()->set('salesforce:fieldmap_type', $salesforce_fieldmap_type, CacheBackendInterface::CACHE_PERMANENT, ['salesforce' => TRUE]);
-
-    }
+  // If mappings, check for mapped objects.
+  try {
+    $mapped_objects = salesforce_mapped_object_load_by_drupal($entity->getEntityTypeId(), $entity->id());
+    dpm($mapped_objects);
   }
-
-  if (empty($fieldmap_type)) {
-    return $salesforce_fieldmap_type;
+  catch (Exception $e) {
+    return;
   }
-  elseif (isset($salesforce_fieldmap_type[$fieldmap_type])) {
-    return $salesforce_fieldmap_type[$fieldmap_type];
+  foreach ($mapped_objects as $mapped_object) {
+    // Resaving the object should update the timestamp.
+    // NB: we are purposefully not creating a new revision here.
+    $mapped_object
+      ->set('entity_updated', REQUEST_TIME)
+      ->save();
   }
 }
+
diff --git a/modules/salesforce_mapping/src/Entity/MappedObject.php b/modules/salesforce_mapping/src/Entity/MappedObject.php
index 0a34d02582ac3868e9c3fe3166d02df0d2162df1..5c3a64a0cb5ef6f248e8de25faf59b37e461d740 100644
--- a/modules/salesforce_mapping/src/Entity/MappedObject.php
+++ b/modules/salesforce_mapping/src/Entity/MappedObject.php
@@ -68,6 +68,7 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject
   }
 
   public function save() {
+    $this->changed = REQUEST_TIME;
     if ($this->isNew()) {
       $this->created = REQUEST_TIME;
     }
@@ -290,6 +291,9 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject
     if ($result instanceof SFID) {
       $this->set('salesforce_id', (string)$result);
     }
+
+    // @TODO setNewRevision not chainable, per https://www.drupal.org/node/2839075
+    $this->setNewRevision(TRUE);
     $this
       ->set('last_sync_action', 'push_' . $action)
       ->set('last_sync_status', TRUE)
@@ -302,6 +306,7 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject
     $client = \Drupal::service('salesforce.client');
     $mapping = $this->salesforce_mapping->entity;
     $client->objectDelete($mapping->getSalesforceObjectType(), $this->sfid());
+    $this->setNewRevision(TRUE);
     $this
       ->set('last_sync_action', 'push_delete')
       ->set('last_sync_status', TRUE)
diff --git a/modules/salesforce_mapping/src/Entity/SalesforceMapping.php b/modules/salesforce_mapping/src/Entity/SalesforceMapping.php
index a5b7420bae216be849ffd7f2e067cda2642c8280..fac7ff32916f4df40a32aa596721e4609f78906a 100644
--- a/modules/salesforce_mapping/src/Entity/SalesforceMapping.php
+++ b/modules/salesforce_mapping/src/Entity/SalesforceMapping.php
@@ -161,6 +161,10 @@ class SalesforceMapping extends ConfigEntityBase implements SalesforceMappingInt
     $this->fieldManager = \Drupal::service('plugin.manager.salesforce_mapping_field');
   }
 
+  public function __get($key) {
+    return $this->$key;
+  }
+
   /**
    * Save the entity.
    *
diff --git a/modules/salesforce_mapping/src/Form/MappedObjectForm.php b/modules/salesforce_mapping/src/Form/MappedObjectForm.php
index 1466e4ac697d835fac05168a2c870cd4da826f96..4c3c9d27587cd43cc6df78d1cb4275013f78a27a 100644
--- a/modules/salesforce_mapping/src/Form/MappedObjectForm.php
+++ b/modules/salesforce_mapping/src/Form/MappedObjectForm.php
@@ -67,6 +67,15 @@ class MappedObjectForm extends ContentEntityForm {
     // Include the parent entity on the form.
     $form = parent::buildForm($form, $form_state);
     $url_params = \Drupal::routeMatch()->getParameters();
+    $drupal_entity = $this->getDrupalEntityFromUrl();
+    // Allow exception to bubble up here, because we shouldn't have got here if
+    // there isn't a mapping.
+
+    $mappings = salesforce_mapping_load_by_drupal($drupal_entity->getEntityTypeId());
+    $options = array_keys($mappings) + ['_none'];
+    // Filter options based on drupal entity type.
+    $form['salesforce_mapping']['widget']['#options'] = array_intersect_key($form['salesforce_mapping']['widget']['#options'], array_flip($options));
+    
     $form['salesforce_mapping']['widget']['#reqiured'] = TRUE;
     $form['actions']['push'] = [
       '#type' => 'submit',
@@ -140,9 +149,9 @@ class MappedObjectForm extends ContentEntityForm {
     }
 
     // Pull from SF.
-    $mapped_object
-      ->pull()
-      ->save();
+    $mapped_object->pull();
+    $mapped_object->setNewRevision(TRUE);
+    $mapped_object->save();
 
     // @TODO: more verbose feedback for successful pull.
     drupal_set_message('Pull successful.');