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 60a84cc..36b7eb5 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
@@ -15,6 +15,12 @@
  */
 package org.onosproject.pce.pceservice;
 
+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;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -25,7 +31,6 @@
 import org.onlab.graph.GraphPathSearch;
 import org.onlab.packet.ChassisId;
 import org.onlab.util.Bandwidth;
-import org.onlab.util.Tools;
 import org.onosproject.net.AnnotationKeys;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DefaultAnnotations;
@@ -33,45 +38,30 @@
 import org.onosproject.net.DefaultLink;
 import org.onosproject.net.DefaultPath;
 import org.onosproject.net.Device;
+import org.onosproject.net.Device.Type;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Link;
+import org.onosproject.net.LinkKey;
 import org.onosproject.net.Path;
 import org.onosproject.net.PortNumber;
-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;
-import org.onosproject.net.resource.ContinuousResourceId;
-import org.onosproject.net.resource.DiscreteResource;
-import org.onosproject.net.resource.DiscreteResourceId;
-import org.onosproject.net.resource.Resource;
-import org.onosproject.net.resource.ResourceAllocation;
-import org.onosproject.net.resource.ResourceConsumer;
-import org.onosproject.net.resource.ResourceId;
-import org.onosproject.net.resource.Resources;
+import org.onosproject.net.intent.Constraint;
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.net.topology.DefaultTopologyEdge;
 import org.onosproject.net.topology.DefaultTopologyVertex;
-import org.onosproject.net.topology.LinkWeigher;
 import org.onosproject.net.topology.LinkWeight;
 import org.onosproject.net.topology.TopologyEdge;
 import org.onosproject.net.topology.TopologyVertex;
 import org.onosproject.pce.pceservice.constraint.CapabilityConstraint;
 import org.onosproject.pce.pceservice.constraint.CostConstraint;
+import org.onosproject.pce.pceservice.constraint.PceBandwidthConstraint;
 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;
+import org.onosproject.pcep.api.TeLinkConfig;
 
 import java.util.Collections;
 import java.util.HashMap;
@@ -80,19 +70,18 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.ImmutableSet.of;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.Is.is;
 import static org.onlab.graph.GraphPathSearch.ALL_PATHS;
 import static org.onosproject.core.CoreService.CORE_PROVIDER_ID;
-import static com.google.common.collect.ImmutableSet.of;
-import static org.onosproject.net.resource.Resources.continuous;
-import static org.onosproject.net.Link.Type.DIRECT;
-import static org.onosproject.net.Link.State.ACTIVE;
 import static org.onosproject.net.DeviceId.deviceId;
+import static org.onosproject.net.Link.State.ACTIVE;
+import static org.onosproject.net.Link.Type.DIRECT;
 import static org.onosproject.net.topology.AdapterLinkWeigher.adapt;
 import static org.onosproject.pce.pceservice.constraint.CostConstraint.Type.COST;
 import static org.onosproject.pce.pceservice.constraint.CostConstraint.Type.TE_COST;
@@ -102,10 +91,10 @@
  */
 public class PathComputationTest {
 
-    private final MockPathResourceService resourceService = new MockPathResourceService();
     private final MockDeviceService deviceService = new MockDeviceService();
     private final MockNetConfigRegistryAdapter netConfigRegistry = new MockNetConfigRegistryAdapter();
     private PceManager pceManager = new PceManager();
+    private final MockBandwidthMgmtService bandwidthMgmtService = new MockBandwidthMgmtService();
     public static ProviderId providerId = new ProviderId("pce", "foo");
     public static final String DEVICE1 = "D001";
     public static final String DEVICE2 = "D002";
@@ -132,7 +121,6 @@
 
     @Before
     public void startUp() {
-        pceManager.resourceService = resourceService;
         pceManager.deviceService = deviceService;
         pceManager.netCfgService = netConfigRegistry;
     }
@@ -160,11 +148,6 @@
         ConnectPoint dst = new ConnectPoint(DeviceId.deviceId(device2), PortNumber.portNumber(port2));
         Link curLink;
         DefaultAnnotations.Builder annotationBuilder = DefaultAnnotations.builder();
-        if (setCost) {
-            annotationBuilder.set(ANNOTATION_COST, String.valueOf(value));
-        } else {
-            annotationBuilder.set(ANNOTATION_TE_COST, String.valueOf(value));
-        }
 
         //TODO:If cost not set cost : default value case
         curLink = DefaultLink.builder().src(src).dst(dst).state(ACTIVE).type(DIRECT)
@@ -174,7 +157,6 @@
 
     @After
     public void tearDown() {
-        pceManager.resourceService = null;
         pceManager.deviceService = null;
         pceManager.netCfgService = null;
     }
@@ -186,8 +168,8 @@
      * @param constraints path constraints
      * @return edge-weight function
      */
-    private LinkWeigher weight(List<Constraint> constraints) {
-        return adapt(new MockTeConstraintBasedLinkWeight(constraints));
+    private LinkWeight weight(List<Constraint> constraints) {
+        return new MockTeConstraintBasedLinkWeight(constraints);
     }
 
     private Set<Path> computePath(Link link1, Link link2, Link link3, Link link4, List<Constraint> constraints) {
@@ -198,7 +180,7 @@
                    new DefaultTopologyEdge(D3, D4, link4)));
 
         GraphPathSearch.Result<TopologyVertex, TopologyEdge> result =
-                graphSearch().search(graph, D1, D4, weight(constraints), ALL_PATHS);
+                graphSearch().search(graph, D1, D4, adapt(weight(constraints)), ALL_PATHS);
         ImmutableSet.Builder<Path> builder = ImmutableSet.builder();
         for (org.onlab.graph.Path<TopologyVertex, TopologyEdge> path : result.paths()) {
             builder.add(networkPath(path));
@@ -262,9 +244,19 @@
                 Constraint constraint = it.next();
                 if (constraint instanceof CapabilityConstraint) {
                     cost = ((CapabilityConstraint) constraint).isValidLink(edge.link(), deviceService,
-                                                                           netConfigRegistry) ? 1 : -1;
+                            netConfigRegistry) ? 1 : -1;
+                } else if (constraint instanceof PceBandwidthConstraint) {
+                    cost = ((PceBandwidthConstraint) constraint).isValidLink(edge.link(),
+                            bandwidthMgmtService) ? 1 : -1;
+
+                } else if (constraint instanceof SharedBandwidthConstraint) {
+                    cost = ((SharedBandwidthConstraint) constraint).isValidLink(edge.link(),
+                            bandwidthMgmtService) ? 1 : -1;
+
+                } else if (constraint instanceof CostConstraint) {
+                    cost = ((CostConstraint) constraint).isValidLink(edge.link(), netConfigRegistry);
                 } else {
-                    cost = constraint.cost(edge.link(), resourceService::isAvailable);
+                    cost = constraint.cost(edge.link(), null);
                 }
             }
             return cost;
@@ -279,85 +271,92 @@
         return new DefaultPath(CORE_PROVIDER_ID, links, path.cost());
     }
 
