diff --git a/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmMonitor.java b/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmMonitor.java
new file mode 100644
index 0000000..d65149d
--- /dev/null
+++ b/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmMonitor.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.faultmanagement.alarms.gui;
+
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmEvent;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmListener;
+
+/**
+ * Encapsulates the behavior of monitoring when new alarms are stored.
+ */
+public class AlarmMonitor {
+
+    private final AlarmTopovMessageHandler messageHandler;
+    private final AlarmListener alarmListener = new TopoAlarmListener();
+    private volatile boolean isMonitoring;
+
+
+    /**
+     * Constructs a traffic monitor.
+     *
+     * @param msgHandler the alarm message handler
+     */
+    public AlarmMonitor(AlarmTopovMessageHandler msgHandler) {
+        messageHandler = msgHandler;
+        messageHandler.alarmService.addListener(alarmListener);
+    }
+
+    /**
+     * Activates updating the alarms onf the GUI client.
+     */
+    protected void startMonitorig() {
+        isMonitoring = true;
+    }
+
+    /**
+     * De-activates updating the alarms onf the GUI client.
+     */
+    protected void stopMonitoring() {
+        isMonitoring = false;
+    }
+
+    //internal alarm listener
+    private class TopoAlarmListener implements AlarmListener {
+
+        @Override
+        public void event(AlarmEvent event) {
+            if (isMonitoring) {
+                messageHandler.sendAlarmHighlights();
+            }
+        }
+    }
+}
diff --git a/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTopovMessageHandler.java b/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTopovMessageHandler.java
index 10ebad9..9a8184c 100644
--- a/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTopovMessageHandler.java
+++ b/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTopovMessageHandler.java
@@ -16,17 +16,12 @@
 package org.onosproject.faultmanagement.alarms.gui;
 
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
 import org.onlab.osgi.ServiceDirectory;
 import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
 import org.onosproject.incubator.net.faultmanagement.alarm.AlarmService;
-import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
-import org.onosproject.net.Element;
-import org.onosproject.net.HostId;
 import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.host.HostService;
 import org.onosproject.ui.RequestHandler;
 import org.onosproject.ui.UiConnection;
 import org.onosproject.ui.UiMessageHandler;
@@ -47,39 +42,29 @@
 public class AlarmTopovMessageHandler extends UiMessageHandler {
 
     private static final String ALARM_TOPOV_DISPLAY_START = "alarmTopovDisplayStart";
-    private static final String ALARM_TOPOV_DISPLAY_UPDATE = "alarmTopovDisplayUpdate";
     private static final String ALARM_TOPOV_DISPLAY_STOP = "alarmTopovDisplayStop";
+    private static final int DELAY_MS = 500;
 
-    private static final String ID = "id";
-    private static final String MODE = "mode";
-
-    private enum Mode {
-        IDLE, MOUSE
-    }
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
+    protected AlarmService alarmService;
     private DeviceService deviceService;
-    private HostService hostService;
-    private AlarmService alarmService;
-
-    private Mode currentMode = Mode.IDLE;
-    private Element elementOfNote;
+    private AlarmMonitor alarmMonitor;
 
     // =======================================================================
     @Override
     public void init(UiConnection connection, ServiceDirectory directory) {
         super.init(connection, directory);
         deviceService = directory.get(DeviceService.class);
-        hostService = directory.get(HostService.class);
         alarmService = directory.get(AlarmService.class);
+        alarmMonitor = new AlarmMonitor(this);
     }
 
     @Override
     protected Collection<RequestHandler> createRequestHandlers() {
         return ImmutableSet.of(
                 new DisplayStartHandler(),
-                new DisplayUpdateHandler(),
                 new DisplayStopHandler()
         );
     }
@@ -94,41 +79,9 @@
 
         @Override
         public void process(ObjectNode payload) {
-            String mode = string(payload, MODE);
-            log.debug("Start Display: mode [{}]", mode);
-
-            clearState();
-            clearForMode();
-
-            switch (mode) {
-                case "mouse":
-                    currentMode = Mode.MOUSE;
-                    sendMouseData();
-                    break;
-
-                default:
-                    currentMode = Mode.IDLE;
-                    break;
-            }
-        }
-    }
-
-    private final class DisplayUpdateHandler extends RequestHandler {
-
-        public DisplayUpdateHandler() {
-            super(ALARM_TOPOV_DISPLAY_UPDATE);
-        }
-
-        @Override
-        public void process(ObjectNode payload) {
-            String id = string(payload, ID);
-            log.debug("Update Display: id [{}]", id);
-
-            if (!Strings.isNullOrEmpty(id)) {
-                updateForMode(id);
-            } else {
-                clearForMode();
-            }
+            log.debug("Start Display");
+            sendDelayedAlarmHighlights();
+            alarmMonitor.startMonitorig();
         }
     }
 
@@ -141,72 +94,54 @@
         @Override
         public void process(ObjectNode payload) {
             log.debug("Stop Display");
-
-            clearState();
-            clearForMode();
+            alarmMonitor.stopMonitoring();
+            clearHighlights();
         }
     }
 
-    // === ------------
-    private void clearState() {
-        currentMode = Mode.IDLE;
-        elementOfNote = null;
+    /**
+     * Sends the highlights with a delay to the client side on the browser.
+     */
+    protected void sendDelayedAlarmHighlights() {
+        createAndSendHighlights(true);
     }
 
-    private void updateForMode(String id) {
-        log.debug("host service: {}", hostService);
-        log.debug("device service: {}", deviceService);
-
-        try {
-            HostId hid = HostId.hostId(id);
-            log.debug("host id {}", hid);
-            elementOfNote = hostService.getHost(hid);
-            log.debug("host element {}", elementOfNote);
-
-        } catch (RuntimeException e) {
-            try {
-                DeviceId did = DeviceId.deviceId(id);
-                log.debug("device id {}", did);
-                elementOfNote = deviceService.getDevice(did);
-                log.debug("device element {}", elementOfNote);
-
-            } catch (RuntimeException e2) {
-                log.debug("Unable to process ID [{}]", id);
-                elementOfNote = null;
-            }
-        }
-
-        switch (currentMode) {
-            case MOUSE:
-                sendMouseData();
-                break;
-
-            default:
-                break;
-        }
-
+    /**
+     * Sends the highlights to the client side on the browser.
+     */
+    protected void sendAlarmHighlights() {
+        createAndSendHighlights(false);
     }
 
-    private void clearForMode() {
-        sendHighlights(new Highlights());
+    private void createAndSendHighlights(boolean toDelay) {
+        Highlights highlights = new Highlights();
+        createBadges(highlights);
+        if (toDelay) {
+            highlights.delay(DELAY_MS);
+        }
+        sendHighlights(highlights);
     }
 
     private void sendHighlights(Highlights highlights) {
         sendMessage(TopoJson.highlightsMessage(highlights));
     }
 
-    private void sendMouseData() {
-        if (elementOfNote != null && elementOfNote instanceof Device) {
-            DeviceId devId = (DeviceId) elementOfNote.id();
-            Set<Alarm> alarmsOnDevice = alarmService.getAlarms(devId);
-            Highlights highlights = new Highlights();
-
-            addDeviceBadge(highlights, devId, alarmsOnDevice.size());
-            sendHighlights(highlights);
-        }
-        // Note: could also process Host, if available
+    private void createBadges(Highlights highlights) {
+        deviceService.getAvailableDevices().forEach(d -> {
+            Set<Alarm> alarmsOnDevice = alarmService.getAlarms(d.id());
+            int alarmSize = alarmsOnDevice.size();
+            log.debug("{} Alarms on device {}", alarmSize, d.id());
+            if (alarmSize > 0) {
+                addDeviceBadge(highlights, d.id(), alarmSize);
+            }
+        });
     }
 
+    private void clearHighlights() {
+        sendHighlights(new Highlights());
+    }
+
+
     private void addDeviceBadge(Highlights h, DeviceId devId, int n) {
         DeviceHighlight dh = new DeviceHighlight(devId.toString());
         dh.setBadge(createBadge(n));
diff --git a/apps/faultmanagement/fmgui/src/main/resources/app/view/alarmTopov/alarmTopovDemo.js b/apps/faultmanagement/fmgui/src/main/resources/app/view/alarmTopov/alarmTopovDemo.js
index 46a4d11..23d41df 100644
--- a/apps/faultmanagement/fmgui/src/main/resources/app/view/alarmTopov/alarmTopovDemo.js
+++ b/apps/faultmanagement/fmgui/src/main/resources/app/view/alarmTopov/alarmTopovDemo.js
@@ -27,26 +27,14 @@
 
     // constants
     var displayStart = 'alarmTopovDisplayStart',
-        displayUpdate = 'alarmTopovDisplayUpdate',
         displayStop = 'alarmTopovDisplayStop';
 
-    // internal state
-    var currentMode = null;
-
 
     // === ---------------------------
     // === Helper functions
 
-    function sendDisplayStart(mode) {
-        wss.sendEvent(displayStart, {
-            mode: mode
-        });
-    }
-
-    function sendDisplayUpdate(what) {
-        wss.sendEvent(displayUpdate, {
-            id: what ? what.id : ''
-        });
+    function sendDisplayStart() {
+        wss.sendEvent(displayStart);
     }
 
     function sendDisplayStop() {
@@ -56,30 +44,15 @@
     // === ---------------------------
     // === Main API functions
 
-    function startDisplay(mode) {
-        if (currentMode === mode) {
-            $log.debug('(in mode', mode, 'already)');
-        } else {
-            currentMode = mode;
-            sendDisplayStart(mode);
-            flash.flash('Starting display mode: ' + mode);
-        }
-    }
-
-    function updateDisplay(m) {
-        if (currentMode) {
-            sendDisplayUpdate(m);
-        }
+    function startDisplay() {
+        sendDisplayStart();
+        flash.flash('Showing alarm counts on devices');
     }
 
     function stopDisplay() {
-        if (currentMode) {
-            currentMode = null;
-            sendDisplayStop();
-            flash.flash('Canceling display mode');
-            return true;
-        }
-        return false;
+        sendDisplayStop();
+        flash.flash('Canceling alarm counts on devices');
+        return true;
     }
 
     // === ---------------------------
@@ -97,7 +70,6 @@
 
             return {
                 startDisplay: startDisplay,
-                updateDisplay: updateDisplay,
                 stopDisplay: stopDisplay
             };
         }]);
diff --git a/apps/faultmanagement/fmgui/src/main/resources/app/view/alarmTopov/alarmTopovOverlay.js b/apps/faultmanagement/fmgui/src/main/resources/app/view/alarmTopov/alarmTopovOverlay.js
index bf389db..a63f476 100644
--- a/apps/faultmanagement/fmgui/src/main/resources/app/view/alarmTopov/alarmTopovOverlay.js
+++ b/apps/faultmanagement/fmgui/src/main/resources/app/view/alarmTopov/alarmTopovOverlay.js
@@ -85,6 +85,7 @@
         },
         activate: function () {
             $log.debug("Alarm topology overlay ACTIVATED");
+            atds.startDisplay();
         },
         deactivate: function () {
             atds.stopDisplay();
@@ -99,37 +100,8 @@
                     $log.debug('Show alarms for selected device. data:', data);
                     ns.navTo("alarmTable", {devId: data.id});
                 }
-            },
-            alarm2button: {
-                gid: '*clocks',
-                tt: 'Show alarms for all devices',
-                cb: function (data) {
-                    $log.debug('Show alarms for all devices. data:', data);
-                    ns.navTo("alarmTable");
-                }
             }
         },
-        // Key bindings for traffic overlay buttons
-        // NOTE: fully qual. button ID is derived from overlay-id and key-name
-        keyBindings: {
-            0: {
-                cb: function () {
-                    atds.stopDisplay();
-                },
-                tt: 'Cancel Alarm Count on Device',
-                gid: 'xMark'
-            },
-            V: {
-                cb: function () {
-                    atds.startDisplay('mouse');
-                },
-                tt: 'Start Alarm Count on Device',
-                gid: '*clock'
-            },
-            _keyOrder: [
-                '0', 'V'
-            ]
-        },
         hooks: {
             // hook for handling escape key
             // Must return true to consume ESC, false otherwise.
@@ -147,16 +119,6 @@
             multi: function (selectOrder) {
                 selectionCallback('multi', selectOrder);
                 tov.addDetailButton('alarm1button');
-                tov.addDetailButton('alarm2button');
-            },
-            mouseover: function (m) {
-                // m has id, class, and type properties
-                $log.debug('mouseover:', m);
-                atds.updateDisplay(m);
-            },
-            mouseout: function () {
-                $log.debug('mouseout');
-                atds.updateDisplay();
             }
         }
     };
