diff --git a/modules/salesforce_address/salesforce_address.info.yml b/modules/salesforce_address/salesforce_address.info.yml
index 2567ac9a5e30b8de743004c1cde2dc002e3671d5..6721c7ed3fc68578802cf83f09b2e0702762cb9b 100644
--- a/modules/salesforce_address/salesforce_address.info.yml
+++ b/modules/salesforce_address/salesforce_address.info.yml
@@ -1,7 +1,7 @@
 name: Salesforce Address
 type: module
 description: A custom Address Field Widget for Salesforce compatibility.
-core_version_requirement: ^9 || ^10
+core_version_requirement: ^10.1
 package: Salesforce
 dependencies:
   - address:address
diff --git a/modules/salesforce_example/salesforce_example.info.yml b/modules/salesforce_example/salesforce_example.info.yml
index 3a0e260e917941760350e019bfb94c275f69a5f9..4d627d16c0f3373e95328c197510b74188458f0f 100644
--- a/modules/salesforce_example/salesforce_example.info.yml
+++ b/modules/salesforce_example/salesforce_example.info.yml
@@ -1,7 +1,7 @@
 name: Salesforce Example
 type: module
 description: Salesforce Examples
-core_version_requirement: ^9 || ^10
+core_version_requirement: ^10.1
 package: Salesforce
 dependencies:
   - salesforce:salesforce_push
diff --git a/modules/salesforce_jwt/salesforce_jwt.info.yml b/modules/salesforce_jwt/salesforce_jwt.info.yml
index 56bf92876f47dc596f45f7886ac52f3a4ccc59bc..c8d1058ebce445b62fa5e4820b229ff2196c28a0 100644
--- a/modules/salesforce_jwt/salesforce_jwt.info.yml
+++ b/modules/salesforce_jwt/salesforce_jwt.info.yml
@@ -1,7 +1,7 @@
 name: Salesforce JWT Auth Provider
 type: module
 description: Provides key-based Salesforce authentication.
-core_version_requirement: ^9 || ^10
+core_version_requirement: ^10.1
 package: Salesforce
 configure: salesforce.auth_config
 dependencies:
diff --git a/modules/salesforce_logger/salesforce_logger.info.yml b/modules/salesforce_logger/salesforce_logger.info.yml
index ef85f72de8d985335578b504025f70d06b15b66c..fe44e091ec81a0055631da64318d8c912ceaea36 100644
--- a/modules/salesforce_logger/salesforce_logger.info.yml
+++ b/modules/salesforce_logger/salesforce_logger.info.yml
@@ -1,7 +1,7 @@
 name: Salesforce Logger
 type: module
 description: Consolidated logging for Salesforce Log events.
-core_version_requirement: ^9 || ^10
+core_version_requirement: ^10.1
 package: Salesforce
 configure: salesforce_logger.settings
 dependencies:
diff --git a/modules/salesforce_mapping/salesforce_mapping.info.yml b/modules/salesforce_mapping/salesforce_mapping.info.yml
index 13fc08b55020743e8bb1bf14a0ea0f8b158ce8f6..e76df63e1319819932365917e084c19de785ffd0 100644
--- a/modules/salesforce_mapping/salesforce_mapping.info.yml
+++ b/modules/salesforce_mapping/salesforce_mapping.info.yml
@@ -2,7 +2,7 @@ name: Salesforce Mapping
 type: module
 description: Map Drupal entities to Salesforce objects.
 package: Salesforce
-core_version_requirement: ^9 || ^10
+core_version_requirement: ^10.1
 dependencies:
   - salesforce:salesforce
   - dynamic_entity_reference:dynamic_entity_reference
diff --git a/modules/salesforce_mapping/src/Entity/MappedObject.php b/modules/salesforce_mapping/src/Entity/MappedObject.php
index 9e8606099c33cf526283b994f2d6f3b74ce6acc5..b3d6e5b0377413504ac017b946c3fc0625bfd90c 100644
--- a/modules/salesforce_mapping/src/Entity/MappedObject.php
+++ b/modules/salesforce_mapping/src/Entity/MappedObject.php
@@ -23,6 +23,7 @@ use Drupal\salesforce_mapping\Event\SalesforcePushParamsEvent;
 use Drupal\salesforce_mapping\MappingConstants;
 use Drupal\salesforce_mapping\Plugin\Field\FieldType\SalesforceLinkItemList;
 use Drupal\salesforce_mapping\PushParams;
+use Drupal\user\Entity\User;
 
 /**
  * Defines a Salesforce Mapped Object entity class.
@@ -40,6 +41,9 @@ use Drupal\salesforce_mapping\PushParams;
  *     "view_builder" = "Drupal\Core\Entity\EntityViewBuilder",
  *     "views_data" = "Drupal\views\EntityViewsData",
  *     "access" = "Drupal\salesforce_mapping\MappedObjectAccessControlHandler",
+ *     "route_provider" = {
+ *       "revision" = "Drupal\Core\Entity\Routing\RevisionHtmlRouteProvider"
+ *     },
  *   },
  *   base_table = "salesforce_mapped_object",
  *   revision_table = "salesforce_mapped_object_revision",
@@ -105,24 +109,6 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject
     parent::__construct($values, 'salesforce_mapped_object');
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function preSaveRevision(EntityStorageInterface $storage, \stdClass $record) {
-    // Revision uid, timestamp, and message are required for D9.
-    if ($this->isNewRevision()) {
-      if (empty($this->getRevisionUserId())) {
-        $this->setRevisionUserId(1);
-      }
-      if (empty($this->getRevisionCreationTime())) {
-        $this->setRevisionCreationTime(time());
-      }
-      if (empty($this->getRevisionLogMessage())) {
-        $this->setRevisionLogMessage('New revision');
-      }
-    }
-  }
-
   /**
    * {@inheritdoc}
    */
@@ -131,6 +117,11 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject
     if ($this->isNew()) {
       $this->created = $this->getRequestTime();
     }
+    if ($this->isNewRevision()) {
+      $this
+        ->setRevisionCreationTime($this->getRequestTime())
+        ->setRevisionUserId($this->getCurrentUserId());
+    }
     return parent::save();
   }
 
@@ -474,6 +465,7 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject
     $this
       ->set('last_sync_action', 'push_delete')
       ->set('last_sync_status', TRUE)
+      ->set('revision_log_message', '')
       ->save();
     return $this;
   }
@@ -600,19 +592,60 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject
     $drupal_entity->setSyncing(TRUE);
     $drupal_entity->save();
 
+    $this->setNewRevision(TRUE);
+
     // Update mapping object.
     $this->setNewRevision(TRUE);
     $this
       ->set('drupal_entity', $drupal_entity)
       ->set('entity_updated', $this->getRequestTime())
-      ->set('last_sync_action', 'pull')
+      ->set('last_sync_action', $this->isNew() ? 'pull_create' : 'pull_update')
       ->set('last_sync_status', TRUE)
       ->set('force_pull', 0)
+      ->set('revision_log_message', '')
       ->save();
 
     return $this;
   }
 
+  /**
+   * {@inheritDoc}
+   */
+  public function getRevisionLogMessage() {
+    return parent::getRevisionLogMessage() ?: $this->last_sync_action->value;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public function getRevisionUserId() {
+    return parent::getRevisionUserId() ?: 1;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public function getRevisionUser() {
+    return parent::getRevisionuser() ?: User::load(1);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public function getRevisionCreationTime() {
+    return parent::getRevisionCreationTime() ?: $this->entity_updated->value;
+  }
+
+  /**
+   * Testable func to return current user id.
+   *
+   * @return int
+   *   The current user id.
+   */
+  protected function getCurrentUserId() {
+    return \Drupal::currentUser()->id();
+  }
+
   /**
    * Testable func to return the request time server variable.
    *
diff --git a/modules/salesforce_mapping_ui/salesforce_mapping_ui.info.yml b/modules/salesforce_mapping_ui/salesforce_mapping_ui.info.yml
index 57e038f7cac1f211540f8e6fb3b92d0795c735bd..5553921fbe7f755f32c613cc0d1dcbd2ea359b14 100644
--- a/modules/salesforce_mapping_ui/salesforce_mapping_ui.info.yml
+++ b/modules/salesforce_mapping_ui/salesforce_mapping_ui.info.yml
@@ -2,7 +2,7 @@ name: Salesforce Mapping UI
 type: module
 description: User interface for managing Salesforce mappings.
 package: Salesforce
-core_version_requirement: ^9 || ^10
+core_version_requirement: ^10.1
 configure: entity.salesforce_mapping.list
 dependencies:
   - salesforce:salesforce_mapping
diff --git a/modules/salesforce_mapping_ui/salesforce_mapping_ui.module b/modules/salesforce_mapping_ui/salesforce_mapping_ui.module
index 5935eca46b004312ec2e1413440ab026e175500c..deb5e1dc077d07d28cb953c38c72b9ba8cbf645b 100644
--- a/modules/salesforce_mapping_ui/salesforce_mapping_ui.module
+++ b/modules/salesforce_mapping_ui/salesforce_mapping_ui.module
@@ -58,6 +58,7 @@ function salesforce_mapping_ui_entity_type_alter(array &$entity_types) {
   $entity_types['salesforce_mapped_object']->setLinkTemplate('edit-form', '/admin/content/salesforce/{salesforce_mapped_object}/edit');
   $entity_types['salesforce_mapped_object']->setLinkTemplate('delete-form', '/admin/content/salesforce/{salesforce_mapped_object}/delete');
   $entity_types['salesforce_mapped_object']->setLinkTemplate('canonical', '/admin/content/salesforce/{salesforce_mapped_object}');
+  $entity_types['salesforce_mapped_object']->setLinkTemplate('version-history', '/admin/content/salesforce/{salesforce_mapped_object}/revisions');
 }
 
 /**
diff --git a/modules/salesforce_oauth/salesforce_oauth.info.yml b/modules/salesforce_oauth/salesforce_oauth.info.yml
index aa589a0f628774d666ac17a76768d61cb05af3ab..d0989070df2509ef1bc8933731d3998f1983298c 100644
--- a/modules/salesforce_oauth/salesforce_oauth.info.yml
+++ b/modules/salesforce_oauth/salesforce_oauth.info.yml
@@ -1,7 +1,7 @@
 name: Salesforce OAuth user-agent Provider
 type: module
 description: Provides user-agent-based Salesforce OAuth authentication.
-core_version_requirement: ^9 || ^10
+core_version_requirement: ^10.1
 package: Salesforce
 configure: salesforce.auth_config
 dependencies:
diff --git a/modules/salesforce_pull/salesforce_pull.info.yml b/modules/salesforce_pull/salesforce_pull.info.yml
index c93ae4ea9c48c0090ad1cd5f2d3bab04d051daf6..d5465efe8807102235c61ac6806670a80cfe98d5 100644
--- a/modules/salesforce_pull/salesforce_pull.info.yml
+++ b/modules/salesforce_pull/salesforce_pull.info.yml
@@ -2,6 +2,6 @@ name: Salesforce Pull
 type: module
 description: Imports objects from Salesforce based on mappings defined in Salesforce Mapping.
 package: Salesforce
-core_version_requirement: ^9 || ^10
+core_version_requirement: ^10.1
 dependencies:
   - salesforce:salesforce_mapping
diff --git a/modules/salesforce_pull/src/Plugin/QueueWorker/PullBase.php b/modules/salesforce_pull/src/Plugin/QueueWorker/PullBase.php
index 6950cbaa26a73fc448c94a84571ceb554c7158cf..8cfdeff4b98bbc84d9b93f89766301b2f1bddfb3 100644
--- a/modules/salesforce_pull/src/Plugin/QueueWorker/PullBase.php
+++ b/modules/salesforce_pull/src/Plugin/QueueWorker/PullBase.php
@@ -224,9 +224,18 @@ abstract class PullBase extends QueueWorkerBase implements ContainerFactoryPlugi
     }
     catch (\Exception $e) {
       $this->eventDispatcher->dispatch(new SalesforceErrorEvent($e, 'Failed to update entity %label from Salesforce object %sfobjectid.', [
-        '%label' => $entity->label(),
+        '%label' => (isset($entity)) ? $entity->label() : "Unknown",
         '%sfobjectid' => (string) $sf_object->id(),
       ]), SalesforceEvents::WARNING);
+
+      $mapped_object->setNewRevision(TRUE);
+      // Update mapped object.
+      $mapped_object
+        ->set('last_sync_action', 'pull_update')
+        ->set('last_sync_status', FALSE)
+        ->set('revision_log_message', $e->getMessage())
+        ->save();
+
       // Throwing a new exception keeps current item in cron queue.
       throw $e;
     }
diff --git a/modules/salesforce_push/salesforce_push.info.yml b/modules/salesforce_push/salesforce_push.info.yml
index c453d48de80216604dda21b635a6c47339867656..8167436f856477db7ced9e39e2d12daab2c98ee2 100644
--- a/modules/salesforce_push/salesforce_push.info.yml
+++ b/modules/salesforce_push/salesforce_push.info.yml
@@ -2,6 +2,6 @@ name: Salesforce Push
 type: module
 description: Push data to Salesforce when updates are made to Drupal entities.
 package: Salesforce
-core_version_requirement: ^9 || ^10
+core_version_requirement: ^10.1
 dependencies:
   - salesforce:salesforce_mapping
diff --git a/modules/salesforce_push/salesforce_push.module b/modules/salesforce_push/salesforce_push.module
index 251abdf6397f1d26a87a40fded88482019c37f3b..ffb8d1f8a8974f24db93da57dbe626df394c3fb3 100644
--- a/modules/salesforce_push/salesforce_push.module
+++ b/modules/salesforce_push/salesforce_push.module
@@ -188,6 +188,7 @@ function salesforce_push_entity_crud_mapping(EntityInterface $entity, $op, Sales
 
     if (!$mapped_object->isNew()) {
       // Only update existing mapped objects.
+      $mapped_object->setNewRevision(TRUE);
       $mapped_object
         ->set('last_sync_action', $op)
         ->set('last_sync_status', FALSE)
diff --git a/modules/salesforce_soap/salesforce_soap.info.yml b/modules/salesforce_soap/salesforce_soap.info.yml
index 3c6e52637e5a82853aea56cd03fe3208e2d7738e..fa5ed25707529c0aa692ebe9bdee4a32ac785b49 100644
--- a/modules/salesforce_soap/salesforce_soap.info.yml
+++ b/modules/salesforce_soap/salesforce_soap.info.yml
@@ -2,6 +2,6 @@ name: Salesforce Soap
 type: module
 description: Exposes a SoapClient service for communicating with the Salesforce SOAP API.
 package: Salesforce
-core_version_requirement: ^9 || ^10
+core_version_requirement: ^10.1
 dependencies:
   - salesforce:salesforce
diff --git a/modules/salesforce_webform/salesforce_webform.info.yml b/modules/salesforce_webform/salesforce_webform.info.yml
index c7e28be8bfaf82d158f1fd6bce1adf38737ee744..d9ef1a510c6b9bb65a00f38dced1b5d5419adcb1 100644
--- a/modules/salesforce_webform/salesforce_webform.info.yml
+++ b/modules/salesforce_webform/salesforce_webform.info.yml
@@ -2,7 +2,7 @@ name: Salesforce Webform
 type: module
 description: Adds support for webforms fields in Salesforce Mapping.
 package: Salesforce
-core_version_requirement: ^9 || ^10
+core_version_requirement: ^10.1
 
 dependencies:
   - salesforce:salesforce_mapping
diff --git a/salesforce.info.yml b/salesforce.info.yml
index d48a7cd122d5912a6f910a81cebe2778316b6b9c..1f2f7c78365f5452defe791bc4ced26ec103edc7 100644
--- a/salesforce.info.yml
+++ b/salesforce.info.yml
@@ -2,5 +2,5 @@ name: Salesforce Integration
 type: module
 description: Modules to integrate Drupal and Salesforce
 package: Salesforce
-core_version_requirement: ^9 || ^10
+core_version_requirement: ^10.1
 configure: salesforce.admin_config_salesforce
diff --git a/tests/modules/salesforce_test_rest_client/salesforce_test_rest_client.info.yml b/tests/modules/salesforce_test_rest_client/salesforce_test_rest_client.info.yml
index 5427d74ca2e108ab56ca36885eb2bd76edbb723e..9c2805c1c2f2afde53785d65fb2e602c57e7feca 100644
--- a/tests/modules/salesforce_test_rest_client/salesforce_test_rest_client.info.yml
+++ b/tests/modules/salesforce_test_rest_client/salesforce_test_rest_client.info.yml
@@ -2,6 +2,6 @@ name: 'Salesforce Test Rest Client'
 type: module
 description: 'Provides a dummy Rest Client for functional tests.'
 package: Testing
-core_version_requirement: ^9 || ^10
+core_version_requirement: ^10.1
 dependencies:
   - salesforce:salesforce