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 89a685b..aa16f80 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
@@ -60,6 +60,7 @@
 import org.onosproject.incubator.net.tunnel.TunnelName;
 import org.onosproject.incubator.net.tunnel.TunnelService;
 import org.onosproject.mastership.MastershipService;
+import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.DefaultAnnotations.Builder;
 import org.onosproject.net.Device;
@@ -92,6 +93,7 @@
 import org.onosproject.pce.pcestore.PcePathInfo;
 import org.onosproject.pce.pcestore.PceccTunnelInfo;
 import org.onosproject.pce.pcestore.api.PceStore;
+import org.onosproject.pcep.api.DeviceCapability;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.DistributedSet;
 import org.onosproject.store.service.Serializer;
@@ -176,6 +178,9 @@
     protected DeviceService deviceService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetworkConfigService netCfgService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected LabelResourceAdminService labelRsrcAdminService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -304,6 +309,14 @@
             return false;
         }
 
+        // Get device config from netconfig, to ascertain that session with ingress is present.
+        DeviceCapability cfg = netCfgService.getConfig(DeviceId.deviceId(srcLsrId), DeviceCapability.class);
+        if (cfg == null) {
+            log.debug("No session to ingress.");
+            pceStore.addFailedPathInfo(new PcePathInfo(src, dst, tunnelName, constraints, lspType));
+            return false;
+        }
+
         TunnelEndPoint srcEndPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(srcLsrId));
         TunnelEndPoint dstEndPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(dstLsrId));
 
@@ -441,7 +454,7 @@
                     bwConstraintValue = bwConstraint.bandwidth().bps();
                 } else if (constraint instanceof CostConstraint) {
                     costConstraint = (CostConstraint) constraint;
-                costType = costConstraint.type().name();
+                    costType = costConstraint.type().name();
                 }
             }
 
