diff --git a/entity_usage.services.yml b/entity_usage.services.yml
index e43c47a..b9f77cf 100644
--- a/entity_usage.services.yml
+++ b/entity_usage.services.yml
@@ -4,7 +4,7 @@ services:
     parent: default_plugin_manager
   entity_usage.usage:
     class: Drupal\entity_usage\EntityUsage
-    arguments: ['@database']
+    arguments: ['@database', '@event_dispatcher']
   entity_usage.entity_update_manager:
     class: Drupal\entity_usage\EntityUpdateManager
     arguments:
diff --git a/src/EntityUsage.php b/src/EntityUsage.php
index 454c20f..0c98ccf 100644
--- a/src/EntityUsage.php
+++ b/src/EntityUsage.php
@@ -4,6 +4,9 @@ namespace Drupal\entity_usage;
 
 use Drupal\Core\Database\Connection;
 use Drupal\Core\Entity\EntityInterface;
+use Drupal\entity_usage\Events\Events;
+use Drupal\entity_usage\Events\EntityUsageEvent;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 
 /**
  * Defines the entity usage base class.
@@ -25,20 +28,29 @@ class EntityUsage implements EntityUsageInterface {
   protected $tableName;
 
   /**
+   * An event dispatcher instance.
+   *
+   * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface
+   */
+  protected $eventDispatcher;
+
+  /**
    * Construct the EntityUsage object.
    *
    * @param \Drupal\Core\Database\Connection $connection
    *   The database connection which will be used to store the entity usage
    *   information.
+   * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher
+   *   An event dispatcher instance to use for events.
    * @param string $table
    *   (optional) The table to store the entity usage info. Defaults to
    *   'entity_usage'.
    */
