[ONOS] Cherry picked from master 1.7 till june 10

Change-Id: Ide60fa5f6bd61fdfbc6ae050b78603cd5f1c78d9
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceQueryPathCommand.java b/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceQueryPathCommand.java
index 32323fa..284f776 100644
--- a/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceQueryPathCommand.java
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceQueryPathCommand.java
@@ -35,6 +35,7 @@
         description = "Supports querying PCE path.")
 public class PceQueryPathCommand extends AbstractShellCommand {
     private final Logger log = getLogger(getClass());
+    public static final String COST_TYPE = "costType";
 
     @Option(name = "-i", aliases = "--id", description = "path-id", required = false,
             multiValued = false)
@@ -71,16 +72,16 @@
      * @param tunnel pce tunnel
      */
     void display(Tunnel tunnel) {
-        print("\npath-id            : %d \n" +
+        print("\npath-id            : %s \n" +
                 "source             : %s \n" +
                 "destination        : %s \n" +
-                "path-type          : %d \n" +
+                "path-type          : %s \n" +
                 "symbolic-path-name : %s \n" +
                 "constraints:            \n" +
-                "   cost            : %d \n" +
-                "   bandwidth       : %.2f",
+                "   cost            : %s \n" +
+                "   bandwidth       : %s",
                 tunnel.tunnelId().id(), tunnel.src().toString(), tunnel.dst().toString(),
-                tunnel.type(), tunnel.tunnelName(), tunnel.path().cost(),
+                tunnel.type().name(), tunnel.tunnelName(), tunnel.annotations().value(COST_TYPE),
                 tunnel.annotations().value(AnnotationKeys.BANDWIDTH));
     }
 }
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceSetupPathCommand.java b/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceSetupPathCommand.java
index a14e6e1..d7e514b 100644
--- a/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceSetupPathCommand.java
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceSetupPathCommand.java
@@ -86,9 +86,10 @@
         LspType lspType = LspType.values()[type];
 
         // Add bandwidth
-        // bandwidth default data rate unit is in BPS
+        // bandwidth default data rate unit is in MBPS, since bandwidth value in network config
+        //stored in MPBS
         if (bandwidth != 0.0) {
-            listConstrnt.add(BandwidthConstraint.of(bandwidth, DataRateUnit.valueOf("BPS")));
+            listConstrnt.add(BandwidthConstraint.of(bandwidth, DataRateUnit.valueOf("MBPS")));
         }
 
         // Add cost
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/PceManager.java b/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/PceManager.java
index 2e148db..41e14dd 100644
--- a/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/PceManager.java
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/PceManager.java
@@ -893,9 +893,7 @@
 
         // Check whether device has SR-TE Capability
         if (cfg.labelStackCap()) {
-            if (!srTeHandler.allocateNodeLabel(deviceId, lsrId)) {
-                log.error("Node label allocation for a device id {} has failed.", deviceId.toString());
-            }
+            srTeHandler.allocateNodeLabel(deviceId, lsrId);
         }
     }
 
@@ -974,10 +972,7 @@
 
         // Check whether device has SR-TE Capability
         if (cfg.labelStackCap()) {
-            if (!srTeHandler.allocateAdjacencyLabel(link)) {
-                log.error("Unable to allocate adjacency label for a link {}.", link.toString());
-                return;
-            }
+            srTeHandler.allocateAdjacencyLabel(link);
         }
 
         return;
@@ -1209,16 +1204,13 @@
                 if (cfg.labelStackCap()) {
                     if (mastershipService.getLocalRole(deviceId) == MastershipRole.MASTER) {
                         // Allocate node-label
-                        if (!srTeHandler.allocateNodeLabel(deviceId, lsrId)) {
-                            log.error("Node label allocation for a device id {} has failed.", deviceId.toString());
-                        }
+                        srTeHandler.allocateNodeLabel(deviceId, lsrId);
 
                         // Allocate adjacency label to links which are
                         // originated from this specific device id
                         Set<Link> links = linkService.getDeviceEgressLinks(deviceId);
                         for (Link link : links) {
                             if (!srTeHandler.allocateAdjacencyLabel(link)) {
-                                log.debug("Unable to allocate adjacency labels for a link {}.", link.toString());
                                 return;
                             }
                         }
@@ -1240,40 +1232,42 @@
             return false;
         }
 
-        Map<DeviceId, LabelResourceId> globalNodeLabelMap = pceStore.getGlobalNodeLabels();
+        if (pceStore.getGlobalNodeLabel(deviceId) != null) {
+            Map<DeviceId, LabelResourceId> globalNodeLabelMap = pceStore.getGlobalNodeLabels();
 
-        for (Entry<DeviceId, LabelResourceId> entry : globalNodeLabelMap.entrySet()) {
+            for (Entry<DeviceId, LabelResourceId> entry : globalNodeLabelMap.entrySet()) {
 
-            // Convert from DeviceId to TunnelEndPoint
-            Device srcDevice = deviceService.getDevice(entry.getKey());
+                // Convert from DeviceId to TunnelEndPoint
+                Device srcDevice = deviceService.getDevice(entry.getKey());
 
-            /*
-             * If there is a slight difference in timing such that if device subsystem has removed the device but PCE
-             * store still has it, just ignore such devices.
-             */
-            if (srcDevice == null) {
-                continue;
+                /*
+                 * If there is a slight difference in timing such that if device subsystem has removed the device but
+                 * PCE store still has it, just ignore such devices.
+                 */
+                if (srcDevice == null) {
+                    continue;
+                }
+
+                String srcLsrId = srcDevice.annotations().value(LSRID);
+                if (srcLsrId == null) {
+                    continue;
+                }
+
+                srTeHandler.advertiseNodeLabelRule(deviceId,
+                                                   entry.getValue(),
+                                                   IpPrefix.valueOf(IpAddress.valueOf(srcLsrId), PREFIX_LENGTH),
+                                                   Objective.Operation.ADD, false);
             }
 
-            String srcLsrId = srcDevice.annotations().value(LSRID);
-            if (srcLsrId == null) {
-                continue;
-            }
-
-            srTeHandler.advertiseNodeLabelRule(deviceId,
-                                               entry.getValue(),
-                                               IpPrefix.valueOf(IpAddress.valueOf(srcLsrId), PREFIX_LENGTH),
-                                               Objective.Operation.ADD, false);
-        }
-
-        Map<Link, LabelResourceId> adjLabelMap = pceStore.getAdjLabels();
-        for (Entry<Link, LabelResourceId> entry : adjLabelMap.entrySet()) {
-            if (entry.getKey().src().deviceId().equals(deviceId)) {
-                srTeHandler.installAdjLabelRule(deviceId,
-                                                entry.getValue(),
-                                                entry.getKey().src().port(),
-                                                entry.getKey().dst().port(),
-                                                Objective.Operation.ADD);
+            Map<Link, LabelResourceId> adjLabelMap = pceStore.getAdjLabels();
+            for (Entry<Link, LabelResourceId> entry : adjLabelMap.entrySet()) {
+                if (entry.getKey().src().deviceId().equals(deviceId)) {
+                    srTeHandler.installAdjLabelRule(deviceId,
+                                                    entry.getValue(),
+                                                    entry.getKey().src().port(),
+                                                    entry.getKey().dst().port(),
+                                                    Objective.Operation.ADD);
+                }
             }
         }
 
@@ -1281,6 +1275,9 @@
                                            LabelResourceId.labelResourceId(0),
                                            IpPrefix.valueOf(END_OF_SYNC_IP_PREFIX),
                                            Objective.Operation.ADD, true);
+
+        log.debug("End of label DB sync for device {}", deviceId);
+
         if (mastershipService.getLocalRole(specificDevice.id()) == MastershipRole.MASTER) {
             // Allocate node-label to this specific device.
             allocateNodeLabel(specificDevice);
@@ -1304,6 +1301,7 @@
         public void process(PacketContext context) {
             // Stop processing if the packet has been handled, since we
             // can't do any more to it.
+            log.debug("Received trigger for label DB sync.");
             if (context.isHandled()) {
                 return;
             }
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/PceccSrTeBeHandler.java b/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/PceccSrTeBeHandler.java
index c760bc1..63eed1b 100644
--- a/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/PceccSrTeBeHandler.java
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/PceccSrTeBeHandler.java
@@ -28,7 +28,6 @@
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MplsLabel;
-import org.onlab.packet.TpPort;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.incubator.net.resource.label.DefaultLabelResource;
 import org.onosproject.incubator.net.resource.label.LabelResource;
@@ -184,7 +183,7 @@
 
         // Check whether node-label was already configured for this specific device.
         if (pceStore.getGlobalNodeLabel(specificDeviceId) != null) {
-            log.error("Node label was already configured for device {}.", specificDeviceId.toString());
+            log.debug("Node label was already configured for device {}.", specificDeviceId.toString());
             return false;
         }
 
@@ -228,12 +227,15 @@
 
             // Push to device
             // Push label information of specificDeviceId to otherDevId in list and vice versa.
-            advertiseNodeLabelRule(otherDevId, specificLabelId,
-                                   IpPrefix.valueOf(IpAddress.valueOf(specificLsrId), PREFIX_LENGTH),
-                                   Objective.Operation.ADD, false);
-            advertiseNodeLabelRule(specificDeviceId, otherLabelId,
-                                   IpPrefix.valueOf(IpAddress.valueOf(otherLsrId), PREFIX_LENGTH),
-                                   Objective.Operation.ADD, false);
+            if (!otherDevId.equals(specificDeviceId)) {
+                advertiseNodeLabelRule(otherDevId, specificLabelId,
+                                       IpPrefix.valueOf(IpAddress.valueOf(specificLsrId), PREFIX_LENGTH),
+                                       Objective.Operation.ADD, false);
+
+                advertiseNodeLabelRule(specificDeviceId, otherLabelId,
+                                       IpPrefix.valueOf(IpAddress.valueOf(otherLsrId), PREFIX_LENGTH),
+                                       Objective.Operation.ADD, false);
+            }
         }
 
         return true;
@@ -519,8 +521,8 @@
         TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder();
 
         selectorBuilder.matchMplsLabel(MplsLabel.mplsLabel(labelId.id().intValue()));
-        selectorBuilder.matchTcpSrc(TpPort.tpPort((int) srcPortNum.toLong()));
-        selectorBuilder.matchTcpDst(TpPort.tpPort((int) dstPortNum.toLong()));
+        selectorBuilder.matchIPSrc(IpPrefix.valueOf((int) srcPortNum.toLong(), 32));
+        selectorBuilder.matchIPDst(IpPrefix.valueOf((int) dstPortNum.toLong(), 32));
 
         TrafficTreatment treatment = DefaultTrafficTreatment.builder().build();
 
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/DistributedPceStore.java b/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/DistributedPceStore.java
index f692a62..6afdb30 100644
--- a/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/DistributedPceStore.java
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/DistributedPceStore.java
@@ -38,6 +38,7 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Link;
 import org.onosproject.net.resource.ResourceConsumer;
+import org.onosproject.pce.pceservice.constraint.CapabilityConstraint;
 import org.onosproject.pce.pceservice.constraint.CostConstraint;
 import org.onosproject.pce.pceservice.TunnelConsumerId;
 import org.onosproject.pce.pceservice.LspType;
@@ -132,6 +133,8 @@
                                           CostConstraint.class,
                                           CostConstraint.Type.class,
                                           BandwidthConstraint.class,
+                                          CapabilityConstraint.class,
+                                          CapabilityConstraint.CapabilityType.class,
                                           LspType.class)
                                 .build()))
 
@@ -216,19 +219,19 @@
     @Override
     public LabelResourceId getGlobalNodeLabel(DeviceId id) {
         checkNotNull(id, DEVICE_ID_NULL);
-        return globalNodeLabelMap.get(id).value();
+        return globalNodeLabelMap.get(id) == null ? null : globalNodeLabelMap.get(id).value();
     }
 
     @Override
     public LabelResourceId getAdjLabel(Link link) {
         checkNotNull(link, LINK_NULL);
-        return adjLabelMap.get(link).value();
+        return adjLabelMap.get(link) == null ? null : adjLabelMap.get(link).value();
     }
 
     @Override
     public PceccTunnelInfo getTunnelInfo(TunnelId tunnelId) {
         checkNotNull(tunnelId, TUNNEL_ID_NULL);
-        return tunnelInfoMap.get(tunnelId).value();
+        return tunnelInfoMap.get(tunnelId) == null ? null : tunnelInfoMap.get(tunnelId).value();
     }
 
     @Override
diff --git a/apps/pce/pceweb/src/main/java/org/onosproject/pceweb/PceWebTopovMessageHandler.java b/apps/pce/pceweb/src/main/java/org/onosproject/pceweb/PceWebTopovMessageHandler.java
index 95e9f1f..72f0118 100644
--- a/apps/pce/pceweb/src/main/java/org/onosproject/pceweb/PceWebTopovMessageHandler.java
+++ b/apps/pce/pceweb/src/main/java/org/onosproject/pceweb/PceWebTopovMessageHandler.java
@@ -431,7 +431,6 @@
                 lspTypeVal = LspType.SR_WITHOUT_SIGNALLING;
                 break;
             default:
-                log.error("Invalid LSP type");
                 break;
         }
 