@@ -621,7 +634,8 @@
             while (it.hasNext() && cost > 0) {
                 Constraint constraint = it.next();
                 if (constraint instanceof CapabilityConstraint) {
-                    cost = ((CapabilityConstraint) constraint).isValidLink(edge.link(), deviceService) ? 1 : -1;
+                    cost = ((CapabilityConstraint) constraint).isValidLink(edge.link(), deviceService,
+                                                                           netCfgService) ? 1 : -1;
                 } else {
                     cost = constraint.cost(edge.link(), resourceService::isAvailable);
                 }
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 dee4747..24413c1 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
@@ -406,6 +406,7 @@
 
     /**
      * Install a rule for pushing unique global labels to the device.
+     *
      * @param deviceId device to which flow should be pushed
      * @param labelId label for the device
      * @param type type of operation
@@ -437,6 +438,7 @@
 
     /**
      * Install a rule for pushing node labels to the device of other nodes.
+     *
      * @param deviceId device to which flow should be pushed
      * @param labelId label for the device
      * @param ipPrefix device for which label is pushed
@@ -474,7 +476,8 @@
     }
 
     /**
-     *  Install a rule for pushing Adjacency labels to the device.
+     * Install a rule for pushing Adjacency labels to the device.
+     *
      * @param deviceId device to which flow should be pushed
      * @param labelId label for the adjacency
      * @param srcPortNum local port of the adjacency
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/constraint/CapabilityConstraint.java b/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/constraint/CapabilityConstraint.java
index a479c38..e123eea 100644
--- a/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/constraint/CapabilityConstraint.java
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/constraint/CapabilityConstraint.java
@@ -15,12 +15,14 @@
  */
 package org.onosproject.pce.pceservice.constraint;
 
-import org.onosproject.net.AnnotationKeys;
 import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
 import org.onosproject.net.Link;
+import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.intent.ResourceContext;
 import org.onosproject.net.intent.constraint.BooleanConstraint;
+import org.onosproject.pcep.api.DeviceCapability;
 
 import java.util.Objects;
 
@@ -32,11 +34,7 @@
 public final class CapabilityConstraint extends BooleanConstraint {
 
     private final CapabilityType capabilityType;
-    public static final String PCECC_CAPABILITY = "pceccCapability";
-    public static final String SR_CAPABILITY = "srCapability";
-    public static final String LABEL_STACK_CAPABILITY = "labelStackCapability";
     public static final String LSRID = "lsrId";
-    public static final String L3 = "L3";
     public static final String TRUE = "true";
 
     /**
@@ -117,45 +115,33 @@
      *
      * @param link to validate source and destination based on capability constraint
      * @param deviceService instance of DeviceService
+     * @param netCfgService instance of NetworkConfigService
      * @return true if link satisfies capability constraint otherwise false
      */
-    public boolean isValidLink(Link link, DeviceService deviceService) {
-        if (deviceService == null) {
+    public boolean isValidLink(Link link, DeviceService deviceService, NetworkConfigService netCfgService) {
+        if (deviceService == null || netCfgService == null) {
             return false;
         }
 
         Device srcDevice = deviceService.getDevice(link.src().deviceId());
         Device dstDevice = deviceService.getDevice(link.dst().deviceId());
 
-        //TODO: Usage of annotations are for transient solution. In future will be replaces with the
+        //TODO: Usage of annotations are for transient solution. In future will be replaced with the
         // network config service / Projection model.
         // L3 device
-        if (srcDevice == null
-                || dstDevice == null
-                || srcDevice.annotations().value(AnnotationKeys.TYPE) == null
-                || dstDevice.annotations().value(AnnotationKeys.TYPE) == null
-                || !srcDevice.annotations().value(AnnotationKeys.TYPE).equals(L3)
-                || !dstDevice.annotations().value(AnnotationKeys.TYPE).equals(L3)) {
+        if (srcDevice == null || dstDevice == null) {
             return false;
         }
 
-        String scrLsrId = srcDevice.annotations().value(LSRID);
+        String srcLsrId = srcDevice.annotations().value(LSRID);
         String dstLsrId = dstDevice.annotations().value(LSRID);
 
-        Device srcCapDevice = null;
-        Device dstCapDevice = null;
+        DeviceCapability srcDeviceConfig = netCfgService.getConfig(DeviceId.deviceId(srcLsrId),
+                                                                       DeviceCapability.class);
+        DeviceCapability dstDeviceConfig = netCfgService.getConfig(DeviceId.deviceId(dstLsrId),
+                                                                       DeviceCapability.class);
 
-        // Get Capability device
-        Iterable<Device> devices = deviceService.getAvailableDevices();
-        for (Device dev : devices) {
-            if (dev.annotations().value(LSRID).equals(scrLsrId)) {
-                srcCapDevice = dev;
-            } else if (dev.annotations().value(LSRID).equals(dstLsrId)) {
-                dstCapDevice = dev;
-            }
-        }
-
-        if (srcCapDevice == null || dstCapDevice == null) {
+        if (srcDeviceConfig == null || dstDeviceConfig == null) {
             return false;
         }
 
@@ -163,23 +149,11 @@
         case WITH_SIGNALLING:
             return true;
         case WITHOUT_SIGNALLING_AND_WITHOUT_SR:
-            if (srcCapDevice.annotations().value(PCECC_CAPABILITY) != null
-                    && dstCapDevice.annotations().value(PCECC_CAPABILITY) != null) {
-                return srcCapDevice.annotations().value(PCECC_CAPABILITY).equals(TRUE)
-                        && dstCapDevice.annotations().value(PCECC_CAPABILITY).equals(TRUE);
-            }
-            return false;
+            return srcDeviceConfig.localLabelCap() && dstDeviceConfig.localLabelCap();
+
         case SR_WITHOUT_SIGNALLING:
-            if (srcCapDevice.annotations().value(LABEL_STACK_CAPABILITY) != null
-                    && dstCapDevice.annotations().value(LABEL_STACK_CAPABILITY) != null
-                    && srcCapDevice.annotations().value(SR_CAPABILITY) != null
-                    && dstCapDevice.annotations().value(SR_CAPABILITY) != null) {
-                return srcCapDevice.annotations().value(LABEL_STACK_CAPABILITY).equals(TRUE)
-                        && dstCapDevice.annotations().value(LABEL_STACK_CAPABILITY).equals(TRUE)
-                        && srcCapDevice.annotations().value(SR_CAPABILITY).equals(TRUE)
-                        && dstCapDevice.annotations().value(SR_CAPABILITY).equals(TRUE);
-            }
-            return false;
+            return srcDeviceConfig.srCap() && dstDeviceConfig.srCap()
+                        && srcDeviceConfig.labelStackCap() && dstDeviceConfig.labelStackCap();
         default:
             return false;
         }
diff --git a/apps/pce/app/src/test/java/org/onosproject/pce/pceservice/PathComputationTest.java b/apps/pce/app/src/test/java/org/onosproject/pce/pceservice/PathComputationTest.java
index c4040ed..9e68702 100644
--- a/apps/pce/app/src/test/java/org/onosproject/pce/pceservice/PathComputationTest.java
+++ b/apps/pce/app/src/test/java/org/onosproject/pce/pceservice/PathComputationTest.java
@@ -40,6 +40,10 @@
 import org.onosproject.net.intent.Constraint;
 import org.onosproject.net.intent.IntentId;
 import org.onosproject.net.Device.Type;
+import org.onosproject.net.config.Config;
+import org.onosproject.net.config.ConfigApplyDelegate;
+import org.onosproject.net.config.ConfigFactory;
+import org.onosproject.net.config.NetworkConfigRegistryAdapter;
 import org.onosproject.net.intent.constraint.BandwidthConstraint;
 import org.onosproject.net.device.DeviceServiceAdapter;
 import org.onosproject.net.resource.ContinuousResource;
@@ -60,7 +64,11 @@
 import org.onosproject.pce.pceservice.constraint.CapabilityConstraint;
 import org.onosproject.pce.pceservice.constraint.CostConstraint;
 import org.onosproject.pce.pceservice.constraint.SharedBandwidthConstraint;
-
+import org.onosproject.pcep.api.DeviceCapability;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
@@ -94,6 +102,7 @@
 
     private final MockPathResourceService resourceService = new MockPathResourceService();
     private final MockDeviceService deviceService = new MockDeviceService();
+    private final MockNetConfigRegistryAdapter netConfigRegistry = new MockNetConfigRegistryAdapter();
     private PceManager pceManager = new PceManager();
     public static ProviderId providerId = new ProviderId("pce", "foo");
     public static final String DEVICE1 = "D001";
@@ -123,6 +132,7 @@
     public void startUp() {
         pceManager.resourceService = resourceService;
         pceManager.deviceService = deviceService;
+        pceManager.netCfgService = netConfigRegistry;
     }
 
     /**
@@ -164,6 +174,7 @@
     public void tearDown() {
         pceManager.resourceService = null;
         pceManager.deviceService = null;
+        pceManager.netCfgService = null;
     }
 
     /**
@@ -234,6 +245,7 @@
             }
         }
 
+        @Override
         public double weight(TopologyEdge edge) {
             if (!constraints.iterator().hasNext()) {
                 //Takes default cost/hopcount as 1 if no constraints specified
@@ -247,7 +259,8 @@
             while (it.hasNext() && cost > 0) {
                 Constraint constraint = it.next();
                 if (constraint instanceof CapabilityConstraint) {
-                    cost = ((CapabilityConstraint) constraint).isValidLink(edge.link(), deviceService) ? 1 : -1;
+                    cost = ((CapabilityConstraint) constraint).isValidLink(edge.link(), deviceService,
+                                                                           netConfigRegistry) ? 1 : -1;
                 } else {
                     cost = constraint.cost(edge.link(), resourceService::isAvailable);
                 }
@@ -346,6 +359,63 @@
         }
     }
 
+    /* Mock test for network config registry. */
+    public static class MockNetConfigRegistryAdapter extends NetworkConfigRegistryAdapter {
+        private ConfigFactory cfgFactory;
+        private Map<DeviceId, DeviceCapability> classConfig = new HashMap<>();
+
+        @Override
+        public void registerConfigFactory(ConfigFactory configFactory) {
+            cfgFactory = configFactory;
+        }
+
+        @Override
+        public void unregisterConfigFactory(ConfigFactory configFactory) {
+            cfgFactory = null;
+        }
+
+        @Override
+        public <S, C extends Config<S>> C addConfig(S subject, Class<C> configClass) {
+            if (configClass == DeviceCapability.class) {
+                DeviceCapability devCap = new DeviceCapability();
+                classConfig.put((DeviceId) subject, devCap);
+
+                JsonNode node = new ObjectNode(new MockJsonNode());
+                ObjectMapper mapper = new ObjectMapper();
+                ConfigApplyDelegate delegate = new InternalApplyDelegate();
+                devCap.init((DeviceId) subject, null, node, mapper, delegate);
+                return (C) devCap;
+            }
+
+            return null;
+        }
+
+        @Override
+        public <S, C extends Config<S>> void removeConfig(S subject, Class<C> configClass) {
+            classConfig.remove(subject);
+        }
+
+        @Override
+        public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
+            if (configClass == DeviceCapability.class) {
+                return (C) classConfig.get(subject);
+            }
+            return null;
+        }
+
+        private class MockJsonNode extends JsonNodeFactory {
+        }
+
+        // Auxiliary delegate to receive notifications about changes applied to
+        // the network configuration - by the apps.
+        private class InternalApplyDelegate implements ConfigApplyDelegate {
+            @Override
+            public void onApply(Config config) {
+                //configs.put(config.subject(), config.node());
+            }
+        }
+    }
+
     /**
      * All links with different costs with L1-L2 as least cost path.
      */
@@ -614,24 +684,48 @@
         builder.set(LSRID, "1.1.1.1");
         addDevice(DEVICE1, builder);
 
+        DeviceCapability device1Cap = netConfigRegistry.addConfig(DeviceId.deviceId("1.1.1.1"), DeviceCapability.class);
+        device1Cap.setLabelStackCap(false)
+            .setLocalLabelCap(false)
+            .setSrCap(false)
+            .apply();
+
         //Device2
         builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "2.2.2.2");
         addDevice(DEVICE2, builder);
 
+        DeviceCapability device2Cap = netConfigRegistry.addConfig(DeviceId.deviceId("2.2.2.2"), DeviceCapability.class);
+        device2Cap.setLabelStackCap(false)
+            .setLocalLabelCap(false)
+            .setSrCap(false)
+            .apply();
+
         //Device3
         builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "3.3.3.3");
         addDevice(DEVICE3, builder);
 
+        DeviceCapability device3Cap = netConfigRegistry.addConfig(DeviceId.deviceId("3.3.3.3"), DeviceCapability.class);
+        device3Cap.setLabelStackCap(false)
+            .setLocalLabelCap(false)
+            .setSrCap(false)
+            .apply();
+
         //Device4
         builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "4.4.4.4");
         addDevice(DEVICE4, builder);
 
+        DeviceCapability device4Cap = netConfigRegistry.addConfig(DeviceId.deviceId("4.4.4.4"), DeviceCapability.class);
+        device4Cap.setLabelStackCap(false)
+            .setLocalLabelCap(false)
+            .setSrCap(false)
+            .apply();
+
         Set<Path> paths = computePath(link1, link2, link3, link4, constraints);
 
         List<Link> links = new LinkedList<>();
@@ -663,32 +757,44 @@
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "1.1.1.1");
         addDevice(DEVICE1, builder);
-        builder.set(PCECC_CAPABILITY, "true");
-        addDevice(PCEPDEVICE1, builder);
+        DeviceCapability device1Cap = netConfigRegistry.addConfig(DeviceId.deviceId("1.1.1.1"), DeviceCapability.class);
+        device1Cap.setLabelStackCap(false)
+            .setLocalLabelCap(true)
+            .setSrCap(false)
+            .apply();
 
         //Device2
         builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "2.2.2.2");
         addDevice(DEVICE2, builder);
