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
new file mode 100644
index 0000000..5d928a0
--- /dev/null
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/ProtectedIntentMonitor.java
@@ -0,0 +1,337 @@
+/*
+ * 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.ui.impl;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.ElementId;
+import org.onosproject.net.HostId;
+import org.onosproject.net.Link;
+import org.onosproject.net.MarkerResource;
+import org.onosproject.net.NetworkResource;
+import org.onosproject.net.behaviour.protection.TransportEndpointDescription;
+import org.onosproject.net.intent.FlowRuleIntent;
+import org.onosproject.net.intent.Intent;
+import org.onosproject.net.intent.OpticalConnectivityIntent;
+import org.onosproject.net.intent.ProtectionEndpointIntent;
+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;
+import org.onosproject.ui.impl.topo.util.TrafficLinkMap;
+import org.onosproject.ui.topo.AbstractTopoMonitor;
+import org.onosproject.ui.topo.DeviceHighlight;
+import org.onosproject.ui.topo.Highlights;
+import org.onosproject.ui.topo.HostHighlight;
+import org.onosproject.ui.topo.LinkHighlight.Flavor;
+import org.onosproject.ui.topo.NodeHighlight;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import static org.onosproject.ui.impl.ProtectedIntentMonitor.ProtectedMode.IDLE;
+import static org.onosproject.ui.impl.ProtectedIntentMonitor.ProtectedMode.SELECTED_INTENT;
+
+/**
+ * Encapsulates the behavior of monitoring protected intents.
+ */
+//TODO refactor duplicated methods from here and the TrafficMonitor to AbstractTopoMonitor
+public class ProtectedIntentMonitor extends AbstractTopoMonitor {
+
+    private static final Logger log =
+            LoggerFactory.getLogger(ProtectedIntentMonitor.class);
+    public static final String PRIMARY_PATH_TAG = "protection1";
+
+    /**
+     * Designates the different modes of operation.
+     */
+    public enum ProtectedMode {
+        IDLE,
+        SELECTED_INTENT
+    }
+
+    private final long trafficPeriod;
+    private final ServicesBundle servicesBundle;
+    private final TopologyViewMessageHandler msgHandler;
+
+    private final Timer timer = new Timer("topo-protected-intents");
+
+    private TimerTask trafficTask = null;
+    private ProtectedMode mode = ProtectedMode.IDLE;
+    private Intent selectedIntent = null;
+
+
+    /**
+     * Constructs a protected intent monitor.
+     *
+     * @param trafficPeriod  traffic task period in ms
+     * @param servicesBundle bundle of services
+     * @param msgHandler     our message handler
+     */
+    public ProtectedIntentMonitor(long trafficPeriod, ServicesBundle servicesBundle,
+                                  TopologyViewMessageHandler msgHandler) {
+        this.trafficPeriod = trafficPeriod;
+        this.servicesBundle = servicesBundle;
+        this.msgHandler = msgHandler;
+
+    }
+
+    // =======================================================================
+    // === API ===
+
+    // TODO: move this out to the "h2h/multi-intent app"
+
+    /**
+     * Monitor for protected intent data to be sent back to the web client,
+     * for the given intent.
+     *
+     * @param intent the intent to monitor
+     */
+    public synchronized void monitor(Intent intent) {
+        log.debug("monitor intent: {}", intent.id());
+        selectedIntent = intent;
+        mode = SELECTED_INTENT;
+        scheduleTask();
+        sendSelectedIntents();
+    }
+
+    /**
+     * Stop all traffic monitoring.
+     */
+    public synchronized void stopMonitoring() {
+        log.debug("STOP monitoring");
+        if (mode != IDLE) {
+            sendClearAll();
+        }
+    }
+
+
+    // =======================================================================
+    // === Helper methods ===
+    private void sendClearAll() {
+        clearAll();
+        sendClearHighlights();
+    }
+
+    private void clearAll() {
+        this.mode = IDLE;
+        clearSelection();
+        cancelTask();
+    }
+
+    private void clearSelection() {
+        selectedIntent = null;
+    }
+
+    //TODO duplicate and can be brought in abstract upper class.
+    private synchronized void scheduleTask() {
+        if (trafficTask == null) {
+            log.debug("Starting up background protected intent task...");
+            trafficTask = new TrafficUpdateTask();
+            timer.schedule(trafficTask, trafficPeriod, trafficPeriod);
+        } else {
+            log.debug("(protected intent task already running)");
+        }
+    }
+
+    private synchronized void cancelTask() {
+        if (trafficTask != null) {
+            trafficTask.cancel();
+            trafficTask = null;
+        }
+    }
+
+    private void sendSelectedIntents() {
+        log.debug("sendSelectedIntents: {}", selectedIntent);
+        msgHandler.sendHighlights(protectedIntentHighlights());
+    }
+
+    private void sendClearHighlights() {
+        log.debug("sendClearHighlights");
+        msgHandler.sendHighlights(new Highlights());
+    }
+
+    // =======================================================================
+    // === Generate messages in JSON object node format
+    private Highlights protectedIntentHighlights() {
+        Highlights highlights = new Highlights();
+        TrafficLinkMap linkMap = new TrafficLinkMap();
+        if (selectedIntent != null) {
+            List<Intent> installables = servicesBundle.intentService()
+                    .getInstallableIntents(selectedIntent.key());
+            Set<Link> primary = new HashSet<>();
+            Set<Link> backup = new HashSet<>();
+            if (installables != null) {
+                //There should be exactly two FlowRuleIntent and four
+                //ProtectionEndpointIntent for each ProtectedTransportIntent.
+                for (Intent installable : installables) {
+                    if (installable instanceof FlowRuleIntent) {
+                        handleFlowRuleIntent(primary, backup, (FlowRuleIntent) installable);
+                    } else if (installable instanceof ProtectionEndpointIntent) {
+                        handleProtectionEndpointIntent(primary, backup,
+                                                       (ProtectionEndpointIntent) installable);
+                    } else {
+                        log.warn("Intent {} is not an expected installable type {} " +
+                                         "related to ProtectedTransportIntent",
+                                 installable.id(), installable.getClass().getSimpleName());
+                        stopMonitoring();
+                    }
+                }
+                boolean isOptical = selectedIntent instanceof OpticalConnectivityIntent;
+                //last parameter (traffic) signals if the link is highlited 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
+                    processLinks(linkMap, backup, Flavor.PRIMARY_HIGHLIGHT, isOptical, true);
+                } else {
+                    processLinks(linkMap, primary, Flavor.SECONDARY_HIGHLIGHT, isOptical, true);
+                    processLinks(linkMap, backup, Flavor.PRIMARY_HIGHLIGHT, isOptical, false);
+                }
+                updateHighlights(highlights, primary);
+                updateHighlights(highlights, backup);
+                colorLinks(highlights, linkMap);
+                highlights.subdueAllElse(Highlights.Amount.MINIMALLY);
+            } else {
+                log.debug("Selected Intent has no installables intents");
+            }
+        } else {
+            log.debug("Selected Intent is null");
+        }
+        return highlights;
+    }
+
+    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+    private void handleProtectionEndpointIntent(Set<Link> primary, Set<Link> backup,
+                                                ProtectionEndpointIntent peIntent) {
+        TransportEndpointDescription primaryDesc = peIntent
+                .description().paths().get(0);
+        TransportEndpointDescription secondaryDesc = peIntent
+                .description().paths().get(1);
+        primary.addAll(servicesBundle.linkService()
+                               .getLinks(primaryDesc.output()
+                                                 .connectPoint()));
+        backup.addAll(servicesBundle.linkService()
+                              .getLinks(secondaryDesc.output()
+                                                .connectPoint()));
+    }
+
+    private void handleFlowRuleIntent(Set<Link> primary, Set<Link> backup,
+                                      FlowRuleIntent frIntent) {
+        boolean protection1 = frIntent.resources().stream()
+                .filter(r -> r instanceof MarkerResource)
+                .map(NetworkResource::toString)
+                .anyMatch(rstring -> rstring.equals(PRIMARY_PATH_TAG));
+        if (protection1) {
+            primary.addAll(linkResources(frIntent));
+        } else {
+            backup.addAll(linkResources(frIntent));
+        }
+    }
+
+    // returns true if the backup path is the one where the traffic is currently flowing
+    private boolean usingBackup(Set<Link> primary) {
+        Set<Link> activeLinks = Sets.newHashSet(servicesBundle.linkService().getActiveLinks());
+        return primary.isEmpty() || !activeLinks.containsAll(primary);
+    }
+
+    private void updateHighlights(Highlights highlights, Iterable<Link> links) {
+        for (Link link : links) {
+            ensureNodePresent(highlights, link.src().elementId());
+            ensureNodePresent(highlights, link.dst().elementId());
+        }
+    }
+
+    //TODO duplicate and can be brought in abstract upper class.
+    private void ensureNodePresent(Highlights highlights, ElementId eid) {
+        String id = eid.toString();
+        NodeHighlight nh = highlights.getNode(id);
+        if (nh == null) {
+            if (eid instanceof DeviceId) {
+                nh = new DeviceHighlight(id);
+                highlights.add((DeviceHighlight) nh);
+            } else if (eid instanceof HostId) {
+                nh = new HostHighlight(id);
+                highlights.add((HostHighlight) nh);
+            }
+        }
+    }
+
+    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.antMarch(true);
+                }
+            }
+        }
+    }
+
+    //TODO duplicate and can be brought in abstract upper class.
+    private void colorLinks(Highlights highlights, TrafficLinkMap linkMap) {
+        for (TrafficLink tlink : linkMap.biLinks()) {
+            highlights.add(tlink.highlight(StatsType.TAGGED));
+        }
+    }
+
+    //TODO duplicate and can be brought in abstract upper class.
+    // Extracts links from the specified flow rule intent resources
+    private Collection<Link> linkResources(Intent installable) {
+        ImmutableList.Builder<Link> builder = ImmutableList.builder();
+        installable.resources().stream().filter(r -> r instanceof Link)
+                .forEach(r -> builder.add((Link) r));
+        return builder.build();
+    }
+
+    // =======================================================================
+    // === Background Task
+
+    // Provides periodic update of traffic information to the client
+    private class TrafficUpdateTask extends TimerTask {
+        @Override
+        public void run() {
+            try {
+                switch (mode) {
+                    case SELECTED_INTENT:
+                        sendSelectedIntents();
+                        break;
+
+                    default:
+                        // RELATED_INTENTS and IDLE modes should never invoke
+                        // the background task, but if they do, they have
+                        // nothing to do
+                        break;
+                }
+
+            } catch (Exception e) {
+                log.warn("Unable to process protected intent task due to {}", e.getMessage());
+                log.warn("Boom!", e);
+            }
+        }
+    }
+}
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/ProtectedIntentOverlay.java b/web/gui/src/main/java/org/onosproject/ui/impl/ProtectedIntentOverlay.java
new file mode 100644
index 0000000..eab07e2
--- /dev/null
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/ProtectedIntentOverlay.java
@@ -0,0 +1,46 @@
+/*
+ * 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.ui.impl;
+
+import org.onosproject.ui.UiTopoOverlay;
+
+/**
+ * Topology Overlay for network traffic.
+ */
+public class ProtectedIntentOverlay extends UiTopoOverlay {
+    /**
+     * Traffic Overlay identifier.
+     */
+    public static final String PROTECTED_INTENTS_ID = "protectedIntent";
+
+    public ProtectedIntentOverlay() {
+        super(PROTECTED_INTENTS_ID);
+    }
+
+    // override activate and deactivate, to write log messages
+    @Override
+    public void activate() {
+        super.activate();
+        log.debug("ProtectedIntentOverlay Activated");
+    }
+
+    @Override
+    public void deactivate() {
+        super.deactivate();
+        log.debug("ProtectedIntentOverlay Deactivated");
+    }
+}
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandler.java
index bd344db..ddf64bd 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandler.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandler.java
@@ -55,8 +55,8 @@
 import org.onosproject.net.intent.IntentListener;
 import org.onosproject.net.intent.Key;
 import org.onosproject.net.intent.MultiPointToSinglePointIntent;
