diff --git a/flag.services.yml b/flag.services.yml
index 88e351f..d52ffe4 100644
--- a/flag.services.yml
+++ b/flag.services.yml
@@ -16,3 +16,8 @@ services:
   flag.link_builder:
     class: Drupal\flag\FlagLinkBuilder
     arguments: ['@entity.manager', '@flag']
+  flagging:
+    class: Drupal\flag\FlaggingService
+    arguments: ['@entity.query', '@event_dispatcher', '@flag']
+    tags:
+      - { name: event_subscriber }
diff --git a/src/FlagService.php b/src/FlagService.php
index 28d6690..171ddec 100644
--- a/src/FlagService.php
+++ b/src/FlagService.php
@@ -12,7 +12,6 @@ use Drupal\Core\Entity\Query\QueryFactory;
 use Drupal\Core\Entity\EntityManagerInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\flag\Event\FlagEvents;
-use Drupal\flag\Event\FlagResetEvent;
 use Drupal\flag\Event\FlaggingEvent;
 use Drupal\flag\FlagInterface;
 use Drupal\flag\FlagServiceInterface;
@@ -21,6 +20,8 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 
 /**
  * Flag service.
+ *  - Handles search requests for flags and flaggings.
+ *  - Performs flagging and unflaging operations.
  */
 class FlagService implements FlagServiceInterface {
 
@@ -267,31 +268,6 @@ class FlagService implements FlagServiceInterface {
   }
 
   /**
-   * {@inheritdoc}
-   */
-  public function reset(FlagInterface $flag, EntityInterface $entity = NULL) {
-    $query = $this->entityQueryManager->get('flagging')
-      ->condition('flag_id', $flag->id());
-
-    if (!empty($entity)) {
-      $query->condition('entity_id', $entity->id());
-    }
-
-    // Count the number of flaggings to delete.
-    $count = $query->count()
-      ->execute();
-
-    $this->eventDispatcher->dispatch(FlagEvents::FLAG_RESET, new FlagResetEvent($flag, $count));
-
-    $flaggings = $this->getFlaggings($flag, $entity);
-    foreach ($flaggings as $flagging) {
-      $flagging->delete();
-    }
-
-    return $count;
-  }
-
-  /**
    * Loads flag entities given their IDs.
    *
    * @param int[] $ids
diff --git a/src/FlagServiceInterface.php b/src/FlagServiceInterface.php
index ff437a1..22a758c 100644
--- a/src/FlagServiceInterface.php
+++ b/src/FlagServiceInterface.php
@@ -147,18 +147,5 @@ interface FlagServiceInterface {
    */
   public function unflag(FlagInterface $flag, EntityInterface $entity, AccountInterface $account = NULL);
 
-  /**
-   *
-   * Remove all flagged entities from a flag.
-   *
-   * @param FlagInterface $flag
-   *  The flag to reset.
-   * @param EntityInterface $entity
-   *  (optional) The entity for which to delete flaggings.
-   *
-   * @return int
-   *  The number of flaggings that have been deleted.
-   */
-  public function reset(FlagInterface $flag, EntityInterface $entity = NULL);
 
 }
