diff --git a/README.txt b/README.txt
index a76dd0d..9180a9e 100644
--- a/README.txt
+++ b/README.txt
@@ -54,6 +54,19 @@ usage of entities on your site.
 Go to the URL /admin/config/entity-usage/batch-update in order to start the
 batch operation.
 
+Tracking via queue
+============
+The module support tracking entity usage via a queue. When the entity usage is
+tracked via a queue, the tracking information will be updated when cron runs.
+This means some references between entities could be missing. Only use this setting
+when you are sure there are no automatic processes using the tracking information
+to update or delete content.
+
+Since this is for advanced users only, this setting is not exposed in the UI.
+This can be enabled through the settings.php by adding the following line:
+
+$config['entity_usage.settings']['queue_tracking'] = TRUE;
+
 Project page and Online handbook
 ================================
 
diff --git a/entity_usage.module b/entity_usage.module
index 2dd3f72..3f358cf 100644
--- a/entity_usage.module
+++ b/entity_usage.module
@@ -31,35 +31,80 @@ function entity_usage_help($route_name, RouteMatchInterface $route_match) {
  * Implements hook_entity_insert().
  */
 function entity_usage_entity_insert(EntityInterface $entity) {
-  \Drupal::service('entity_usage.entity_update_manager')->trackUpdateOnCreation($entity);
+  if (\Drupal::configFactory()->get('entity_usage.settings')->get('queue_tracking')) {
+    \Drupal::queue('entity_usage_tracker')->createItem([
+      'operation' => 'insert',
+      'entity_type' => $entity->getEntityTypeId(),
+      'entity_id' => $entity->id(),
+    ]);
+  }
+  else {
+    \Drupal::service('entity_usage.entity_update_manager')->trackUpdateOnCreation($entity);
+  }
 }
 
 /**
  * Implements hook_entity_update().
  */
 function entity_usage_entity_update(EntityInterface $entity) {
-  \Drupal::service('entity_usage.entity_update_manager')->trackUpdateOnEdition($entity);
+  if (\Drupal::configFactory()->get('entity_usage.settings')->get('queue_tracking')) {
+    \Drupal::queue('entity_usage_tracker')->createItem([
+      'operation' => 'update',
+      'entity_type' => $entity->getEntityTypeId(),
+      'entity_id' => $entity->id(),
+    ]);
+  }
+  else {
+    \Drupal::service('entity_usage.entity_update_manager')->trackUpdateOnEdition($entity);
+  }
 }
 
 /**
  * Implements hook_entity_predelete().
  */
 function entity_usage_entity_predelete(EntityInterface $entity) {
-  \Drupal::service('entity_usage.entity_update_manager')->trackUpdateOnDeletion($entity);
+  if (\Drupal::configFactory()->get('entity_usage.settings')->get('queue_tracking')) {
+    \Drupal::queue('entity_usage_tracker')->createItem([
+      'operation' => 'predelete',
+      'entity_type' => $entity->getEntityTypeId(),
+      'entity_id' => $entity->id(),
+    ]);
+  }
+  else {
+    \Drupal::service('entity_usage.entity_update_manager')->trackUpdateOnDeletion($entity);
+  }
 }
 
 /**
  * Implements hook_entity_translation_delete().
  */
 function entity_usage_entity_translation_delete(EntityInterface $translation) {
-  \Drupal::service('entity_usage.entity_update_manager')->trackUpdateOnDeletion($translation, 'translation');
+  if (\Drupal::configFactory()->get('entity_usage.settings')->get('queue_tracking')) {
+    \Drupal::queue('entity_usage_tracker')->createItem([
+      'operation' => 'translation_delete',
+      'entity_type' => $translation->getEntityTypeId(),
+      'entity_id' => $translation->id(),
+    ]);
+  }
+  else {
+    \Drupal::service('entity_usage.entity_update_manager')->trackUpdateOnDeletion($translation, 'translation');
+  }
 }
 
 /**
  * Implements hook_entity_revision_delete().
  */
 function entity_usage_entity_revision_delete(EntityInterface $entity) {
-  \Drupal::service('entity_usage.entity_update_manager')->trackUpdateOnDeletion($entity, 'revision');
+  if (\Drupal::configFactory()->get('entity_usage.settings')->get('queue_tracking')) {
+    \Drupal::queue('entity_usage_tracker')->createItem([
+      'operation' => 'revision_delete',
+      'entity_type' => $entity->getEntityTypeId(),
+      'entity_id' => $entity->id(),
+    ]);
+  }
+  else {
+    \Drupal::service('entity_usage.entity_update_manager')->trackUpdateOnDeletion($entity, 'revision');
+  }
 }
 
 /**
diff --git a/src/EntityUsageTrackBase.php b/src/EntityUsageTrackBase.php
index 34db9ad..cdefec6 100644
--- a/src/EntityUsageTrackBase.php
+++ b/src/EntityUsageTrackBase.php
@@ -160,6 +160,10 @@ abstract class EntityUsageTrackBase extends PluginBase implements EntityUsageTra
    * {@inheritdoc}
    */
   public function trackOnEntityUpdate(EntityInterface $source_entity) {
+    // We depend on $source_entity->original to do anything useful here.
+    if (empty($source_entity->original)) {
+      return;
+    }
     $trackable_field_types = $this->getApplicableFieldTypes();
     $fields = array_keys($this->getReferencingFields($source_entity, $trackable_field_types));
     foreach ($fields as $field_name) {
diff --git a/src/Plugin/QueueWorker/EntityUsageTracker.php b/src/Plugin/QueueWorker/EntityUsageTracker.php
new file mode 100644
index 0000000..dadc678
--- /dev/null
+++ b/src/Plugin/QueueWorker/EntityUsageTracker.php
@@ -0,0 +1,109 @@
+<?php
+
+namespace Drupal\entity_usage\Plugin\QueueWorker;
+
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\Core\Queue\QueueWorkerBase;
+use Drupal\entity_usage\EntityUpdateManager;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Processes the entity usage tracking via a queue.
+ *
+ * @QueueWorker(
+ *   id = "entity_usage_tracker",
+ *   title = @Translation("Entity usage tracker"),
+ *   cron = {"time" = 300}
+ * )
+ */
+class EntityUsageTracker extends QueueWorkerBase implements ContainerFactoryPluginInterface {
+
+  /**
+   * The entity type manager service.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * The entity usage update manager.
+   *
+   * @var \Drupal\entity_usage\EntityUpdateManager
+   */
+  protected $entityUsageUpdateManager;
+
+  /**
+   * Constructs a new class instance.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   Entity type manager service.
+   * @param \Drupal\entity_usage\EntityUpdateManager $entity_usage_update_manager
+   *   Entity usage update manager.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, EntityUpdateManager $entity_usage_update_manager) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->entityTypeManager = $entity_type_manager;
+    $this->entityUsageUpdateManager = $entity_usage_update_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('entity_type.manager'),
+      $container->get('entity_usage.entity_update_manager')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function processItem($data) {
+
+    $storage = $this->entityTypeManager->getStorage($data['entity_type']);
+
+    if (!$storage) {
+      return;
+    }
+
+    $entity = $storage->load($data['entity_id']);
+
+    if (!$entity) {
+      return;
+    }
+
+    switch ($data['operation']) {
+      case 'insert':
+        $this->entityUsageUpdateManager->trackUpdateOnCreation($entity);
+        break;
+
+      case 'update':
+        $this->entityUsageUpdateManager->trackUpdateOnEdition($entity);
+        break;
+
+      case 'predelete':
+        $this->entityUsageUpdateManager->trackUpdateOnDeletion($entity);
+        break;
+
+      case 'translation_delete':
+        $this->entityUsageUpdateManager->trackUpdateOnDeletion($entity, 'translation');
+        break;
+
+      case 'revision_delete':
+        $this->entityUsageUpdateManager->trackUpdateOnDeletion($entity, 'revision');
+        break;
+    }
+  }
+
+}
