diff --git a/apps/tunnel/api/src/main/java/org/onosproject/incubator/net/resource/label/LabelResourcePool.java b/apps/tunnel/api/src/main/java/org/onosproject/incubator/net/resource/label/LabelResourcePool.java
new file mode 100644
index 0000000..d34bb97
--- /dev/null
+++ b/apps/tunnel/api/src/main/java/org/onosproject/incubator/net/resource/label/LabelResourcePool.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.incubator.net.resource.label;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import java.util.Collections;
+import java.util.Objects;
+import java.util.Set;
+
+import com.google.common.annotations.Beta;
+import org.onosproject.net.DeviceId;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Abstraction of the capacity of device label resource or global label
+ * resource. It's contiguous range of label resource. When a application apply
+ * some labels of some device, first catch from Set that store
+ * available labels, if the size of the Set less than the apply number, then get
+ * labels by calculating with three attributes, beginLabel,endLabel and
+ * currentUsedMaxLabelId.
+ */
+@Beta
+public class LabelResourcePool {
+
+    private final DeviceId deviceId;
+    private final LabelResourceId beginLabel;
+    private final LabelResourceId endLabel;
+    private final long totalNum; // capacity of label resource pool
+    private final long usedNum; // have used label number
+    private final LabelResourceId currentUsedMaxLabelId; // the maximal label
+                                                        // number id
+    private ImmutableSet<LabelResource> releaseLabelId; // Set of released label
+
+    /**
+     * Creates a pool by device id,begin label id,end label id.
+     *
+     * @param deviceId device identifier
+     * @param beginLabel represents for the first label id in the range of label
+     *            resource pool
+     * @param endLabel represents for the last label id in the range of label
+     *            resource pool
+     */
+    public LabelResourcePool(String deviceId, long beginLabel, long endLabel) {
+        this(deviceId, beginLabel, endLabel, endLabel - beginLabel + 1, 0L,
+             beginLabel, ImmutableSet.copyOf(Collections.emptySet()));
+    }
+
+    /**
+     * Creates a pool by device id,begin label id,end label id.
+     * Used to update a pool in the store.
+     *
+     * @param deviceId device identifier
+     * @param beginLabel represents for the first label id in the range of label
+     *            resource pool
+     * @param endLabel represents for the last label id in the range of label
+     *            resource pool
+     * @param totalNum capacity of label resource pool
+     * @param usedNum have used label number
+     * @param currentUsedMaxLabelId the maximal label number id
+     * @param releaseLabelId Set of released label
+     */
+    public LabelResourcePool(String deviceId, long beginLabel, long endLabel,
+                             long totalNum, long usedNum,
+                             long currentUsedMaxLabelId,
+                             ImmutableSet<LabelResource> releaseLabelId) {
+        checkArgument(endLabel >= beginLabel,
+                      "endLabel %s must be greater than or equal to beginLabel %s",
+                      endLabel, beginLabel);
+        this.deviceId = DeviceId.deviceId(deviceId);
+        this.beginLabel = LabelResourceId.labelResourceId(beginLabel);
+        this.endLabel = LabelResourceId.labelResourceId(endLabel);
+        this.totalNum = totalNum;
+        this.usedNum = usedNum;
+        this.currentUsedMaxLabelId = LabelResourceId
+                .labelResourceId(currentUsedMaxLabelId);
+        this.releaseLabelId = releaseLabelId;
+    }
+
+    /**
+     * Returns a device id.
+     *
+     * @return DeviceId
+     */
+    public DeviceId deviceId() {
+        return deviceId;
+    }
+
+    /**
+     * Returns a begin Label id.
+     *
+     * @return begin Label id
+     */
+    public LabelResourceId beginLabel() {
+        return beginLabel;
+    }
+
+    /**
+     * Returns an end Label id.
+     *
+     * @return end Label id
+     */
+    public LabelResourceId endLabel() {
+        return endLabel;
+    }
+
+    /**
+     * Returns a begin Label id.
+     *
+     * @return current Used Maximal Label Id
+     */
+    public LabelResourceId currentUsedMaxLabelId() {
+        return currentUsedMaxLabelId;
+    }
+
+    /**
+     * Returns total number.
+     *
+     * @return the total label number
+     */
+    public long totalNum() {
+        return totalNum;
+    }
+
+    /**
+     * Returns used number.
+     *
+     * @return the used label number
+     */
+    public long usedNum() {
+        return usedNum;
+    }
+
+    /**
+     * Returns the Set of released label before.
+     *
+     * @return the Set of LabelResource
+     */
+    public Set<LabelResource> releaseLabelId() {
+        return releaseLabelId;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(this.deviceId, this.beginLabel, this.endLabel,
+                            this.totalNum, this.usedNum,
+                            this.currentUsedMaxLabelId, this.releaseLabelId);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof LabelResourcePool) {
+            LabelResourcePool that = (LabelResourcePool) obj;
+            return Objects.equals(this.deviceId, that.deviceId)
+                    && Objects.equals(this.beginLabel, that.beginLabel)
+                    && Objects.equals(this.endLabel, that.endLabel)
+                    && Objects.equals(this.totalNum, that.totalNum)
+                    && Objects.equals(this.usedNum, that.usedNum)
+                    && Objects.equals(this.currentUsedMaxLabelId,
+                                      that.currentUsedMaxLabelId)
+                    && Objects.equals(this.releaseLabelId, that.releaseLabelId);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        // TODO Auto-generated method stub
+        return MoreObjects.toStringHelper(this).add("deviceId", this.deviceId)
+                .add("beginLabel", this.beginLabel)
+                .add("endLabel", this.endLabel).add("totalNum", this.totalNum)
+                .add("usedNum", this.usedNum)
+                .add("currentUsedMaxLabelId", this.currentUsedMaxLabelId)
+                .add("releaseLabelId", this.releaseLabelId).toString();
+    }
+}
