diff --git a/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/DefaultTunnelProvider.java b/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/DefaultTunnelProvider.java
new file mode 100644
index 0000000..1a7a9b9
--- /dev/null
+++ b/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/DefaultTunnelProvider.java
@@ -0,0 +1,133 @@
+/*
+ * 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.provider.tunnel;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+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.cfg.ComponentConfigService;
+import org.onosproject.net.ElementId;
+import org.onosproject.net.Path;
+import org.onosproject.net.provider.AbstractProvider;
+import org.onosproject.net.provider.ProviderId;
+import org.onosproject.net.tunnel.Tunnel;
+import org.onosproject.net.tunnel.TunnelDescription;
+import org.onosproject.net.tunnel.TunnelId;
+import org.onosproject.net.tunnel.TunnelProvider;
+import org.onosproject.net.tunnel.TunnelProviderRegistry;
+import org.onosproject.net.tunnel.TunnelProviderService;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+
+/**
+ * Provider of a fake network environment, i.e. devices, links, hosts, etc. To
+ * be used for benchmarking only.
+ */
+@Component(immediate = true)
+@Service
+public class DefaultTunnelProvider extends AbstractProvider
+        implements TunnelProvider {
+
+    private static final Logger log = getLogger(DefaultTunnelProvider.class);
+
+    static final String PROVIDER_ID = "org.onosproject.provider.tunnel.default";
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected ComponentConfigService cfgService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected TunnelProviderRegistry tunnelProviderRegistry;
+
+    TunnelProviderService service;
+
+    /**
+     * Creates a Tunnel provider.
+     */
+    public DefaultTunnelProvider() {
+        super(new ProviderId("default", PROVIDER_ID));
+    }
+
+    @Activate
+    public void activate(ComponentContext context) {
+        cfgService.registerProperties(getClass());
+        service = tunnelProviderRegistry.register(this);
+        log.info("Started");
+    }
+
+    @Deactivate
+    public void deactivate(ComponentContext context) {
+        cfgService.unregisterProperties(getClass(), false);
+        tunnelProviderRegistry.unregister(this);
+        log.info("Stopped");
+    }
+
+    @Override
+    public void setupTunnel(Tunnel tunnel, Path path) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void setupTunnel(ElementId srcElement, Tunnel tunnel, Path path) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void releaseTunnel(Tunnel tunnel) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void releaseTunnel(ElementId srcElement, Tunnel tunnel) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void updateTunnel(Tunnel tunnel, Path path) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void updateTunnel(ElementId srcElement, Tunnel tunnel, Path path) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public TunnelId tunnelAdded(TunnelDescription tunnel) {
+        return service.tunnelAdded(tunnel);
+    }
+
+    @Override
+    public void tunnelRemoved(TunnelDescription tunnel) {
+        service.tunnelRemoved(tunnel);
+    }
+
+    @Override
+    public void tunnelUpdated(TunnelDescription tunnel) {
+        service.tunnelUpdated(tunnel);
+    }
+
+}
diff --git a/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/CreateTunnelCommand.java b/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/CreateTunnelCommand.java
new file mode 100644
index 0000000..0086e32
--- /dev/null
+++ b/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/CreateTunnelCommand.java
@@ -0,0 +1,183 @@
+/*
+ * 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.provider.tunnel.cli;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import java.util.Optional;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onlab.packet.IpAddress;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.core.DefaultGroupId;
+import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.SparseAnnotations;
+import org.onosproject.net.provider.ProviderId;
+import org.onosproject.net.tunnel.DefaultOpticalTunnelEndPoint;
+import org.onosproject.net.tunnel.DefaultTunnelDescription;
+import org.onosproject.net.tunnel.IpTunnelEndPoint;
+import org.onosproject.net.tunnel.OpticalLogicId;
+import org.onosproject.net.tunnel.OpticalTunnelEndPoint;
+import org.onosproject.net.tunnel.Tunnel;
+import org.onosproject.net.tunnel.TunnelDescription;
+import org.onosproject.net.tunnel.TunnelEndPoint;
+import org.onosproject.net.tunnel.TunnelId;
+import org.onosproject.net.tunnel.TunnelName;
+import org.onosproject.net.tunnel.TunnelProvider;
+
+/**
+ * Supports for creating a tunnel by using IP address and optical as tunnel end
+ * point.
+ */
+@Command(scope = "onos", name = "create-tunnels",
+description = "Supports for creating a tunnel by using IP address and optical as tunnel end point now.")
+public class CreateTunnelCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "src", description = "Source tunnel point."
+            + " Only supports for IpTunnelEndPoint and OpticalTunnelEndPoint as end point now."
+            + " If creates a ODUK or OCH type tunnel, the formatter of this argument is DeviceId-PortNumber."
+            + " Otherwise src means IP address.", required = true, multiValued = false)
+    String src = null;
+
+    @Argument(index = 1, name = "dst", description = "Destination tunnel point."
+            + " Only supports for IpTunnelEndPoint and OpticalTunnelEndPoint as end point now."
+            + " If creates a ODUK or OCH type tunnel, the formatter of this argument is DeviceId-PortNumber."
+            + " Otherwise dst means IP address.", required = true, multiValued = false)
+    String dst = null;
+    @Argument(index = 2, name = "type", description = "The type of tunnels,"
+            + " It includes MPLS, VLAN, VXLAN, GRE, ODUK, OCH", required = true, multiValued = false)
+    String type = null;
+    @Argument(index = 3, name = "groupId",
+            description = "Group flow table id which a tunnel match up", required = true, multiValued = false)
+    String groupId = null;
+
+    @Argument(index = 4, name = "tunnelName",
+            description = "The name of tunnels", required = false, multiValued = false)
+    String tunnelName = null;
+
+    @Argument(index = 5, name = "bandWith",
+            description = "The bandWith attribute of tunnel", required = false, multiValued = false)
+    String bandWith = null;
+
+    private static final String FMT = "The tunnel identity is %s";
+
+    @Override
+    protected void execute() {
+        TunnelProvider service = get(TunnelProvider.class);
+        ProviderId producerName = new ProviderId("default",
+                                                 "org.onosproject.provider.tunnel.default");
+        TunnelEndPoint srcPoint = null;
+        TunnelEndPoint dstPoint = null;
+        Tunnel.Type trueType = null;
+        if ("MPLS".equals(type)) {
+            trueType = Tunnel.Type.MPLS;
+            srcPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(src));
+            dstPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(dst));
+        } else if ("VLAN".equals(type)) {
+            trueType = Tunnel.Type.VLAN;
+            srcPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(src));
+            dstPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(dst));
+        } else if ("VXLAN".equals(type)) {
+            trueType = Tunnel.Type.VXLAN;
+            srcPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(src));
+            dstPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(dst));
+        } else if ("GRE".equals(type)) {
+            trueType = Tunnel.Type.GRE;
+            srcPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(src));
+            dstPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(dst));
+        } else if ("ODUK".equals(type)) {
+            trueType = Tunnel.Type.ODUK;
+            String[] srcArray = src.split("||");
+            checkArgument(srcArray.length < 2, "Illegal src formatter.");
+            String[] dstArray = dst.split("||");
+            checkArgument(dstArray.length < 2, "Illegal dst formatter.");
+            srcPoint = new DefaultOpticalTunnelEndPoint(
+                                                        producerName,
+                                                        Optional.of(DeviceId
+                                                                .deviceId(srcArray[0])),
+                                                        Optional.of(PortNumber
+                                                                .portNumber(srcArray[1])),
+                                                        null,
+                                                        OpticalTunnelEndPoint.Type.LAMBDA,
+                                                        OpticalLogicId
+                                                                .logicId(0),
+                                                        true);
+            dstPoint = new DefaultOpticalTunnelEndPoint(
+                                                        producerName,
+                                                        Optional.of(DeviceId
+                                                                .deviceId(dstArray[0])),
+                                                        Optional.of(PortNumber
+                                                                .portNumber(dstArray[1])),
+                                                        null,
+                                                        OpticalTunnelEndPoint.Type.LAMBDA,
+                                                        OpticalLogicId
+                                                                .logicId(0),
+                                                        true);
+        } else if ("OCH".equals(type)) {
+            trueType = Tunnel.Type.OCH;
+            String[] srcArray = src.split("-");
+            String[] dstArray = dst.split("-");
+            srcPoint = new DefaultOpticalTunnelEndPoint(
+                                                        producerName,
+                                                        Optional.of(DeviceId
+                                                                .deviceId(srcArray[0])),
+                                                        Optional.of(PortNumber
+                                                                .portNumber(srcArray[1])),
+                                                        null,
+                                                        OpticalTunnelEndPoint.Type.LAMBDA,
+                                                        OpticalLogicId
+                                                                .logicId(0),
+                                                        true);
+            dstPoint = new DefaultOpticalTunnelEndPoint(
+                                                        producerName,
+                                                        Optional.of(DeviceId
+                                                                .deviceId(dstArray[0])),
+                                                        Optional.of(PortNumber
+                                                                .portNumber(dstArray[1])),
+                                                        null,
+                                                        OpticalTunnelEndPoint.Type.LAMBDA,
+                                                        OpticalLogicId
+                                                                .logicId(0),
+                                                        true);
+        } else {
+            print("Illegal tunnel type. Please input MPLS, VLAN, VXLAN, GRE, ODUK or OCH.");
+            return;
+        }
+
+        SparseAnnotations annotations = DefaultAnnotations
+                .builder()
+                .set("bandWith", bandWith == null && "".equals(bandWith) ? "0" : bandWith)
+                .build();
+        TunnelDescription tunnel = new DefaultTunnelDescription(
+                                                                null,
+                                                                srcPoint,
+                                                                dstPoint,
+                                                                trueType,
+                                                                new DefaultGroupId(
+                                                                                   Integer.valueOf(groupId)
+                                                                                           .intValue()),
+                                                                producerName,
+                                                                TunnelName
+                                                                        .tunnelName(tunnelName),
+                                                                annotations);
+        TunnelId tunnelId = service.tunnelAdded(tunnel);
+        print(FMT, tunnelId.id());
+    }
+
+}
diff --git a/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/RemoveTunnelCommand.java b/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/RemoveTunnelCommand.java
new file mode 100644
index 0000000..b4be6ac
--- /dev/null
+++ b/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/RemoveTunnelCommand.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2014-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.provider.tunnel.cli;
+
+import java.util.Optional;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onlab.packet.IpAddress;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.provider.ProviderId;
+import org.onosproject.net.tunnel.DefaultOpticalTunnelEndPoint;
+import org.onosproject.net.tunnel.DefaultTunnelDescription;
+import org.onosproject.net.tunnel.IpTunnelEndPoint;
+import org.onosproject.net.tunnel.OpticalLogicId;
+import org.onosproject.net.tunnel.OpticalTunnelEndPoint;
+import org.onosproject.net.tunnel.Tunnel;
+import org.onosproject.net.tunnel.TunnelDescription;
+import org.onosproject.net.tunnel.TunnelEndPoint;
+import org.onosproject.net.tunnel.TunnelProvider;
+
+/**
+ * Supports for removing all tunnels by using IP address and optical as tunnel
+ * end point now. It's used by producers.
+ */
+@Command(scope = "onos", name = "remove-tunnels", description = "Supports for removing all tunnels by using IP address"
+        + " and optical as tunnel end point now. It's used by producers.")
+public class RemoveTunnelCommand extends AbstractShellCommand {
+    @Argument(index = 0, name = "src", description = "Source tunnel point."
+            + " Only supports for IpTunnelEndPoint and OpticalTunnelEndPoint as end point now."
+            + " If deletess a ODUK or OCH type tunnel, the formatter of this argument is DeviceId-PortNumber."
+            + " Otherwise src means IP address.", required = true, multiValued = false)
+    String src = null;
+    @Argument(index = 1, name = "dst", description = "Destination tunnel point."
+            + " Only supports for IpTunnelEndPoint and OpticalTunnelEndPoint as end point now."
+            + " If deletess a ODUK or OCH type tunnel, the formatter of this argument is DeviceId-PortNumber."
+            + " Otherwise dst means IP address.", required = true, multiValued = false)
+    String dst = null;
+
+    @Argument(index = 2, name = "type", description = "The type of tunnels,"
+            + " It includes MPLS, VLAN, VXLAN, GRE, ODUK, OCH", required = true, multiValued = false)
+    String type = null;
+
+    @Override
+    protected void execute() {
+        TunnelProvider service = get(TunnelProvider.class);
+        ProviderId producerName = new ProviderId("default",
+                                                 "org.onosproject.provider.tunnel.default");
+        TunnelEndPoint srcPoint = null;
+        TunnelEndPoint dstPoint = null;
+        Tunnel.Type trueType = null;
+        if ("MPLS".equals(type)) {
+            trueType = Tunnel.Type.MPLS;
+            srcPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(src));
+            dstPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(dst));
+        } else if ("VLAN".equals(type)) {
+            trueType = Tunnel.Type.VLAN;
+            srcPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(src));
+            dstPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(dst));
+        } else if ("VXLAN".equals(type)) {
+            trueType = Tunnel.Type.VXLAN;
+            srcPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(src));
+            dstPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(dst));
+        } else if ("GRE".equals(type)) {
+            trueType = Tunnel.Type.GRE;
+            srcPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(src));
+            dstPoint = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(dst));
+        } else if ("ODUK".equals(type)) {
+            trueType = Tunnel.Type.ODUK;
+            String[] srcArray = src.split("-");
+            String[] dstArray = dst.split("-");
+            srcPoint = new DefaultOpticalTunnelEndPoint(
+                                                        producerName,
+                                                        Optional.of(DeviceId
+                                                                .deviceId(srcArray[0])),
+                                                        Optional.of(PortNumber
+                                                                .portNumber(srcArray[1])),
+                                                        null,
+                                                        OpticalTunnelEndPoint.Type.LAMBDA,
+                                                        OpticalLogicId
+                                                                .logicId(0),
+                                                        true);
+            dstPoint = new DefaultOpticalTunnelEndPoint(
+                                                        producerName,
+                                                        Optional.of(DeviceId
+                                                                .deviceId(dstArray[0])),
+                                                        Optional.of(PortNumber
+                                                                .portNumber(dstArray[1])),
+                                                        null,
+                                                        OpticalTunnelEndPoint.Type.LAMBDA,
+                                                        OpticalLogicId
+                                                                .logicId(0),
+                                                        true);
+        } else if ("OCH".equals(type)) {
+            trueType = Tunnel.Type.OCH;
+            String[] srcArray = src.split("-");
+            String[] dstArray = dst.split("-");
+            srcPoint = new DefaultOpticalTunnelEndPoint(
+                                                        producerName,
+                                                        Optional.of(DeviceId
+                                                                .deviceId(srcArray[0])),
+                                                        Optional.of(PortNumber
+                                                                .portNumber(srcArray[1])),
+                                                        null,
+                                                        OpticalTunnelEndPoint.Type.LAMBDA,
+                                                        OpticalLogicId
+                                                                .logicId(0),
+                                                        true);
+            dstPoint = new DefaultOpticalTunnelEndPoint(
+                                                        producerName,
+                                                        Optional.of(DeviceId
+                                                                .deviceId(dstArray[0])),
+                                                        Optional.of(PortNumber
+                                                                .portNumber(dstArray[1])),
+                                                        null,
+                                                        OpticalTunnelEndPoint.Type.LAMBDA,
+                                                        OpticalLogicId
+                                                                .logicId(0),
+                                                        true);
+        } else {
+            print("Illegal tunnel type. Please input MPLS, VLAN, VXLAN, GRE, ODUK or OCH.");
+            return;
+        }
+        TunnelDescription tunnel = new DefaultTunnelDescription(null, srcPoint,
+                                                                dstPoint,
+                                                                trueType, null,
+                                                                producerName,
+                                                                null);
+        service.tunnelRemoved(tunnel);
+    }
+
+}
diff --git a/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/package-info.java b/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/package-info.java
new file mode 100644
index 0000000..0fd7d25
--- /dev/null
+++ b/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/cli/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.
+ */
+
+/**
+ * Null provider CLI commands and completers.
+ */
+package org.onosproject.provider.tunnel.cli;
diff --git a/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/package-info.java b/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/package-info.java
new file mode 100644
index 0000000..f5143c1
--- /dev/null
+++ b/providers/tunnel/src/main/java/org/onosproject/provider/tunnel/package-info.java
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+
+/**
+ * Set of null south-bound providers which permit simulating a network
+ * topology using fake devices, links, hosts, etc.
+ */
+package org.onosproject.provider.tunnel;