-        builder.set(PCECC_CAPABILITY, "true");
-        addDevice(PCEPDEVICE2, builder);
+        DeviceCapability device2Cap = netConfigRegistry.addConfig(DeviceId.deviceId("2.2.2.2"), DeviceCapability.class);
+        device2Cap.setLabelStackCap(false)
+            .setLocalLabelCap(true)
+            .setSrCap(false)
+            .apply();
 
         //Device3
         builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "3.3.3.3");
         addDevice(DEVICE3, builder);
-        builder.set(PCECC_CAPABILITY, "true");
-        addDevice(PCEPDEVICE3, builder);
+        DeviceCapability device3Cap = netConfigRegistry.addConfig(DeviceId.deviceId("3.3.3.3"), DeviceCapability.class);
+        device3Cap.setLabelStackCap(false)
+            .setLocalLabelCap(true)
+            .setSrCap(false)
+            .apply();
 
         //Device4
         builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "4.4.4.4");
         addDevice(DEVICE4, builder);
-        builder.set(PCECC_CAPABILITY, "true");
-        addDevice(PCEPDEVICE4, builder);
+        DeviceCapability device4Cap = netConfigRegistry.addConfig(DeviceId.deviceId("4.4.4.4"), DeviceCapability.class);
+        device4Cap.setLabelStackCap(false)
+            .setLocalLabelCap(true)
+            .setSrCap(false)
+            .apply();
 
         Set<Path> paths = computePath(link1, link2, link3, link4, constraints);
 
