diff --git a/web/gui/src/main/java/org/onlab/onos/gui/TopologyViewWebSocket.java b/web/gui/src/main/java/org/onlab/onos/gui/TopologyViewWebSocket.java
index 9e46da3..bd02065 100644
--- a/web/gui/src/main/java/org/onlab/onos/gui/TopologyViewWebSocket.java
+++ b/web/gui/src/main/java/org/onlab/onos/gui/TopologyViewWebSocket.java
@@ -90,7 +90,8 @@
 
     private static final String APP_ID = "org.onlab.onos.gui";
 
-    private static final long TRAFFIC_FREQUENCY_SEC = 2000;
+    private static final long TRAFFIC_FREQUENCY = 2000;
+    private static final long SUMMARY_FREQUENCY = 30000;
 
     private static final Comparator<? super ControllerNode> NODE_COMPARATOR =
             new Comparator<ControllerNode>() {
@@ -103,9 +104,9 @@
 
     private final Timer timer = new Timer("topology-view");
 
-    private static final int MAX_EVENTS = 500;
-    private static final int MAX_BATCH_MS = 1000;
-    private static final int MAX_IDLE_MS = 500;
+    private static final int MAX_EVENTS = 1000;
+    private static final int MAX_BATCH_MS = 5000;
+    private static final int MAX_IDLE_MS = 1000;
 
     private final ApplicationId appId;
 
@@ -122,15 +123,23 @@
 
     private final EventAccumulator eventAccummulator = new InternalEventAccummulator();
 
-    private boolean summaryEnabled = true;
     private TimerTask trafficTask;
     private ObjectNode trafficEvent;
 
+    private TimerTask summaryTask;
+    private ObjectNode summaryEvent;
+
     private long lastActive = System.currentTimeMillis();
     private boolean listenersRemoved = false;
 
     private TopologyViewIntentFilter intentFilter;
 
+    // Current selection context
+    private Set<Host> selectedHosts;
+    private Set<Device> selectedDevices;
+    private List<Intent> selectedIntents;
+    private int currentIntentIndex = -1;
+
     /**
      * Creates a new web-socket for serving data to GUI topology view.
      *
@@ -204,7 +213,6 @@
             processMessage((ObjectNode) mapper.reader().readTree(data));
         } catch (Exception e) {
             log.warn("Unable to parse GUI request {} due to {}", data, e);
-            log.warn("Boom!!!!", e);
         }
     }
 
@@ -221,19 +229,29 @@
         } else if (type.equals("addMultiSourceIntent")) {
             createMultiSourceIntent(event);
 
-        } else if (type.equals("requestTraffic")) {
-            requestTraffic(event);
+        } else if (type.equals("requestRelatedIntents")) {
+            requestRelatedIntents(event);
+        } else if (type.equals("requestNextRelatedIntent")) {
+            requestNextRelatedIntent(event);
+        } else if (type.equals("requestSelectedIntentTraffic")) {
+            requestSelectedIntentTraffic(event);
+
         } else if (type.equals("requestAllTraffic")) {
             requestAllTraffic(event);
+            startTrafficMonitoring(event);
+
         } else if (type.equals("requestDeviceLinkFlows")) {
             requestDeviceLinkFlows(event);
+            startTrafficMonitoring(event);
+
         } else if (type.equals("cancelTraffic")) {
             cancelTraffic(event);
 
         } else if (type.equals("requestSummary")) {
             requestSummary(event);
+            startSummaryMonitoring(event);
         } else if (type.equals("cancelSummary")) {
-            cancelSummary(event);
+            stopSummaryMonitoring();
 
         } else if (type.equals("equalizeMasters")) {
             equalizeMasters(event);
@@ -324,8 +342,9 @@
                 new HostToHostIntent(appId, one, two,
                                      DefaultTrafficSelector.builder().build(),
                                      DefaultTrafficTreatment.builder().build());
-        startMonitoring(event);
+
         intentService.submit(intent);
+        startMonitoringIntent(event, intent);
     }
 
     // Creates multi-source-to-single-dest intent.
@@ -348,10 +367,24 @@
         MultiPointToSinglePointIntent intent =
                 new MultiPointToSinglePointIntent(appId, selector, treatment,
                                                   ingressPoints, dstHost.location());
-        startMonitoring(event);
+
         intentService.submit(intent);
+        startMonitoringIntent(event, intent);
     }
 
+
+    private synchronized void startMonitoringIntent(ObjectNode event, Intent intent) {
+        selectedHosts = new HashSet<>();
+        selectedDevices = new HashSet<>();
+        selectedIntents = new ArrayList<>();
+        selectedIntents.add(intent);
+        currentIntentIndex = -1;
+        requestNextRelatedIntent(event);
+        requestSelectedIntentTraffic(event);
+    }
+
+
+
     private Set<ConnectPoint> getHostLocations(Set<HostId> hostIds) {
         Set<ConnectPoint> points = new HashSet<>();
         for (HostId hostId : hostIds) {
@@ -374,17 +407,15 @@
     }
 
 
-    private synchronized long startMonitoring(ObjectNode event) {
-        if (trafficTask != null) {
-            stopMonitoring();
-        }
+    private synchronized long startTrafficMonitoring(ObjectNode event) {
+        stopTrafficMonitoring();
         trafficEvent = event;
         trafficTask = new TrafficMonitor();
-        timer.schedule(trafficTask, TRAFFIC_FREQUENCY_SEC, TRAFFIC_FREQUENCY_SEC);
+        timer.schedule(trafficTask, TRAFFIC_FREQUENCY, TRAFFIC_FREQUENCY);
         return number(event, "sid");
     }
 
-    private synchronized void stopMonitoring() {
+    private synchronized void stopTrafficMonitoring() {
         if (trafficTask != null) {
             trafficTask.cancel();
             trafficTask = null;
@@ -394,13 +425,13 @@
 
     // Subscribes for host traffic messages.
     private synchronized void requestAllTraffic(ObjectNode event) {
-        long sid = startMonitoring(event);
+        long sid = startTrafficMonitoring(event);
         sendMessage(trafficSummaryMessage(sid));
     }
 
     private void requestDeviceLinkFlows(ObjectNode event) {
         ObjectNode payload = payload(event);
-        long sid = startMonitoring(event);
+        long sid = startTrafficMonitoring(event);
 
         // Get the set of selected hosts and their intents.
         ArrayNode ids = (ArrayNode) payload.path("ids");
@@ -416,58 +447,122 @@
     }
 
 
-    // Subscribes for host traffic messages.
-    private synchronized void requestTraffic(ObjectNode event) {
+    // Requests related intents message.
+    private synchronized void requestRelatedIntents(ObjectNode event) {
         ObjectNode payload = payload(event);
         if (!payload.has("ids")) {
             return;
         }
 
-        long sid = startMonitoring(event);
+        long sid = number(event, "sid");
 
-        // Get the set of selected hosts and their intents.
-        ArrayNode ids = (ArrayNode) payload.path("ids");
-        Set<Host> hosts = getHosts(ids);
-        Set<Device> devices = getDevices(ids);
-        Set<Intent> intents = intentFilter.findPathIntents(hosts, devices);
+        // Cancel any other traffic monitoring mode.
+        stopTrafficMonitoring();
 
-        // If there is a hover node, include it in the hosts and find intents.
         String hover = string(payload, "hover");
-        Set<Intent> hoverIntents;
+        if (haveSelectedIntents()) {
+            // Get the set of selected hosts and their intents.
+            ArrayNode ids = (ArrayNode) payload.path("ids");
+            selectedHosts = getHosts(ids);
+            selectedDevices = getDevices(ids);
+            selectedIntents = intentFilter.findPathIntents(selectedHosts, selectedDevices,
+                                                           intentService.getIntents());
+            currentIntentIndex = -1;
+
+            // Send a message to highlight all links of all monitored intents.
+            sendMessage(trafficMessage(sid, new TrafficClass("primary", selectedIntents)));
+        }
+
         if (!isNullOrEmpty(hover)) {
-            addHover(hosts, devices, hover);
-            hoverIntents = intentFilter.findPathIntents(hosts, devices);
-            intents.removeAll(hoverIntents);
+            // If there is a hover node, include it in the selection and find intents.
+            processExtendedSelection(sid, hover);
+        }
+    }
 
-            // Send an initial message to highlight all links of all monitored intents.
-            sendMessage(trafficMessage(sid,
-                                       new TrafficClass("primary", hoverIntents),
-                                       new TrafficClass("secondary", intents)));
+    private boolean haveSelectedIntents() {
+        return selectedIntents != null && !selectedIntents.isEmpty();
+    }
 
-        } else {
-            // Send an initial message to highlight all links of all monitored intents.
-            sendMessage(trafficMessage(sid, new TrafficClass("primary", intents)));
+    private void processExtendedSelection(long sid, String hover) {
+        Set<Host> hoverSelHosts = new HashSet<>(selectedHosts);
+        Set<Device> hoverSelDevices = new HashSet<>(selectedDevices);
+        addHover(hoverSelHosts, hoverSelDevices, hover);
+
+        List<Intent> primary =
+                intentFilter.findPathIntents(hoverSelHosts, hoverSelDevices,
+                                             selectedIntents);
+        Set<Intent> secondary = new HashSet<>(selectedIntents);
+        secondary.removeAll(primary);
+
+        // Send a message to highlight all links of all monitored intents.
+        sendMessage(trafficMessage(sid, new TrafficClass("primary", primary),
+                                   new TrafficClass("secondary", secondary)));
+    }
+
+    // Requests next of the related intents.
+    private void requestNextRelatedIntent(ObjectNode event) {
+        if (haveSelectedIntents()) {
+            currentIntentIndex = (currentIntentIndex + 1) % selectedIntents.size();
+            Intent selectedIntent = selectedIntents.get(currentIntentIndex);
+            log.info("Requested next intent {}", selectedIntent.id());
+
+            Set<Intent> primary = new HashSet<>();
+            primary.add(selectedIntent);
+
+            Set<Intent> secondary = new HashSet<>(selectedIntents);
+            secondary.remove(selectedIntent);
+
+            // Send a message to highlight all links of the selected intent.
+            sendMessage(trafficMessage(number(event, "sid"),
+                                       new TrafficClass("primary", primary),
+                                       new TrafficClass("secondary", secondary)));
+        }
+    }
+
+    // Requests monitoring of traffic for the selected intent.
+    private void requestSelectedIntentTraffic(ObjectNode event) {
+        if (haveSelectedIntents()) {
+            Intent selectedIntent = selectedIntents.get(currentIntentIndex);
+            log.info("Requested traffic for selected {}", selectedIntent.id());
+
+            Set<Intent> primary = new HashSet<>();
+            primary.add(selectedIntent);
+
+            // Send a message to highlight all links of the selected intent.
+            sendMessage(trafficMessage(number(event, "sid"),
+                                       new TrafficClass("primary", primary, true)));
         }
     }
 
     // Cancels sending traffic messages.
     private void cancelTraffic(ObjectNode event) {
+        selectedIntents = null;
         sendMessage(trafficMessage(number(event, "sid")));
-        stopMonitoring();
+        stopTrafficMonitoring();
     }
 
 
+    private synchronized long startSummaryMonitoring(ObjectNode event) {
+        stopSummaryMonitoring();
+        summaryEvent = event;
+        summaryTask = new SummaryMonitor();
+        timer.schedule(summaryTask, SUMMARY_FREQUENCY, SUMMARY_FREQUENCY);
+        return number(event, "sid");
+    }
+
+    private synchronized void stopSummaryMonitoring() {
+        if (summaryEvent != null) {
+            summaryTask.cancel();
+            summaryTask = null;
+            summaryEvent = null;
+        }
+    }
+
     // Subscribes for summary messages.
     private synchronized void requestSummary(ObjectNode event) {
-        summaryEnabled = true;
         sendMessage(summmaryMessage(number(event, "sid")));
     }
 
-    // Cancels sending summary messages.
-    private synchronized void cancelSummary(ObjectNode event) {
-        summaryEnabled = false;
-    }
-
 
     // Forces mastership role rebalancing.
     private void equalizeMasters(ObjectNode event) {
@@ -550,7 +645,7 @@
         @Override
         public void event(IntentEvent event) {
             if (trafficEvent != null) {
-                requestTraffic(trafficEvent);
+                requestSelectedIntentTraffic(trafficEvent);
             }
             eventAccummulator.add(event);
         }
@@ -564,6 +659,7 @@
         }
     }
 
+    // Periodic update of the traffic information
     private class TrafficMonitor extends TimerTask {
         @Override
         public void run() {
@@ -574,8 +670,8 @@
                         requestAllTraffic(trafficEvent);
                     } else if (type.equals("requestDeviceLinkFlows")) {
                         requestDeviceLinkFlows(trafficEvent);
-                    } else {
-                        requestTraffic(trafficEvent);
+                    } else if (type.equals("requestSelectedIntentTraffic")) {
+                        requestSelectedIntentTraffic(trafficEvent);
                     }
                 }
             } catch (Exception e) {
@@ -585,6 +681,20 @@
         }
     }
 
+    // Periodic update of the summary information
+    private class SummaryMonitor extends TimerTask {
+        @Override
+        public void run() {
+            try {
+                if (summaryEvent != null) {
+                    requestSummary(summaryEvent);
+                }
+            } catch (Exception e) {
+                log.warn("Unable to handle summary request due to {}", e.getMessage());
+            }
+        }
+    }
+
     // Accumulates events to drive methodic update of the summary pane.
     private class InternalEventAccummulator extends AbstractEventAccumulator {
         protected InternalEventAccummulator() {
@@ -594,7 +704,7 @@
         @Override
         public void processEvents(List<Event> events) {
             try {
-                if (summaryEnabled) {
+                if (summaryEvent != null) {
                     sendMessage(summmaryMessage(0));
                 }
             } catch (Exception e) {
