Generic Tunnel Subsystem (ONOS-1276) and L1/L0 (OTN/ROADM)extensions (ONOS-676):
1)Initial Work for ONOS-676: OTN/ROADM (L1/L0 NE) support in ONOS by extending the device/port modeling;
  - extending device type to include L1 OTN NEs;
  - extending port type to include ODUCLT port(T-port), OCH-port(L-port), OMS-port (WDM-port);
  - more standard annotations related to OTN/ROADMs support will come from PCEP provider as well as TL1 providers;
2)Intial Work for ONOS-1276: generic Tunnel subsystem in ONOS for both packet (L3/L2) networks and optical (L1/L0) networks
  - supporting PCEP framework, which is capable of interacting with the PCEP provider;
  - supporting any other kind of tunnel provider;
  - each Tunnel is associated with at least two Labels (abstracted logical entity/Id for virtualization of physical port);
  - same type of Tunnels can be formed as a reachablity graph for other services and NB applications use;

Change-Id: I29af495f90e179e2c5d8753b76e02889a3b4355b
diff --git a/core/api/src/main/java/org/onosproject/net/Device.java b/core/api/src/main/java/org/onosproject/net/Device.java
index 6327dca..ddfa6af 100644
--- a/core/api/src/main/java/org/onosproject/net/Device.java
+++ b/core/api/src/main/java/org/onosproject/net/Device.java
@@ -26,7 +26,7 @@
      * Coarse classification of the type of the infrastructure device.
      */
     public enum Type {
-        SWITCH, ROUTER, ROADM, FIREWALL, BALANCER, IPS, IDS, CONTROLLER, OTHER
+        SWITCH, ROUTER, ROADM, OTN, FIREWALL, BALANCER, IPS, IDS, CONTROLLER, OTHER
     }
 
     /**
@@ -34,6 +34,7 @@
      *
      * @return device id
      */
+    @Override
     DeviceId id();
 
     /**
diff --git a/core/api/src/main/java/org/onosproject/net/Link.java b/core/api/src/main/java/org/onosproject/net/Link.java
index 1593e75..e7bb96f 100644
--- a/core/api/src/main/java/org/onosproject/net/Link.java
+++ b/core/api/src/main/java/org/onosproject/net/Link.java
@@ -44,12 +44,12 @@
 
         /**
          * Signifies that this link represents a logical link backed by
-         * some form of a tunnel.
+         * some form of a tunnel, e.g., GRE, MPLS, ODUk, OCH.
          */
         TUNNEL,
 
         /**
-         * Signifies that this link is realized by optical connection.
+         * Signifies that this link is realized by fiber (either single channel or WDM).
          */
         OPTICAL
     }
diff --git a/core/api/src/main/java/org/onosproject/net/Port.java b/core/api/src/main/java/org/onosproject/net/Port.java
index d1e83fa..dd51448 100644
--- a/core/api/src/main/java/org/onosproject/net/Port.java
+++ b/core/api/src/main/java/org/onosproject/net/Port.java
@@ -31,7 +31,30 @@
         /**
          * Signifies optical fiber-based connectivity.
          */
-        FIBER
+        FIBER,
+
+        /**
+         * Signifies optical fiber-based packet port.
+         */
+        PACKET,
+
+        /**
+         * Signifies optical fiber-based optical tributary port (called T-port).
+         * The signal from the client side will be formed into a ITU G.709 (OTN) frame.
+         */
+        ODUCLT,
+
+        /**
+         * Signifies optical fiber-based Line-side port (called L-port).
+         */
+        OCH,
+
+        /**
+         * Signifies optical fiber-based WDM port (called W-port).
+         * Optical Multiplexing Section (See ITU G.709).
+         */
+        OMS
+
     }
 
     /**
diff --git a/core/api/src/main/java/org/onosproject/net/Tunnel.java b/core/api/src/main/java/org/onosproject/net/Tunnel.java
deleted file mode 100644
index c3a2cee..0000000
--- a/core/api/src/main/java/org/onosproject/net/Tunnel.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2014 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.net;
-
-/**
- * Abstraction of a generalized network tunnel.
- */
-public interface Tunnel extends Link {
-
-    /**
-     * Tunnel technology type.
-     */
-    enum Type {
-        MPLS, VLAN, VXLAN, GRE, OPTICAL
-    }
-
-    /**
-     * Network resource backing the tunnel, e.g. lambda, VLAN id, MPLS tag.
-     *
-     * @return backing resource
-     */
-    NetworkResource resource();
-
-}
diff --git a/core/api/src/main/java/org/onosproject/net/tunnel/DefaultLabel.java b/core/api/src/main/java/org/onosproject/net/tunnel/DefaultLabel.java
new file mode 100644
index 0000000..99f8e9b
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/tunnel/DefaultLabel.java
@@ -0,0 +1,113 @@
+package org.onosproject.net.tunnel;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Objects;
+import java.util.Optional;
+
+import org.onosproject.net.AbstractModel;
+import org.onosproject.net.Annotations;
+import org.onosproject.net.ElementId;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.provider.ProviderId;
+
+/**
+ * Default label model implementation.
+ */
+public class DefaultLabel extends AbstractModel implements Label {
+    private final Optional<ElementId> elementId;
+    private final Optional<PortNumber> portNumber;
+    private final Optional<Label> parentLabel;
+    private final Type type;
+    private final LabelId id;
+    private final boolean isGlobal;
+
+    /**
+     * Creates a label attributed to the specified provider (may be null).
+     * if provider is null, which means the label is not managed by the SB.
+     *
+     * @param elementId     parent network element
+     * @param number      port number
+     * @param parentLabel parent port or parent label
+     * @param type        port type
+     * @param id          LabelId
+     * @param isGlobal    indicator whether the label is global significant or not
+     * @param annotations optional key/value annotations
+     */
+    public DefaultLabel(ProviderId providerId, Optional<ElementId> elementId,
+                        Optional<PortNumber> number, Optional<Label> parentLabel,
+                        Type type, LabelId id, boolean isGlobal, Annotations... annotations) {
+        super(providerId, annotations);
+        this.elementId = elementId;
+        this.portNumber = number;
+        this.parentLabel = parentLabel;
+        this.id = id;
+        this.type = type;
+        this.isGlobal = isGlobal;
+    }
+
+    @Override
+    public LabelId id() {
+        return id;
+    }
+
+    @Override
+    public Optional<ElementId> elementId() {
+        return elementId;
+    }
+
+    @Override
+    public Optional<PortNumber> portNumber() {
+        return portNumber;
+    }
+
+    @Override
+    public Optional<Label> parentLabel() {
+        return parentLabel;
+    }
+
+    @Override
+    public boolean isGlobal() {
+        return isGlobal;
+    }
+
+    @Override
+    public Type type() {
+        return type;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(elementId, portNumber, parentLabel, id);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultLabel) {
+            final DefaultLabel other = (DefaultLabel) obj;
+            return Objects.equals(this.id, other.id) &&
+                   Objects.equals(this.type, other.type) &&
+                   Objects.equals(this.isGlobal, other.isGlobal) &&
+                   Objects.equals(this.elementId, other.elementId) &&
+                   Objects.equals(this.portNumber, other.portNumber) &&
+                   Objects.equals(this.parentLabel, other.parentLabel);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("elementId", elementId)
+                .add("portNumber", portNumber)
+                .add("parentLabel", parentLabel)
+                .add("type", type)
+                .add("id", id)
+                .add("isGlobal", isGlobal)
+                .toString();
+    }
+
+}
diff --git a/core/api/src/main/java/org/onosproject/net/tunnel/DefaultTunnel.java b/core/api/src/main/java/org/onosproject/net/tunnel/DefaultTunnel.java
new file mode 100644
index 0000000..c21a516
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/tunnel/DefaultTunnel.java
@@ -0,0 +1,168 @@
+package org.onosproject.net.tunnel;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkState;
+
+import java.util.Objects;
+
+import org.onosproject.core.IdGenerator;
+import org.onosproject.net.AbstractModel;
+import org.onosproject.net.Annotations;
+import org.onosproject.net.provider.ProviderId;
+import org.onosproject.net.resource.Bandwidth;
+
+/**
+ * Default tunnel model implementation.
+ */
+public final class DefaultTunnel extends AbstractModel implements Tunnel {
+    private final TunnelId  id;
+    private final Label src;
+    private final Label dst;
+    private final Type type;
+    private final State state;
+    private final boolean isDurable;
+    private final boolean isBidirectional;
+    private final Bandwidth bandwidth;
+
+    /**
+     * Constructs an tunnel using the builder pattern.
+     *
+     * @param providerId  provider identity, can be null if comes from the NB
+     * @param builder     tunnelBuilder
+     * @param annotations optional key/value annotations
+     * @return
+     */
+    private DefaultTunnel(ProviderId providerId, TunnelBuilder builder, Annotations... annotations) {
+        super(providerId, annotations);
+        this.id = builder.id;
+        this.src = builder.src;
+        this.dst = builder.dst;
+        this.type = builder.type;
+        this.state = builder.state;
+        this.isDurable = builder.isDurable;
+        this.isBidirectional = builder.isBidirectional;
+        this.bandwidth = builder.bandwidth;
+    }
+
+    @Override
+    public TunnelId id() {
+        return id;
+    }
+
+    @Override
+    public Label src() {
+        return src;
+    }
+
+    @Override
+    public Label dst() {
+        return dst;
+    }
+
+    @Override
+    public Type type() {
+        return type;
+    }
+
+    @Override
+    public State state() {
+        return state;
+    }
+
+    @Override
+    public boolean isDurable() {
+        return isDurable;
+    }
+
+    @Override
+    public boolean isBidirectional() {
+        return isBidirectional;
+    }
+
+    @Override
+    public Bandwidth bandwidth() {
+        return bandwidth;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id);
+    }
+
+    /**
+     * {@inheritDoc}
+     * Note that only TunnelId is considered on equality check.
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof DefaultTunnel) {
+            final DefaultTunnel other = (DefaultTunnel) obj;
+            return Objects.equals(this.id, other.id);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("tunnelId", id)
+                .add("src", src)
+                .add("dst", dst)
+                .add("type", type)
+                .add("state", state)
+                .add("durable", isDurable)
+                .add("isBidirectional", isBidirectional)
+                .add("bandwidth", bandwidth)
+                .toString();
+    }
+
+    public static class TunnelBuilder {
+        private TunnelId id = null;
+        private Label src = null;
+        private Label dst = null;
+        private Type type = null;
+        private State state = null;
+        private boolean isDurable = false;
+        private boolean isBidirectional = false;
+        private Bandwidth bandwidth = null;
+
+        private static IdGenerator idGenerator;
+
+        public TunnelBuilder labelSrcDst(Label src, Label dst) {
+            this.src = src;
+            this.dst = dst;
+            return this;
+        }
+
+        public TunnelBuilder state(State state) {
+            this.state = state;
+            return this;
+        }
+
+        public TunnelBuilder isDurable(boolean isDurable) {
+            this.isDurable = isDurable;
+            return this;
+        }
+
+        public TunnelBuilder isBidirectional(boolean isBidirectional) {
+            this.isBidirectional = isBidirectional;
+            return this;
+        }
+
+        public TunnelBuilder bandwidth(Bandwidth bandwidth) {
+            this.bandwidth = bandwidth;
+            return this;
+        }
+
+        public DefaultTunnel build(ProviderId providerId, Annotations... annotations) {
+            checkState(idGenerator != null, "Id generator is not bound.");
+            this.id = TunnelId.valueOf(idGenerator.getNewId());
+            return new DefaultTunnel(providerId, this, annotations);
+        }
+
+    }
+
+}
diff --git a/core/api/src/main/java/org/onosproject/net/tunnel/DefaultTunnelDescription.java b/core/api/src/main/java/org/onosproject/net/tunnel/DefaultTunnelDescription.java
new file mode 100644
index 0000000..432f4c6
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/tunnel/DefaultTunnelDescription.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2015 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.net.tunnel;
+
+import com.google.common.base.MoreObjects;
+
+import org.onosproject.net.AbstractDescription;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.SparseAnnotations;
+
+/**
+ * Default implementation of immutable tunnel description entity.
+ */
+public class DefaultTunnelDescription extends AbstractDescription
+        implements TunnelDescription {
+
+    private final TunnelId  tunnelId;
+    private final ConnectPoint src;
+    private final ConnectPoint dst;
+    private final Tunnel.Type type;
+    private final boolean isBidirectional;
+
+    /**
+     * Creates a tunnel description using the supplied information.
+     *
+     * @param id          TunnelId
+     * @param src         ConnectPoint source
+     * @param dst         ConnectPoint destination
+     * @param type        tunnel type
+     * @param isBidirectional        boolean
+     * @param annotations optional key/value annotations
+     */
+    public DefaultTunnelDescription(TunnelId id, ConnectPoint src, ConnectPoint dst,
+                                  Tunnel.Type type, boolean isBidirectional,
+                                  SparseAnnotations... annotations) {
+        super(annotations);
+        this.tunnelId = id;
+        this.src = src;
+        this.dst = dst;
+        this.type = type;
+        this.isBidirectional = isBidirectional;
+    }
+
+    @Override
+    public TunnelId id() {
+        return tunnelId;
+    }
+
+    @Override
+    public ConnectPoint src() {
+        return src;
+    }
+
+    @Override
+    public ConnectPoint dst() {
+        return dst;
+    }
+
+    @Override
+    public Tunnel.Type type() {
+        return type;
+    }
+
+    @Override
+    public boolean isBidirectional() {
+        return isBidirectional;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("tunnelId", id())
+                .add("src", src())
+                .add("dst", dst())
+                .add("type", type())
+                .add("isBidirectional", isBidirectional())
+                .toString();
+    }
+
+}
diff --git a/core/api/src/main/java/org/onosproject/net/tunnel/Label.java b/core/api/src/main/java/org/onosproject/net/tunnel/Label.java
new file mode 100644
index 0000000..fc55b13
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/tunnel/Label.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2015 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.net.tunnel;
+
+import java.util.Optional;
+
+import org.onosproject.net.Annotated;
+import org.onosproject.net.ElementId;
+import org.onosproject.net.NetworkResource;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.Provided;
+
+/**
+ * Generic representation of a logical port entity in a consistent way,
+ * it is used to identify e.g., VLAN#, MPLS label#, ODUk timeSlot, WDM lambda, etc.
+ * It supports nested case.
+ */
+public interface Label extends Annotated, Provided, NetworkResource {
+
+    /** Represents coarse Label type classification. */
+    public enum Type {
+        /**
+         * Signifies VLAN-based tag.
+         */
+        VLAN,
+
+        /**
+         * Signifies LAG-based label.
+         */
+        LAG,
+
+        /**
+         * Signifies MPLS-based label.
+         */
+        MPLS,
+
+        /**
+         * Signifies IP-based label.
+         */
+        IP,
+
+        /**
+         * Signifies optical data unit-based label.
+         */
+        TIMESLOT,
+
+        /**
+         * Signifies optical wavelength-based label.
+         */
+        LAMBDA,
+
+        /**
+         * Signifies device-based identifier for the label.
+         */
+        DEVICE
+    }
+
+    /**
+     * Returns the identifier to this Label.
+     *
+     * @return identifier
+     */
+    LabelId id();
+
+    /**
+     * Returns the parent network element to which this label belongs.
+     *
+     * @return parent network element
+     */
+    Optional<ElementId> elementId();
+
+    /**
+     * Returns the parent network port to which this label belongs, can not be be null.
+     *
+     * @return port number
+     */
+    Optional<PortNumber> portNumber();
+
+    /**
+     * Returns the parent label to which this label belongs, optional.
+     *
+     * @return parent label, if it is null, the parent is a physical port
+     */
+    Optional<Label> parentLabel();
+
+    /**
+     * Indicates whether or not the port is global significant.
+     *
+     * @return true if the port is global significant
+     */
+    boolean isGlobal();
+
+    /**
+     * Returns the label type.
+     *
+     * @return label type
+     */
+    Type type();
+}
\ No newline at end of file
diff --git a/core/api/src/main/java/org/onosproject/net/tunnel/LabelId.java b/core/api/src/main/java/org/onosproject/net/tunnel/LabelId.java
new file mode 100644
index 0000000..0d59211
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/tunnel/LabelId.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2015 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.net.tunnel;
+
+import java.util.Objects;
+import com.google.common.primitives.UnsignedLongs;
+
+/**
+ * Representation of a label Id, a logical port identifier.
+ */
+public final class LabelId {
+        /**
+         * Represents a logical Id.
+        */
+        private final long labelId;
+
+        /**
+         * Constructor, public creation is prohibited.
+         */
+        private LabelId(long id) {
+            this.labelId = id;
+        }
+
+        /**
+         * Returns the LabelId representing the specified long value.
+         *
+         * @param id identifier as long value
+         * @return LabelId
+         */
+        public static LabelId labelId(long id) {
+            return new LabelId(id);
+        }
+
+        public static LabelId labelId(String string) {
+            return new LabelId(UnsignedLongs.decode(string));
+        }
+
+        public long toLong() {
+            return labelId;
+        }
+
+        @Override
+        public String toString() {
+            return UnsignedLongs.toString(labelId);
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(labelId);
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj instanceof LabelId) {
+                final LabelId other = (LabelId) obj;
+                return this.labelId == other.labelId;
+            }
+            return false;
+        }
+
+}
diff --git a/core/api/src/main/java/org/onosproject/net/tunnel/Tunnel.java b/core/api/src/main/java/org/onosproject/net/tunnel/Tunnel.java
new file mode 100644
index 0000000..18ae5be
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/tunnel/Tunnel.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2015 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.net.tunnel;
+
+import org.onosproject.net.Annotated;
+import org.onosproject.net.NetworkResource;
+import org.onosproject.net.Provided;
+import org.onosproject.net.resource.Bandwidth;
+
+
+/**
+ * Abstraction of a generalized Tunnel entity (bandwidth pipe) for either L3/L2 networks or L1/L0 networks,
+ * representation of e.g., VLAN, GRE tunnel, MPLS LSP, L1 ODUk connection, WDM OCH, etc.. Each Tunnel is
+ * associated with at least two Label objects that model the logical ports essentially.
+ * Note that it supports nested case.
+ */
+
+public interface Tunnel extends Annotated, Provided, NetworkResource {
+
+    /**
+     * Coarse representation of the Tunnel types.
+     */
+    public enum Type {
+        /**
+         * Signifies that this is a L2 tunnel.
+         */
+        VLAN,
+
+        /**
+         * Signifies that this is a DC L2 extension tunnel.
+         */
+        VXLAN,
+
+        /**
+         * Signifies that this is a L3 tunnel.
+         */
+        GRE,
+
+        /**
+         * Signifies that this is a MPLS tunnel.
+         */
+        LSP,
+
+        /**
+         * Signifies that this is a L1 OTN tunnel.
+         */
+        ODUk,
+
+        /**
+         * Signifies that this is a L0 OCH tunnel.
+         */
+        OCH
+    }
+
+    /**
+     * Representation of the tunnel state.
+     *
+     */
+    public enum State {
+
+        /**
+         * Signifies that a tunnel is currently in a initialized state.
+         */
+        INIT,
+
+        /**
+         * Signifies that a tunnel is currently established but no traffic.
+         */
+        ESTABLISHED,
+
+        /**
+         * Signifies that a tunnel is currently serving the traffic.
+         */
+        ACTIVE,
+
+        /**
+         * Signifies that a tunnel is currently out of service.
+         */
+        FAILED,
+
+        /**
+         * Signifies that a tunnel is currently in maintenance state.
+         */
+        INACTIVE
+
+    }
+
+    TunnelId id();
+
+
+    /**
+     * Returns the tunnel source point (source Label object).
+     *
+     * @return source Label object
+     */
+    Label src();
+
+    /**
+     * Returns the tunnel destination point (destination Label object).
+     *
+     * @return destination Label object
+     */
+    Label dst();
+
+    /**
+     * Returns the tunnel type.
+     *
+     * @return tunnel type
+     */
+    Type type();
+
+    /**
+     * Returns the tunnel state.
+     *
+     * @return tunnel state
+     */
+    State state();
+
+    /**
+     * Indicates if the tunnel is to be considered durable.
+     *
+     * @return true if the tunnel is durable
+     */
+    boolean isDurable();
+
+
+    /**
+     * Indicates if the tunnel is to be considered Bidirectional.
+     *
+     * @return true if the tunnel is Bidirectional
+     */
+    boolean isBidirectional();
+
+    /**
+     * Return the tunnel bandwidth.
+     *
+     * @return tunnel bandwidth
+     */
+    Bandwidth bandwidth();
+}
+
+
+
+
+
diff --git a/core/api/src/main/java/org/onosproject/net/tunnel/TunnelAdminService.java b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelAdminService.java
new file mode 100644
index 0000000..3731e5a
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelAdminService.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2015 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.net.tunnel;
+
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Path;
+
+/**
+ * Service for administering the inventory of provisioned tunnels.
+ */
+public interface TunnelAdminService {
+
+    /**
+     * Removes the provisioned tunnel.
+     *
+     * @param tunnelId tunnel ID
+     */
+    void removeTunnel(TunnelId tunnelId);
+
+    /**
+     * Removes the provisioned tunnel leading to and from the
+     * specified labels.
+     *
+     * @param src source label
+     * @param dst destination label
+     */
+    void removeTunnels(Label src, Label dst);
+
+    /**
+     * Removes all provisioned tunnels leading to and from the
+     * specified connection point.
+     *
+     * @param src source connection point
+     * @param dst destination connection point
+     */
+    void removeTunnels(ConnectPoint src, ConnectPoint dst);
+
+    /**
+     * Removes all provisioned tunnels leading to and from the
+     * specified connection point.
+     *
+     * @param src source connection point
+     * @param dst destination connection point
+     * @param type tunnel type
+     */
+    void removeTunnels(ConnectPoint src, ConnectPoint dst, Tunnel.Type type);
+
+    /**
+     * Removes all provisioned tunnels leading to and from the
+     * specified connection point.
+     *
+     * @param connectPoint connection point
+     */
+    void removeTunnels(ConnectPoint connectPoint);
+
+    /**
+     * Removes all provisioned tunnels leading to and from the
+     * specified device.
+     *
+     * @param deviceId device identifier
+     */
+    void removeTunnels(DeviceId deviceId);
+
+    /**
+     * Invokes the core to update a tunnel based on specified tunnel parameters.
+     *
+     * @param tunnel Tunnel
+     * @param path explicit route (path changed) or null (path not changed) for the tunnel
+     */
+    void updateTunnel(Tunnel tunnel, Path path);
+
+}
diff --git a/core/api/src/main/java/org/onosproject/net/tunnel/TunnelDescription.java b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelDescription.java
new file mode 100644
index 0000000..f77928e
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelDescription.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2015 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.net.tunnel;
+
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.Description;
+
+/**
+ * Describes the tunnel.
+ */
+public interface TunnelDescription extends Description {
+
+    /**
+     * Returns the tunnel id.
+     *
+     * @return tunnelId
+     */
+    TunnelId id();
+
+    /**
+     * Returns the connection point source.
+     *
+     * @return tunnel source ConnectionPoint
+     */
+    ConnectPoint src();
+
+    /**
+     * Returns the connection point destination.
+     *
+     * @return tunnel destination
+     */
+    ConnectPoint dst();
+
+    /**
+     * Returns the tunnel type.
+     *
+     * @return tunnel type
+     */
+    Tunnel.Type type();
+
+    /**
+     * Returns if the tunnel is bidirectional.
+     *
+     * @return true if bidirectional, otherwise false
+     */
+    boolean isBidirectional();
+
+}
diff --git a/core/api/src/main/java/org/onosproject/net/tunnel/TunnelEvent.java b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelEvent.java
new file mode 100644
index 0000000..41b36a4
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelEvent.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2015 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.net.tunnel;
+
+import org.onosproject.event.AbstractEvent;
+
+/**
+ * Describes tunnel events.
+ */
+public class TunnelEvent extends AbstractEvent<TunnelEvent.Type, Tunnel> {
+
+    /**
+     * Type of tunnel events.
+     */
+    public enum Type {
+        /**
+         * Signifies that a new tunnel has been added.
+         */
+        TUNNEL_ADDED,
+
+        /**
+         * Signifies that a tunnel has been updated or changed state.
+         */
+        TUNNEL_UPDATED,
+
+        /**
+         * Signifies that a tunnel has been removed.
+         */
+        TUNNEL_REMOVED
+    }
+
+    /**
+     * Creates an event of a given type and for the specified tunnel.
+     *
+     * @param type tunnel event type
+     * @param tunnel event tunnel subject
+     */
+    public TunnelEvent(Type type, Tunnel tunnel) {
+        super(type, tunnel);
+    }
+
+    /**
+     * Creates an event of a given type and for the specified link and
+     * the current time.
+     *
+     * @param type tunnel event type
+     * @param tunnel event tunnel subject
+     * @param time occurrence time
+     */
+    public TunnelEvent(Type type, Tunnel tunnel, long time) {
+        super(type, tunnel, time);
+    }
+
+}
diff --git a/core/api/src/main/java/org/onosproject/net/tunnel/TunnelId.java b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelId.java
new file mode 100644
index 0000000..50e56f7
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelId.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2015 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.net.tunnel;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+/**
+ * Representation of a Tunnel Id.
+ */
+public final class TunnelId {
+    private final long value;
+
+    /**
+     * Creates an tunnel identifier from the specified tunnel.
+     *
+     * @param value long value
+     * @return tunnel identifier
+     */
+    public static TunnelId valueOf(long value) {
+        return new TunnelId(value);
+    }
+
+    public static TunnelId valueOf(String value) {
+        checkArgument(value.startsWith("0x"));
+         return new TunnelId(Long.parseLong(value.substring("0x".length()), 16));
+    }
+
+    /**
+     * Constructor for serializer.
+     */
+    TunnelId() {
+        this.value = 0;
+    }
+
+    /**
+     * Constructs the ID corresponding to a given long value.
+     *
+     * @param value the underlying value of this ID
+     */
+    TunnelId(long value) {
+        this.value = value;
+    }
+
+    /**
+     * Returns the backing value.
+     *
+     * @return the value
+     */
+    public long id() {
+        return value;
+    }
+
+    @Override
+    public int hashCode() {
+        return (int) (value ^ (value >>> 32));
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == this) {
+            return true;
+        }
+        if (!(obj instanceof TunnelId)) {
+            return false;
+        }
+        TunnelId that = (TunnelId) obj;
+        return this.value == that.value;
+    }
+
+    @Override
+    public String toString() {
+        return "0x" + Long.toHexString(value);
+    }
+
+}
diff --git a/core/api/src/main/java/org/onosproject/net/tunnel/TunnelListener.java b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelListener.java
new file mode 100644
index 0000000..654cf7d
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelListener.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2015 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.net.tunnel;
+
+import org.onosproject.event.EventListener;
+
+/**
+ * Entity capable of receiving tunnel related events.
+ */
+public interface TunnelListener extends EventListener<TunnelEvent> {
+}
diff --git a/core/api/src/main/java/org/onosproject/net/tunnel/TunnelProvider.java b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelProvider.java
new file mode 100644
index 0000000..ea90342
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelProvider.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2015 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.net.tunnel;
+
+import org.onosproject.net.ElementId;
+import org.onosproject.net.Path;
+import org.onosproject.net.provider.Provider;
+
+/**
+ * Abstraction of an entity providing tunnel setup/release services to the core.
+ */
+public interface TunnelProvider extends Provider {
+
+    /**
+     * Instructs the provider to setup a tunnel.
+     *
+     * @param tunnel Tunnel
+     * @param path explicit route or null for the tunnel
+     */
+    void setupTunnel(Tunnel tunnel, Path path);
+
+    /**
+     * Instructs the provider to setup a tunnel given the respective device.
+     *
+     * @param srcElement device
+     * @param tunnel Tunnel
+     * @param path explicit route (not null) for the tunnel
+     */
+    void setupTunnel(ElementId srcElement, Tunnel tunnel, Path path);
+
+    /**
+     * Instructs the provider to release a tunnel.
+     *
+     * @param tunnel Tunnel
+     */
+    void releaseTunnel(Tunnel tunnel);
+
+    /**
+     * Instructs the provider to release a tunnel given the respective device.
+     *
+     * @param srcElement device
+     * @param tunnel Tunnel
+     */
+    void releaseTunnel(ElementId srcElement, Tunnel tunnel);
+
+    /**
+     * Instructs the provider to update a tunnel.
+     *
+     * @param tunnel Tunnel
+     * @param path explicit route (path changed) or null (path not changed) for the tunnel
+     */
+    void updateTunnel(Tunnel tunnel, Path path);
+
+    /**
+     * Instructs the provider to update a tunnel given the respective device.
+     *
+     * @param srcElement device
+     * @param tunnel Tunnel
+     * @param path explicit route (path changed) or null (path not changed) for the tunnel
+     */
+    void updateTunnel(ElementId srcElement, Tunnel tunnel, Path path);
+
+}
diff --git a/core/api/src/main/java/org/onosproject/net/tunnel/TunnelProviderRegistry.java b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelProviderRegistry.java
new file mode 100644
index 0000000..d6a3148
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelProviderRegistry.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2015 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.net.tunnel;
+
+import org.onosproject.net.provider.ProviderRegistry;
+
+/**
+ * Abstraction of an tunnel provider registry.
+ */
+public interface TunnelProviderRegistry
+        extends ProviderRegistry<TunnelProvider, TunnelProviderService> {
+}
diff --git a/core/api/src/main/java/org/onosproject/net/tunnel/TunnelProviderService.java b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelProviderService.java
new file mode 100644
index 0000000..4842098
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelProviderService.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2015 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.net.tunnel;
+
+import org.onosproject.net.provider.ProviderService;
+
+/**
+ * APIs for tunnel provider to notify the tunnel subSystem.
+ */
+public interface TunnelProviderService extends ProviderService<TunnelProvider> {
+
+    /**
+     * Signals that the provider has added a tunnel.
+     *
+     * @param tunnel tunnel information
+     */
+    void tunnelAdded(TunnelDescription tunnel);
+
+    /**
+     * Signals that the provider has removed a tunnel.
+     *
+     * @param tunnel tunnel information
+     */
+    void tunnelRemoved(TunnelDescription tunnel);
+
+    /**
+     * Signals that the a tunnel was changed (e.g., sensing changes of tunnel).
+     *
+     * @param tunnel tunnel information
+     */
+    void tunnelUpdated(TunnelDescription tunnel);
+
+}
diff --git a/core/api/src/main/java/org/onosproject/net/tunnel/TunnelService.java b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelService.java
new file mode 100644
index 0000000..2127a7b
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelService.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2015 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.net.tunnel;
+
+import java.util.Collection;
+
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.Path;
+import org.onosproject.net.resource.Bandwidth;
+
+/**
+ * Service for interacting with the tunnel inventory.
+ */
+public interface TunnelService {
+
+    /**
+     * Invokes the core to create a tunnel based on specified parameters.
+     *
+     * @param src sourcePoint
+     * @param dst destinationPoint
+     * @param bw  bandwidth
+     * @param path explicit path or null
+     */
+    void requestTunnel(ConnectPoint src, ConnectPoint dst, Bandwidth bw, Path path);
+
+    /**
+     * Invokes the core to create a tunnel based on specified parameters with a tunnel type.
+     *
+     * @param src sourcePoint
+     * @param dst destinationPoint
+     * @param type  tunnelType
+     * @param bw  bandwidth
+     * @param path explicit path or null
+     */
+    void requestTunnel(ConnectPoint src, ConnectPoint dst, Tunnel.Type type, Bandwidth bw, Path path);
+
+    /**
+     * Returns the count of all known tunnels in the dataStore.
+     *
+     * @return number of tunnels
+     */
+    int getTunnelCount();
+
+    /**
+     * Returns a collection of all known tunnel based on the type.
+     *
+     * @return all tunnels for a specific type
+     */
+    Collection<Tunnel> getTunnels(Tunnel.Type type);
+
+    /**
+     * Returns set of all tunnels from the
+     * specified connectpoint.
+     *
+     * @return set of tunnels
+     */
+    Collection<Tunnel> getTunnels(ConnectPoint connectPoint, Tunnel.Type type);
+
+    /**
+     * Returns set of all tunnels from the
+     * specified source connectpoint and destination connectpoint.
+     *
+     * @param src sourcePoint
+     * @param dst destinationPoint
+     * @param type tunnel type
+     * @return set of tunnels
+     */
+    Collection<Tunnel> getTunnels(ConnectPoint src, ConnectPoint dst, Tunnel.Type type);
+
+    /**
+     * Returns the tunnel between the specified source
+     * and destination connection points.
+     *
+     * @param src source label
+     * @param dst destination label
+     * @return tunnel from source to destination; null if none found
+     */
+    Tunnel getTunnel(Label src, Label dst);
+
+    /**
+     * Returns the tunnel based on the Id.
+     *
+     * @param id tunnelId
+     * @return tunnel with specified Id
+     */
+    Tunnel getTunnel(TunnelId id);
+
+    /**
+     * Adds the specified tunnel listener.
+     *
+     * @param listener tunnel listener
+     */
+    void addListener(TunnelListener listener);
+
+    /**
+     * Removes the specified tunnel listener.
+     *
+     * @param listener tunnel listener
+     */
+    void removeListener(TunnelListener listener);
+
+}
diff --git a/core/api/src/main/java/org/onosproject/net/tunnel/TunnelStore.java b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelStore.java
new file mode 100644
index 0000000..c09e7f1
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelStore.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2015 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.net.tunnel;
+
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.provider.ProviderId;
+import org.onosproject.store.Store;
+
+/**
+ * Manages inventory of tunnels.
+ */
+public interface TunnelStore extends Store<TunnelEvent, TunnelStoreDelegate> {
+
+    /**
+     * Returns the number of tunnels in the store.
+     *
+     * @return number of tunnels
+     */
+    int getTunnelCount();
+
+    /**
+     * Returns an iterable collection of all tunnel in the inventory.
+     *
+     * @return collection of all tunnels
+     */
+    Iterable<Tunnel> getTunnels();
+
+    /**
+     * Returns all tunnels egressing from the specified device.
+     *
+     * @param deviceId device identifier
+     * @return set of device tunnels
+     */
+    Iterable<Tunnel> getDeviceEgressTunnels(DeviceId deviceId);
+
+    /**
+     * Returns all tunnels ingressing from the specified device.
+     *
+     * @param deviceId device identifier
+     * @return set of device tunnels
+     */
+    Iterable<Tunnel> getDeviceIngressTunnels(DeviceId deviceId);
+
+    /**
+     * Returns the tunnel between the two end-points and the tunnel type.
+     *
+     * @param src source connection point
+     * @param dst destination connection point
+     * @param type tunnel type
+     * @return tunnels or null if one not found between the end-points
+     */
+    Iterable<Tunnel> getTunnel(ConnectPoint src, ConnectPoint dst, Tunnel.Type type);
+
+    /**
+     * Returns all tunnels egressing from the specified connection point.
+     *
+     * @param src source connection point
+     * @return set of connection point tunnels
+     */
+    Iterable<Tunnel> getEgressTunnels(ConnectPoint src);
+
+    /**
+     * Returns all tunnels ingressing to the specified connection point.
+     *
+     * @param dst destination connection point
+     * @return set of connection point tunnels
+     */
+    Iterable<Tunnel> getIngressTunnels(ConnectPoint dst);
+
+    /**
+     * Creates a new tunnel based on the given information.
+     *
+     * @param providerId    provider identity (e.g., PCEP provider)
+     * @param tunnel tunnel information
+     * @return create tunnel event
+     */
+    public TunnelEvent addTunnel(ProviderId providerId,
+                                        Tunnel tunnel);
+
+    /**
+     * Updates a new tunnel based on the given information.
+     *
+     * @param providerId      provider identity (e.g., PCEP provider)
+     * @param tunnel tunnel
+     * @return update tunnel event
+     */
+    public TunnelEvent updateTunnel(ProviderId providerId,
+                                        Tunnel tunnel);
+
+    /**
+     * Removes a new tunnel based on the given information.
+     *
+     * @param providerId      provider identity (e.g., PCEP provider)
+     * @param tunnel tunnel
+     * @return remove tunnel event
+     */
+    TunnelEvent removeTunnel(ProviderId providerId,
+                             Tunnel tunnel);
+
+}
diff --git a/core/api/src/main/java/org/onosproject/net/tunnel/TunnelStoreDelegate.java b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelStoreDelegate.java
new file mode 100644
index 0000000..177e7f0
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/tunnel/TunnelStoreDelegate.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2015 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.net.tunnel;
+
+import org.onosproject.store.StoreDelegate;
+
+/**
+ * Tunnel store delegate abstraction.
+ */
+public interface TunnelStoreDelegate extends StoreDelegate<TunnelEvent> {
+}
diff --git a/core/api/src/main/java/org/onosproject/net/tunnel/package-info.java b/core/api/src/main/java/org/onosproject/net/tunnel/package-info.java
new file mode 100644
index 0000000..41580d3
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/tunnel/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2015 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.
+ */
+
+/**
+ * Tunnel model related services and providers API definitions.
+ */
+package org.onosproject.net.tunnel;
diff --git a/core/net/src/main/java/org/onosproject/net/tunnel/impl/TunnelManager.java b/core/net/src/main/java/org/onosproject/net/tunnel/impl/TunnelManager.java
new file mode 100644
index 0000000..a769add
--- /dev/null
+++ b/core/net/src/main/java/org/onosproject/net/tunnel/impl/TunnelManager.java
@@ -0,0 +1,281 @@
+/*
+ * Copyright 2015 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.net.tunnel.impl;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.util.Collection;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+
+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.core.CoreService;
+import org.onosproject.event.AbstractListenerRegistry;
+import org.onosproject.event.EventDeliveryService;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Path;
+import org.onosproject.net.link.LinkEvent;
+import org.onosproject.net.link.LinkListener;
+import org.onosproject.net.provider.AbstractProviderRegistry;
+import org.onosproject.net.provider.AbstractProviderService;
+import org.onosproject.net.provider.ProviderId;
+import org.onosproject.net.resource.Bandwidth;
+import org.onosproject.net.tunnel.Label;
+import org.onosproject.net.tunnel.Tunnel;
+import org.onosproject.net.tunnel.TunnelAdminService;
+import org.onosproject.net.tunnel.TunnelDescription;
+import org.onosproject.net.tunnel.TunnelEvent;
+import org.onosproject.net.tunnel.TunnelId;
+import org.onosproject.net.tunnel.TunnelListener;
+import org.onosproject.net.tunnel.TunnelProvider;
+import org.onosproject.net.tunnel.TunnelProviderRegistry;
+import org.onosproject.net.tunnel.TunnelProviderService;
+import org.onosproject.net.tunnel.TunnelService;
+import org.onosproject.net.tunnel.TunnelStore;
+import org.onosproject.net.tunnel.TunnelStoreDelegate;
+import org.onosproject.net.tunnel.Tunnel.Type;
+import org.slf4j.Logger;
+
+/**
+ * Provides implementation of the tunnel NB/SB APIs.
+ */
+@Component(immediate = true, enabled = true)
+@Service
+public class TunnelManager extends AbstractProviderRegistry<TunnelProvider, TunnelProviderService>
+        implements TunnelService, TunnelAdminService, TunnelProviderRegistry {
+
+    private static final String TUNNNEL_ID_NULL = "Tunnel ID cannot be null";
+
+    private final Logger log = getLogger(getClass());
+
+    protected final AbstractListenerRegistry<TunnelEvent, TunnelListener>
+            listenerRegistry = new AbstractListenerRegistry<>();
+
+    private final TunnelStoreDelegate delegate = new InternalStoreDelegate();
+    private final InternalTunnelListener tunnelListener = new InternalTunnelListener();
+    private InternalLinkListener linkListener = new InternalLinkListener();
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected TunnelStore store;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected EventDeliveryService eventDispatcher;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CoreService coreService;
+
+    private ExecutorService futureService;
+
+    @Activate
+    public void activate() {
+        // TODO Auto-generated method stub
+        log.info("Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        // TODO Auto-generated method stub
+        log.info("Stopped");
+    }
+
+    @Override
+    protected TunnelProviderService createProviderService(TunnelProvider provider) {
+        // TODO Auto-generated method stub
+        return new InternalTunnelProviderService(provider);
+    }
+
+    @Override
+    public TunnelProviderService register(TunnelProvider provider) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public void unregister(TunnelProvider provider) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public Set<ProviderId> getProviders() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+    @Override
+    public void removeTunnels(Label src, Label dst) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void removeTunnels(ConnectPoint connectPoint) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void removeTunnels(DeviceId deviceId) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public int getTunnelCount() {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    @Override
+    public Collection<Tunnel> getTunnels(Type type) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Set<Tunnel> getTunnels(ConnectPoint connectPoint, Type type) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Tunnel getTunnel(Label src, Label dst) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Tunnel getTunnel(TunnelId id) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public void addListener(TunnelListener listener) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void removeListener(TunnelListener listener) {
+        // TODO Auto-generated method stub
+
+    }
+
+    private class InternalTunnelListener implements TunnelListener {
+        @Override
+        public void event(TunnelEvent event) {
+            // TODO Auto-generated method stub
+
+        }
+    }
+
+    private class InternalLinkListener implements LinkListener {
+        @Override
+        public void event(LinkEvent event) {
+            // TODO Auto-generated method stub
+
+        }
+    }
+
+    private class InternalTunnelProviderService
+            extends AbstractProviderService<TunnelProvider>
+            implements TunnelProviderService {
+        protected InternalTunnelProviderService(TunnelProvider provider) {
+            super(provider);
+            // TODO Auto-generated constructor stub
+        }
+
+        @Override
+        public void tunnelAdded(TunnelDescription tunnel) {
+            // TODO Auto-generated method stub
+
+        }
+
+        @Override
+        public void tunnelUpdated(TunnelDescription tunnel) {
+            // TODO Auto-generated method stub
+
+        }
+
+        @Override
+        public void tunnelRemoved(TunnelDescription tunnel) {
+            // TODO Auto-generated method stub
+
+        }
+
+    }
+
+    private class InternalStoreDelegate implements TunnelStoreDelegate {
+        @Override
+        public void notify(TunnelEvent event) {
+            // TODO Auto-generated method stub
+            if (event != null) {
+                eventDispatcher.post(event);
+            }
+        }
+    }
+
+    @Override
+    public void requestTunnel(ConnectPoint src, ConnectPoint dst,
+                                Bandwidth bw, Path path) {
+        // TODO Auto-generated method stub
+    }
+
+
+    @Override
+    public void requestTunnel(ConnectPoint src, ConnectPoint dst, Type type,
+                              Bandwidth bw, Path path) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void removeTunnel(TunnelId tunnelId) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void removeTunnels(ConnectPoint src, ConnectPoint dst) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void removeTunnels(ConnectPoint src, ConnectPoint dst, Type type) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void updateTunnel(Tunnel tunnel, Path path) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public Collection<Tunnel> getTunnels(ConnectPoint src, ConnectPoint dst,
+                                       Type type) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+}
diff --git a/core/net/src/main/java/org/onosproject/net/tunnel/impl/package-info.java b/core/net/src/main/java/org/onosproject/net/tunnel/impl/package-info.java
new file mode 100644
index 0000000..ccadddb
--- /dev/null
+++ b/core/net/src/main/java/org/onosproject/net/tunnel/impl/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2015 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.
+ */
+
+/**
+ * Core subsystem for tracking global inventory of tunnels.
+ */
+package org.onosproject.net.tunnel.impl;