@@ -721,36 +827,44 @@
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "1.1.1.1");
         addDevice(DEVICE1, builder);
-        builder.set(SR_CAPABILITY, "true");
-        builder.set(LABEL_STACK_CAPABILITY, "true");
-        addDevice(PCEPDEVICE1, builder);
+        DeviceCapability device1Cap = netConfigRegistry.addConfig(DeviceId.deviceId("1.1.1.1"), DeviceCapability.class);
+        device1Cap.setLabelStackCap(true)
+            .setLocalLabelCap(false)
+            .setSrCap(true)
+            .apply();
 
         //Device2
         builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "2.2.2.2");
         addDevice(DEVICE2, builder);
-        builder.set(SR_CAPABILITY, "true");
-        builder.set(LABEL_STACK_CAPABILITY, "true");
-        addDevice(PCEPDEVICE2, builder);
+        DeviceCapability device2Cap = netConfigRegistry.addConfig(DeviceId.deviceId("2.2.2.2"), DeviceCapability.class);
+        device2Cap.setLabelStackCap(true)
+            .setLocalLabelCap(false)
+            .setSrCap(true)
+            .apply();
 
         //Device3
         builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "3.3.3.3");
         addDevice(DEVICE3, builder);
-        builder.set(SR_CAPABILITY, "true");
-        builder.set(LABEL_STACK_CAPABILITY, "true");
-        addDevice(PCEPDEVICE3, builder);
+        DeviceCapability device3Cap = netConfigRegistry.addConfig(DeviceId.deviceId("3.3.3.3"), DeviceCapability.class);
+        device3Cap.setLabelStackCap(true)
+            .setLocalLabelCap(false)
+            .setSrCap(true)
+            .apply();
 
         //Device4
         builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "4.4.4.4");
         addDevice(DEVICE4, builder);
-        builder.set(SR_CAPABILITY, "true");
-        builder.set(LABEL_STACK_CAPABILITY, "true");
-        addDevice(PCEPDEVICE4, builder);
+        DeviceCapability device4Cap = netConfigRegistry.addConfig(DeviceId.deviceId("4.4.4.4"), DeviceCapability.class);
+        device4Cap.setLabelStackCap(true)
+            .setLocalLabelCap(false)
+            .setSrCap(true)
+            .apply();
         Set<Path> paths = computePath(link1, link2, link3, link4, constraints);
 
         List<Link> links = new LinkedList<>();
@@ -783,36 +897,45 @@
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "1.1.1.1");
         addDevice(DEVICE1, builder);
-        builder.set(SR_CAPABILITY, "true");
-        builder.set(LABEL_STACK_CAPABILITY, "true");
-        addDevice(PCEPDEVICE1, builder);
+        DeviceCapability device1Cap = netConfigRegistry.addConfig(DeviceId.deviceId("1.1.1.1"), DeviceCapability.class);
+        device1Cap.setLabelStackCap(true)
+            .setLocalLabelCap(false)
+            .setSrCap(true)
+            .apply();
 
         //Device2
         builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "2.2.2.2");
         addDevice(DEVICE2, builder);
-        builder.set(SR_CAPABILITY, "true");
-        builder.set(LABEL_STACK_CAPABILITY, "true");
-        addDevice(PCEPDEVICE2, builder);
+        DeviceCapability device2Cap = netConfigRegistry.addConfig(DeviceId.deviceId("2.2.2.2"), DeviceCapability.class);
+        device2Cap.setLabelStackCap(true)
+            .setLocalLabelCap(false)
+            .setSrCap(true)
+            .apply();
 
         //Device3
         builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "3.3.3.3");
         addDevice(DEVICE3, builder);
-        builder.set(SR_CAPABILITY, "true");
-        builder.set(LABEL_STACK_CAPABILITY, "true");
-        addDevice(PCEPDEVICE3, builder);
+        DeviceCapability device3Cap = netConfigRegistry.addConfig(DeviceId.deviceId("3.3.3.3"), DeviceCapability.class);
+        device3Cap.setLabelStackCap(true)
+            .setLocalLabelCap(false)
+            .setSrCap(true)
+            .apply();
 
         //Device4
         builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "4.4.4.4");
         addDevice(DEVICE4, builder);