@@ -539,7 +538,6 @@
             costTypeVal = CostConstraint.Type.TE_COST;
             break;
         default:
-            log.error("Invalid cost type");
             break;
         }
 
@@ -660,12 +658,17 @@
         tunnelSet = tunnelService.queryTunnel(MPLS);
         for (Tunnel tunnel : tunnelSet) {
             if (tunnel.path() == null) {
-                log.info("path does not exist");
+                log.error("path does not exist");
                 return;
             }
             paths.add(tunnel.path());
         }
 
+        if (tunnelSet.size() == 0) {
+            log.warn("Tunnel does not exist");
+            return;
+        }
+
         ImmutableSet.Builder<Link> builder = ImmutableSet.builder();
         allPathLinks = buildPaths(builder).build();
         hilightAndSendPaths();
diff --git a/apps/pce/pceweb/src/main/java/org/onosproject/pceweb/PceWebTopovOverlay.java b/apps/pce/pceweb/src/main/java/org/onosproject/pceweb/PceWebTopovOverlay.java
index 41f3243..044b7a2 100644
--- a/apps/pce/pceweb/src/main/java/org/onosproject/pceweb/PceWebTopovOverlay.java
+++ b/apps/pce/pceweb/src/main/java/org/onosproject/pceweb/PceWebTopovOverlay.java
@@ -17,18 +17,28 @@
 package org.onosproject.pceweb;
 
 
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.onlab.util.Bandwidth;
 import org.onosproject.net.AnnotationKeys;
 import org.onosproject.net.Annotations;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.Link;
 import org.onosproject.ui.UiTopoOverlay;
 import org.onosproject.ui.topo.ButtonId;
 import org.onosproject.ui.topo.PropertyPanel;
 import org.onosproject.net.HostId;
 import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.link.LinkEvent;
+import org.onosproject.net.resource.ContinuousResource;
+import org.onosproject.net.resource.DiscreteResource;
+import org.onosproject.net.resource.Resource;
+import org.onosproject.net.resource.ResourceService;
+import org.onosproject.net.resource.Resources;
 import org.onosproject.ui.topo.TopoConstants.CoreButtons;
-
-import static org.onosproject.ui.topo.TopoConstants.Properties.*;
 import org.onosproject.cli.AbstractShellCommand;
 
 /**
@@ -42,7 +52,9 @@
 
     public static final String AS_NUMBER = "asNumber";
     public static final String DOMAIN_IDENTIFIER = "domainIdentifier";
-    public static final String ROUTING_UNIVERSE = "routingUniverse";
+    public static final String ABR_BIT = "abrBit";
+    public static final String ASBR_BIT = "externalBit";
+    public static final String TE_METRIC = "teCost";
 
     private static final ButtonId SRC_BUTTON = new ButtonId("src");
     private static final ButtonId DST_BUTTON = new ButtonId("dst");
@@ -77,34 +89,75 @@
          if (deviceService != null) {
 
             Device device = deviceService.getDevice(deviceId);
-            Annotations annot = device.annotations();
+            Annotations annots = device.annotations();
 
-            String routerId = annot.value(AnnotationKeys.ROUTER_ID);
-            String type = annot.value(AnnotationKeys.TYPE);
-            String asNumber = annot.value(AS_NUMBER);
-            String domain = annot.value(DOMAIN_IDENTIFIER);
-            String routingUnverse = annot.value(ROUTING_UNIVERSE);
+            String routerId = annots.value(AnnotationKeys.ROUTER_ID);
+            String type = annots.value(AnnotationKeys.TYPE);
+            String asNumber = annots.value(AS_NUMBER);
+            String domain = annots.value(DOMAIN_IDENTIFIER);
+            String abrStatus = annots.value(ABR_BIT);
+            String asbrStatus = annots.value(ASBR_BIT);
 
             if (type != null) {
                 pp.addProp("Type", type);
             }
-            /* TBD: Router ID need to print
+
             if (routerId != null) {
                 pp.addProp("Router-ID", routerId);
-            } */
-            if (routingUnverse != null) {
-                pp.addProp("Routing Universe", routingUnverse);
             }
+
             if (asNumber != null) {
                 pp.addProp("AS Number", asNumber);
             }
+
             if (domain != null) {
                 pp.addProp("Domain ID", domain);
             }
+
+            if (abrStatus != null) {
+                pp.addProp("ABR Role", abrStatus);
+            }
+
+            if (asbrStatus != null) {
+                pp.addProp("ASBR Role", asbrStatus);
+            }
         }
     }
 
     @Override