-import org.onosproject.net.intent.IntentState;
 import org.onosproject.net.intent.IntentService;
+import org.onosproject.net.intent.IntentState;
 import org.onosproject.net.link.LinkEvent;
 import org.onosproject.net.link.LinkListener;
 import org.onosproject.ui.JsonUtils;
@@ -124,6 +124,10 @@
     private static final String TOPO_SELECT_OVERLAY = "topoSelectOverlay";
     private static final String TOPO_STOP = "topoStop";
 
+    //Protected Intents events
+    private static final String SEL_PROTECTED_INTENT = "selectProtectedIntent";
+    private static final String CANCEL_PROTECTED_INTENT_HIGHLIGHT = "cancelProtectedIntentHighlight";
+
     // outgoing event types
     private static final String SHOW_SUMMARY = "showSummary";
     private static final String SHOW_DETAILS = "showDetails";
@@ -186,6 +190,7 @@
 
     private TopoOverlayCache overlayCache;
     private TrafficMonitor traffic;
+    private ProtectedIntentMonitor protectedIntentMonitor;
 
     private TimerTask summaryTask = null;
     private boolean summaryRunning = false;
@@ -198,6 +203,7 @@
         super.init(connection, directory);
         appId = directory.get(CoreService.class).registerApplication(MY_APP_ID);
         traffic = new TrafficMonitor(TRAFFIC_PERIOD, servicesBundle, this);