-  public function __construct(Connection $connection, $table = 'entity_usage') {
+  public function __construct(Connection $connection, EventDispatcherInterface $event_dispatcher, $table = 'entity_usage') {
 
     $this->connection = $connection;
     $this->tableName = $table;
-
+    $this->eventDispatcher = $event_dispatcher;
   }
 
   /**
@@ -58,6 +70,9 @@ class EntityUsage implements EntityUsageInterface {
       ->expression('count', 'count + :count', [':count' => $count])
       ->execute();
 
+    $event = new EntityUsageEvent($t_id, $t_type, $re_id, $re_type, $method, $count);
+    $this->eventDispatcher->dispatch(Events::USAGE_ADD, $event);
+
   }
 
   /**
@@ -92,6 +107,8 @@ class EntityUsage implements EntityUsageInterface {
       $query->expression('count', 'count - :count', [':count' => $count]);
       $query->execute();
     }
+    $event = new EntityUsageEvent($t_id, $t_type, $re_id, $re_type, NULL, $count);
+    $this->eventDispatcher->dispatch(Events::USAGE_DELETE, $event);
 
   }
 
@@ -105,6 +122,9 @@ class EntityUsage implements EntityUsageInterface {
       ->condition('t_type', $t_type);
     $query->execute();
 
+    $event = new EntityUsageEvent(NULL, $t_type, NULL, NULL, NULL, NULL);
+    $this->eventDispatcher->dispatch(Events::BULK_TARGETS_DELETE, $event);
+
   }
 
   /**
@@ -117,6 +137,9 @@ class EntityUsage implements EntityUsageInterface {
       ->condition('re_type', $re_type);
     $query->execute();
 
+    $event = new EntityUsageEvent(NULL, NULL, NULL, $re_type, NULL, NULL);
+    $this->eventDispatcher->dispatch(Events::BULK_HOSTS_DELETE, $event);
+
   }
 
   /**
diff --git a/src/Events/EntityUsageEvent.php b/src/Events/EntityUsageEvent.php
new file mode 100644
index 0000000..f793d3d
--- /dev/null
+++ b/src/Events/EntityUsageEvent.php
@@ -0,0 +1,199 @@
+<?php
+
+namespace Drupal\entity_usage\Events;
+
+use Symfony\Component\EventDispatcher\Event;
+
+/**
+ * Implementation of Entity Usage events.
+ */
+class EntityUsageEvent extends Event {
+
+  /**
+   * The identifier of the target entity.
+   *
+   * @var string
+   */
+  protected $targetEntityId;
+
+  /**
+   * The type of the target entity.
+   *
+   * @var string
+   */
+  protected $targetEntityType;
+
+  /**
+   * The identifier of the referencing entity.
+   *
+   * @var string
+   */
+  protected $referencingEntityId;
+
+  /**
+   * The type of the entity that is referencing.
+   *
+   * @var string
+   */
+  protected $referencingEntityType;
+
+  /**
+   * The method or way the two entities are being referenced.
+   *
+   * @var string
+   */
+  protected $method;
+
+  /**
+   * The number of references to add or remove.
+   *
+   * @var string
+   */
+  protected $count;
+
+  /**
+   * EntityUsageEvents constructor.
+   *
+   * @param int $t_id
+   *   The identifier of the target entity.
+   * @param string $t_type
+   *   The type of the target entity.
+   * @param int $re_id
+   *   The identifier of the referencing entity.
+   * @param string $re_type
+   *   The type of the entity that is referencing.
+   * @param string $method
+   *   The method or way the two entities are being referenced.
+   * @param int $count
+   *   The number of references to add or remove.
+   */
+  public function __construct($t_id = NULL, $t_type = NULL, $re_id = NULL, $re_type = NULL, $method = NULL, $count = NULL) {
+    $this->targetEntityId = $t_id;
+    $this->targetEntityType = $t_type;
+    $this->referencingEntityId = $re_id;
+    $this->referencingEntityType = $re_type;
+    $this->method = $method;
+    $this->count = $count;
+  }
+
+  /**
+   * Sets the target entity id.
+   *
+   * @param int $id
+   *   The target entity id.
+   */
+  public function setTargetEntityId($id) {
+    $this->targetEntityId = $id;
+  }
+
+  /**
+   * Sets the target entity type.
+   *
+   * @param string $type
+   *   The target entity type.
+   */
+  public function setTargetEntityType($type) {
+    $this->targetEntityType = $type;
+  }
+
+  /**
+   * Sets the referencing entity id.
+   *
+   * @param int $id
+   *   The referencing entity id.
+   */
+  public function setReferencingEntityId($id) {
+    $this->referencingEntityId = $id;
+  }
+
+  /**
+   * Sets the referencing entity type.
+   *
+   * @param string $type
+   *   The referencing entity type.
+   */
+  public function setReferencingEntityType($type) {
+    $this->referencingEntityType = $type;
+  }
+
+  /**
+   * Sets the referencing method.
+   *
+   * @param string $method
+   *   The referencing method.
+   */
+  public function setReferencingMethod($method) {
+    $this->method = $method;
+  }
+
+  /**
+   * Sets the count.
+   *
+   * @param int $count
+   *   The number od references to add or remove.
+   */
+  public function setCount($count) {
+    $this->count = $count;
+  }
+
+  /**
+   * Gets the target entity id.
+   *
+   * @return null|string
+   *   The target entity id or NULL.
+   */
+  public function getTargetEntityId() {
+    return $this->targetEntityId;
+  }
+
+  /**
+   * Gets the target entity type.
+   *
+   * @return null|string
+   *   The target entity type or NULL.
+   */
+  public function getTargetEntityType() {
+    return $this->targetEntityType;
+  }
+
+  /**
+   * Gets the referencing entity id.
+   *
+   * @return int|null
+   *   The referencing entity id or NULL.
+   */
+  public function getReferencingEntityId() {
+    return $this->referencingEntityId;
+  }
+
+  /**
+   * Gets the referencing entity type.
+   *
+   * @return null|string
+   *   The referencing entity type or NULL.
+   */
+  public function getReferencingEntityType() {
+    return $this->referencingEntityType;
+  }
+
+  /**
+   * Gets the referencing method.
+   *
+   * @return null|string
+   *   The referencing method or NULL.
+   */
+  public function getReferencingMethod() {
+    return $this->method;
+  }
+
+  /**
+   * Gets the count.
+   *
+   * @return int|null
+   *   The number of references to add or remove or NULL.
+   */
+  public function getCount() {
+    return $this->count;
+  }
+
+}
diff --git a/src/Events/Events.php b/src/Events/Events.php
new file mode 100644
index 0000000..15ae743
--- /dev/null
+++ b/src/Events/Events.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Drupal\entity_usage\Events;
+
+/**
+ * Contains all events thrown by Entity Usage.
+ */
+final class Events {
+
+  /**
+   * The USAGE_ADD event occurs when entities are referenced.
+   *
+   * @var string
+   */
+  const USAGE_ADD = 'entity_usage.add';
+
+  /**
+   * The USAGE_DELETE event occurs when reference to an entity is removed.
+   *
+   * @var string
+   */
+  const USAGE_DELETE = 'entity_usage.delete';
+
+  /**
+   * The BULK_TARGETS_DELETE event.
+   *
+   * The BULK_TARGETS_DELETE event occurs when all records of a given
+   * entity_type (target) is removed.
+   *
+   * @var string
+   */
+  const BULK_TARGETS_DELETE = 'entity_usage.bulk_targets_delete';
+
+  /**
+   * The BULK_HOSTS_DELETE event.
+   *
+   * The BULK_HOSTS_DELETE event occurs when all records of a given entity_type
+   * (host) are removed.
+   *
+   * @var string
+   */
+  const BULK_HOSTS_DELETE = 'entity_usage.bulk_delete_hosts';
+
+}
diff --git a/tests/src/Kernel/EntityUsageTest.php b/tests/src/Kernel/EntityUsageTest.php
index f9a350f..53f726f 100644
--- a/tests/src/Kernel/EntityUsageTest.php
+++ b/tests/src/Kernel/EntityUsageTest.php
@@ -3,6 +3,8 @@
 namespace Drupal\Tests\entity_usage\Kernel;
 
 use Drupal\entity_test\Entity\EntityTest;
+use Drupal\entity_usage\Events\EntityUsageEvent;
+use Drupal\entity_usage\Events\Events;
 use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
 
 /**
@@ -57,6 +59,13 @@ class EntityUsageTest extends EntityKernelTestBase {
   protected $tableName;
 
   /**
+   * State service for recording information received by event listeners.
+   *
+   * @var \Drupal\Core\State\State
+   */
+  protected $state;
+
+  /**
    * {@inheritdoc}
    */
   protected function setUp() {
@@ -70,6 +79,15 @@ class EntityUsageTest extends EntityKernelTestBase {
     // Create two test entities.
     $this->testEntities = $this->getTestEntities();
 
+    $this->state = \Drupal::state();
+    \Drupal::service('event_dispatcher')->addListener(Events::USAGE_ADD,
+      [$this, 'usageAddEventRecorder']);
+    \Drupal::service('event_dispatcher')->addListener(Events::USAGE_DELETE,
+      [$this, 'usageDeleteEventRecorder']);
+    \Drupal::service('event_dispatcher')->addListener(Events::BULK_TARGETS_DELETE,
+      [$this, 'usageBulkTargetDeleteEventRecorder']);
+    \Drupal::service('event_dispatcher')->addListener(Events::BULK_HOSTS_DELETE,
+      [$this, 'usageBulkHostsDeleteEventRecorder']);
   }
 
   /**
@@ -115,6 +133,16 @@ class EntityUsageTest extends EntityKernelTestBase {
     $entity_usage = $this->container->get('entity_usage.usage');
     $entity_usage->add($entity->id(), $entity->getEntityTypeId(), '1', 'foo', 'entity_reference', 1);
 
+    $event = \Drupal::state()->get('entity_usage_events_test.usage_add', []);
+
+    $this->assertSame($event['event_name'], Events::USAGE_ADD);
+    $this->assertSame($event['target_id'], $entity->id());
+    $this->assertSame($event['target_type'], $entity->getEntityTypeId());
+    $this->assertSame($event['referencing_id'], '1');
+    $this->assertSame($event['referencing_type'], 'foo');
+    $this->assertSame($event['method'], 'entity_reference');
+    $this->assertSame($event['count'], 1);
+
     $real_usage = $this->injectedDatabase->select($this->tableName, 'e')
       ->fields('e', ['count'])
       ->condition('e.t_id', $entity->id())
@@ -151,6 +179,17 @@ class EntityUsageTest extends EntityKernelTestBase {
 
     // Normal decrement.
     $entity_usage->delete($entity->id(), $entity->getEntityTypeId(), 1, 'foo', 1);
+
+    $event = \Drupal::state()->get('entity_usage_events_test.usage_delete', []);
+
+    $this->assertSame($event['event_name'], Events::USAGE_DELETE);
+    $this->assertSame($event['target_id'], $entity->id());
+    $this->assertSame($event['target_type'], $entity->getEntityTypeId());
+    $this->assertSame($event['referencing_id'], 1);
+    $this->assertSame($event['referencing_type'], 'foo');
+    $this->assertSame($event['method'], NULL);
+    $this->assertSame($event['count'], 1);
+
     $count = $this->injectedDatabase->select($this->tableName, 'e')
       ->fields('e', ['count'])
       ->condition('e.t_id', $entity->id())
@@ -210,6 +249,16 @@ class EntityUsageTest extends EntityKernelTestBase {
     $entity_usage = $this->container->get('entity_usage.usage');
     $entity_usage->bulkDeleteTargets($entity_type);
 
+    $event = \Drupal::state()->get('entity_usage_events_test.usage_bulk_target_delete', []);
+
+    $this->assertSame($event['event_name'], Events::BULK_TARGETS_DELETE);
+    $this->assertSame($event['target_id'], NULL);
+    $this->assertSame($event['target_type'], $entity_type);
+    $this->assertSame($event['referencing_id'], NULL);
+    $this->assertSame($event['referencing_type'], NULL);
+    $this->assertSame($event['method'], NULL);
+    $this->assertSame($event['count'], NULL);
+
     // Check if there are no records left.
     $count = $this->injectedDatabase->select($this->tableName, 'e')
       ->fields('e', ['count'])
@@ -249,6 +298,16 @@ class EntityUsageTest extends EntityKernelTestBase {
     $entity_usage = $this->container->get('entity_usage.usage');
     $entity_usage->bulkDeleteHosts($entity_type);
 
+    $event = \Drupal::state()->get('entity_usage_events_test.usage_bulk_hosts_delete', []);
+
+    $this->assertSame($event['event_name'], Events::BULK_HOSTS_DELETE);
+    $this->assertSame($event['target_id'], NULL);
+    $this->assertSame($event['target_type'], NULL);
+    $this->assertSame($event['referencing_id'], NULL);
+    $this->assertSame($event['referencing_type'], $entity_type);
+    $this->assertSame($event['method'], NULL);
+    $this->assertSame($event['count'], NULL);
+
     // Check if there are no records left.
     $count = $this->injectedDatabase->select($this->tableName, 'e')
       ->fields('e', ['count'])
@@ -280,4 +339,84 @@ class EntityUsageTest extends EntityKernelTestBase {
     ];
   }
 
+  /**
+   * Reacts to save event.
+   *
+   * @param \Drupal\entity_usage\Events\EntityUsageEvent $event
+   *    The entity usage event.
+   * @param string $name
+   *    The name of the event.
+   */
+  public function usageAddEventRecorder(EntityUsageEvent $event, $name) {
+    $this->state->set('entity_usage_events_test.usage_add', [
+      'event_name' => $name,
+      'target_id' => $event->getTargetEntityId(),
+      'target_type' => $event->getTargetEntityType(),
+      'referencing_id' => $event->getReferencingEntityId(),
+      'referencing_type' => $event->getReferencingEntityType(),
+      'method' => $event->getReferencingMethod(),
+      'count' => $event->getCount(),
+    ]);
+  }
+
+  /**
+   * Reacts to delete event.
+   *
+   * @param \Drupal\entity_usage\Events\EntityUsageEvent $event
+   *    The entity usage event.
+   * @param string $name
+   *    The name of the event.
+   */
+  public function usageDeleteEventRecorder(EntityUsageEvent $event, $name) {
+    $this->state->set('entity_usage_events_test.usage_delete', [
+      'event_name' => $name,
+      'target_id' => $event->getTargetEntityId(),
+      'target_type' => $event->getTargetEntityType(),
+      'referencing_id' => $event->getReferencingEntityId(),
+      'referencing_type' => $event->getReferencingEntityType(),
+      'method' => $event->getReferencingMethod(),
+      'count' => $event->getCount(),
+    ]);
+  }
+
+  /**
+   * Reacts to bulk target delete event.
+   *
+   * @param \Drupal\entity_usage\Events\EntityUsageEvent $event
+   *    The entity usage event.
+   * @param string $name
+   *    The name of the event.
+   */
+  public function usageBulkTargetDeleteEventRecorder(EntityUsageEvent $event, $name) {
+    $this->state->set('entity_usage_events_test.usage_bulk_target_delete', [
+      'event_name' => $name,
+      'target_id' => $event->getTargetEntityId(),
+      'target_type' => $event->getTargetEntityType(),
+      'referencing_id' => $event->getReferencingEntityId(),
+      'referencing_type' => $event->getReferencingEntityType(),
+      'method' => $event->getReferencingMethod(),
+      'count' => $event->getCount(),
+    ]);
+  }
+
+  /**
+   * Reacts to bulk hosts delete event.
+   *
+   * @param \Drupal\entity_usage\Events\EntityUsageEvent $event
+   *    The entity usage event.
+   * @param string $name
+   *    The name of the event.
+   */
+  public function usageBulkHostsDeleteEventRecorder(EntityUsageEvent $event, $name) {
+    $this->state->set('entity_usage_events_test.usage_bulk_hosts_delete', [
+      'event_name' => $name,
+      'target_id' => $event->getTargetEntityId(),
+      'target_type' => $event->getTargetEntityType(),
+      'referencing_id' => $event->getReferencingEntityId(),
+      'referencing_type' => $event->getReferencingEntityType(),
+      'method' => $event->getReferencingMethod(),
+      'count' => $event->getCount(),
+    ]);
+  }
+
 }
