diff --git a/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/BandwidthManager.java b/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/BandwidthManager.java
new file mode 100644
index 0000000..e8fc1c7
--- /dev/null
+++ b/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/BandwidthManager.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.bandwidthmgr;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onosproject.net.Link;
+import org.onosproject.net.LinkKey;
+import org.onosproject.bandwidthmgr.api.BandwidthMgmtService;
+import org.onosproject.bandwidthmgr.api.BandwidthMgmtStore;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Implementation of PCE service.
+ */
+@Component(immediate = true)
+@Service
+public class BandwidthManager implements BandwidthMgmtService {
+    private static final Logger log = LoggerFactory.getLogger(BandwidthManager.class);
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected BandwidthMgmtStore store;
+
+    @Activate
+    protected void activate() {
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        log.info("Stopped");
+    }
+
+    @Override
+    public Double getTeCost(LinkKey linkKey) {
+        checkNotNull(linkKey);
+        return store.getTeCost(linkKey);
+    }
+
+    @Override
+    public Double getAvailableBandwidth(LinkKey linkKey) {
+        checkNotNull(linkKey);
+        Set<Double> unResvBw = getUnreservedBw(linkKey);
+        Double localReservedBw = getAllocatedLocalReservedBw(linkKey);
+        if (unResvBw != null && localReservedBw != null) {
+
+            return unResvBw.iterator().next().doubleValue()
+                    - localReservedBw.doubleValue();
+        }
+        return unResvBw.iterator().next().doubleValue();
+    }
+
+    @Override
+    public boolean allocLocalReservedBw(LinkKey linkKey, Double bandwidth) {
+        checkNotNull(linkKey);
+        checkNotNull(bandwidth);
+        return store.allocLocalReservedBw(linkKey, bandwidth);
+    }
+
+    @Override
+    public boolean releaseLocalReservedBw(LinkKey linkkey, Double bandwidth) {
+        checkNotNull(linkkey);
+        checkNotNull(bandwidth);
+        return store.releaseLocalReservedBw(linkkey, bandwidth);
+    }
+
+    @Override
+    public Double getAllocatedLocalReservedBw(LinkKey linkkey) {
+        checkNotNull(linkkey);
+        return store.getAllocatedLocalReservedBw(linkkey);
+    }
+
+    @Override
+    public boolean addUnreservedBw(LinkKey linkKey, Set<Double> bandwidth) {
+        checkNotNull(linkKey);
+        checkNotNull(bandwidth);
+        return store.addUnreservedBw(linkKey, bandwidth);
+    }
+
+    @Override
+    public boolean removeUnreservedBw(LinkKey linkkey) {
+        checkNotNull(linkkey);
+        return store.removeUnreservedBw(linkkey);
+    }
+
+    @Override
+    public Set<Double> getUnreservedBw(LinkKey linkkey) {
+        checkNotNull(linkkey);
+        return store.getUnreservedBw(linkkey);
+    }
+
+    @Override
+    public boolean isBandwidthAvailable(Link link, Double bandwidth) {
+        checkNotNull(link);
+        checkNotNull(bandwidth);
+
+        LinkKey linkKey = LinkKey.linkKey(link);
+        Double localAllocBw = getAllocatedLocalReservedBw(linkKey);
+
+        Set<Double> unResvBw = getUnreservedBw(linkKey);
+        Double prirZeroBw = unResvBw.iterator().next();
+
+        return (bandwidth <= prirZeroBw -  (localAllocBw != null ? localAllocBw : 0));
+    }
+}
\ No newline at end of file
diff --git a/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/DistributedBandwidthMgmtStore.java b/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/DistributedBandwidthMgmtStore.java
new file mode 100644
index 0000000..3568942
--- /dev/null
+++ b/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/DistributedBandwidthMgmtStore.java
@@ -0,0 +1,216 @@
+/*
+ * 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.
+ */
+package org.onosproject.bandwidthmgr;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_ADDED;
+import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_REMOVED;
+import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_UPDATED;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+
+import org.onlab.util.KryoNamespace;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.LinkKey;
+import org.onosproject.net.config.NetworkConfigEvent;
+import org.onosproject.net.config.NetworkConfigListener;
+import org.onosproject.net.config.NetworkConfigService;
+import org.onosproject.bandwidthmgr.api.BandwidthMgmtStore;
+import org.onosproject.pcep.api.TeLinkConfig;
+import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.ConsistentMap;
+import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.StorageService;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Manages the pool of available labels to devices, links and tunnels.
+ */
+@Component(immediate = true)
+@Service
+public class DistributedBandwidthMgmtStore implements BandwidthMgmtStore {
+    private static final Logger log = LoggerFactory.getLogger(BandwidthManager.class);
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetworkConfigService netCfgService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected StorageService storageService;
+
+    private InternalConfigListener cfgListener = new InternalConfigListener();
+
+    private ConsistentMap<LinkKey, Double> teCost;
+    // Locally maintain unreserved bandwidth of each link.
+    private ConsistentMap<LinkKey, Set<Double>> unResvBw;
+
+    // Mapping tunnel with link key with local reserved bandwidth
+    private ConsistentMap<LinkKey, Double> localReservedBw;
+
+    private static final Serializer SERIALIZER = Serializer
+            .using(new KryoNamespace.Builder().register(KryoNamespaces.API)
+                    .register(KryoNamespaces.API)
+                    .register(LinkKey.class)
+                    .register(ConnectPoint.class)
+                    .build());
+
+    @Activate
+    protected void activate() {
+        netCfgService.addListener(cfgListener);
+
+        localReservedBw = storageService.<LinkKey, Double>consistentMapBuilder()
+                .withName("local-reserved-bandwith")
+                .withSerializer(SERIALIZER)
+                .build();
+
+        unResvBw = storageService.<LinkKey, Set<Double>>consistentMapBuilder()
+                .withName("onos-unreserved-bandwidth")
+                .withSerializer(SERIALIZER)
+                .build();
+
+        teCost = storageService.<LinkKey, Double>consistentMapBuilder()
+                .withName("onos-tecost")
+                .withSerializer(SERIALIZER)
+                .build();
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        netCfgService.removeListener(cfgListener);
+        log.info("Stopped");
+    }
+
+    @Override
+    public Double getTeCost(LinkKey linkKey) {
+        if (teCost.get(linkKey) != null) {
+            return teCost.get(linkKey).value();
+        }
+        return null;
+    }
+
+    @Override
+    public boolean allocLocalReservedBw(LinkKey linkkey, Double bandwidth) {
+        Double allocatedBw = null;
+
+        if (localReservedBw.get(linkkey) != null) {
+            allocatedBw = localReservedBw.get(linkkey).value();
+        }
+        if (allocatedBw != null) {
+            localReservedBw.put(linkkey, (allocatedBw + bandwidth));
+        } else {
+            localReservedBw.put(linkkey, bandwidth);
+        }
+
+        return true;
+    }
+
+    @Override
+    public boolean releaseLocalReservedBw(LinkKey linkkey, Double bandwidth) {
+
+        Double allocatedBw = null;
+        if (localReservedBw.get(linkkey) != null) {
+            allocatedBw = localReservedBw.get(linkkey).value();
+        }
+
+        if (allocatedBw == null || allocatedBw < bandwidth) {
+            return false;
+        }
+
+        Double releasedBw = allocatedBw - bandwidth;
+        if (releasedBw == 0.0) {
+            localReservedBw.remove(linkkey);
+        } else {
+            localReservedBw.put(linkkey, releasedBw);
+        }
+        return true;
+    }
+
+    @Override
+    public Double getAllocatedLocalReservedBw(LinkKey linkkey) {
+        return localReservedBw.get(linkkey) != null ? localReservedBw.get(linkkey).value() : null;
+    }
+
+    @Override
+    public boolean addUnreservedBw(LinkKey linkkey, Set<Double> bandwidth) {
+        unResvBw.put(linkkey, bandwidth);
+        return true;
+    }
+
+    @Override
+    public boolean removeUnreservedBw(LinkKey linkkey) {
+        unResvBw.remove(linkkey);
+        return true;
+    }
+
+    @Override
+    public Set<Double> getUnreservedBw(LinkKey linkkey) {
+        checkNotNull(linkkey);
+        return unResvBw.get(linkkey) != null ? unResvBw.get(linkkey).value() : null;
+    }
+
+    private class InternalConfigListener implements NetworkConfigListener {
+
+        @Override
+        public void event(NetworkConfigEvent event) {
+
+            if (event.configClass().equals(TeLinkConfig.class)) {
+                if ((event.type() != CONFIG_ADDED) &&  (event.type() != CONFIG_UPDATED)
+                        && (event.type() != CONFIG_REMOVED)) {
+                    return;
+                }
+                LinkKey linkKey = (LinkKey) event.subject();
+                switch (event.type()) {
+                    case  CONFIG_ADDED:
+                    case  CONFIG_UPDATED:
+
+                        TeLinkConfig cfg = netCfgService.getConfig(linkKey, TeLinkConfig.class);
+                        if (cfg == null) {
+                            log.error("Unable to get the configuration of the link.");
+                            return;
+                        }
+                        Set<Double> unresvBw = new LinkedHashSet<>();
+                        unresvBw.add(cfg.unResvBandwidth());
+                        addUnreservedBw(linkKey, unresvBw);
+
+                        if (cfg.teCost() != 0) {
+                            teCost.put(linkKey, (double) cfg.teCost());
+                        }
+
+                        break;
+                    case CONFIG_REMOVED:
+                        removeUnreservedBw(linkKey);
+                        localReservedBw.remove(linkKey);
+                        teCost.remove(linkKey);
+
+                        break;
+                    default:
+                        break;
+                }
+            }
+        }
+    }
+
+}
diff --git a/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/api/BandwidthMgmtService.java b/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/api/BandwidthMgmtService.java
new file mode 100644
index 0000000..35271bd
--- /dev/null
+++ b/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/api/BandwidthMgmtService.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.bandwidthmgr.api;
+
+import org.onosproject.net.Link;
+import org.onosproject.net.LinkKey;
+
+import java.util.Set;
+
+public interface BandwidthMgmtService {
+
+
+    /**
+     * Allocate local bandwidth(non rsvp-te) to linkKey mapping.
+     *
+     * @param linkkey link key of the link
+     * @param bandwidth requested local bandwidth
+     * @return success or failure
+     */
+    boolean allocLocalReservedBw(LinkKey linkkey, Double bandwidth);
+
+
+    /**
+     * Release local bandwidth(non rsvp-te) to linkKey mapping.
+     *
+     * @param linkkey link key of the link
+     * @param bandwidth releasing local bandwidth
+     * @return success or failure
+     */
+     boolean releaseLocalReservedBw(LinkKey linkkey, Double bandwidth);
+
+    /**
+     * Get local allocated bandwidth of the link.
+     *
+     * @param linkkey link key of the link
+     * @return allocated bandwidth
+     */
+     Double getAllocatedLocalReservedBw(LinkKey linkkey);
+
+    /**
+     * Add unreserved bandwidth to linkKey mapping.
+     *
+     * @param linkkey link key of the link
+     * @param bandwidth set of unreserved bandwidth
+     * @return success or failure
+     */
+     boolean addUnreservedBw(LinkKey linkkey, Set<Double> bandwidth);
+
+    /**
+     * Remove unreserved bandwidth to linkKey mapping.
+     *
+     * @param linkkey link key of the link
+     * @return success or failure
+     */
+     boolean removeUnreservedBw(LinkKey linkkey);
+
+    /**
+     * Get list of unreserved Bandwidth of the link.
+     *
+     * @param linkkey link key of the link
+     * @return Set of unreserved bandwidth
+     */
+     Set<Double> getUnreservedBw(LinkKey linkkey);
+
+    /**
+     * Returns if the link has the available bandwidth or not.
+     *
+     * @param link link
+     * @param bandwidth required bandwidth
+     * @return true if bandwidth is available else false
+     */
+    boolean isBandwidthAvailable(Link link, Double bandwidth);
+
+    /**
+     * Returns Te cost for the specified link key.
+     *
+     * @param linkKey connect point of source and destination of the link
+     * @return Te cost for the linkKey
+     */
+    Double getTeCost(LinkKey linkKey);
+
+    /**
+     * Returns available bandwidth for the linkKey.
+     *
+     * @param linkKey connect point of source and destination of the link
+     * @return available bandwidth for the linkKey
+     */
+    Double getAvailableBandwidth(LinkKey linkKey);
+}
diff --git a/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/api/BandwidthMgmtStore.java b/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/api/BandwidthMgmtStore.java
new file mode 100644
index 0000000..c9aae0e
--- /dev/null
+++ b/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/api/BandwidthMgmtStore.java
@@ -0,0 +1,86 @@
+/*
+ * 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.
+ */
+package org.onosproject.bandwidthmgr.api;
+
+import org.onosproject.net.LinkKey;
+
+import java.util.Set;
+
+/**
+ * Abstraction of an entity providing pool of available labels to devices, links and tunnels.
+ */
+public interface BandwidthMgmtStore {
+
+    /**
+     * Allocate local bandwidth(non rsvp-te) to linkKey mapping.
+     *
+     * @param linkkey link key of the link
+     * @param bandwidth requested local bandwidth
+     * @return success or failure
+     */
+    boolean allocLocalReservedBw(LinkKey linkkey, Double bandwidth);
+
+
+    /**
+     * Release local bandwidth(non rsvp-te) to linkKey mapping.
+     *
+     * @param linkkey link key of the link
+     * @param bandwidth releasing local bandwidth
+     * @return success or failure
+     */
+    boolean releaseLocalReservedBw(LinkKey linkkey, Double bandwidth);
+
+    /**
+     * Get local allocated bandwidth of the link.
+     *
+     * @param linkkey link key of the link
+     * @return allocated bandwidth
+     */
+    Double getAllocatedLocalReservedBw(LinkKey linkkey);
+
+    /**
+     * Add unreserved bandwidth to linkKey mapping.
+     *
+     * @param linkkey link key of the link
+     * @param bandwidth set of unreserved bandwidth
+     * @return success or failure
+     */
+    boolean addUnreservedBw(LinkKey linkkey, Set<Double> bandwidth);
+
+    /**
+     * Remove unreserved bandwidth to linkKey mapping.
+     *
+     * @param linkkey link key of the link
+     * @return success or failure
+     */
+    boolean removeUnreservedBw(LinkKey linkkey);
+
+    /**
+     * Get list of unreserved Bandwidth of the link.
+     *
+     * @param linkkey link key of the link
+     * @return Set of unreserved bandwidth
+     */
+    Set<Double> getUnreservedBw(LinkKey linkkey);
+
+    /**
+     * Returns Te cost for the specified link key.
+     *
+     * @param linkKey connect point of source and destination of the link
+     * @return Te cost for the linkKey
+     */
+    Double getTeCost(LinkKey linkKey);
+}
diff --git a/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/api/package-info.java b/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/api/package-info.java
new file mode 100644
index 0000000..686aecc
--- /dev/null
+++ b/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/api/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Bandwidth management service.
+ */
+package org.onosproject.bandwidthmgr.api;
diff --git a/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/package-info.java b/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/package-info.java
new file mode 100644
index 0000000..91336fc
--- /dev/null
+++ b/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * PCE Bandwidth management service implementation.
+ */
+package org.onosproject.bandwidthmgr;
\ No newline at end of file