-        builder.set(SR_CAPABILITY, "true");
-        builder.set(LABEL_STACK_CAPABILITY, "true");
-        addDevice(PCEPDEVICE4, builder);
+        DeviceCapability device4Cap = netConfigRegistry.addConfig(DeviceId.deviceId("4.4.4.4"), DeviceCapability.class);
+        device4Cap.setLabelStackCap(true)
+            .setLocalLabelCap(false)
+            .setSrCap(true)
+            .apply();
+
         Set<Path> paths = computePath(link1, link2, link3, link4, constraints);
 
         List<Link> links = new LinkedList<>();
@@ -842,36 +965,45 @@
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "1.1.1.1");
         addDevice(DEVICE1, builder);
-        builder.set(SR_CAPABILITY, "true");
-        builder.set(LABEL_STACK_CAPABILITY, "true");
-        addDevice(PCEPDEVICE1, builder);
+        DeviceCapability device1Cap = netConfigRegistry.addConfig(DeviceId.deviceId("1.1.1.1"), DeviceCapability.class);
+        device1Cap.setLabelStackCap(true)
+            .setLocalLabelCap(false)
+            .setSrCap(true)
+            .apply();
 
         //Device2
         builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "2.2.2.2");
         addDevice(DEVICE2, builder);
-        builder.set(SR_CAPABILITY, "true");
-        builder.set(LABEL_STACK_CAPABILITY, "true");
-        addDevice(PCEPDEVICE2, builder);
+        DeviceCapability device2Cap = netConfigRegistry.addConfig(DeviceId.deviceId("2.2.2.2"), DeviceCapability.class);
+        device2Cap.setLabelStackCap(true)
+            .setLocalLabelCap(false)
+            .setSrCap(true)
+            .apply();
 
         //Device3
         builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "3.3.3.3");
         addDevice(DEVICE3, builder);
-        builder.set(SR_CAPABILITY, "true");
-        builder.set(LABEL_STACK_CAPABILITY, "true");
-        addDevice(PCEPDEVICE3, builder);
+        DeviceCapability device3Cap = netConfigRegistry.addConfig(DeviceId.deviceId("3.3.3.3"), DeviceCapability.class);
+        device3Cap.setLabelStackCap(true)
+            .setLocalLabelCap(false)
+            .setSrCap(true)
+            .apply();
 
         //Device4
         builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "4.4.4.4");
         addDevice(DEVICE4, builder);
-        builder.set(SR_CAPABILITY, "true");
-        builder.set(LABEL_STACK_CAPABILITY, "true");
-        addDevice(PCEPDEVICE4, builder);
+        DeviceCapability device4Cap = netConfigRegistry.addConfig(DeviceId.deviceId("4.4.4.4"), DeviceCapability.class);
+        device4Cap.setLabelStackCap(true)
+            .setLocalLabelCap(false)
+            .setSrCap(true)
+            .apply();
+
         Set<Path> paths = computePath(link1, link2, link3, link4, constraints);
 
         List<Link> links = new LinkedList<>();
@@ -969,24 +1101,33 @@
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "1.1.1.1");
         addDevice(DEVICE1, builder);
-        builder.set(PCECC_CAPABILITY, "true");
-        addDevice(PCEPDEVICE1, builder);
+        DeviceCapability device1Cap = netConfigRegistry.addConfig(DeviceId.deviceId("1.1.1.1"), DeviceCapability.class);
+        device1Cap.setLabelStackCap(false)
+            .setLocalLabelCap(true)
+            .setSrCap(false)
+            .apply();
 
         //Device2
         builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "2.2.2.2");
         addDevice(DEVICE2, builder);
-        builder.set(PCECC_CAPABILITY, "true");
-        addDevice(PCEPDEVICE2, builder);
+        DeviceCapability device2Cap = netConfigRegistry.addConfig(DeviceId.deviceId("2.2.2.2"), DeviceCapability.class);
+        device2Cap.setLabelStackCap(false)
+            .setLocalLabelCap(true)
+            .setSrCap(false)
+            .apply();
 
         //Device4
         builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "4.4.4.4");
         addDevice(DEVICE4, builder);
-        builder.set(PCECC_CAPABILITY, "true");
-        addDevice(PCEPDEVICE4, builder);
+        DeviceCapability device4Cap = netConfigRegistry.addConfig(DeviceId.deviceId("4.4.4.4"), DeviceCapability.class);
+        device4Cap.setLabelStackCap(false)
+            .setLocalLabelCap(true)
+            .setSrCap(false)
+            .apply();
         Set<Path> paths = computePath(link1, link2, link3, link4, constraints);
 
         List<Link> links = new LinkedList<>();
@@ -1019,24 +1160,33 @@
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "1.1.1.1");
         addDevice(DEVICE2, builder);
-        builder.set(PCECC_CAPABILITY, "true");
-        addDevice(PCEPDEVICE1, builder);
+        DeviceCapability device1Cap = netConfigRegistry.addConfig(DeviceId.deviceId("1.1.1.1"), DeviceCapability.class);
+        device1Cap.setLabelStackCap(false)
+            .setLocalLabelCap(true)
+            .setSrCap(false)
+            .apply();
 
         //Device2
         builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "2.2.2.2");
         addDevice(DEVICE2, builder);
-        builder.set(PCECC_CAPABILITY, "true");
-        addDevice(PCEPDEVICE2, builder);
+        DeviceCapability device2Cap = netConfigRegistry.addConfig(DeviceId.deviceId("2.2.2.2"), DeviceCapability.class);
+        device2Cap.setLabelStackCap(false)
+            .setLocalLabelCap(true)
+            .setSrCap(false)
+            .apply();
 
         //Device4
         builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
         builder.set(LSRID, "4.4.4.4");
         addDevice(DEVICE4, builder);
-        builder.set(PCECC_CAPABILITY, "true");
-        addDevice(PCEPDEVICE4, builder);
+        DeviceCapability device4Cap = netConfigRegistry.addConfig(DeviceId.deviceId("4.4.4.4"), DeviceCapability.class);
+        device4Cap.setLabelStackCap(false)
+            .setLocalLabelCap(true)
+            .setSrCap(false)
+            .apply();
         Set<Path> paths = computePath(link1, link2, link3, link4, constraints);
 
         assertThat(paths, is(new HashSet<>()));
diff --git a/apps/pce/app/src/test/java/org/onosproject/pce/pceservice/PceManagerTest.java b/apps/pce/app/src/test/java/org/onosproject/pce/pceservice/PceManagerTest.java
index 2da22e5..4b1faaf 100644
--- a/apps/pce/app/src/test/java/org/onosproject/pce/pceservice/PceManagerTest.java
+++ b/apps/pce/app/src/test/java/org/onosproject/pce/pceservice/PceManagerTest.java
@@ -102,12 +102,14 @@
 import org.onosproject.net.topology.TopologyListener;
 import org.onosproject.net.topology.TopologyServiceAdapter;
 import org.onosproject.net.topology.TopologyVertex;
+import org.onosproject.pce.pceservice.PathComputationTest.MockNetConfigRegistryAdapter;
 import org.onosproject.pce.pceservice.PathComputationTest.MockPathResourceService;
 import org.onosproject.pce.pceservice.constraint.CostConstraint;
 import org.onosproject.pce.pcestore.api.PceStore;
 import org.onosproject.pce.util.LabelResourceAdapter;
 import org.onosproject.pce.util.PceStoreAdapter;
 import org.onosproject.pce.util.TunnelServiceAdapter;
+import org.onosproject.pcep.api.DeviceCapability;
 import org.onosproject.pce.util.FlowObjServiceAdapter;
 import org.onosproject.store.service.TestStorageService;
 
@@ -130,6 +132,7 @@
     private TestStorageService storageService = new TestStorageService();
     private PacketService packetService = new MockPacketService();
     private MockDeviceService deviceService = new MockDeviceService();
+    private MockNetConfigRegistryAdapter netConfigRegistry = new PathComputationTest.MockNetConfigRegistryAdapter();
     private MockFlowObjService flowObjectiveService = new MockFlowObjService();
     private PceStore pceStore = new PceStoreAdapter();
     private LabelResourceService labelResourceService = new LabelResourceAdapter();
@@ -137,13 +140,9 @@
     public static ProviderId providerId = new ProviderId("pce", "foo");
     private static final String L3 = "L3";
     private static final String LSRID = "lsrId";
-    private static final String PCECC_CAPABILITY = "pceccCapability";
-    private static final String SR_CAPABILITY = "srCapability";
-    private static final String LABEL_STACK_CAPABILITY = "labelStackCapability";
 
     private TopologyGraph graph = null;
     private Device deviceD1, deviceD2, deviceD3, deviceD4;
