diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/ProtectedIntentMonitor.java b/web/gui/src/main/java/org/onosproject/ui/impl/ProtectedIntentMonitor.java
index 81561c6..28b761b 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/ProtectedIntentMonitor.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/ProtectedIntentMonitor.java
@@ -20,8 +20,6 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
-
-
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.ElementId;
@@ -32,8 +30,10 @@
 import org.onosproject.net.flow.instructions.Instructions.OutputInstruction;
 import org.onosproject.net.intent.FlowRuleIntent;
 import org.onosproject.net.intent.Intent;
+import org.onosproject.net.intent.IntentService;
 import org.onosproject.net.intent.OpticalConnectivityIntent;
 import org.onosproject.net.intent.ProtectionEndpointIntent;
+import org.onosproject.net.link.LinkService;
 import org.onosproject.ui.impl.topo.util.ServicesBundle;
 import org.onosproject.ui.impl.topo.util.TrafficLink;
 import org.onosproject.ui.impl.topo.util.TrafficLink.StatsType;
@@ -49,7 +49,9 @@
 import org.slf4j.LoggerFactory;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedHashSet;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -198,9 +200,9 @@
     private Highlights protectedIntentHighlights() {
         Highlights highlights = new Highlights();
         TrafficLinkMap linkMap = new TrafficLinkMap();
+        IntentService intentService = servicesBundle.intentService();
         if (selectedIntent != null) {
-            List<Intent> installables = servicesBundle.intentService()
-                    .getInstallableIntents(selectedIntent.key());
+            List<Intent> installables = intentService.getInstallableIntents(selectedIntent.key());
 
             if (installables != null) {
                 ProtectionEndpointIntent ep1 = installables.stream()
@@ -225,7 +227,7 @@
                     .filter(FlowRuleIntent.class::isInstance)
                     .map(FlowRuleIntent.class::cast)
                     // only consider fwd links so that ants march in one direction
-                    // TODO: ⇅didn't help need further investigation.
+                    // TODO: didn't help need further investigation.
                     //.filter(i -> !i.resources().contains(marker("rev")))
                     .collect(Collectors.groupingBy(this::isPrimary));
 
@@ -241,8 +243,14 @@
                 List<FlowRuleIntent> backTransit = transits.getOrDefault(false, ImmutableList.of());
                 populateLinks(backup, backHead, backTail, backTransit);
 
+                // Add packet to optical links
+                if (!usingBackup(primary)) {
+                    primary.addAll(protectedIntentMultiLayer(primHead, primTail));
+                }
+                backup.addAll(protectedIntentMultiLayer(backHead, backTail));
+
                 boolean isOptical = selectedIntent instanceof OpticalConnectivityIntent;
-                //last parameter (traffic) signals if the link is highlited with ants or solid line
+                //last parameter (traffic) signals if the link is highlighted with ants or solid line
                 //Flavor is swapped so green is primary path.
                 if (usingBackup(primary)) {
                     //the backup becomes in use so we have a dotted line
@@ -260,7 +268,7 @@
                 colorLinks(highlights, linkMap);
                 highlights.subdueAllElse(Highlights.Amount.MINIMALLY);
             } else {
-                log.debug("Selected Intent has no installables intents");
+                log.debug("Selected Intent has no installable intents");
             }
         } else {
             log.debug("Selected Intent is null");
@@ -268,6 +276,61 @@
         return highlights;
     }
 
+    /**
+     * Returns the packet to optical mapping given a head and tail of a protection path.
+     *
+     * @param head head of path
+     * @param tail tail of path
+     */
+    private Set<Link> protectedIntentMultiLayer(ConnectPoint head, ConnectPoint tail) {
+        List<Link> links = new LinkedList<>();
+        LinkService linkService = servicesBundle.linkService();
+        IntentService intentService = servicesBundle.intentService();
+
+        // Ingress cross connect link
+        links.addAll(
+                linkService.getEgressLinks(head).stream()
+                        .filter(l -> l.type() == Link.Type.OPTICAL)
+                        .collect(Collectors.toList())
+        );
+
+        // Egress cross connect link
+        links.addAll(
+                linkService.getIngressLinks(tail).stream()
+                        .filter(l -> l.type() == Link.Type.OPTICAL)
+                        .collect(Collectors.toList())
+        );
+
+        // The protected intent does not rely on a multi-layer mapping
+        if (links.size() != 2) {
+            return Collections.emptySet();
+        }
+
+        // Expected head and tail of optical circuit (not connectivity!) intent
+        ConnectPoint ocHead = links.get(0).dst();
+        ConnectPoint ocTail = links.get(1).src();
+
+        // Optical connectivity
+        // FIXME: assumes that transponder (OTN device) is a one-to-one mapping
+        // We need to track the multi-layer aspects better
+        intentService.getIntents().forEach(intent -> {
+            if (intent instanceof OpticalConnectivityIntent) {
+                OpticalConnectivityIntent ocIntent = (OpticalConnectivityIntent) intent;
+                if (ocHead.deviceId().equals(ocIntent.getSrc().deviceId()) &&
+                        ocTail.deviceId().equals(ocIntent.getDst().deviceId())) {
+                    intentService.getInstallableIntents(ocIntent.key()).forEach(i -> {
+                        if (i instanceof FlowRuleIntent) {
+                            FlowRuleIntent fr = (FlowRuleIntent) i;
+                            links.addAll(linkResources(fr));
+                        }
+                    });
+                }
+            }
+        });
+
+        return new LinkedHashSet<>(links);
+    }
+
     // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
     /**
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 5cf5765..cc03524 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
@@ -26,6 +26,7 @@
 import org.onosproject.net.HostId;
 import org.onosproject.net.Link;
 import org.onosproject.net.PortNumber;
+import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.flow.FlowEntry;
 import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.flow.instructions.Instruction;
@@ -38,6 +39,7 @@
 import org.onosproject.net.intent.OpticalConnectivityIntent;
 import org.onosproject.net.intent.OpticalPathIntent;
 import org.onosproject.net.intent.PathIntent;
+import org.onosproject.net.link.LinkService;
 import org.onosproject.net.statistic.Load;
 import org.onosproject.ui.impl.topo.util.IntentSelection;
 import org.onosproject.ui.impl.topo.util.ServicesBundle;
@@ -67,11 +69,14 @@
 import java.util.Set;
 import java.util.Timer;
 import java.util.TimerTask;
+import java.util.stream.Collectors;
 
 import static org.onosproject.incubator.net.PortStatisticsService.MetricType.BYTES;
 import static org.onosproject.incubator.net.PortStatisticsService.MetricType.PACKETS;
 import static org.onosproject.net.DefaultEdgeLink.createEdgeLink;
-import static org.onosproject.ui.impl.TrafficMonitor.Mode.*;
+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;
 
 /**
  * Encapsulates the behavior of monitoring specific traffic patterns.
@@ -586,7 +591,23 @@
                     if (installable instanceof PathIntent) {
                         links = ((PathIntent) installable).path().links();
                     } else if (installable instanceof FlowRuleIntent) {
-                        links = addEdgeLinksIfNeeded(intent, linkResources(installable));
+                        Collection<Link> l = new ArrayList<>();
+                        l.addAll(linkResources(installable));
+                        // Add cross connect links
+                        if (intent instanceof OpticalConnectivityIntent) {
+                            OpticalConnectivityIntent ocIntent = (OpticalConnectivityIntent) intent;
+                            LinkService linkService = servicesBundle.linkService();
+                            DeviceService deviceService = servicesBundle.deviceService();
+                            l.addAll(linkService.getDeviceIngressLinks(ocIntent.getSrc().deviceId()).stream()
+                                    .filter(i ->
+                                            deviceService.getDevice(i.src().deviceId()).type() == Device.Type.SWITCH)
+                                    .collect(Collectors.toList()));
+                            l.addAll(linkService.getDeviceEgressLinks(ocIntent.getDst().deviceId()).stream()
+                                    .filter(e ->
+                                            deviceService.getDevice(e.dst().deviceId()).type() == Device.Type.SWITCH)
+                                    .collect(Collectors.toList()));
+                        }
+                        links = l;
                     } else if (installable instanceof FlowObjectiveIntent) {
                         links = addEdgeLinksIfNeeded(intent, linkResources(installable));
                     } else if (installable instanceof LinkCollectionIntent) {