+    public Map<String, String> additionalLinkData(LinkEvent event) {
+        Map<String, String> map = new HashMap<>();
+        Link link = event.subject();
+
+        map.put("Src port", link.src().port().toString());
+        map.put("Dst port", link.dst().port().toString());
+        map.put("Te metric", link.annotations().value(TE_METRIC));
+
+        ResourceService resService = AbstractShellCommand.get(ResourceService.class);
+        DiscreteResource devResource = Resources.discrete(link.src().deviceId(), link.src().port()).resource();
+        if (resService == null) {
+            log.warn("resource service does not exist ");
+            return map;
+        }
+
+        if (devResource == null) {
+            log.warn("Device resources does not exist ");
+            return map;
+        }
+        Set<Resource> resources = resService.getAvailableResources(devResource.id(), Bandwidth.class);
+        if (resources.isEmpty()) {
+            log.warn("Bandwidth resources does not exist ");
+            return map;
+        }
+
+        if (resources.iterator().next() instanceof ContinuousResource) {
+            map.put("Bandwidth", ((ContinuousResource) resources.iterator().next()).toString());
+        }
+
+        return map;
+    }
+
+    @Override
     public void modifyHostDetails(PropertyPanel pp, HostId hostId) {
         pp.addButton(SRC_BUTTON).addButton(DST_BUTTON);
     }
diff --git a/apps/pce/pceweb/src/main/resources/app/view/pcewebTopov/pcewebTopovDemo.js b/apps/pce/pceweb/src/main/resources/app/view/pcewebTopov/pcewebTopovDemo.js
index e16e15b..586ebea 100644
--- a/apps/pce/pceweb/src/main/resources/app/view/pcewebTopov/pcewebTopovDemo.js
+++ b/apps/pce/pceweb/src/main/resources/app/view/pcewebTopov/pcewebTopovDemo.js
@@ -96,9 +96,9 @@
         addAttribute('pce-cost-type-valname', 'pce-cost-type-te', 'TE', 'radio');
         //Add the LSP type related inputs.
         addAttribute('pce-lsp-type-name', 'pce-lsp-type', 'Lsp Type', 'checkbox');
-        addAttribute('pce-lsp-type-valname', 'pce-lsp-type-cr', 'WITH SIGNALLING', 'radio');
-        addAttribute('pce-lsp-type-valname', 'pce-lsp-type-srbe', 'WITHOUT SR WITHOUT SIGNALLING', 'radio');
-        addAttribute('pce-lsp-type-valname', 'pce-lsp-type-srte', 'WITH SR WITHOUT SIGNALLING', 'radio');
+        addAttribute('pce-lsp-type-valname', 'pce-lsp-type-cr', 'With signalling', 'radio');
+        addAttribute('pce-lsp-type-valname', 'pce-lsp-type-srbe', 'Without SR without signalling', 'radio');
+        addAttribute('pce-lsp-type-valname', 'pce-lsp-type-srte', 'With SR without signalling', 'radio');
         //Add the tunnel name
         addAttribute('pce-tunnel-name', 'pce-tunnel-name-id', 'Tunnel Name', 'text');
 
@@ -182,12 +182,12 @@
         return content;
     }
 
-    function isChecked(viewId) {
-        return d3.select('#' + viewId).property('checked');
+    function isChecked(cboxId) {
+        return d3.select('#' + cboxId).property('checked');
     }
 
-    function getCheckedValue(viewId) {
-        return d3.select('#' + viewId).property('value');
+    function getCheckedValue(cboxId) {
+        return d3.select('#' + cboxId).property('value');
     }
 
     function showTunnelInformation(data) {
@@ -198,25 +198,19 @@
             var tdString = '' ;
             tunnelNameData.a.forEach( function (val, idx) {
                 var tunnelName = isChecked('tunnel-id-'+idx);
-                if (tunnelName)
-                {
+                if (tunnelName) {
                     tdString = val;
                 }
             } );
 
-            if (tdString) {
-                constraintsUpdateDialog(tdString);
-            } else {
-                $log.debug("No tunnel id is selected.");
-            }
-
+            constraintsUpdateDialog(tdString);
             $log.debug('Dialog OK button clicked');
         }
 
         tds.openDialog()
             .setTitle('Available LSPs with selected device')
             .addContent(createUserTextUpdate(data))
-            .addOkChained(dOkUpdate, 'GOTO Selection of constraints')
+            .addOkChained(dOkUpdate, 'OK')
             .addCancel(dClose, 'Close')
             .bindKeys();
     }
@@ -266,7 +260,7 @@
             .setTitle('Select constraints for update path')
             .addContent(createUserTextUpdatePathEvent())
             .addCancel()
-            .addOk(dOkUpdateEvent, 'Update Path')     // NOTE: NOT the "chained" version!
+            .addOk(dOkUpdateEvent, 'OK')     // NOTE: NOT the "chained" version!
             .bindKeys();
 
     }
@@ -278,7 +272,7 @@
         tds.openDialog()
             .setTitle('Available Tunnels for remove')
             .addContent(createUserTextRemove(data))
-            .addOk(dOkRemove, 'Remove')
+            .addOk(dOkRemove, 'OK')
             .addCancel(dClose, 'Close')
             .bindKeys();
     }
diff --git a/apps/pce/pceweb/src/main/resources/app/view/pcewebTopov/pcewebTopovOverlay.js b/apps/pce/pceweb/src/main/resources/app/view/pcewebTopov/pcewebTopovOverlay.js
index 4ad40a0..72dd1ef 100644
--- a/apps/pce/pceweb/src/main/resources/app/view/pcewebTopov/pcewebTopovOverlay.js
+++ b/apps/pce/pceweb/src/main/resources/app/view/pcewebTopov/pcewebTopovOverlay.js
@@ -168,6 +168,29 @@
             },
             multi: function (selectOrder) {
                 selectionCallback(selectOrder);
+            },
+            modifylinkdata: function (data, extra) {
+                $log.debug("Modify link data", data, extra);
+
+                function sep() {
+                    data.propOrder.push('-');
+                }
+
+                function add(key) {
+                    var val = extra[key];
+                    if (val !== undefined) {
+                        data.propOrder.push(key);
+                        data.props[key] = val;
+                    }
+                }
+
+                sep();
+                add('Src port');
+                add('Dst port');
+                add('Te metric');
+                add('Bandwidth');
+
+                return data;
             }
         }
     };
diff --git a/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpDpid.java b/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpDpid.java
index 8baa5f0..a0f5952 100644
--- a/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpDpid.java
+++ b/protocols/bgp/api/src/main/java/org/onosproject/bgp/controller/BgpDpid.java
@@ -70,7 +70,7 @@
     /*
      * Get iso node ID in specified string format.
      */