+        protectedIntentMonitor = new ProtectedIntentMonitor(TRAFFIC_PERIOD, servicesBundle, this);
     }
 
     @Override
@@ -236,8 +242,10 @@
                 new ReqPrevIntent(),
                 new ReqSelectedIntentTraffic(),
                 new SelIntent(),
+                new SelProtectedIntent(),
 
-                new CancelTraffic()
+                new CancelTraffic(),
+                new CancelProtectedIntentHighlight()
         );
     }
 
@@ -629,6 +637,23 @@
         }
     }
 
+    private final class SelProtectedIntent extends RequestHandler {
+        private SelProtectedIntent() {
+            super(SEL_PROTECTED_INTENT);
+        }
+
+        @Override
+        public void process(ObjectNode payload) {
+            Intent intent = findIntentByPayload(payload);
+            if (intent == null) {
+                log.warn("Unable to find protected intent from payload {}", payload);
+            } else {
+                log.debug("starting to monitor protected intent {}", intent.key());
+                protectedIntentMonitor.monitor(intent);
+            }
+        }
+    }
+
     private final class CancelTraffic extends RequestHandler {
         private CancelTraffic() {
             super(CANCEL_TRAFFIC);
@@ -640,6 +665,17 @@
         }
     }
 
+    private final class CancelProtectedIntentHighlight extends RequestHandler {
+        private CancelProtectedIntentHighlight() {
+            super(CANCEL_PROTECTED_INTENT_HIGHLIGHT);
+        }
+
+        @Override
+        public void process(ObjectNode payload) {
+            protectedIntentMonitor.stopMonitoring();
+        }
+    }
+
     //=======================================================================
 
     // Converts highlights to JSON format and sends the message to the client
