diff --git a/flag.libraries.yml b/flag.libraries.yml
index e4322a6..a97edde 100644
--- a/flag.libraries.yml
+++ b/flag.libraries.yml
@@ -8,8 +8,19 @@ flag.admin:
     - core/drupalSettings
     - core/drupal.form
 
+# Normal action link library.
 flag.link:
   version: VERSION
   css:
     theme:
       css/flag-link.css: {}
+
+# Ajax action link library.
+flag.link_ajax:
+  version: VERSION
+  js:
+    js/flag-action_link_flash.js: {}
+  dependencies:
+    - core/jquery
+    - core/drupal
+    - core/drupal.ajax
\ No newline at end of file
diff --git a/js/flag-action_link_flash.js b/js/flag-action_link_flash.js
new file mode 100644
index 0000000..b024c36
--- /dev/null
+++ b/js/flag-action_link_flash.js
@@ -0,0 +1,39 @@
+/**
+ * @file
+ * Defines the client side code for the ActionLinkFlashCommand.
+ *
+ * see \Drupal\flag\Ajax\ActionLinkFlashCommand
+ */
+
+(function ($, Drupal) {
+
+  'use strict';
+
+  /**
+   * Display message on the screen for a short period of time.
+   *
+   * @param {Drupal.Ajax} [ajax]
+   *   The ajax object.
+   * @param {object} response
+   *   Object holding the server response.
+   * @param {string} response.selector
+   *   The selector of link to be updated.
+   * @param {string} response.message
+   *   The message to be displayed.
+   * @param {number} [status]
+   *   The HTTP status code.
+   */
+  Drupal.AjaxCommands.prototype.actionLinkFlash = function (ajax, response, status) {
+    // Construct a <p> element with escaped message.
+    var p_elem = $('<p>').text(response.message);
+
+    $(response.selector).after(p_elem);
+
+    p_elem.fadeIn('fast', function() {
+      $(this).fadeOut(3000, function() {
+        $(this).remove();
+      });
+    });
+  };
+
+})(jQuery, Drupal);
diff --git a/src/Ajax/ActionLinkFlashCommand.php b/src/Ajax/ActionLinkFlashCommand.php
new file mode 100644
index 0000000..0c4a33f
--- /dev/null
+++ b/src/Ajax/ActionLinkFlashCommand.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace Drupal\flag\Ajax;
+
+use Drupal\Core\Ajax\CommandInterface;
+
+/**
+ * Flash a message as an action link is updated.
+ *
+ * The client side code can be found in js/flag-action_link_flash.js
+ *
+ * @ingroup flag
+ */
+class ActionLinkFlashCommand implements CommandInterface {
+
+  /**
+   * Identifies the action link to be flashed.
+   *
+   * @var string
+   */
+  protected $selector;
+
+  /**
+   * The message to be flashed under the link.
+   *
+   * @var string
+   */
+  protected $message;
+
+  /**
+   * Construct a message Flasher.
+   *
+   * @param string $selector
+   *   Identifies the action link to be flashed.
+   * @param string $message
+   *   The message to be displayed.
+   */
+  public function __construct($selector, $message) {
+    $this->selector = $selector;
+    $this->message = $message;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function render() {
+    return [
+      'command' => 'actionLinkFlash',
+      'selector' => $this->selector,
+      'message' => $this->message,
+    ];
+  }
+
+}
diff --git a/src/Controller/ActionLinkController.php b/src/Controller/ActionLinkController.php
index 462aef3..531afc0 100644
--- a/src/Controller/ActionLinkController.php
+++ b/src/Controller/ActionLinkController.php
@@ -5,20 +5,28 @@ namespace Drupal\flag\Controller;
 use Drupal\Core\Ajax\AjaxResponse;
 use Drupal\Core\Ajax\ReplaceCommand;
 use Drupal\Core\Controller\ControllerBase;
-use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
 use Drupal\Core\Render\RendererInterface;
-use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\flag\Ajax\ActionLinkFlashCommand;
 use Drupal\flag\FlagInterface;
 use Drupal\flag\FlagServiceInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\RedirectResponse;
 use Symfony\Component\HttpFoundation\Request;
 
 /**
- * Provides a controller to flag and unflag when routed from a normal link.
+ * Controller responses to flag and unflag action links.
+ *
+ * If the action_link is a normal link then after an update the response to a
+ *  valid request is a redirect to the entity with drupal update message.
+ *
+ * For an ajax_action_link the response is a set of AJAX commands to update the
+ * link in the page. If the user agent has javascript disabled then the
+ * behaviour reverts to that of a normal link.
  */
 class ActionLinkController extends ControllerBase implements ContainerInjectionInterface {
-
   /**
    * The flag service.
    *
@@ -64,8 +72,8 @@ class ActionLinkController extends ControllerBase implements ContainerInjectionI
    * @param \Symfony\Component\HttpFoundation\Request $request
    *   The request.
    *
-   * @return \Symfony\Component\HttpFoundation\RedirectResponse
-   *   The response object.
+   * @return \Drupal\Core\Ajax\AjaxResponse|\Symfony\Component\HttpFoundation\RedirectResponse|null
+   *   The response object, only if successful.
    *
    * @see \Drupal\flag\Plugin\Reload
    */
@@ -81,11 +89,11 @@ class ActionLinkController extends ControllerBase implements ContainerInjectionI
       // link for the existing state of the flag.
     }
 
-    return $this->generateResponse($flag, $entity, $request);
+    return $this->generateResponse($flag, $entity, $request, $flag->getFlagMessage());
   }
 
   /**
-   * Performs a flagging when called via a route.
+   * Performs a unflagging when called via a route.
    *
    * @param \Drupal\flag\FlagInterface $flag
    *   The flag entity.
@@ -94,8 +102,8 @@ class ActionLinkController extends ControllerBase implements ContainerInjectionI
    * @param \Symfony\Component\HttpFoundation\Request $request
    *   The request.
    *
-   * @return \Symfony\Component\HttpFoundation\RedirectResponse
-   *   The response object.
+   * @return \Drupal\Core\Ajax\AjaxResponse|\Symfony\Component\HttpFoundation\RedirectResponse|null
+   *   The response object, only if successful.
    *
    * @see \Drupal\flag\Plugin\Reload
    */
@@ -111,26 +119,23 @@ class ActionLinkController extends ControllerBase implements ContainerInjectionI
       // link for the existing state of the flag.
     }
 
-    return $this->generateResponse($flag, $entity, $request);
+    return $this->generateResponse($flag, $entity, $request, $flag->getUnflagMessage());
   }
 
   /**
-   * Generates a response object after handing the un/flag request.
-   *
-   * Depending on the wrapper format of the request, it will either redirect
-   * or return an ajax response.
+   * Generates a response after the flag has been updated.
    *
    * @param \Drupal\flag\FlagInterface $flag
    *   The flag entity.
    * @param \Drupal\Core\Entity\EntityInterface $entity
    *   The entity object.
-   * @param \Symfony\Component\HttpFoundation\Request $request
-   *   The request.
+   * @param string $message
+   *   (optional) The message to flash.
    *
    * @return \Drupal\Core\Ajax\AjaxResponse|\Symfony\Component\HttpFoundation\RedirectResponse
    *   The response object.
    */
-  protected function generateResponse(FlagInterface $flag, EntityInterface $entity, Request $request) {
+  protected function generateResponse(FlagInterface $flag, EntityInterface $entity, Request $request, $message = NULL) {
     if ($request->get(MainContentViewSubscriber::WRAPPER_FORMAT) == 'drupal_ajax') {
       // Create a new AJAX response.
       $response = new AjaxResponse();
@@ -148,14 +153,21 @@ class ActionLinkController extends ControllerBase implements ContainerInjectionI
       $replace = new ReplaceCommand($selector, $this->renderer->renderPlain($link));
       $response->addCommand($replace);
 
-      return $response;
+      if ($message) {
+        // Push a message pulsing comamnd onto the stack.
+        $pulse = new ActionLinkFlashCommand($selector, $message);
+        $response->addCommand($pulse);
+     }
     }
     else {
       // Redirect back to the entity. A passed in destination query parameter
       // will automatically override this.
       $url_info = $entity->toUrl();
-      return $this->redirect($url_info->getRouteName(), $url_info->getRouteParameters());
+      $response =  $this->redirect($url_info->getRouteName(), $url_info->getRouteParameters());
     }
 
+    return $response;
   }
+
 }
+
diff --git a/src/Plugin/ActionLink/AJAXactionLink.php b/src/Plugin/ActionLink/AJAXactionLink.php
index 7b8e531..78b090e 100644
--- a/src/Plugin/ActionLink/AJAXactionLink.php
+++ b/src/Plugin/ActionLink/AJAXactionLink.php
@@ -2,8 +2,8 @@
 
 namespace Drupal\flag\Plugin\ActionLink;
 
-use Drupal\flag\FlagInterface;
 use Drupal\Core\Entity\EntityInterface;
+use Drupal\flag\FlagInterface;
 
 /**
  * Provides the AJAX link type.
@@ -21,9 +21,10 @@ class AJAXactionLink extends Reload {
 
   public function getAsFlagLink(FlagInterface $flag, EntityInterface $entity) {
     $build = parent::getAsFlagLink($flag, $entity);
-    $build['#attached']['library'][] = 'core/drupal.ajax';
+    $build['#attached']['library'][] = 'flag/flag.link_ajax';
     $build['#attributes']['class'][] = 'use-ajax';
     return $build;
+
   }
 
 }