-    private Device pcepDeviceD1, pcepDeviceD2, pcepDeviceD3, pcepDeviceD4;
     private Link link1, link2, link3, link4;
     protected static int flowsDownloaded;
     private TunnelListener tunnelListener;
@@ -163,6 +162,7 @@
         pceManager.storageService = storageService;
         pceManager.packetService = packetService;
         pceManager.deviceService = deviceService;
+        pceManager.netCfgService = netConfigRegistry;
         pceManager.labelRsrcService = labelResourceService;
         pceManager.flowObjectiveService = flowObjectiveService;
         pceManager.pceStore = pceStore;
@@ -231,27 +231,6 @@
         builderDev4.set(AnnotationKeys.TYPE, L3);
         builderDev4.set(LSRID, "4.4.4.4");
 
-        if (setSrCap) {
-            builderDev1.set(SR_CAPABILITY, "true");
-            builderDev2.set(SR_CAPABILITY, "true");
-            builderDev3.set(SR_CAPABILITY, "true");
-            builderDev4.set(SR_CAPABILITY, "true");
-        }
-
-        if (setPceccCap) {
-            builderDev1.set(PCECC_CAPABILITY, "true");
-            builderDev2.set(PCECC_CAPABILITY, "true");
-            builderDev3.set(PCECC_CAPABILITY, "true");
-            builderDev4.set(PCECC_CAPABILITY, "true");
-        }
-
-        if (setLabelStackCap) {
-            builderDev1.set(LABEL_STACK_CAPABILITY, "true");
-            builderDev2.set(LABEL_STACK_CAPABILITY, "true");
-            builderDev3.set(LABEL_STACK_CAPABILITY, "true");
-            builderDev4.set(LABEL_STACK_CAPABILITY, "true");
-        }
-
         deviceD1 = new MockDevice(D1.deviceId(), builderDev1.build());
         deviceD2 = new MockDevice(D2.deviceId(), builderDev2.build());
         deviceD3 = new MockDevice(D3.deviceId(), builderDev3.build());
@@ -262,17 +241,29 @@
         deviceService.addDevice(deviceD3);
         deviceService.addDevice(deviceD4);
 
-        pcepDeviceD1 = new MockDevice(DeviceId.deviceId(PathComputationTest.PCEPDEVICE1), builderDev1.build());
-        deviceService.addDevice(pcepDeviceD1);
+        DeviceCapability device1Cap = netConfigRegistry.addConfig(DeviceId.deviceId("1.1.1.1"), DeviceCapability.class);
+        device1Cap.setLabelStackCap(setLabelStackCap)
+        .setLocalLabelCap(setPceccCap)
+        .setSrCap(setSrCap)
+        .apply();
 
-        pcepDeviceD2 = new MockDevice(DeviceId.deviceId(PathComputationTest.PCEPDEVICE2), builderDev1.build());
-        deviceService.addDevice(pcepDeviceD2);
+        DeviceCapability device2Cap = netConfigRegistry.addConfig(DeviceId.deviceId("2.2.2.2"), DeviceCapability.class);
+        device2Cap.setLabelStackCap(setLabelStackCap)
+        .setLocalLabelCap(setPceccCap)
+        .setSrCap(setSrCap)
+        .apply();
 
-        pcepDeviceD3 = new MockDevice(DeviceId.deviceId(PathComputationTest.PCEPDEVICE3), builderDev1.build());
-        deviceService.addDevice(pcepDeviceD3);
+        DeviceCapability device3Cap = netConfigRegistry.addConfig(DeviceId.deviceId("3.3.3.3"), DeviceCapability.class);
+        device3Cap.setLabelStackCap(setLabelStackCap)
+        .setLocalLabelCap(setPceccCap)
+        .setSrCap(setSrCap)
+        .apply();
 
-        pcepDeviceD4 = new MockDevice(DeviceId.deviceId(PathComputationTest.PCEPDEVICE4), builderDev1.build());
-        deviceService.addDevice(pcepDeviceD4);
+        DeviceCapability device4Cap = netConfigRegistry.addConfig(DeviceId.deviceId("4.4.4.4"), DeviceCapability.class);
+        device4Cap.setLabelStackCap(setLabelStackCap)
+        .setLocalLabelCap(setPceccCap)
+        .setSrCap(setSrCap)
+        .apply();
 
         if (bandwidth != 0) {
             List<Resource> resources = new LinkedList<>();