@@ -666,7 +702,7 @@
         nodes.sort(NODE_COMPARATOR);
         for (ControllerNode node : nodes) {
             sendMessage(instanceMessage(new ClusterEvent(INSTANCE_ADDED, node),
-                    messageType));
+                                        messageType));
         }
     }
 
@@ -916,7 +952,7 @@
             String me = this.toString();
             String miniMe = me.replaceAll("^.*@", "me@");
             log.debug("Time: {}; this: {}, processing items ({} events)",
-                    now, miniMe, items.size());
+                      now, miniMe, items.size());
             // End-of-Debugging
 
             try {
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java b/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java
index 254e807..14b3db9 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java
@@ -172,7 +172,8 @@
 
         UiTopoOverlayFactory topoOverlayFactory =
                 () -> ImmutableList.of(
-                        new TrafficOverlay()
+                        new TrafficOverlay(),
+                        new ProtectedIntentOverlay()
                 );
 
         UiTopoMapFactory topoMapFactory =
diff --git a/web/gui/src/main/webapp/app/view/topo/topoForce.js b/web/gui/src/main/webapp/app/view/topo/topoForce.js
index 948939b..03d8477 100644
--- a/web/gui/src/main/webapp/app/view/topo/topoForce.js
+++ b/web/gui/src/main/webapp/app/view/topo/topoForce.js
@@ -24,7 +24,7 @@
 
     // injected refs
     var $log, $timeout, fs, sus, ts, flash, wss, tov,
-        tis, tms, td3, tss, tts, tos, fltr, tls, uplink, svg;
+        tis, tms, td3, tss, tts, tos, fltr, tls, uplink, svg, tpis;
 
     // configuration
     var linkConfig = {
@@ -1052,9 +1052,10 @@
             'TopoOverlayService', 'TopoInstService', 'TopoModelService',
             'TopoD3Service', 'TopoSelectService', 'TopoTrafficService',
             'TopoObliqueService', 'TopoFilterService', 'TopoLinkService',
+            'TopoProtectedIntentsService',
 
         function (_$log_, _$timeout_, _fs_, _sus_, _ts_, _flash_, _wss_, _tov_,
-                  _tis_, _tms_, _td3_, _tss_, _tts_, _tos_, _fltr_, _tls_) {
+                  _tis_, _tms_, _td3_, _tss_, _tts_, _tos_, _fltr_, _tls_, _tpis_) {
             $log = _$log_;
             $timeout = _$timeout_;
             fs = _fs_;
@@ -1071,6 +1072,7 @@
             tos = _tos_;
             fltr = _fltr_;
             tls = _tls_;
+            tpis = _tpis_;
 
             ts.addListener(updateLinksAndNodes);
 
@@ -1093,6 +1095,7 @@
                 td3.initD3(mkD3Api());
                 tss.initSelect(mkSelectApi());
                 tts.initTraffic(mkTrafficApi());
+                tpis.initProtectedIntents(mkTrafficApi());
                 tos.initOblique(mkObliqueApi(uplink, fltr));
                 fltr.initFilter(mkFilterApi());
                 tls.initLink(mkLinkApi(svg, uplink), td3);
@@ -1136,6 +1139,7 @@
                 tls.destroyLink();
                 tos.destroyOblique();
                 tts.destroyTraffic();
+                tpis.destroyProtectedIntents();
                 tss.destroySelect();
                 td3.destroyD3();
                 tms.destroyModel();
diff --git a/web/gui/src/main/webapp/app/view/topo/topoProtectedIntent.js b/web/gui/src/main/webapp/app/view/topo/topoProtectedIntent.js
new file mode 100644
index 0000000..20193dd
--- /dev/null
+++ b/web/gui/src/main/webapp/app/view/topo/topoProtectedIntent.js
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ */
+
+/*
+ ONOS GUI -- Topology Protected Intents Module.
+ Defines behavior for viewing protected intents .
+ */
+
+(function () {
+    'use strict';
+
+    // injected refs
+    var $log, fs, flash, wss, api;
+
+    // internal state
+    var showingProtectedIntent = null;
+
+    // === -------------------------------------------------------------
+    //  protected intent requests invoked from keystrokes or toolbar buttons...
+
+    function cancelHighlights() {
+        if (!showingProtectedIntent) {
+            return false;
+        }
+
+        showingProtectedIntent = false;
+        wss.sendEvent('cancelProtectedIntentHighlight');
+        flash.flash('Monitoring canceled');
+        return true;
+    }
+
+    // force the system to create a single intent selection
+    function showProtectedIntent(data) {
+        wss.sendEvent('selectProtectedIntent', data);
+        flash.flash('Selecting Intent ' + data.key);
+        showingProtectedIntent = true;
+    }
+
+    // === -----------------------------------------------------
+    // === MODULE DEFINITION ===
+
+    angular.module('ovTopo')
+    .factory('TopoProtectedIntentsService',
+        ['$log', 'FnService', 'FlashService', 'WebSocketService',
+
+        function (_$log_, _fs_, _flash_, _wss_) {
+            $log = _$log_;
+            fs = _fs_;
+            flash = _flash_;
+            wss = _wss_;
+
+            return {
+                initProtectedIntents: function (_api_) { api = _api_; },
+                destroyProtectedIntents: function () { },
+
+                // invoked from toolbar overlay buttons or keystrokes
+                cancelHighlights: cancelHighlights,
+                showProtectedIntent: showProtectedIntent
+            };
+        }]);
+}());
diff --git a/web/gui/src/main/webapp/app/view/topo/topoProtectedIntentOverlay.js b/web/gui/src/main/webapp/app/view/topo/topoProtectedIntentOverlay.js
new file mode 100644
index 0000000..ab9114f
--- /dev/null
+++ b/web/gui/src/main/webapp/app/view/topo/topoProtectedIntentOverlay.js
@@ -0,0 +1,78 @@
+/*
+ * 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.
+ */
+
+/*
+ ONOS GUI -- Topology Protected Intents Overlay Module.
+ Defines behavior for viewing different multiple Protected Intents.
+ Installed as a Topology Overlay.
+ */
+(function () {
+    'use strict';
+
+    // injected refs
+    var $log, tov, tpis;
+
+    // NOTE: no internal state here -- see topoProtectedIntents for that
+
+    // NOTE: providing button disabling requires too big a refactoring of
+    //       the button factory etc. Will have to be done another time.
+
+
+    // traffic overlay definition
+    var overlay = {
+        overlayId: 'protectedIntent',
+        glyphId: 'm_ips',
+        tooltip: 'Protected Intents Overlay',
+
+        activate: function () {
+            $log.debug("Protected Intent overlay ACTIVATED");
+        },
+
+        deactivate: function () {
+            tpis.cancelHighlights();
+            $log.debug("Protected Intent DEACTIVATED");
+        },
+
+        hooks: {
+            // hook for handling escape key
+            escape: function () {
+                // Must return true to consume ESC, false otherwise.
+                return tpis.cancelHighlights();
+            },
+            // intent visualization hook
+            acceptIntent: function (type) {
+                // accept only intents with type "Protected"
+                return (type.startsWith('Protected'));
+            },
+            showIntent: function (info) {
+                $log.debug('^^ topoProtectedIntentsOverlay.showintent() ^^', info);
+                tpis.showProtectedIntent(info);
+            }
+        }
+    };
+
+    // invoke code to register with the overlay service
+    angular.module('ovTopo')
+        .run(['$log', 'TopoOverlayService', 'TopoProtectedIntentsService',
+
+        function (_$log_, _tov_, _tpis_) {
+            $log = _$log_;
+            tov = _tov_;
+            tpis = _tpis_;
+            tov.register(overlay);
+        }]);
+
+}());
diff --git a/web/gui/src/main/webapp/app/view/topo/topoSelect.js b/web/gui/src/main/webapp/app/view/topo/topoSelect.js
index cfd2fb3..724b43c 100644
--- a/web/gui/src/main/webapp/app/view/topo/topoSelect.js
+++ b/web/gui/src/main/webapp/app/view/topo/topoSelect.js
@@ -23,7 +23,7 @@
     'use strict';
 
     // injected refs
-    var $log, fs, wss, tov, tps, tts, ns, sus;
+    var $log, fs, wss, tov, tps, tts, ns, sus, tpis;
 
     // api to topoForce
     var api;
@@ -306,9 +306,9 @@
     .factory('TopoSelectService',
         ['$log', 'FnService', 'WebSocketService', 'TopoOverlayService',
             'TopoPanelService', 'TopoTrafficService', 'NavService',
-            'SvgUtilService',
+            'SvgUtilService', 'TopoProtectedIntentsService',
 
-        function (_$log_, _fs_, _wss_, _tov_, _tps_, _tts_, _ns_, _sus_) {
+        function (_$log_, _fs_, _wss_, _tov_, _tps_, _tts_, _ns_, _sus_, _tpis_) {
             $log = _$log_;
             fs = _fs_;
             wss = _wss_;
@@ -317,6 +317,7 @@
             tts = _tts_;
             ns = _ns_;
             sus = _sus_;
+            tpis= _tpis_;
 
             function initSelect(_api_) {
                 api = _api_;
diff --git a/web/gui/src/main/webapp/index.html b/web/gui/src/main/webapp/index.html
index 9f85a21..cf1812e 100644
--- a/web/gui/src/main/webapp/index.html
+++ b/web/gui/src/main/webapp/index.html
@@ -190,6 +190,8 @@
     <script src="app/view/topo/topoSprite.js"></script>
     <script src="app/view/topo/topoTraffic.js"></script>
     <script src="app/view/topo/topoTrafficNew.js"></script>
+    <script src="app/view/topo/topoProtectedIntent.js"></script>
+    <script src="app/view/topo/topoProtectedIntentOverlay.js"></script>
     <script src="app/view/topo/topoToolbar.js"></script>
     <script src="app/view/device/device.js"></script>
     <script src="app/view/flow/flow.js"></script>
