diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/IpTunnelEndPoint.java b/core/api/src/main/java/org/onosproject/net/behaviour/IpTunnelEndPoint.java
deleted file mode 100644
index 2b622e3..0000000
--- a/core/api/src/main/java/org/onosproject/net/behaviour/IpTunnelEndPoint.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.net.behaviour;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import org.onlab.packet.IpAddress;
-
-/**
- * Represent for a tunnel point using ip address.
- *
- * @deprecated version 1.7.0 - Hummingbird; use {@code TunnelEndPoint<IpAddress>}
- */
-@Deprecated
-@Beta
-public final class IpTunnelEndPoint extends TunnelEndPoint<IpAddress> {
-
-    /**
-     * Public construction is prohibited.
-     * @param ip ip address
-     */
-    private IpTunnelEndPoint(IpAddress ip) {
-        super(ip);
-    }
-
-    /**
-     * Create a IP tunnel end point.
-     * @param ip IP address
-     * @return IpTunnelEndPoint
-     */
-    public static IpTunnelEndPoint ipTunnelPoint(IpAddress ip) {
-        return new IpTunnelEndPoint(ip);
-    }
-
-    /**
-     * Returns IP address.
-     * @return IP address
-     */
-    public IpAddress ip() {
-        return value;
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass()).add("ip", value).toString();
-    }
-}
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/TunnelConfig.java b/core/api/src/main/java/org/onosproject/net/behaviour/TunnelConfig.java
deleted file mode 100644
index 696061c..0000000
--- a/core/api/src/main/java/org/onosproject/net/behaviour/TunnelConfig.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.net.behaviour;
-
-import java.util.Collection;
-
-import org.onosproject.net.driver.HandlerBehaviour;
-
-/**
- * Behaviour for handling various drivers for tunnel configuration.
- *
- * @deprecated version 1.7.0 - Hummingbird; use interface config tunnel mode
- */
-@Deprecated
-public interface TunnelConfig extends HandlerBehaviour {
-
-    /**
-     * Creates a tunnel interface on a given bridge of this device.
-     *
-     * @param bridgeName bridge name
-     * @param tunnel tunnel description
-     * @return true if succeeds, false otherwise
-     */
-    boolean createTunnelInterface(BridgeName bridgeName, TunnelDescription tunnel);
-
-    /**
-     * Removes a tunnel on this device.
-     *
-     * @param tunnel tunnel descriptor
-     */
-    void removeTunnel(TunnelDescription tunnel);
-
-    /**
-     * Updates a tunnel on this device.
-     *
-     * @param tunnel tunnel descriptor
-     */
-    void updateTunnel(TunnelDescription tunnel);
-
-    /**
-     * Returns tunnels created on this device.
-     *
-     * @return collection of tunnels
-     */
-    Collection<TunnelDescription> getTunnels();
-
-}
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/TunnelName.java b/core/api/src/main/java/org/onosproject/net/behaviour/TunnelName.java
deleted file mode 100644
index 2b567ac..0000000
--- a/core/api/src/main/java/org/onosproject/net/behaviour/TunnelName.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.net.behaviour;
-
-import com.google.common.annotations.Beta;
-
-import java.util.Objects;
-
-/**
- * Represents for a unique tunnel name. TunnelId is generated by ONOS while
- * TunnelName is given by producer. The consumer can borrow tunnels with
- * TunnelId or TunnelName.
- *
- * @deprecated version 1.7.0 - Hummingbird
- */
-@Deprecated
-@Beta
-public final class TunnelName {
-    private final String str;
-
-    // Default constructor for serialization
-    private TunnelName(String tunnelName) {
-        this.str = tunnelName;
-    }
-
-
-    /**
-     * Creates a tunnel name using the supplied URI string.
-     *
-     * @param tunnelName tunnel name string
-     * @return tunnel name object
-     */
-    public static TunnelName tunnelName(String tunnelName) {
-        return new TunnelName(tunnelName);
-    }
-
-    /**
-     * The string of tunnel name.
-     *
-     * @return the string of tunnel name
-     */
-    public String value() {
-        return str;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(str);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof TunnelName) {
-            final TunnelName that = (TunnelName) obj;
-            return this.getClass() == that.getClass()
-                    && Objects.equals(this.str, that.str);
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return str;
-    }
-}
diff --git a/drivers/ovsdb/src/main/java/org/onosproject/drivers/ovsdb/OvsdbTunnelConfig.java b/drivers/ovsdb/src/main/java/org/onosproject/drivers/ovsdb/OvsdbTunnelConfig.java
deleted file mode 100644
index 8618552..0000000
--- a/drivers/ovsdb/src/main/java/org/onosproject/drivers/ovsdb/OvsdbTunnelConfig.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.drivers.ovsdb;
-
-import org.onlab.packet.IpAddress;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.behaviour.BridgeName;
-import org.onosproject.net.behaviour.TunnelConfig;
-import org.onosproject.net.behaviour.TunnelDescription;
-import org.onosproject.net.driver.AbstractHandlerBehaviour;
-import org.onosproject.net.driver.DriverHandler;
-import org.onosproject.ovsdb.controller.OvsdbClientService;
-import org.onosproject.ovsdb.controller.OvsdbController;
-import org.onosproject.ovsdb.controller.OvsdbInterface;
-import org.onosproject.ovsdb.controller.OvsdbNodeId;
-
-import java.util.Collection;
-import java.util.Collections;
-
-/**
- * OVSDB-based implementation of tunnel config behaviour.
- *
- * @deprecated version 1.7.0 - Hummingbird; use interface config instead
- */
-@Deprecated
-public class OvsdbTunnelConfig extends AbstractHandlerBehaviour
-        implements TunnelConfig {
-
-    @Override
-    public boolean createTunnelInterface(BridgeName bridgeName, TunnelDescription tunnel) {
-        DriverHandler handler = handler();
-        OvsdbClientService ovsdbNode = getOvsdbNode(handler);
-
-        OvsdbInterface ovsdbIface = OvsdbInterface.builder(tunnel).build();
-        return ovsdbNode.createInterface(bridgeName.name(), ovsdbIface);
-    }
-
-    @Override
-    public void removeTunnel(TunnelDescription tunnel) {
-        DriverHandler handler = handler();
-        OvsdbClientService ovsdbNode = getOvsdbNode(handler);
-        ovsdbNode.dropInterface(tunnel.ifaceName());
-    }
-
-    @Override
-    public void updateTunnel(TunnelDescription tunnel) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public Collection<TunnelDescription> getTunnels() {
-        return Collections.emptyList();
-    }
-
-    // OvsdbNodeId(IP) is used in the adaptor while DeviceId(ovsdb:IP)
-    // is used in the core. So DeviceId need be changed to OvsdbNodeId.
-    private OvsdbNodeId changeDeviceIdToNodeId(DeviceId deviceId) {
-        String[] splits = deviceId.toString().split(":");
-        if (splits == null || splits.length < 1) {
-            return null;
-        }
-        IpAddress ipAddress = IpAddress.valueOf(splits[1]);
-        return new OvsdbNodeId(ipAddress, 0);
-    }
-
-    private OvsdbClientService getOvsdbNode(DriverHandler handler) {
-        OvsdbController ovsController = handler.get(OvsdbController.class);
-        DeviceId deviceId = handler.data().deviceId();
-        OvsdbNodeId nodeId = changeDeviceIdToNodeId(deviceId);
-        return ovsController.getOvsdbClient(nodeId);
-    }
-}
