diff --git a/flag.api.php b/flag.api.php
index d1961dc..a4141ea 100644
--- a/flag.api.php
+++ b/flag.api.php
@@ -8,6 +8,8 @@
 use Drupal\flag\FlagInterface;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\flag\FlaggingInterface;
+use Drupal\Core\Entity\EntityInterface;
+
 /**
  * @addtogroup hooks
  * @{
@@ -51,8 +53,8 @@ function hook_flag_options_alter(array &$options, FlagInterface $flag) {
  *   The action about to be carried out. Either 'flag' or 'unflag'.
  * @param \Drupal\flag\FlagInterface $flag
  *   The flag object.
- * @param int $entity_id
- *   The id of the entity the user is trying to flag or unflag.
+ * @param \Drupal\Core\Entity\EntityInterface $flaggable
+ *   The flaggable entity the user is trying to flag or unflag.
  * @param \Drupal\Core\Session\AccountInterface $account
  *   The user account performing the action.
  * @param bool $skip_permission_check
@@ -66,7 +68,9 @@ function hook_flag_options_alter(array &$options, FlagInterface $flag) {
  *   drupal_access_denied will be called and a 403 will be returned.
  *   If validation is successful, do not return a value.
  */
-function hook_flag_validate($action, FlagInterface $flag, $entity_id,
+function hook_flag_validate($action, 
+                            FlagInterface $flag,
+                            EntityInterface $flaggable,
                             AccountInterface $account, $skip_permission_check,
                             FlaggingInterface $flagging) {
 }
diff --git a/flag.services.yml b/flag.services.yml
index 27106e9..640360d 100644
--- a/flag.services.yml
+++ b/flag.services.yml
@@ -15,7 +15,7 @@ services:
     arguments: ['@container.namespaces', '@cache.default', '@module_handler']
   flag:
     class: Drupal\flag\FlagService
-    arguments: ['@plugin.manager.flag.flagtype', '@event_dispatcher', '@entity.query', '@current_user', '@entity_type.manager']
+    arguments: ['@plugin.manager.flag.flagtype', '@event_dispatcher', '@entity.query', '@current_user', '@entity_type.manager', '@module_handler']
   flag.count:
     class: Drupal\flag\FlagCountManager
     arguments: ['@database']
diff --git a/src/FlagService.php b/src/FlagService.php
index ce4b448..29eba35 100644
--- a/src/FlagService.php
+++ b/src/FlagService.php
@@ -10,7 +10,9 @@ namespace Drupal\flag;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\Query\QueryFactory;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Extension\ModuleHandler;
 use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\Updater\Module;
 use Drupal\flag\Event\FlagEvents;
 use Drupal\flag\Event\FlaggingEvent;
 use Drupal\flag\FlagType\FlagTypePluginManager;
@@ -53,12 +55,17 @@ class FlagService implements FlagServiceInterface {
    */
   private $currentUser;
 
-  /*
+  /**
    * @var EntityTypeManagerInterface
-   * */
+   */
   private $entityTypeManager;
 
   /**
+   * @var ModuleHandler
+   */
+  private $moduleHandler;
+
+  /**
    * Constructor.
    *
    * @param FlagTypePluginManager $flag_type
@@ -76,12 +83,14 @@ class FlagService implements FlagServiceInterface {
                               EventDispatcherInterface $event_dispatcher,
                               QueryFactory $entity_query,
                               AccountInterface $current_user,
-                              EntityTypeManagerInterface $entity_type_manager) {
+                              EntityTypeManagerInterface $entity_type_manager,
+                              ModuleHandler $module_handler) {
     $this->flagTypeManager = $flag_type;
     $this->eventDispatcher = $event_dispatcher;
     $this->entityQueryManager = $entity_query;
     $this->currentUser = $current_user;
     $this->entityTypeManager = $entity_type_manager;
+    $this->moduleHandler = $module_handler;
   }
 
   /**
@@ -232,6 +241,16 @@ class FlagService implements FlagServiceInterface {
       'global' => $flag->isGlobal(),
     ]);
 
+    $validations = $this->moduleHandler->invokeAll('flag_validate', [
+      'flag', $flag, $entity, $account, $flagging
+    ]);
+
+    foreach ($validations as $hook => $valid) {
+      if (!$valid) {
+        return FALSE;
+      }
+    }
+
     $flagging->save();
 
     return $flagging;
@@ -261,7 +280,19 @@ class FlagService implements FlagServiceInterface {
       throw new \LogicException('The entity is not flagged by the user.');
     }
 
+    $validations = $this->moduleHandler->invokeAll('flag_validate', [
+      'unflag', $flag, $entity, $account, $flagging
+    ]);
+
+    foreach ($validations as $hook => $valid) {
+      if (!$valid) {
+        return FALSE;
+      }
+    }
+
     $flagging->delete();
+    
+    return TRUE;
   }
 
   /**
diff --git a/src/FlagServiceInterface.php b/src/FlagServiceInterface.php
index 68f5d93..12b3a6f 100644
--- a/src/FlagServiceInterface.php
+++ b/src/FlagServiceInterface.php
@@ -175,8 +175,8 @@ interface FlagServiceInterface {
    *   (optional) The account of the user flagging the entity. If not given,
    *   the current user is used.
    *
-   * @return \Drupal\flag\FlagInterface|null
-   *   The flagging.
+   * @return \Drupal\flag\FlagInterface|false
+   *   The flagging if successful, FALSE otherwise.
    *
    * @throws \LogicException
    *   An exception is thrown if the given flag, entity, and account are not
@@ -205,6 +205,9 @@ interface FlagServiceInterface {
    *   (optional) The account of the user that created the flagging. Defaults
    *   to the current user.
    *
+   * @return bool
+   *  TRUE if the unflagging was successful, FALSE otherwise.
+   *
    * @throws \LogicException
    *   An exception is thrown if the given flag, entity, and account are not
    *   compatible in some way:
