diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/TrafficMonitor.java b/web/gui/src/main/java/org/onosproject/ui/impl/TrafficMonitor.java
index 31f07f8..2dc8e44 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/TrafficMonitor.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/TrafficMonitor.java
@@ -37,10 +37,11 @@
 import org.onosproject.ui.impl.topo.IntentSelection;
 import org.onosproject.ui.impl.topo.ServicesBundle;
 import org.onosproject.ui.impl.topo.TopoIntentFilter;
-import org.onosproject.ui.impl.topo.TrafficClass;
 import org.onosproject.ui.impl.topo.TrafficLink;
+import org.onosproject.ui.impl.topo.TrafficLink.StatsType;
 import org.onosproject.ui.impl.topo.TrafficLinkMap;
 import org.onosproject.ui.topo.Highlights;
+import org.onosproject.ui.topo.LinkHighlight.Flavor;
 import org.onosproject.ui.topo.NodeSelection;
 import org.onosproject.ui.topo.TopoUtils;
 import org.slf4j.Logger;
@@ -59,9 +60,8 @@
 
 import static org.onosproject.net.DefaultEdgeLink.createEdgeLink;
 import static org.onosproject.ui.impl.TrafficMonitor.Mode.IDLE;
+import static org.onosproject.ui.impl.TrafficMonitor.Mode.RELATED_INTENTS;
 import static org.onosproject.ui.impl.TrafficMonitor.Mode.SELECTED_INTENT;
-import static org.onosproject.ui.topo.LinkHighlight.Flavor.PRIMARY_HIGHLIGHT;
-import static org.onosproject.ui.topo.LinkHighlight.Flavor.SECONDARY_HIGHLIGHT;
 
 /**
  * Encapsulates the behavior of monitoring specific traffic patterns.
@@ -239,6 +239,9 @@
         if (selectedIntents != null) {
             selectedIntents.next();
             sendSelectedIntents();
+            if (mode == SELECTED_INTENT) {
+                mode = RELATED_INTENTS;
+            }
         }
     }
 
@@ -251,6 +254,9 @@
         if (selectedIntents != null) {
             selectedIntents.prev();
             sendSelectedIntents();
+            if (mode == SELECTED_INTENT) {
+                mode = RELATED_INTENTS;
+            }
         }
     }
 
@@ -300,7 +306,6 @@
             trafficTask = new TrafficUpdateTask();
             timer.schedule(trafficTask, trafficPeriod, trafficPeriod);
         } else {
-            // TEMPORARY until we are sure this is working correctly
             log.debug("(traffic task already running)");
         }
     }
@@ -314,12 +319,12 @@
 
     private void sendAllFlowTraffic() {
         log.debug("sendAllFlowTraffic");
-        msgHandler.sendHighlights(trafficSummary(TrafficLink.StatsType.FLOW_STATS));
+        msgHandler.sendHighlights(trafficSummary(StatsType.FLOW_STATS));
     }
 
     private void sendAllPortTraffic() {
         log.debug("sendAllPortTraffic");
-        msgHandler.sendHighlights(trafficSummary(TrafficLink.StatsType.PORT_STATS));
+        msgHandler.sendHighlights(trafficSummary(StatsType.PORT_STATS));
     }
 
     private void sendDeviceLinkFlows() {
@@ -345,7 +350,7 @@
     // =======================================================================
     // === Generate messages in JSON object node format
 
-    private Highlights trafficSummary(TrafficLink.StatsType type) {
+    private Highlights trafficSummary(StatsType type) {
         Highlights highlights = new Highlights();
 
         TrafficLinkMap linkMap = new TrafficLinkMap();
@@ -353,9 +358,9 @@
         addEdgeLinks(linkMap);
 
         for (TrafficLink tlink : linkMap.biLinks()) {
-            if (type == TrafficLink.StatsType.FLOW_STATS) {
+            if (type == StatsType.FLOW_STATS) {
                 attachFlowLoad(tlink);
-            } else if (type == TrafficLink.StatsType.PORT_STATS) {
+            } else if (type == StatsType.PORT_STATS) {
                 attachPortLoad(tlink);
             }
 
@@ -385,7 +390,7 @@
 
             // now report on our collated links
             for (TrafficLink tlink : linkMap.biLinks()) {
-                highlights.add(tlink.highlight(TrafficLink.StatsType.FLOW_COUNT));
+                highlights.add(tlink.highlight(StatsType.FLOW_COUNT));
             }
 
         }
@@ -420,10 +425,8 @@
                 log.debug("Highlight intent: {} ([{}] of {})",
                           current.id(), selectedIntents.index(), count);
             }
-            TrafficClass tc1 = new TrafficClass(PRIMARY_HIGHLIGHT, primary);
-            TrafficClass tc2 = new TrafficClass(SECONDARY_HIGHLIGHT, secondary);
-            // classify primary links after secondary (last man wins)
-            highlightIntents(highlights, tc2, tc1);
+
+            highlightIntentLinks(highlights, primary, secondary);
         }
         return highlights;
     }
@@ -437,8 +440,8 @@
             primary.add(current);
             log.debug("Highlight traffic for intent: {} ([{}] of {})",
                       current.id(), selectedIntents.index(), selectedIntents.size());
-            TrafficClass tc1 = new TrafficClass(PRIMARY_HIGHLIGHT, primary, true);
-            highlightIntents(highlights, tc1);
+
+            highlightIntentLinksWithTraffic(highlights, primary);
         }
         return highlights;
     }
@@ -532,27 +535,29 @@
         return count;
     }
 
-    private void highlightIntents(Highlights highlights,
-                                  TrafficClass... trafficClasses) {
+    private void highlightIntentLinks(Highlights highlights,
+                                      Set<Intent> primary, Set<Intent> secondary) {
         TrafficLinkMap linkMap = new TrafficLinkMap();
-
-        for (TrafficClass trafficClass : trafficClasses) {
-            classifyLinkTraffic(linkMap, trafficClass);
-        }
-
-        for (TrafficLink tlink : linkMap.biLinks()) {
-            highlights.add(tlink.highlight(TrafficLink.StatsType.TAGGED));
-        }
+        // NOTE: highlight secondary first, then primary, so that links shared
+        //       by intents are colored correctly ("last man wins")
+        createTrafficLinks(linkMap, secondary, Flavor.SECONDARY_HIGHLIGHT, false);
+        createTrafficLinks(linkMap, primary, Flavor.PRIMARY_HIGHLIGHT, false);
+        colorLinks(highlights, linkMap);
     }
 
-    private void classifyLinkTraffic(TrafficLinkMap linkMap,
-                                     TrafficClass trafficClass) {
-        for (Intent intent : trafficClass.intents()) {
-            boolean isOptical = intent instanceof OpticalConnectivityIntent;
+    private void highlightIntentLinksWithTraffic(Highlights highlights,
+                                                 Set<Intent> primary) {
+        TrafficLinkMap linkMap = new TrafficLinkMap();
+        createTrafficLinks(linkMap, primary, Flavor.PRIMARY_HIGHLIGHT, true);
+        colorLinks(highlights, linkMap);
+    }
+
+    private void createTrafficLinks(TrafficLinkMap linkMap, Set<Intent> intents,
+                                    Flavor flavor, boolean showTraffic) {
+        for (Intent intent : intents) {
             List<Intent> installables = servicesBundle.intentService()
                     .getInstallableIntents(intent.key());
             Iterable<Link> links = null;
-
             if (installables != null) {
                 for (Intent installable : installables) {
 
@@ -566,28 +571,13 @@
                         links = ((OpticalPathIntent) installable).path().links();
                     }
 
-                    classifyLinks(trafficClass, isOptical, linkMap, links);
+                    boolean isOptical = intent instanceof OpticalConnectivityIntent;
+                    processLinks(linkMap, links, flavor, isOptical, showTraffic);
                 }
             }
         }
     }
 
-    private void classifyLinks(TrafficClass trafficClass, boolean isOptical,
-                               TrafficLinkMap linkMap,
-                               Iterable<Link> links) {
-        if (links != null) {
-            for (Link link : links) {
-                TrafficLink tlink = linkMap.add(link);
-                if (trafficClass.showTraffic()) {
-                    tlink.addLoad(getLinkFlowLoad(link));
-                    tlink.antMarch(true);
-                }
-                tlink.optical(isOptical);
-                tlink.tagFlavor(trafficClass.flavor());
-            }
-        }
-    }
-
     // Extracts links from the specified flow rule intent resources
     private Collection<Link> linkResources(Intent installable) {
         ImmutableList.Builder<Link> builder = ImmutableList.builder();
@@ -596,6 +586,28 @@
         return builder.build();
     }
 
+    private void processLinks(TrafficLinkMap linkMap, Iterable<Link> links,
+                              Flavor flavor, boolean isOptical,
+                              boolean showTraffic) {
+        if (links != null) {
+            for (Link link : links) {
+                TrafficLink tlink = linkMap.add(link);
+                tlink.tagFlavor(flavor);
+                tlink.optical(isOptical);
+                if (showTraffic) {
+                    tlink.addLoad(getLinkFlowLoad(link));
+                    tlink.antMarch(true);
+                }
+            }
+        }
+    }
+
+    private void colorLinks(Highlights highlights, TrafficLinkMap linkMap) {
+        for (TrafficLink tlink : linkMap.biLinks()) {
+            highlights.add(tlink.highlight(StatsType.TAGGED));
+        }
+    }
+
     // =======================================================================
     // === Background Task
 