diff --git a/src/FlaggingService.php b/src/FlaggingService.php
new file mode 100644
index 0000000..c8a214c
--- /dev/null
+++ b/src/FlaggingService.php
@@ -0,0 +1,117 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\flag\FlaggingService.
+ */
+
+namespace Drupal\flag;
+
+use Drupal\flag\Event\FlagEvents;
+use Drupal\flag\Event\FlagResetEvent;
+use Drupal\flag\Event\FlagDeleteEvent;
+use Drupal\flag\FlagInterface;
+use Drupal\flag\FlagService;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\Query\QueryFactory;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+
+/**
+ * Class FlaggingService.
+ *
+ * Resets a flag on request and automatically when a flag is deleted.
+ *
+ * This implementation while correct may not scale.
+ * With large numbers of flaggings to delete it will cosume an amount of
+ * time which is deemed unacceptable to site users.
+ *
+ * Faster implementations become possible once a queue system is developed to
+ * hand off multiple delettions.
+ *
+ * @see https://www.drupal.org/node/89181
+ *
+ * @package Drupal\flag
+ */
+class FlaggingService implements FlaggingServiceInterface, EventSubscriberInterface {
+
+  /**
+   * The entity query manager.
+   *
+   * @var \Drupal\Core\Entity\Query\QueryFactory
+   */
+  private $entityQueryManager;
+
+  /**
+   * The event dispatcher.
+   *
+   * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface
+   */
+  private $eventDispatcher;
+
+  /**
+   * The Flag Service.
+   *
+   * @var \Drupal\flag\FlagService
+   */
+  private $flagService;
+
+  /**
+   * Constructor.
+   *
+   * @param QueryFactory $entity_query
+   *   The entity query factory.
+   * @param EventDispatcherInterface $event_dispatcher
+   *   The event dispatcher service.
+   */
+  public function __construct(QueryFactory $entity_query, EventDispatcherInterface $event_dispatcher, FlagService $flag_service) {
+    $this->entityQueryManager = $entity_query;
+    $this->eventDispatcher = $event_dispatcher;
+    $this->flagService = $flag_service;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function reset(FlagInterface $flag, EntityInterface $entity = NULL) {
+    $query = $this->entityQueryManager->get('flagging')
+      ->condition('flag_id', $flag->id());
+
+    if (!empty($entity)) {
+      $query->condition('entity_id', $entity->id());
+    }
+
+    // Count the number of flaggings to delete.
+    $count = $query->count()
+      ->execute();
+
+    $this->eventDispatcher->dispatch(FlagEvents::FLAG_RESET, new FlagResetEvent($flag, $count));
+
+    $flaggings = $this->flagService->getFlaggings($flag, $entity);
+    foreach ($flaggings as $flagging) {
+      $flagging->delete();
+    }
+
+    return $count;
+  }
+
+  /**
+   * Responds to flag delete events and removes all the assocated flaggings.
+   *
+   * @param FlagDeleteEvent $event
+   *   The Flag Event.
+   */
+  public function onDeleteResetFlaggings(FlagDeleteEvent $event) {
+    $this->reset($event->getFlag());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents() {
+    $events = array();
+    $events[FlagEvents::FLAG_DELETED][] = array('onDeleteResetFlaggings', -100);
+    return $events;
+  }
+
+}
diff --git a/src/FlaggingServiceInterface.php b/src/FlaggingServiceInterface.php
new file mode 100644
index 0000000..8c6aa9c
--- /dev/null
+++ b/src/FlaggingServiceInterface.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\flag\FlaggingServiceInterface.
+ */
+
+namespace Drupal\flag;
+
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\flag\FlagInterface;
+
+/**
+ * Interface FlaggingServiceInterface.
+ *
+ * @package Drupal\flag
+ */
+interface FlaggingServiceInterface {
+
+  /**
+   * Remove all flagged entities from a flag.
+   *
+   * @param FlagInterface $flag
+   *   The flag to reset.
+   * @param EntityInterface $entity
+   *   (optional) The entity for which to delete flaggings.
+   *
+   * @return int
+   *   The number of flaggings that have been deleted.
+   */
+  public function reset(FlagInterface $flag, EntityInterface $entity = NULL);
+
+}
diff --git a/src/Form/FlagResetForm.php b/src/Form/FlagResetForm.php
index 65fafff..a6b1d28 100644
--- a/src/Form/FlagResetForm.php
+++ b/src/Form/FlagResetForm.php
@@ -10,7 +10,7 @@ use Drupal\Core\Url;
 use Drupal\Core\Form\ConfirmFormBase;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\flag\FlagInterface;
-use Drupal\flag\FlagService;
+use Drupal\flag\FlaggingServiceInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 /**
  * Provides the flag reset form.
@@ -20,9 +20,9 @@ class FlagResetForm extends ConfirmFormBase {
   /**
    * The Flag Service.
    *
-   * @var \Drupal\flag\FlagService $flagService
+   * @var \Drupal\flag\FlagDeletionServiceInterface $flagDelete
    */
-  protected $flagService;
+  protected $flagDelete;
 
   /**
    * The flag to reset.
@@ -33,9 +33,11 @@ class FlagResetForm extends ConfirmFormBase {
 
   /**
    * Class constructor.
+   *
+   * @param \Drupal\flag\FlaggingDeleteionServiceInterface $flag_delete
    */
-  public function __construct(FlagService $flag_service) {
-    $this->flagService = $flag_service;
+  public function __construct(FlaggingServiceInterface $flag_delete) {
+    $this->flagDelete = $flag_delete;
   }
 
   /**
@@ -43,7 +45,7 @@ class FlagResetForm extends ConfirmFormBase {
    */
   public static function create(ContainerInterface $container) {
     return new static(
-      $container->get('flag')
+      $container->get('flagging')
     );
   }
 
@@ -100,7 +102,7 @@ class FlagResetForm extends ConfirmFormBase {
    * {@inheritdoc}
    */
   public function submitForm(array &$form, FormStateInterface $form_state) {
-    $this->flagService->reset($this->flag);
+    $this->flagDelete->reset($this->flag);
     drupal_set_message($this->t('Flag %label was reset.', [
       '%label' => $this->flag->label(),
     ]));
diff --git a/src/Tests/FlagCountsTest.php b/src/Tests/FlagCountsTest.php
index 5bcedaa..c3d3d15 100644
--- a/src/Tests/FlagCountsTest.php
+++ b/src/Tests/FlagCountsTest.php
@@ -23,7 +23,6 @@ class FlagCountsTest extends FlagTestBase {
    * The flag.
    *
    * @var \Drupal\flag\FlagInterface
-   *
    */
   protected $flag;
 
@@ -42,6 +41,20 @@ class FlagCountsTest extends FlagTestBase {
   protected $flagService;
 
   /**
+   * The flag count service.
+   *
+   * @var \Drupal\flag\FlagCountManagerInterface
+   */
+  protected $flagCountService;
+
+  /**
+   * The flagging deletion service.
+   *
+   * @var \Drupal\flag\FlaggingServiceInterface
+   */
+  protected $flaggingDelete;
+
+  /**
    * User object.
    *
    * @var \Drupal\user\Entity\User|false
@@ -55,6 +68,8 @@ class FlagCountsTest extends FlagTestBase {
     parent::setUp();
 
     $this->flagService = \Drupal::service('flag');
+    $this->flagCountService = \Drupal::service('flag.count');
+    $this->flaggingDelete = \Drupal::service('flagging');
 
     // Create a flag.
     $this->flag = $this->createFlag('node', ['article'], 'reload');
@@ -85,25 +100,89 @@ class FlagCountsTest extends FlagTestBase {
     // Flag the node.
     $this->flagService->flag($this->flag, $this->node, $this->adminUser);
 
-    $flagCountService = \Drupal::service('flag.count');
-
     // Check each of the count API functions.
-    $flag_get_entity_flag_counts = $flagCountService->getEntityCounts($this->flag, 'node');
+    $flag_get_entity_flag_counts = $this->flagCountService->getEntityCounts($this->flag, 'node');
     $this->assertEqual($flag_get_entity_flag_counts, 1, "getEntityFlagCounts() returns the expected count.");
 
-    $flag_get_user_flag_counts = $flagCountService->getUserCounts($this->flag, $this->adminUser);
+    $flag_get_user_flag_counts = $this->flagCountService->getUserCounts($this->flag, $this->adminUser);
     $this->assertEqual($flag_get_user_flag_counts, 1, "getUserFlagCounts() returns the expected count.");
 
-    $flag_get_counts = $flagCountService->getCounts($this->node);
+    $flag_get_counts = $this->flagCountService->getCounts($this->node);
     $this->assertEqual($flag_get_counts[$this->flag->id()], 1, "getCounts() returns the expected count.");
 
-    $flag_get_flag_counts = $flagCountService->getTotals($this->flag);
+    $flag_get_flag_counts = $this->flagCountService->getTotals($this->flag);
     $this->assertEqual($flag_get_flag_counts, 1, "getFlagTotalCounts() returns the expected count.");
 
-    $this->flagService->reset($this->flag);
+    $this->flaggingDelete->reset($this->flag);
     drupal_static_reset();
-    $flag_get_flag_counts = $flagCountService->getTotals($this->flag);
+    $flag_get_flag_counts = $this->flagCountService->getTotals($this->flag);
     $this->assertEqual($flag_get_flag_counts, 0, "getCounts() on reset flag returns the expected count.");
   }
 
+  /**
+   * Tests flaggings are deleted and counts are removed when a flag is deleted.
+   */
+  public function testFlagDeletion() {
+
+    // Create a flag.
+    $flag = $this->createFlag('node', ['article'], 'reload');
+
+    // Create a article to flag.
+    $article1 = Node::create([
+      'body' => [
+        [
+          'value' => $this->randomMachineName(32),
+          'format' => filter_default_format(),
+        ]
+      ],
+      'type' => 'article',
+      'title' => $this->randomMachineName(8),
+    ]);
+    $article1->save();
+
+    // Create a second article.
+    $article2 = Node::create([
+      'body' => [
+        [
+          'value' => $this->randomMachineName(32),
+          'format' => filter_default_format(),
+        ]
+      ],
+      'type' => 'article',
+      'title' => $this->randomMachineName(8),
+    ]);
+    $article2->save();
+
+    // Flag both.
+    $this->flagService->flag($flag, $article1);
+    $this->flagService->flag($flag, $article2);
+
+    // Confirm the counts have been incremented.
+    $article1_count_before = $this->flagCountService->getCounts($article1);
+    $this->assertEqual($article1_count_before[$flag->id()], 1, 'The article1 has been flagged.');
+    $article2_count_before = $this->flagCountService->getCounts($article2);
+    $this->assertEqual(count($article2_count_before[$flag->id()]), 1, 'The article2 has been flagged.');
+
+    // Confirm the flagging have been created.
+    $flaggings_before = $this->flagService->getFlaggings($flag);
+    $this->assertEqual(count($flaggings_before), 2, 'There are two flaggings associated with the flag');
+
+    // Delete the flag.
+    $flag->delete();
+    // Reset counts stored in FlagCountManager and force inspection of the
+    // peristent store.
+    drupal_static_reset();
+
+    // The list of all flaggings MUST now be empty.
+    $flaggings_after = $this->flagService->getFlaggings($flag);
+    $this->assert(empty($flaggings_after), 'The flaggings were removed, when the flag was deleted');
+
+    // The flag id is now stale, so instead of searching for the flag in the
+    // count array as before we require the entire array should be empty.
+    $article1_counts_after = $this->flagCountService->getCounts($article1);
+    $this->assert(empty($article1_counts_after), 'Article1 counts has been removed.');
+    $article2_counts_after = $this->flagCountService->getCounts($article2);
+    $this->assertEqual(empty($article2_counts_after), 'Article2 counts has been removed.');
+  }
+
 }