-    /**
-     * Tests Resource service for path computation.
-     */
-    public class MockPathResourceService extends ResourceServiceAdapter {
-        private final Map<Resource, ResourceConsumer> assignment = new HashMap<>();
-        private Map<ResourceId, List<ResourceAllocation>> resourcesAllocations = new HashMap<>();
+    public static class MockBandwidthMgmtService extends BandwidthMgmtServiceAdapter {
+        private Map<LinkKey, Double> teCost = new HashMap<>();
+        // Locally maintain unreserved bandwidth of each link.
+        private Map<LinkKey, Set<Double>> unResvBw = new HashMap<>();
+
+        // Mapping tunnel with link key with local reserved bandwidth
+        private Map<LinkKey, Double> localReservedBw = new HashMap<>();
 
         @Override
-        public Optional<ResourceAllocation> allocate(ResourceConsumer consumer, Resource resources) {
-            List<ResourceAllocation> allocations = allocate(consumer, ImmutableList.of(resources));
-            if (allocations.isEmpty()) {
-                return Optional.empty();
+        public boolean allocLocalReservedBw(LinkKey linkkey, Double bandwidth) {
+            Double allocatedBw = localReservedBw.get(linkkey);
+            if (allocatedBw != null) {
+                localReservedBw.put(linkkey, (allocatedBw + bandwidth));
+            } else {
+                localReservedBw.put(linkkey, bandwidth);
             }
 
-            assert allocations.size() == 1;
-            ResourceAllocation allocation = allocations.get(0);
-            assert allocation.resource().equals(resources);
-
-            // cast is ensured by the assertions above
-            return Optional.of(allocation);
+            return true;
         }
 
         @Override
-        public List<ResourceAllocation> allocate(ResourceConsumer consumer, List<? extends Resource> resources) {
-            for (Resource resource: resources) {
-                if (resource instanceof ContinuousResource) {
-                    List<ResourceAllocation> allocs = new LinkedList<>();
-                    allocs.add(new ResourceAllocation(resource, consumer));
-                    resourcesAllocations.put(resource.id(), allocs);
-                }
+        public boolean releaseLocalReservedBw(LinkKey linkkey, Double bandwidth) {
+            Double allocatedBw = localReservedBw.get(linkkey);
+            if (allocatedBw == null || allocatedBw < bandwidth) {
+                return false;
             }
-            return resources.stream()
-                    .map(x -> new ResourceAllocation(x, consumer))
-                    .collect(Collectors.toList());
+
+            Double releasedBw = allocatedBw - bandwidth;
+            if (releasedBw == 0.0) {
+                localReservedBw.remove(linkkey);
+            } else {
+                localReservedBw.put(linkkey, releasedBw);
+            }
+            return true;
         }
 
         @Override
-        public List<ResourceAllocation> getResourceAllocations(ResourceId id) {
-            if (id instanceof ContinuousResourceId) {
-                return resourcesAllocations.get(id);
-            }
-            DiscreteResource discrete = Resources.discrete((DiscreteResourceId) id).resource();
-            return Optional.ofNullable(assignment.get(discrete))
-                    .map(x -> ImmutableList.of(new ResourceAllocation(discrete, x)))
-                    .orElse(ImmutableList.of());
+        public Double getAllocatedLocalReservedBw(LinkKey linkkey) {
+            return localReservedBw.get(linkkey);
         }
 
         @Override
-        public <T> Set<Resource> getAvailableResources(DiscreteResourceId parent, Class<T> cls) {
-            return getAvailableResources(parent).stream()
-                    .filter(x -> x.isTypeOf(cls))
-                    .collect(Collectors.toSet());
+        public boolean addUnreservedBw(LinkKey linkkey, Set<Double> bandwidth) {
+            unResvBw.put(linkkey, bandwidth);
+            return true;
         }
 
         @Override
-        public <T> Set<T> getAvailableResourceValues(DiscreteResourceId parent, Class<T> cls) {
-            return getAvailableResources(parent).stream()
-                    .filter(x -> x.isTypeOf(cls))
-                    .flatMap(x -> Tools.stream(x.valueAs(cls)))
-                    .collect(Collectors.toSet());
+        public boolean removeUnreservedBw(LinkKey linkkey) {
+            unResvBw.remove(linkkey);
+            return true;
         }
 
         @Override
-        public boolean isAvailable(Resource resource) {
-            if (resource instanceof DiscreteResource) {
-                return true;
-            }
+        public Set<Double> getUnreservedBw(LinkKey linkkey) {
+            checkNotNull(linkkey);
+            return unResvBw.get(linkkey);
+        }
 
-            if (resource instanceof ContinuousResource) {
-                List<ResourceAllocation> resalloc = resourcesAllocations.get(resource.id());
+        @Override
+        public boolean isBandwidthAvailable(Link link, Double bandwidth) {
+            LinkKey linkKey = LinkKey.linkKey(link);
+            Double localAllocBw = getAllocatedLocalReservedBw(linkKey);
 
-                if ((resalloc != null) && (!resalloc.isEmpty())) {
-                    if (((ContinuousResource) resalloc.iterator().next().resource()).value()
-                            >= ((ContinuousResource) resource).value()) {
-                        return true;
-                    }
-                }
+            Set<Double> unResvBw = getUnreservedBw(linkKey);
+
+            Double prirZeroBw = unResvBw.iterator().next();
+            return (bandwidth <= prirZeroBw -  (localAllocBw != null ? localAllocBw : 0));
+        }
+
+        @Override
+        public Double getTeCost(LinkKey linkKey) {
+            if (teCost.get(linkKey) != null) {
+                return teCost.get(linkKey);
             }
-            return false;
+            return null;
+        }
+
+        @Override
+        public Double getAvailableBandwidth(LinkKey linkKey) {
+            if (unResvBw.get(linkKey) != null && localReservedBw.get(linkKey) != null) {
+
+                return unResvBw.get(linkKey).iterator().next().doubleValue()
+                        - localReservedBw.get(linkKey).doubleValue();
+            }
+            return unResvBw.get(linkKey).iterator().next().doubleValue();
         }
     }
 
@@ -365,6 +364,7 @@
     public static class MockNetConfigRegistryAdapter extends NetworkConfigRegistryAdapter {
         private ConfigFactory cfgFactory;
         private Map<DeviceId, DeviceCapability> classConfig = new HashMap<>();
+        private Map<LinkKey, TeLinkConfig> teLinkConfig = new HashMap<>();
 
         @Override
         public void registerConfigFactory(ConfigFactory configFactory) {
@@ -387,6 +387,15 @@
                 ConfigApplyDelegate delegate = new InternalApplyDelegate();
                 devCap.init((DeviceId) subject, null, node, mapper, delegate);
                 return (C) devCap;
+            } else if (configClass == TeLinkConfig.class) {
+                TeLinkConfig teConfig = new TeLinkConfig();
+                teLinkConfig.put((LinkKey) subject, teConfig);
+
+                JsonNode node = new ObjectNode(new MockJsonNode());
+                ObjectMapper mapper = new ObjectMapper();
+                ConfigApplyDelegate delegate = new InternalApplyDelegate();
+                teConfig.init((LinkKey) subject, null, node, mapper, delegate);
+                return (C) teConfig;
             }
 
             return null;
@@ -394,13 +403,19 @@
 
         @Override
         public <S, C extends Config<S>> void removeConfig(S subject, Class<C> configClass) {
-            classConfig.remove(subject);
+            if (configClass == DeviceCapability.class) {
+                classConfig.remove(subject);
+            } else if (configClass == TeLinkConfig.class) {
+                teLinkConfig.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);
+            } else if (configClass == TeLinkConfig.class) {
+                return (C) teLinkConfig.get(subject);
             }
             return null;
         }
@@ -432,6 +447,23 @@
         List<Constraint> constraints = new LinkedList<>();
         constraints.add(costConst);
 
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.igpCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.igpCost(20)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.igpCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.igpCost(50)
+                .apply();
+
         Set<Path> paths = computePath(link1, link2, link3, link4, constraints);
 
         List<Link> links = new LinkedList<>();
@@ -456,6 +488,24 @@
         CostConstraint costConst = CostConstraint.of(COST);
         List<Constraint> constraints = new LinkedList<>();
         constraints.add(costConst);
+
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.igpCost(100)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.igpCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.igpCost(1000)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.igpCost(100)
+                .apply();
+
         Set<Path> paths = computePath(link1, link2, link3, link4, constraints);
 
         List<Link> links = new LinkedList<>();
@@ -476,29 +526,24 @@
         Link link3 = addLink(DEVICE1, 80, DEVICE3, 70, true, 100);
         Link link4 = addLink(DEVICE3, 60, DEVICE4, 50, true, 50);
 
-        List<Resource> resources = new LinkedList<>();
+        Set<Double> unreserved = new HashSet<>();
+        unreserved.add(new Double(50));
 
-        resources.add(continuous(link1.src().deviceId(), link1.src().port(), Bandwidth.class)
-                .resource(50));
-        resources.add(continuous(link2.src().deviceId(), link2.src().port(), Bandwidth.class)
-                .resource(50));
-        resources.add(continuous(link3.src().deviceId(), link3.src().port(), Bandwidth.class)
-                .resource(100));
-        resources.add(continuous(link4.src().deviceId(), link4.src().port(), Bandwidth.class)
-                .resource(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link1), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link1), new Double(0));
 
-        resources.add(continuous(link1.dst().deviceId(), link1.dst().port(), Bandwidth.class)
-                .resource(50));
-        resources.add(continuous(link2.dst().deviceId(), link2.dst().port(), Bandwidth.class)
-                .resource(50));
-        resources.add(continuous(link3.dst().deviceId(), link3.src().port(), Bandwidth.class)
-                .resource(100));
-        resources.add(continuous(link4.dst().deviceId(), link4.dst().port(), Bandwidth.class)
-                .resource(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link2), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link2), new Double(0));
 
-        resourceService.allocate(IntentId.valueOf(70), resources);
+        unreserved.remove(new Double(50));
+        unreserved.add(new Double(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link3), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link3), new Double(0));
 
-        BandwidthConstraint bandwidthConst = new BandwidthConstraint(Bandwidth.bps(10.0));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link4), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link4), new Double(0));
+
+        PceBandwidthConstraint bandwidthConst = new PceBandwidthConstraint(Bandwidth.bps(10.0));
 
         List<Constraint> constraints = new LinkedList<>();
         constraints.add(bandwidthConst);
@@ -518,21 +563,24 @@
         Link link3 = addLink(DEVICE1, 80, DEVICE3, 70, true, 100);
         Link link4 = addLink(DEVICE3, 60, DEVICE4, 50, true, 100);
 
-        List<Resource> resources = new LinkedList<>();
+        Set<Double> unreserved = new HashSet<>();
+        unreserved.add(new Double(50));
 
-        resources.add(continuous(link1.src().deviceId(), link1.src().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link2.src().deviceId(), link2.src().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link3.src().deviceId(), link3.src().port(), Bandwidth.class).resource(100));
-        resources.add(continuous(link4.src().deviceId(), link4.src().port(), Bandwidth.class).resource(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link1), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link1), new Double(0));
 
-        resources.add(continuous(link1.dst().deviceId(), link1.dst().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link2.dst().deviceId(), link2.dst().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link3.dst().deviceId(), link3.dst().port(), Bandwidth.class).resource(100));
-        resources.add(continuous(link4.dst().deviceId(), link4.dst().port(), Bandwidth.class).resource(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link2), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link2), new Double(0));
 
-        resourceService.allocate(IntentId.valueOf(70), resources);
+        unreserved.remove(new Double(50));
+        unreserved.add(new Double(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link3), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link3), new Double(0));
 
-        BandwidthConstraint bandwidthConst = new BandwidthConstraint(Bandwidth.bps(60.0));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link4), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link4), new Double(0));
+
+        PceBandwidthConstraint bandwidthConst = new PceBandwidthConstraint(Bandwidth.bps(60.0));
 
         List<Constraint> constraints = new LinkedList<>();
         constraints.add(bandwidthConst);
@@ -551,18 +599,22 @@
         Link link3 = addLink(DEVICE1, 80, DEVICE3, 70, true, 100);
         Link link4 = addLink(DEVICE3, 60, DEVICE4, 50, true, 80);
 
-        List<Resource> resources = new LinkedList<>();
+        Set<Double> unreserved = new HashSet<>();
+        unreserved.add(new Double(50));
 
-        resources.add(continuous(link1.src().deviceId(), link1.src().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link2.src().deviceId(), link2.src().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link3.src().deviceId(), link3.src().port(), Bandwidth.class).resource(100));
-        resources.add(continuous(link4.src().deviceId(), link4.src().port(), Bandwidth.class).resource(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link1), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link1), new Double(0));
 
-        resources.add(continuous(link1.dst().deviceId(), link1.dst().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link2.dst().deviceId(), link2.dst().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link3.dst().deviceId(), link3.dst().port(), Bandwidth.class).resource(100));
-        resources.add(continuous(link4.dst().deviceId(), link4.dst().port(), Bandwidth.class).resource(100));
-        resourceService.allocate(IntentId.valueOf(70), resources);
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link2), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link2), new Double(0));
+
+        unreserved.remove(new Double(50));
+        unreserved.add(new Double(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link3), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link3), new Double(0));
+
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link4), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link4), new Double(0));
 
         List<Constraint> constraints = new LinkedList<>();
 
@@ -573,6 +625,25 @@
         links.add(link2);
 
         CostConstraint costConst = CostConstraint.of(COST);
+
+
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.igpCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.igpCost(20)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.igpCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.igpCost(50)
+                .apply();
+
         sharedLinks.addAll(links);
         SharedBandwidthConstraint sharedBw = new SharedBandwidthConstraint(sharedLinks, Bandwidth.bps(10),
                 Bandwidth.bps(20.0));
@@ -593,18 +664,22 @@
         Link link3 = addLink(DEVICE1, 80, DEVICE3, 70, true, 100);
         Link link4 = addLink(DEVICE3, 60, DEVICE4, 50, true, 80);
 
-        List<Resource> resources = new LinkedList<>();
+        Set<Double> unreserved = new HashSet<>();
+        unreserved.add(new Double(50));
 
-        resources.add(continuous(link1.src().deviceId(), link1.src().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link2.src().deviceId(), link2.src().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link3.src().deviceId(), link3.src().port(), Bandwidth.class).resource(100));
-        resources.add(continuous(link4.src().deviceId(), link4.src().port(), Bandwidth.class).resource(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link1), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link1), new Double(0));
 
-        resources.add(continuous(link1.dst().deviceId(), link1.dst().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link2.dst().deviceId(), link2.dst().port(), Bandwidth.class).resource(50));
-        resources.add(continuous(link3.dst().deviceId(), link3.dst().port(), Bandwidth.class).resource(100));
-        resources.add(continuous(link4.dst().deviceId(), link4.dst().port(), Bandwidth.class).resource(100));
-        resourceService.allocate(IntentId.valueOf(70), resources);
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link2), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link2), new Double(0));
+
+        unreserved.remove(new Double(50));
+        unreserved.add(new Double(100));
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link3), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link3), new Double(0));
+
+        bandwidthMgmtService.addUnreservedBw(LinkKey.linkKey(link4), unreserved);
+        bandwidthMgmtService.allocLocalReservedBw(LinkKey.linkKey(link4), new Double(0));
 
         List<Constraint> constraints = new LinkedList<>();
 
@@ -614,6 +689,25 @@
         links.add(link1);
         links.add(link2);
         CostConstraint costConst = CostConstraint.of(COST);
+
+
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.igpCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.igpCost(20)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.igpCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.igpCost(80)
+                .apply();
+
         sharedLinks.addAll(links);
         SharedBandwidthConstraint sharedBwConst = new SharedBandwidthConstraint(sharedLinks, Bandwidth.bps(20),
                 Bandwidth.bps(10.0));
@@ -654,6 +748,25 @@
 
         List<Constraint> constraints = new LinkedList<>();
         constraints.add(tecostConst);
+
+
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.teCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.teCost(20)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.teCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.teCost(80)
+                .apply();
+
         Set<Path> paths = computePath(link1, link2, link3, link4, constraints);
 
         List<Link> links = new LinkedList<>();
@@ -674,6 +787,25 @@
         Link link4 = addLink(DEVICE3, 60, DEVICE4, 50, false, 80);
 
         CostConstraint tecostConst = CostConstraint.of(TE_COST);
+
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.teCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.teCost(20)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.teCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.teCost(80)
+                .apply();
+
+
         CapabilityConstraint capabilityConst = CapabilityConstraint
                 .of(CapabilityConstraint.CapabilityType.WITH_SIGNALLING);
 
@@ -754,6 +886,23 @@
         constraints.add(capabilityConst);
         CostConstraint costConst = CostConstraint.of(COST);
         constraints.add(costConst);
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.igpCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.igpCost(20)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.igpCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.igpCost(80)
+                .apply();
+
         //Device1
         DefaultAnnotations.Builder builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
@@ -824,6 +973,23 @@
         constraints.add(capabilityConst);
         CostConstraint costConst = CostConstraint.of(COST);
         constraints.add(costConst);
+
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.igpCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.igpCost(20)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.igpCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.igpCost(80)
+                .apply();
         //Device1
         DefaultAnnotations.Builder builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
@@ -894,6 +1060,23 @@
 
         constraints.add(capabilityConst);
         constraints.add(tecostConst);
+
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.teCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.teCost(20)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.teCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.teCost(80)
+                .apply();
         //Device1
         DefaultAnnotations.Builder builder = DefaultAnnotations.builder();
         builder.set(AnnotationKeys.TYPE, L3);
@@ -1061,6 +1244,28 @@
 
         List<Constraint> constraints = new LinkedList<>();
         constraints.add(costConst);
+
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.igpCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.igpCost(100)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.igpCost(10)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.igpCost(10)
+                .apply();
+
+        TeLinkConfig teLinkConfig5 = netConfigRegistry.addConfig(LinkKey.linkKey(link5), TeLinkConfig.class);
+        teLinkConfig5.igpCost(20)
+                .apply();
+
         Graph<TopologyVertex, TopologyEdge> graph = new AdjacencyListsGraph<>(of(D1, D2, D3, D4, D5),
                 of(new DefaultTopologyEdge(D1, D2, link1),
                    new DefaultTopologyEdge(D2, D4, link2),
@@ -1069,7 +1274,7 @@
                    new DefaultTopologyEdge(D4, D5, link5)));
 
         GraphPathSearch.Result<TopologyVertex, TopologyEdge> result =
-                graphSearch().search(graph, D1, D5, weight(constraints), ALL_PATHS);
+                graphSearch().search(graph, D1, D5, adapt(weight(constraints)), ALL_PATHS);
         ImmutableSet.Builder<Path> builder = ImmutableSet.builder();
         for (org.onlab.graph.Path<TopologyVertex, TopologyEdge> path : result.paths()) {
             builder.add(networkPath(path));
@@ -1154,6 +1359,24 @@
         CapabilityConstraint capabilityConst = CapabilityConstraint
                 .of(CapabilityConstraint.CapabilityType.WITHOUT_SIGNALLING_AND_WITHOUT_SR);
         CostConstraint costConst = CostConstraint.of(COST);
+
+        TeLinkConfig teLinkConfig = netConfigRegistry.addConfig(LinkKey.linkKey(link1), TeLinkConfig.class);
+        teLinkConfig.igpCost(50)
+                .apply();
+
+
+        TeLinkConfig teLinkConfig2 = netConfigRegistry.addConfig(LinkKey.linkKey(link2), TeLinkConfig.class);
+        teLinkConfig2.igpCost(20)
+                .apply();
+
+        TeLinkConfig teLinkConfig3 = netConfigRegistry.addConfig(LinkKey.linkKey(link3), TeLinkConfig.class);
+        teLinkConfig3.igpCost(10)
+                .apply();
+
+        TeLinkConfig teLinkConfig4 = netConfigRegistry.addConfig(LinkKey.linkKey(link4), TeLinkConfig.class);
+        teLinkConfig4.igpCost(10)
+                .apply();
+
         List<Constraint> constraints = new LinkedList<>();
         constraints.add(capabilityConst);
         constraints.add(costConst);
@@ -1199,4 +1422,4 @@
         UNKNOWN, UNKNOWN, UNKNOWN,
         UNKNOWN, new ChassisId(), builder.build()));
     }
-}
+}
\ No newline at end of file