-    private String isoNodeIdString(byte[] isoNodeId) {
+    public String isoNodeIdString(byte[] isoNodeId) {
         if (isoNodeId != null) {
             return String.format("%02x%02x.%02x%02x.%02x%02x", isoNodeId[0], isoNodeId[1],
                                  isoNodeId[2], isoNodeId[3],
diff --git a/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/PcepAnnotationKeys.java b/protocols/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepAnnotationKeys.java
similarity index 96%
rename from providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/PcepAnnotationKeys.java
rename to protocols/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepAnnotationKeys.java
index 18292b7..097f647 100644
--- a/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/PcepAnnotationKeys.java
+++ b/protocols/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepAnnotationKeys.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.provider.pcep.tunnel.impl;
+package org.onosproject.pcep.controller;
 
 /**
  * Collection of keys for annotation for PCEP tunnels.
diff --git a/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepLspStatus.java b/protocols/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepLspStatus.java
similarity index 97%
rename from protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepLspStatus.java
rename to protocols/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepLspStatus.java
index 79ed9fe..5b3e08c 100644
--- a/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepLspStatus.java
+++ b/protocols/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepLspStatus.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.pcep.controller.impl;
+package org.onosproject.pcep.controller;
 
 import org.onosproject.incubator.net.tunnel.Tunnel.State;
 
diff --git a/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/SrpIdGenerators.java b/protocols/pcep/api/src/main/java/org/onosproject/pcep/controller/SrpIdGenerators.java
similarity index 96%
rename from providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/SrpIdGenerators.java
rename to protocols/pcep/api/src/main/java/org/onosproject/pcep/controller/SrpIdGenerators.java
index 3e18025..e0cb3b3 100644
--- a/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/SrpIdGenerators.java
+++ b/protocols/pcep/api/src/main/java/org/onosproject/pcep/controller/SrpIdGenerators.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.provider.pcep.tunnel.impl;
+package org.onosproject.pcep.controller;
 
 import static org.slf4j.LoggerFactory.getLogger;
 
diff --git a/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepChannelHandler.java b/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepChannelHandler.java
index e8c52cc..d2523f5 100644
--- a/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepChannelHandler.java
+++ b/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepChannelHandler.java
@@ -62,6 +62,8 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.onosproject.pcep.controller.PcepSyncStatus.NOT_SYNCED;
+
 /**
  * Channel handler deals with the pcc client connection and dispatches
  * messages from client to the appropriate locations.
@@ -177,18 +179,23 @@
                          * The socket IP is stored in channel.
                          */
                         LinkedList<PcepValueType> optionalTlvs = pOpenmsg.getPcepOpenObject().getOptionalTlv();
-                        for (PcepValueType optionalTlv : optionalTlvs) {
-                            if (optionalTlv instanceof NodeAttributesTlv) {
-                                List<PcepValueType> subTlvs = ((NodeAttributesTlv) optionalTlv)
-                                        .getllNodeAttributesSubTLVs();
-                                for (PcepValueType subTlv : subTlvs) {
-                                    if (subTlv instanceof IPv4RouterIdOfLocalNodeSubTlv) {
-                                        h.thispccId = PccId.pccId(IpAddress
-                                                .valueOf(((IPv4RouterIdOfLocalNodeSubTlv) subTlv).getInt()));
+                        if (optionalTlvs != null) {
+                            for (PcepValueType optionalTlv : optionalTlvs) {
+                                if (optionalTlv instanceof NodeAttributesTlv) {
+                                    List<PcepValueType> subTlvs = ((NodeAttributesTlv) optionalTlv)
+                                            .getllNodeAttributesSubTLVs();
+                                    if (subTlvs == null) {
                                         break;
                                     }
+                                    for (PcepValueType subTlv : subTlvs) {
+                                        if (subTlv instanceof IPv4RouterIdOfLocalNodeSubTlv) {
+                                            h.thispccId = PccId.pccId(IpAddress
+                                                    .valueOf(((IPv4RouterIdOfLocalNodeSubTlv) subTlv).getInt()));
+                                            break;
+                                        }
+                                    }
+                                    break;
                                 }
-                                break;
                             }
                         }
 
@@ -228,6 +235,11 @@
                             h.pcepPacketStats);
                     //Get pc instance and set capabilities
                     h.pc.setCapability(h.capability);
+
+                    // Initilialize DB sync status.
+                    h.pc.setLspDbSyncStatus(NOT_SYNCED);
+                    h.pc.setLabelDbSyncStatus(NOT_SYNCED);
+
                     // set the status of pcc as connected
                     h.pc.setConnected(true);
                     h.pc.setChannel(h.channel);
@@ -253,6 +265,7 @@
                     log.debug("Keep alive time : " + keepAliveTimer);
 
                     //set the state handshake completion.
+
                     h.sendKeepAliveMessage();
                     h.pcepPacketStats.addOutPacket();
                     h.setHandshakeComplete(true);
diff --git a/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepClientControllerImpl.java b/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepClientControllerImpl.java
index 391aa7d..00a7a20 100644
--- a/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepClientControllerImpl.java
+++ b/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepClientControllerImpl.java
@@ -45,6 +45,7 @@
 import org.onosproject.pcep.controller.PcepClientController;
 import org.onosproject.pcep.controller.PcepClientListener;
 import org.onosproject.pcep.controller.PcepEventListener;
+import org.onosproject.pcep.controller.PcepLspStatus;
 import org.onosproject.pcep.controller.PcepNodeListener;
 import org.onosproject.pcep.controller.PcepPacketListener;
 import org.onosproject.pcep.controller.PcepSyncStatus;
@@ -235,8 +236,10 @@
                 ListIterator<PcepStateReport> listIterator = ((PcepReportMsg) msg).getStateReportList().listIterator();
                 while (listIterator.hasNext()) {
                     PcepStateReport stateRpt = listIterator.next();
-                    if (stateRpt.getLspObject().getSFlag()) {
+                    PcepLspObject lspObj = stateRpt.getLspObject();
+                    if (lspObj.getSFlag()) {
                         if (pc.lspDbSyncStatus() != PcepSyncStatus.IN_SYNC) {
+                            log.debug("LSP DB sync started for PCC {}", pc.getPccId().id().toString());
                             // Initialize LSP DB sync and temporary cache.
                             pc.setLspDbSyncStatus(PcepSyncStatus.IN_SYNC);
                             pc.initializeSyncMsgList(pccId);
@@ -246,13 +249,16 @@
 
                         // Don't send to provider as of now.
                         continue;
-                    } else {
-                        if (pc.lspDbSyncStatus() == PcepSyncStatus.IN_SYNC) {
+                    } else if (lspObj.getPlspId() == 0) {
+                        if (pc.lspDbSyncStatus() == PcepSyncStatus.IN_SYNC
+                                || pc.lspDbSyncStatus() == PcepSyncStatus.NOT_SYNCED) {
                             // Set end of LSPDB sync.
+                            log.debug("LSP DB sync completed for PCC {}", pc.getPccId().id().toString());
                             pc.setLspDbSyncStatus(PcepSyncStatus.SYNCED);
 
                             // Call packet provider to initiate label DB sync (only if PCECC capable).
                             if (pc.capability().pceccCapability()) {
+                                log.debug("Trigger label DB sync for PCC {}", pc.getPccId().id().toString());
                                 pc.setLabelDbSyncStatus(IN_SYNC);
                                 for (PcepPacketListener l : pcepPacketListener) {
                                     l.sendPacketIn(pccId);
@@ -428,10 +434,16 @@
             }
 
             List<PcepStateReport> syncStateRptList = pc.getSyncMsgList(pccId);
+            if (syncStateRptList == null) {
+                // When there are no LSPs to sync, directly end-of-sync PCRpt will come and the
+                // list will be null.
+                syncStateRptList = Collections.EMPTY_LIST;
+            }
+
             Iterator<PcepStateReport> stateRptListIterator = syncStateRptList.iterator();
 
             // For every report, fetch PLSP id, local LSP id and symbolic path name from the message.
-            while (syncStateRptList.iterator().hasNext()) {
+            while (stateRptListIterator.hasNext()) {
                 PcepStateReport stateRpt = stateRptListIterator.next();
                 Tunnel tunnel = null;
 
diff --git a/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepClientImpl.java b/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepClientImpl.java
index a62a611..91a79de 100644
--- a/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepClientImpl.java
+++ b/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepClientImpl.java
@@ -73,7 +73,7 @@
     private byte sessionId;
     private PcepPacketStatsImpl pktStats;
     private Map<LspKey, Boolean> lspDelegationInfo;
-    private Map<PccId, List<PcepStateReport>> sycRptCache = new HashMap<>();
+    private Map<PccId, List<PcepStateReport>> syncRptCache = new HashMap<>();
 
     @Override
     public void init(PccId pccId, PcepVersion pcepVersion, PcepPacketStats pktStats) {
@@ -267,24 +267,24 @@
     @Override
     public void initializeSyncMsgList(PccId pccId) {
         List<PcepStateReport> rptMsgList = new LinkedList<>();
-        sycRptCache.put(pccId, rptMsgList);
+        syncRptCache.put(pccId, rptMsgList);
     }
 
     @Override
     public List<PcepStateReport> getSyncMsgList(PccId pccId) {
-        return sycRptCache.get(pccId);
+        return syncRptCache.get(pccId);
     }
 
     @Override
     public void removeSyncMsgList(PccId pccId) {
-        sycRptCache.remove(pccId);
+        syncRptCache.remove(pccId);
     }
 
     @Override
     public void addSyncMsgToList(PccId pccId, PcepStateReport rptMsg) {
-        List<PcepStateReport> rptMsgList = sycRptCache.get(pccId);
+        List<PcepStateReport> rptMsgList = syncRptCache.get(pccId);
         rptMsgList.add(rptMsg);
-        sycRptCache.put(pccId, rptMsgList);
+        syncRptCache.put(pccId, rptMsgList);
     }
 
     @Override
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepBandwidthObject.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepBandwidthObject.java
index b8d2695..9e06ef5 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepBandwidthObject.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepBandwidthObject.java
@@ -80,7 +80,7 @@
          *
          * @return bandwidth
          */
-        int getBandwidth();
+        float getBandwidth();
 
         /**
          * Sets bandwidth value and return its builder.
@@ -88,7 +88,7 @@
          * @param iBandwidth bandwidth value
          * @return Builder by setting bandwidth
          */
-        Builder setBandwidth(int iBandwidth);
+        Builder setBandwidth(float iBandwidth);
 
         /**
          * Sets P flag in Bandwidth object header and returns its builder.
diff --git a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepBandwidthObjectVer1.java b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepBandwidthObjectVer1.java
index 83973b4..6abe495 100644
--- a/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepBandwidthObjectVer1.java
+++ b/protocols/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/ver1/PcepBandwidthObjectVer1.java
@@ -169,7 +169,7 @@
         private PcepObjectHeader bandwidthObjHeader;
         private boolean bIsHeaderSet = false;
 
-        private int iBandwidth;
+        private float iBandwidth;
         private boolean bIsBandwidthSet = false;
 
         private boolean bPFlag;
@@ -200,7 +200,7 @@
         }
 
         @Override
-        public int getBandwidth() {
+        public float getBandwidth() {
             return this.iBandwidth;
         }
 
@@ -216,7 +216,7 @@
         }
 
         @Override
-        public Builder setBandwidth(int iBandwidth) {
+        public Builder setBandwidth(float iBandwidth) {
             this.iBandwidth = iBandwidth;
             this.bIsBandwidthSet = true;
             return this;
diff --git a/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java b/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java
index be90682..e95eba09 100644
--- a/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java
+++ b/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java
@@ -20,9 +20,10 @@
 import static org.onosproject.incubator.net.resource.label.LabelResourceId.labelResourceId;
 import static java.util.stream.Collectors.toList;
 
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
+import java.util.HashMap;
 
 import org.onlab.packet.ChassisId;
 import org.onlab.packet.Ip4Address;
@@ -74,6 +75,7 @@
 import org.onosproject.net.MastershipRole;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.config.NetworkConfigService;
+import org.onosproject.net.config.basics.BandwidthCapacity;
 import org.onosproject.net.device.DefaultDeviceDescription;
 import org.onosproject.net.device.DefaultPortDescription;
 import org.onosproject.net.device.DeviceDescription;
@@ -90,7 +92,6 @@
 import org.onosproject.net.link.LinkService;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
-import org.onosproject.net.config.basics.BandwidthCapacity;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -160,6 +161,7 @@
     public static final int DELAY = 2;
     private LabelResourceId beginLabel = labelResourceId(5122);
     private LabelResourceId endLabel = labelResourceId(9217);
+    private HashMap<DeviceId, List<PortDescription>> portMap = new HashMap<>();
 
     @Activate
     public void activate() {
@@ -243,13 +245,15 @@
                 if (tlv.getType() == NodeDescriptors.IGP_ROUTERID_TYPE) {
                     if (tlv instanceof IsIsPseudonode) {
                         deviceType = VIRTUAL;
-                        newBuilder.set(AnnotationKeys.ROUTER_ID, new String(((IsIsPseudonode) tlv).getIsoNodeId()));
+                        newBuilder.set(AnnotationKeys.ROUTER_ID, nodeUri.isoNodeIdString(((IsIsPseudonode) tlv)
+                                .getIsoNodeId()));
                     } else if (tlv instanceof OspfPseudonode) {
                         deviceType = VIRTUAL;
                         newBuilder
                                 .set(AnnotationKeys.ROUTER_ID, Integer.toString(((OspfPseudonode) tlv).getrouterID()));
                     } else if (tlv instanceof IsIsNonPseudonode) {
-                        newBuilder.set(AnnotationKeys.ROUTER_ID, new String(((IsIsNonPseudonode) tlv).getIsoNodeId()));
+                        newBuilder.set(AnnotationKeys.ROUTER_ID, nodeUri.isoNodeIdString(((IsIsNonPseudonode) tlv)
+                                .getIsoNodeId()));
                     } else if (tlv instanceof OspfNonPseudonode) {
                         newBuilder.set(AnnotationKeys.ROUTER_ID,
                                 Integer.toString(((OspfNonPseudonode) tlv).getrouterID()));
@@ -284,14 +288,35 @@
             deviceProviderService.deviceDisconnected(deviceId);
         }
 
+        private List<PortDescription> buildPortDescriptions(DeviceId deviceId,
+                                                            PortNumber portNumber) {
+
+            List<PortDescription> portList;
+
+            if (portMap.containsKey(deviceId)) {
+                portList = portMap.get(deviceId);
+            } else {
+                portList = new ArrayList<>();
+            }
+            if (portNumber != null) {
+                PortDescription portDescriptions = new DefaultPortDescription(portNumber, true);
+                portList.add(portDescriptions);
+            }
+
+            portMap.put(deviceId, portList);
+            return portList;
+        }
+
         @Override
         public void addLink(BgpLinkLsNlriVer4 linkNlri, PathAttrNlriDetails details) throws BgpParseException {
             log.debug("Addlink {}", linkNlri.toString());
 
-            if (linkProviderService == null) {
+            LinkDescription linkDes = buildLinkDes(linkNlri, details, true);
+
+            //If already link exists, return
+            if (linkService.getLink(linkDes.src(), linkDes.dst()) != null || linkProviderService == null) {
                 return;
             }
-            LinkDescription linkDes = buildLinkDes(linkNlri, details, true);
 
             /*
              * Update link ports and configure bandwidth on source and destination port using networkConfig service
@@ -302,13 +327,11 @@
             }
 
             //Updating ports of the link
-            List<PortDescription> srcPortDescriptions = new LinkedList<>();
-            srcPortDescriptions.add(new DefaultPortDescription(linkDes.src().port(), true));
-            deviceProviderService.updatePorts(linkDes.src().deviceId(), srcPortDescriptions);
+            deviceProviderService.updatePorts(linkDes.src().deviceId(), buildPortDescriptions(linkDes.src().deviceId(),
+                    linkDes.src().port()));
 
-            List<PortDescription> dstPortDescriptions = new LinkedList<>();
-            dstPortDescriptions.add(new DefaultPortDescription(linkDes.dst().port(), true));
-            deviceProviderService.updatePorts(linkDes.dst().deviceId(), dstPortDescriptions);
+            deviceProviderService.updatePorts(linkDes.dst().deviceId(), buildPortDescriptions(linkDes.dst().deviceId(),
+                    linkDes.dst().port()));
 
             linkProviderService.linkDetected(linkDes);
         }
diff --git a/providers/bgpcep/app/app.xml b/providers/bgpcep/app/app.xml
new file mode 100644
index 0000000..0854ce0
--- /dev/null
+++ b/providers/bgpcep/app/app.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2016-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.
+  -->
+<app name="org.onosproject.bgpcep" origin="ON.Lab" version="${project.version}"
+     category="Provider" url="http://onosproject.org" title="BGP PCEP Provider"
+     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
+     features="${project.artifactId}">
+    <description>${project.description}</description>
+    <artifact>mvn:${project.groupId}/onos-bgpio/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-bgp-api/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-bgp-ctl/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-pcepio/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-app-pcep-api/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-pcep-controller-api/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-bgp-provider-topology/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-bgp-provider-cfg/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-pcep-controller-impl/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-pcep-provider-topology/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-pcep-provider-tunnel/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-pcep-provider-packet/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-bgpcep-provider-flow/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-app-pce/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-app-pceweb/${project.version}</artifact>
+</app>
diff --git a/providers/bgpcep/app/features.xml b/providers/bgpcep/app/features.xml
new file mode 100644
index 0000000..dc4fffb
--- /dev/null
+++ b/providers/bgpcep/app/features.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+  ~ Copyright 2016-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.
+  -->
+<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
+    <feature name="${project.artifactId}" version="${project.version}"
+             description="${project.description}">
+        <feature>onos-api</feature>
+        <bundle>mvn:${project.groupId}/onos-bgpio/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-bgp-api/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-bgp-ctl/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-pcep-controller-api/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-bgp-provider-topology/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-bgp-provider-cfg/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-pcepio/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-app-pcep-api/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-pcep-controller-impl/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-pcep-provider-topology/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-pcep-provider-tunnel/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-app-pce/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-app-pceweb/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-pcep-provider-packet/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-bgpcep-provider-flow/${project.version}</bundle>
+    </feature>
+</features>
diff --git a/providers/bgpcep/app/pom.xml b/providers/bgpcep/app/pom.xml
new file mode 100644
index 0000000..2c51bed
--- /dev/null
+++ b/providers/bgpcep/app/pom.xml
@@ -0,0 +1,108 @@
+<!--
+  ~ Copyright 2016-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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-bgpcep-providers</artifactId>
+        <version>1.6.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>onos-bgpcep-app</artifactId>
+    <packaging>pom</packaging>
+    <description>BGP PCEP protocol southbound providers</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-bgpio</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-bgp-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-bgp-ctl</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-pcep-controller-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-bgp-provider-cfg</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-pcepio</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-pcep-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-pcep-controller-impl</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-pcep-provider-topology</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-pcep-provider-tunnel</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-pce</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-pceweb</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-bgp-provider-topology</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-pcep-provider-packet</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-bgpcep-provider-flow</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/providers/bgpcep/flow/src/main/java/org/onosproject/provider/bgpcep/flow/impl/BgpcepFlowRuleProvider.java b/providers/bgpcep/flow/src/main/java/org/onosproject/provider/bgpcep/flow/impl/BgpcepFlowRuleProvider.java
index b005132..6f0f10a 100644
--- a/providers/bgpcep/flow/src/main/java/org/onosproject/provider/bgpcep/flow/impl/BgpcepFlowRuleProvider.java
+++ b/providers/bgpcep/flow/src/main/java/org/onosproject/provider/bgpcep/flow/impl/BgpcepFlowRuleProvider.java
@@ -15,6 +15,9 @@
  */
 package org.onosproject.provider.bgpcep.flow.impl;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -28,7 +31,6 @@
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MplsLabel;
 import org.onosproject.bgp.controller.BgpController;
-import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.incubator.net.resource.label.LabelResourceId;
 import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint;
@@ -42,21 +44,24 @@
 import org.onosproject.net.Path;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.flow.CompletedBatchOperation;
+import org.onosproject.net.flow.DefaultFlowEntry;
+import org.onosproject.net.flow.FlowEntry;
 import org.onosproject.net.flow.FlowRule;
+import org.onosproject.net.flow.FlowRuleBatchEntry;
 import org.onosproject.net.flow.FlowRuleBatchOperation;
 import org.onosproject.net.flow.FlowRuleProvider;
 import org.onosproject.net.flow.FlowRuleProviderRegistry;
 import org.onosproject.net.flow.FlowRuleProviderService;
 import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.FlowEntry.FlowEntryState;
 import org.onosproject.net.flow.criteria.Criterion;
 import org.onosproject.net.flow.criteria.IPCriterion;
 import org.onosproject.net.flow.criteria.MetadataCriterion;
 import org.onosproject.net.flow.criteria.MplsBosCriterion;
 import org.onosproject.net.flow.criteria.MplsCriterion;
 import org.onosproject.net.flow.criteria.PortCriterion;
-import org.onosproject.net.flow.criteria.TcpPortCriterion;
 import org.onosproject.net.flow.criteria.TunnelIdCriterion;
-import org.onosproject.net.flowobjective.Objective;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.net.resource.ResourceService;
@@ -81,13 +86,14 @@
 import org.onosproject.pcepio.types.PcepLabelMap;
 import org.onosproject.pcepio.types.PcepValueType;
 import org.onosproject.pcepio.types.StatefulIPv4LspIdentifiersTlv;
-import org.onosproject.provider.pcep.tunnel.impl.SrpIdGenerators;
-import org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys;
+import org.onosproject.pcep.controller.SrpIdGenerators;
+import org.onosproject.pcep.controller.PcepAnnotationKeys;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 
 import static org.onosproject.pcep.controller.PcepSyncStatus.IN_SYNC;
 import static org.onosproject.pcep.controller.PcepSyncStatus.SYNCED;
+import static org.onosproject.net.flow.criteria.Criterion.Type.EXTENSION;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -104,9 +110,6 @@
     protected FlowRuleProviderRegistry providerRegistry;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected ComponentConfigService cfgService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected BgpController bgpController;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -129,6 +132,12 @@
     public static final long SET = 0xFFFFFFFFL;
     private static final String LSRID = "lsrId";
 
+    private enum PcepFlowType {
+        ADD,
+        MODIFY,
+        REMOVE
+    }
+
     /**
      * Creates a BgpFlow host provider.
      */
@@ -138,14 +147,12 @@
 
     @Activate
     public void activate(ComponentContext context) {
-        cfgService.registerProperties(getClass());
         providerService = providerRegistry.register(this);
         log.info("Started");
     }
 
     @Deactivate
     public void deactivate(ComponentContext context) {
-        cfgService.unregisterProperties(getClass(), false);
         providerRegistry.unregister(this);
         providerService = null;
         log.info("Stopped");
@@ -154,26 +161,25 @@
     @Override
     public void applyFlowRule(FlowRule... flowRules) {
         for (FlowRule flowRule : flowRules) {
-            processRule(flowRule, Objective.Operation.ADD);
+            processRule(flowRule, PcepFlowType.ADD);
         }
     }
 
     @Override
     public void removeFlowRule(FlowRule... flowRules) {
         for (FlowRule flowRule : flowRules) {
-            processRule(flowRule, Objective.Operation.REMOVE);
+            processRule(flowRule, PcepFlowType.REMOVE);
         }
     }
 
-    private void processRule(FlowRule flowRule, Objective.Operation type) {
+    private void processRule(FlowRule flowRule, PcepFlowType type) {
         MplsLabel mplsLabel = null;
-        IpPrefix ip4Prefix = null;
+        IpPrefix ip4PrefixSrc = null;
+        IpPrefix ip4PrefixDst = null;
         PortNumber port = null;
         TunnelId tunnelId = null;
         long labelType = 0;
         boolean bottomOfStack = false;
-        int srcPort = 0;
-        int dstPort = 0;
 
         TrafficSelector selector = flowRule.selector();
         for (Criterion c : selector.criteria()) {
@@ -184,20 +190,16 @@
                 break;
             case IPV4_SRC:
                 IPCriterion ipCriterion = (IPCriterion) c;
-                ip4Prefix = ipCriterion.ip().getIp4Prefix();
+                ip4PrefixSrc = ipCriterion.ip().getIp4Prefix();
+                break;
+            case IPV4_DST:
+                ipCriterion = (IPCriterion) c;
+                ip4PrefixDst = ipCriterion.ip().getIp4Prefix();
                 break;
             case IN_PORT:
                 PortCriterion inPort = (PortCriterion) c;
                 port = inPort.port();
                 break;
-            case TCP_SRC:
-                TcpPortCriterion srcTcpPort = (TcpPortCriterion) c;
-                srcPort = srcTcpPort.tcpPort().toInt();
-                break;
-            case TCP_DST:
-                TcpPortCriterion dstTcpPort = (TcpPortCriterion) c;
-                dstPort = dstTcpPort.tcpPort().toInt();
-                break;
             case TUNNEL_ID:
                 TunnelIdCriterion tc = (TunnelIdCriterion) c;
                 tunnelId = TunnelId.valueOf(String.valueOf(tc.tunnelId()));
@@ -224,13 +226,12 @@
                 return;
             }
 
-            if (srcPort != 0 && dstPort != 0) {
-                pushAdjacencyLabel(flowRule.deviceId(), label, PortNumber.portNumber(srcPort),
-                                   PortNumber.portNumber(dstPort), type);
+            if (ip4PrefixDst != null) {
+                pushAdjacencyLabel(flowRule.deviceId(), label, ip4PrefixSrc, ip4PrefixDst, type);
                 return;
             }
 
-            pushGlobalNodeLabel(flowRule.deviceId(), label, ip4Prefix, type, bottomOfStack);
+            pushGlobalNodeLabel(flowRule.deviceId(), label, ip4PrefixSrc, type, bottomOfStack);
 
         } catch (PcepParseException e) {
             log.error("Exception occured while sending label message to PCC {}", e.getMessage());
@@ -255,7 +256,7 @@
 
     //Pushes node labels to the specified device.
     private void pushGlobalNodeLabel(DeviceId deviceId, LabelResourceId labelId,
-            IpPrefix ipPrefix, Objective.Operation type, boolean isBos) throws PcepParseException {
+            IpPrefix ipPrefix, PcepFlowType type, boolean isBos) throws PcepParseException {
 
         checkNotNull(deviceId);
         checkNotNull(labelId);
@@ -271,7 +272,7 @@
 
         if (ipPrefix == null) {
             // Pushing self node label to device.
-            IpPrefix.valueOf(pc.getPccId().ipAddress(), 32);
+            ipPrefix = IpPrefix.valueOf(pc.getPccId().ipAddress(), 32);
         }
 
         PcepFecObjectIPv4 fecObject = pc.factory().buildFecObjectIpv4()
@@ -279,16 +280,9 @@
                                       .build();
 
         boolean bSFlag = false;
-        if (pc.labelDbSyncStatus() == IN_SYNC) {
-            if (isBos) {
-                /*
-                 * Now the sync is completed.
-                 * Need to send label DB end-of-sync msg, i.e. S flag in SRP id is reset.
-                 */
-                pc.setLabelDbSyncStatus(SYNCED);
-            } else {
-                bSFlag = true;
-            }
+        if (pc.labelDbSyncStatus() == IN_SYNC && !isBos) {
+            // Need to set sync flag in all messages till sync completes.
+            bSFlag = true;
         }
 
         PcepSrpObject srpObj = getSrpObject(pc, type, bSFlag);
@@ -312,14 +306,19 @@
                                       .build();
 
         pc.sendMessage(labelMsg);
+
+        if (isBos) {
+            // Sync is completed.
+            pc.setLabelDbSyncStatus(SYNCED);
+        }
     }
 
-    private PcepSrpObject getSrpObject(PcepClient pc, Objective.Operation type, boolean bSFlag)
+    private PcepSrpObject getSrpObject(PcepClient pc, PcepFlowType type, boolean bSFlag)
             throws PcepParseException {
         PcepSrpObject srpObj;
         boolean bRFlag = false;
 
-        if (!type.equals(Objective.Operation.ADD)) {
+        if (!type.equals(PcepFlowType.ADD)) {
             // To cleanup labels, R bit is set
             bRFlag = true;
         }
@@ -334,13 +333,14 @@
     }
 
     //Pushes adjacency labels to the specified device.
-    private void pushAdjacencyLabel(DeviceId deviceId, LabelResourceId labelId,
-            PortNumber srcPortNum, PortNumber dstPortNum, Objective.Operation type) throws PcepParseException {
+    private void pushAdjacencyLabel(DeviceId deviceId, LabelResourceId labelId, IpPrefix ip4PrefixSrc,
+                                    IpPrefix ip4PrefixDst, PcepFlowType type)
+            throws PcepParseException {
 
         checkNotNull(deviceId);
         checkNotNull(labelId);
-        checkNotNull(srcPortNum);
-        checkNotNull(dstPortNum);
+        checkNotNull(ip4PrefixSrc);
+        checkNotNull(ip4PrefixDst);
         checkNotNull(type);
 
         PcepClient pc = getPcepClient(deviceId);
@@ -351,17 +351,21 @@
 
         LinkedList<PcepLabelUpdate> labelUpdateList = new LinkedList<>();
 
-        long srcPortNo = srcPortNum.toLong();
-        long dstPortNo = dstPortNum.toLong();
-        srcPortNo = ((srcPortNo & IDENTIFIER_SET) == IDENTIFIER_SET) ? srcPortNo & SET : srcPortNo;
-        dstPortNo = ((dstPortNo & IDENTIFIER_SET) == IDENTIFIER_SET) ? dstPortNo & SET : dstPortNo;
+        int srcPortNo = ip4PrefixSrc.address().getIp4Address().toInt();
+        int dstPortNo = ip4PrefixDst.address().getIp4Address().toInt();
 
         PcepFecObjectIPv4Adjacency fecAdjObject = pc.factory().buildFecIpv4Adjacency()
-                                                  .seRemoteIPv4Address((int) dstPortNo)
-                                                  .seLocalIPv4Address((int) srcPortNo)
+                                                  .seRemoteIPv4Address(dstPortNo)
+                                                  .seLocalIPv4Address(srcPortNo)
                                                   .build();
 
-        PcepSrpObject srpObj = getSrpObject(pc, type, false);
+        boolean bSFlag = false;
+        if (pc.labelDbSyncStatus() == IN_SYNC) {
+            // Need to set sync flag in all messages till sync completes.
+            bSFlag = true;
+        }
+
+        PcepSrpObject srpObj = getSrpObject(pc, type, bSFlag);
 
         //Adjacency label object
         PcepLabelObject labelObject = pc.factory().buildLabelObject()
@@ -387,7 +391,7 @@
     //Pushes local labels to the device which is specific to path [CR-case].
     private void pushLocalLabels(DeviceId deviceId, LabelResourceId labelId,
             PortNumber portNum, TunnelId tunnelId,
-            Boolean isBos, Long labelType, Objective.Operation type) throws PcepParseException {
+            Boolean isBos, Long labelType, PcepFlowType type) throws PcepParseException {
 
         checkNotNull(deviceId);
         checkNotNull(labelId);
@@ -559,6 +563,31 @@
 
     @Override
     public void executeBatch(FlowRuleBatchOperation batch) {
-    //TODO
+        Collection<FlowEntry> flowEntries = new ArrayList<>();
+
+        for (FlowRuleBatchEntry fbe : batch.getOperations()) {
+            Criterion criteria = fbe.target().selector().getCriterion(EXTENSION);
+
+            switch (fbe.operator()) {
+            case ADD:
+                if (criteria == null) {
+                    processRule(fbe.target(), PcepFlowType.ADD);
+                    flowEntries.add(new DefaultFlowEntry(fbe.target(), FlowEntryState.ADDED, 0, 0, 0));
+                }
+                break;
+            case REMOVE:
+                if (criteria == null) {
+                    processRule(fbe.target(), PcepFlowType.REMOVE);
+                    flowEntries.add(new DefaultFlowEntry(fbe.target(), FlowEntryState.REMOVED, 0, 0, 0));
+                }
+                break;
+            default:
+                log.error("Unknown flow operation: {}", fbe);
+            }
+        }
+
+        CompletedBatchOperation status = new CompletedBatchOperation(true, Collections.emptySet(), batch.deviceId());
+        providerService.batchOperationCompleted(batch.id(), status);
+        providerService.pushFlowMetrics(batch.deviceId(), flowEntries);
     }
 }
diff --git a/providers/bgpcep/pom.xml b/providers/bgpcep/pom.xml
index 68ef64b..0bbecf3 100644
--- a/providers/bgpcep/pom.xml
+++ b/providers/bgpcep/pom.xml
@@ -28,6 +28,7 @@
 
   <modules>
         <module>flow</module>
+        <module>app</module>
   </modules>
 
   <dependencies>
diff --git a/providers/pcep/app/app.xml b/providers/pcep/app/app.xml
index 1bdef05..8cae1d5 100644
--- a/providers/pcep/app/app.xml
+++ b/providers/pcep/app/app.xml
@@ -25,4 +25,5 @@
     <artifact>mvn:${project.groupId}/onos-pcep-controller-impl/${project.version}</artifact>
     <artifact>mvn:${project.groupId}/onos-pcep-provider-topology/${project.version}</artifact>
     <artifact>mvn:${project.groupId}/onos-pcep-provider-tunnel/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-pcep-provider-packet/${project.version}</artifact>
 </app>
diff --git a/providers/pcep/app/features.xml b/providers/pcep/app/features.xml
index 002f7f6..4f3ee7f 100644
--- a/providers/pcep/app/features.xml
+++ b/providers/pcep/app/features.xml
@@ -24,5 +24,6 @@
         <bundle>mvn:${project.groupId}/onos-pcep-controller-impl/${project.version}</bundle>
         <bundle>mvn:${project.groupId}/onos-pcep-provider-topology/${project.version}</bundle>
         <bundle>mvn:${project.groupId}/onos-pcep-provider-tunnel/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-pcep-provider-packet/${project.version}</bundle>
     </feature>
 </features>
diff --git a/providers/pcep/app/pom.xml b/providers/pcep/app/pom.xml
index dae00e4..3d7fc3d 100644
--- a/providers/pcep/app/pom.xml
+++ b/providers/pcep/app/pom.xml
@@ -58,6 +58,10 @@
             <artifactId>onos-pcep-provider-tunnel</artifactId>
             <version>${project.version}</version>
         </dependency>
-
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-pcep-provider-packet</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 </project>
diff --git a/providers/pcep/packet/src/main/java/org/onosproject/provider/pcep/packet/impl/PcepPacketProvider.java b/providers/pcep/packet/src/main/java/org/onosproject/provider/pcep/packet/impl/PcepPacketProvider.java
index 48f2408..13a2f99 100644
--- a/providers/pcep/packet/src/main/java/org/onosproject/provider/pcep/packet/impl/PcepPacketProvider.java
+++ b/providers/pcep/packet/src/main/java/org/onosproject/provider/pcep/packet/impl/PcepPacketProvider.java
@@ -107,6 +107,7 @@
             }
 
             if (pccDeviceId == null) {
+                log.error("Device not found to perform label DB sync.");
                 return;
             }
 
diff --git a/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java b/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java
index eaebc57..9a445fb 100644
--- a/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java
+++ b/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java
@@ -21,9 +21,6 @@
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.onlab.packet.ChassisId;
-import org.onosproject.cluster.ClusterService;
-import org.onosproject.mastership.MastershipAdminService;
-import org.onosproject.mastership.MastershipService;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.Device;
@@ -55,7 +52,6 @@
 import org.onosproject.net.link.LinkProvider;
 import org.onosproject.net.link.LinkProviderRegistry;
 import org.onosproject.net.link.LinkProviderService;
-import org.onosproject.net.link.LinkService;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.pcep.api.DeviceCapability;
@@ -94,7 +90,9 @@
      * Creates instance of PCEP topology provider.
      */
     public PcepTopologyProvider() {
-        super(new ProviderId("l3", "org.onosproject.provider.pcep"));
+        //In BGP-PCEP app, since both BGP and PCEP topology provider have same scheme
+        //so BGP will be primary and PCEP topology provider will be ancillary.
+        super(new ProviderId("l3", "org.onosproject.provider.pcep", true));
     }
 
     private static final Logger log = LoggerFactory
@@ -113,18 +111,6 @@
     protected DeviceService deviceService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected LinkService linkService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected MastershipAdminService mastershipAdminService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected MastershipService mastershipService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected ClusterService clusterService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected PcepClientController pcepClientController;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -141,7 +127,7 @@
 
     private final ConfigFactory<DeviceId, DeviceCapability> configFactory =
             new ConfigFactory<DeviceId, DeviceCapability>(SubjectFactories.DEVICE_SUBJECT_FACTORY,
-                    DeviceCapability.class, "deviceCapability", true) {
+                    DeviceCapability.class, "deviceCapability", false) {
                 @Override
                 public DeviceCapability createConfig() {
                     return new DeviceCapability();
@@ -156,6 +142,7 @@
         controller.addLinkListener(listener);
         pcepClientController.addNodeListener(listener);
         netConfigRegistry.registerConfigFactory(configFactory);
+        log.info("Started");
     }
 
     @Deactivate
@@ -166,6 +153,7 @@
         controller.removeLinkListener(listener);
         pcepClientController.removeNodeListener(listener);
         netConfigRegistry.unregisterConfigFactory(configFactory);
+        log.info("Stopped");
     }
 
     private List<PortDescription> buildPortDescriptions(PcepDpid dpid,
diff --git a/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelProvider.java b/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelProvider.java
index c77187a..8448528 100644
--- a/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelProvider.java
+++ b/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelProvider.java
@@ -24,6 +24,7 @@
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
+import org.onlab.packet.Ip4Address;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.DefaultGroupId;
@@ -79,8 +80,9 @@
 import org.onosproject.pcep.controller.PcepClientController;
 import org.onosproject.pcep.controller.PcepClientListener;
 import org.onosproject.pcep.controller.PcepEventListener;
+import org.onosproject.pcep.controller.PcepLspStatus;
 import org.onosproject.pcep.controller.PcepLspSyncAction;
-import org.onosproject.pcep.controller.impl.PcepLspStatus;
+import org.onosproject.pcep.controller.SrpIdGenerators;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 import org.onosproject.pcepio.protocol.PcInitiatedLspRequest;
 import org.onosproject.pcepio.protocol.PcepAttribute;
@@ -130,13 +132,13 @@
 import static org.onosproject.pcep.api.PcepDpid.uri;
 import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING;
 import static org.onosproject.provider.pcep.tunnel.impl.LspType.SR_WITHOUT_SIGNALLING;
-import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.BANDWIDTH;
-import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LOCAL_LSP_ID;
-import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE;
-import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PCC_TUNNEL_ID;
-import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PLSP_ID;
-import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.DELEGATE;
-import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.COST_TYPE;
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.BANDWIDTH;
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.LOCAL_LSP_ID;
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.LSP_SIG_TYPE;
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.PCC_TUNNEL_ID;
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.PLSP_ID;
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.DELEGATE;
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.COST_TYPE;
 import static org.onosproject.provider.pcep.tunnel.impl.RequestType.CREATE;
 import static org.onosproject.provider.pcep.tunnel.impl.RequestType.DELETE;
 import static org.onosproject.provider.pcep.tunnel.impl.RequestType.LSP_STATE_RPT;
@@ -306,18 +308,13 @@
             return;
         }
 
-        if (!(srcElement instanceof IpElementId)) {
-            log.error("Element id is not valid");
-            return;
-        }
-
         // check for tunnel end points
         if (!(tunnel.src() instanceof IpTunnelEndPoint) || !(tunnel.dst() instanceof IpTunnelEndPoint)) {
             log.error("Tunnel source or destination is not valid");
             return;
         }
 
-        PcepClient pc = pcepClientController.getClient(PccId.pccId(((IpElementId) srcElement).ipAddress()));
+        PcepClient pc = pcepClientController.getClient(PccId.pccId(((IpTunnelEndPoint) tunnel.src()).ip()));
 
         if (!(pc instanceof PcepClient)) {
             log.error("There is no PCC connected with ip addresss {}"
@@ -822,21 +819,27 @@
         IpAddress ipDstAddress = null;
         IpAddress ipSrcAddress = null;
         PcepValueType subObj = null;
+        long portNo;
 
         for (Link link : listLink) {
             source = link.src();
             if (!(source.equals(destination))) {
                 //set IPv4SubObject for ERO object
-                ipSrcAddress = source.ipElementId().ipAddress();
+                portNo = source.port().toLong();
+                portNo = ((portNo & IDENTIFIER_SET) == IDENTIFIER_SET) ? portNo & SET : portNo;
+                ipSrcAddress = Ip4Address.valueOf((int) portNo);
                 subObj = new IPv4SubObject(ipSrcAddress.getIp4Address().toInt());
                 llSubObjects.add(subObj);
             }
 
             destination = link.dst();
-            ipDstAddress = destination.ipElementId().ipAddress();
+            portNo = destination.port().toLong();
+            portNo = ((portNo & IDENTIFIER_SET) == IDENTIFIER_SET) ? portNo & SET : portNo;
+            ipDstAddress = Ip4Address.valueOf((int) portNo);
             subObj = new IPv4SubObject(ipDstAddress.getIp4Address().toInt());
             llSubObjects.add(subObj);
         }
+
         return llSubObjects;
     }
 
@@ -904,9 +907,9 @@
         //build ERO object
         PcepEroObject eroobj = pc.factory().buildEroObject().setSubObjects(llSubObjects).build();
 
-        int iBandwidth = DEFAULT_BANDWIDTH_VALUE;
+        float iBandwidth = DEFAULT_BANDWIDTH_VALUE;
         if (tunnel.annotations().value(BANDWIDTH) != null) {
-            iBandwidth = Integer.parseInt(tunnel.annotations().value(BANDWIDTH));
+            iBandwidth = Float.parseFloat(tunnel.annotations().value(BANDWIDTH));
         }
         // build bandwidth object
         PcepBandwidthObject bandwidthObject = pc.factory().buildBandwidthObject().setBandwidth(iBandwidth).build();
diff --git a/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepReleaseTunnelProviderTest.java b/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepReleaseTunnelProviderTest.java
index 22a683b..e8ed50a 100644
--- a/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepReleaseTunnelProviderTest.java
+++ b/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepReleaseTunnelProviderTest.java
@@ -23,7 +23,7 @@
 import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING;
 import static org.onosproject.provider.pcep.tunnel.impl.LspType.SR_WITHOUT_SIGNALLING;
 import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR;
-import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE;
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.LSP_SIG_TYPE;
 
 import java.io.IOException;
 import java.util.ArrayList;
diff --git a/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepSetupTunnelProviderTest.java b/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepSetupTunnelProviderTest.java
index 078deb1..018f50c 100644
--- a/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepSetupTunnelProviderTest.java
+++ b/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepSetupTunnelProviderTest.java
@@ -23,7 +23,7 @@
 import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING;
 import static org.onosproject.provider.pcep.tunnel.impl.LspType.SR_WITHOUT_SIGNALLING;
 import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR;
-import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE;
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.LSP_SIG_TYPE;
 
 import java.io.IOException;
 import java.util.ArrayList;
diff --git a/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelAddedTest.java b/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelAddedTest.java
index ce00b5e..537d888 100644
--- a/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelAddedTest.java
+++ b/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelAddedTest.java
@@ -19,12 +19,12 @@
 import static org.hamcrest.core.Is.is;
 import static org.onosproject.incubator.net.tunnel.Tunnel.Type.MPLS;
 import static org.onosproject.incubator.net.tunnel.Tunnel.State.INIT;
-import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.BANDWIDTH;
-import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LOCAL_LSP_ID;
-import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE;
-import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PCC_TUNNEL_ID;
-import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PLSP_ID;
-import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.DELEGATE;
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.BANDWIDTH;
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.LOCAL_LSP_ID;
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.LSP_SIG_TYPE;
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.PCC_TUNNEL_ID;
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.PLSP_ID;
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.DELEGATE;
 import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR;
 import static org.onosproject.pcep.controller.PcepSyncStatus.SYNCED;
 import static org.onosproject.net.Device.Type.ROUTER;
diff --git a/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelProviderTest.java b/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelProviderTest.java
index e641c64..0e7fc99 100644
--- a/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelProviderTest.java
+++ b/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelProviderTest.java
@@ -20,7 +20,7 @@
 import static org.hamcrest.core.IsNot.not;
 import static org.onosproject.net.DefaultAnnotations.EMPTY;
 import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING;
-import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE;
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.LSP_SIG_TYPE;
 
 import java.io.IOException;
 import java.util.ArrayList;
diff --git a/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepUpdateTunnelProviderTest.java b/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepUpdateTunnelProviderTest.java
index 4106dfb..2b85fdf 100644
--- a/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepUpdateTunnelProviderTest.java
+++ b/providers/pcep/tunnel/src/test/java/org/onosproject/provider/pcep/tunnel/impl/PcepUpdateTunnelProviderTest.java
@@ -20,7 +20,9 @@
 import static org.hamcrest.core.Is.is;
 import static org.hamcrest.core.IsNot.not;
 import static org.onosproject.net.DefaultAnnotations.EMPTY;
-import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE;
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.LSP_SIG_TYPE;
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.LOCAL_LSP_ID;
+import static org.onosproject.pcep.controller.PcepAnnotationKeys.PLSP_ID;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -112,8 +114,8 @@
         path = new DefaultPath(pid, links, 20, EMPTY);
 
         Annotations annotations = DefaultAnnotations.builder()
-                .set(PcepAnnotationKeys.PLSP_ID, "1")
-                .set(PcepAnnotationKeys.LOCAL_LSP_ID, "1")
+                .set(PLSP_ID, "1")
+                .set(LOCAL_LSP_ID, "1")
                 .set(LSP_SIG_TYPE, WITH_SIGNALLING.name())
                 .build();
 
@@ -173,8 +175,8 @@
 
         Annotations annotations = DefaultAnnotations.builder()
                 .set(LSP_SIG_TYPE, WITH_SIGNALLING.name())
-                .set(PcepAnnotationKeys.PLSP_ID, "1")
-                .set(PcepAnnotationKeys.LOCAL_LSP_ID, "1")
+                .set(PLSP_ID, "1")
+                .set(LOCAL_LSP_ID, "1")
                 .build();
 
         tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS,
@@ -233,8 +235,8 @@
 
         Annotations annotations = DefaultAnnotations.builder()
                 .set(LSP_SIG_TYPE, SR_WITHOUT_SIGNALLING.name())
-                .set(PcepAnnotationKeys.PLSP_ID, "1")
-                .set(PcepAnnotationKeys.LOCAL_LSP_ID, "1")
+                .set(PLSP_ID, "1")
+                .set(LOCAL_LSP_ID, "1")
                 .build();
 
         tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS,
@@ -293,8 +295,8 @@
 
         Annotations annotations = DefaultAnnotations.builder()
                 .set(LSP_SIG_TYPE, WITHOUT_SIGNALLING_AND_WITHOUT_SR.name())
-                .set(PcepAnnotationKeys.PLSP_ID, "1")
-                .set(PcepAnnotationKeys.LOCAL_LSP_ID, "1")
+                .set(PLSP_ID, "1")
+                .set(LOCAL_LSP_ID, "1")
                 .build();
 
         tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS,