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;
