diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/config/basics/InterfaceConfig.java b/incubator/api/src/main/java/org/onosproject/incubator/net/config/basics/InterfaceConfig.java
index 91832dc..80ee3a7 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/config/basics/InterfaceConfig.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/config/basics/InterfaceConfig.java
@@ -26,7 +26,7 @@
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
-import org.onosproject.incubator.net.intf.Interface;
+import org.onosproject.net.intf.Interface;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.config.Config;
 import org.onosproject.net.host.InterfaceIpAddress;
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/intf/Interface.java b/incubator/api/src/main/java/org/onosproject/incubator/net/intf/Interface.java
deleted file mode 100644
index c055bb0..0000000
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/intf/Interface.java
+++ /dev/null
@@ -1,206 +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.incubator.net.intf;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.VlanId;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.host.InterfaceIpAddress;
-
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * An Interface maps network configuration information (such as addresses and
- * vlans) to a port in the network.
- */
-@Beta
-public class Interface {
-    public static final String NO_INTERFACE_NAME = "";
-
-    private final String name;
-    private final ConnectPoint connectPoint;
-    private final List<InterfaceIpAddress> ipAddresses;
-    private final MacAddress macAddress;
-    // TODO: Deprecate this due to ambiguity
-    private final VlanId vlan;
-    private final VlanId vlanUntagged;
-    private final Set<VlanId> vlanTagged;
-    private final VlanId vlanNative;
-
-    /**
-     * Creates new Interface with the provided configuration.
-     *
-     * @param name name of the interface
-     * @param connectPoint the connect point this interface maps to
-     * @param ipAddresses list of IP addresses
-     * @param macAddress MAC address
-     * @param vlan VLAN ID
-     */
-    public Interface(String name, ConnectPoint connectPoint,
-                     List<InterfaceIpAddress> ipAddresses,
-                     MacAddress macAddress, VlanId vlan) {
-        this(name, connectPoint, ipAddresses, macAddress, vlan, null, null, null);
-    }
-
-    /**
-     * Creates new Interface with the provided configuration.
-     *
-     * @param name name of the interface
-     * @param connectPoint the connect point this interface maps to
-     * @param ipAddresses list of IP addresses
-     * @param macAddress MAC address
-     * @param vlan VLAN ID
-     * @param vlanUntagged untagged VLAN.
-     *                     Cannot be used with vlanTagged or vlanNative.
-     * @param vlanTagged   tagged VLANs.
-     *                     Cannot be used with vlanUntagged.
-     * @param vlanNative   native vLAN. Optional.
-     *                     Can only be used when vlanTagged is specified. Cannot be used with vlanUntagged.
-     */
-    public Interface(String name, ConnectPoint connectPoint,
-                     List<InterfaceIpAddress> ipAddresses,
-                     MacAddress macAddress, VlanId vlan,
-                     VlanId vlanUntagged, Set<VlanId> vlanTagged, VlanId vlanNative) {
-        this.name = name == null ? NO_INTERFACE_NAME : name;
-        this.connectPoint = checkNotNull(connectPoint);
-        this.ipAddresses = ipAddresses == null ? Lists.newArrayList() : ipAddresses;
-        this.macAddress = macAddress == null ? MacAddress.NONE : macAddress;
-        this.vlan = vlan == null ? VlanId.NONE : vlan;
-        this.vlanUntagged = vlanUntagged == null ? VlanId.NONE : vlanUntagged;
-        this.vlanTagged = vlanTagged == null ? ImmutableSet.of() : ImmutableSet.copyOf(vlanTagged);
-        this.vlanNative = vlanNative == null ? VlanId.NONE : vlanNative;
-    }
-
-    /**
-     * Retrieves the name of the interface.
-     *
-     * @return name
-     */
-    public String name() {
-        return name;
-    }
-
-    /**
-     * Retrieves the connection point that this interface maps to.
-     *
-     * @return the connection point
-     */
-    public ConnectPoint connectPoint() {
-        return connectPoint;
-    }
-
-    /**
-     * Retrieves a list of IP addresses that are assigned to the interface in
-     * the order that they were configured.
-     *
-     * @return list of IP addresses
-     */
-    public List<InterfaceIpAddress> ipAddressesList() {
-        return ipAddresses;
-    }
-
-    /**
-     * Retrieves the MAC address that is assigned to the interface.
-     *
-     * @return the MAC address
-     */
-    public MacAddress mac() {
-        return macAddress;
-    }
-
-    /**
-     * Retrieves the VLAN ID that is assigned to the interface.
-     *
-     * @return the VLAN ID
-     */
-    public VlanId vlan() {
-        return vlan;
-    }
-
-    /**
-     * Retrieves the VLAN ID that is assigned to untagged packets.
-     *
-     * @return the VLAN ID
-     */
-    public VlanId vlanUntagged() {
-        return vlanUntagged;
-    }
-
-    /**
-     * Retrieves the set of VLAN IDs that are allowed on this interface.
-     *
-     * @return the VLAN ID
-     */
-    public Set<VlanId> vlanTagged() {
-        return vlanTagged;
-    }
-
-    /**
-     * Retrieves the VLAN ID that is assigned to untagged packets on this
-     * tagged interface.
-     *
-     * @return the VLAN ID
-     */
-    public VlanId vlanNative() {
-        return vlanNative;
-    }
-
-    @Override
-    public boolean equals(Object other) {
-        if (!(other instanceof Interface)) {
-            return false;
-        }
-
-        Interface otherInterface = (Interface) other;
-
-        return Objects.equals(name, otherInterface.name) &&
-                Objects.equals(connectPoint, otherInterface.connectPoint) &&
-                Objects.equals(ipAddresses, otherInterface.ipAddresses) &&
-                Objects.equals(macAddress, otherInterface.macAddress) &&
-                Objects.equals(vlan, otherInterface.vlan) &&
-                Objects.equals(vlanUntagged, otherInterface.vlanUntagged) &&
-                Objects.equals(vlanTagged, otherInterface.vlanTagged) &&
-                Objects.equals(vlanNative, otherInterface.vlanNative);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(connectPoint, name, ipAddresses, macAddress, vlan,
-                vlanUntagged, vlanTagged, vlanNative);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("name", name)
-                .add("connectPoint", connectPoint)
-                .add("ipAddresses", ipAddresses)
-                .add("macAddress", macAddress)
-                .add("vlan", vlan)
-                .add("vlanUntagged", vlanUntagged)
-                .add("vlanTagged", vlanTagged)
-                .add("vlanNative", vlanNative)
-                .toString();
-    }
-}
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/intf/InterfaceAdminService.java b/incubator/api/src/main/java/org/onosproject/incubator/net/intf/InterfaceAdminService.java
deleted file mode 100644
index 410dc39..0000000
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/intf/InterfaceAdminService.java
+++ /dev/null
@@ -1,41 +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.incubator.net.intf;
-
-import org.onosproject.net.ConnectPoint;
-
-/**
- * Provides a means to modify the interfaces configuration.
- */
-public interface InterfaceAdminService {
-
-    /**
-     * Adds a new interface configuration to the system.
-     *
-     * @param intf interface to add
-     */
-    void add(Interface intf);
-
-    /**
-     * Removes an interface configuration from the system.
-     *
-     * @param connectPoint connect point of the interface
-     * @param name name of the interface
-     * @return the result of removal
-     */
-    boolean remove(ConnectPoint connectPoint, String name);
-}
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/intf/InterfaceEvent.java b/incubator/api/src/main/java/org/onosproject/incubator/net/intf/InterfaceEvent.java
deleted file mode 100644
index 230b4d2..0000000
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/intf/InterfaceEvent.java
+++ /dev/null
@@ -1,114 +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.incubator.net.intf;
-
-import org.onosproject.event.AbstractEvent;
-import org.joda.time.LocalDateTime;
-import static com.google.common.base.MoreObjects.toStringHelper;
-
-/**
- * Describes an interface event.
- */
-public class InterfaceEvent extends AbstractEvent<InterfaceEvent.Type, Interface> {
-
-    private final Interface prevSubject;
-
-    public enum Type {
-        /**
-         * Indicates a new interface has been added.
-         */
-        INTERFACE_ADDED,
-
-        /**
-         * Indicates an interface has been updated.
-         */
-        INTERFACE_UPDATED,
-
-        /**
-         * Indicates an interface has been removed.
-         */
-        INTERFACE_REMOVED
-    }
-
-    /**
-     * Creates an interface event with type and subject.
-     *
-     * @param type event type
-     * @param subject subject interface
-     */
-    public InterfaceEvent(Type type, Interface subject) {
-        this(type, subject, null);
-    }
-
-    /**
-     * Creates an interface event with type, subject and time of event.
-     *
-     * @param type event type
-     * @param subject subject interface
-     * @param time time of event
-     */
-    public InterfaceEvent(Type type, Interface subject, long time) {
-        this(type, subject, null, time);
-    }
-
-    /**
-     * Creates an interface event with type, subject and previous subject.
-     *
-     * @param type event type
-     * @param subject subject interface
-     * @param prevSubject previous interface subject
-     */
-    public InterfaceEvent(Type type, Interface subject, Interface prevSubject) {
-        super(type, subject);
-        this.prevSubject = prevSubject;
-    }
-
-    /**
-     * Creates an interface event with type, subject, previous subject and time.
-     *
-     * @param type event type
-     * @param subject subject interface
-     * @param prevSubject previous interface subject
-     * @param time time of event
-     */
-    public InterfaceEvent(Type type, Interface subject, Interface prevSubject, long time) {
-        super(type, subject, time);
-        this.prevSubject = prevSubject;
-    }
-
-    /**
-     * Returns the previous interface subject.
-     *
-     * @return previous subject of interface or null if the event is not interface specific.
-     */
-    public Interface prevSubject() {
-        return prevSubject;
-    }
-
-    @Override
-    public String toString() {
-        if (prevSubject == null) {
-            return super.toString();
-        }
-        return toStringHelper(this)
-                .add("time", new LocalDateTime(time()))
-                .add("type", type())
-                .add("subject", subject())
-                .add("prevSubject", prevSubject)
-                .toString();
-     }
-}
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/intf/InterfaceListener.java b/incubator/api/src/main/java/org/onosproject/incubator/net/intf/InterfaceListener.java
deleted file mode 100644
index cf003c8..0000000
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/intf/InterfaceListener.java
+++ /dev/null
@@ -1,25 +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.incubator.net.intf;
-
-import org.onosproject.event.EventListener;
-
-/**
- * Listener for interface events.
- */
-public interface InterfaceListener extends EventListener<InterfaceEvent> {
-}
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/intf/InterfaceService.java b/incubator/api/src/main/java/org/onosproject/incubator/net/intf/InterfaceService.java
deleted file mode 100644
index 9a173aa..0000000
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/intf/InterfaceService.java
+++ /dev/null
@@ -1,91 +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.incubator.net.intf;
-
-import com.google.common.annotations.Beta;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.VlanId;
-import org.onosproject.event.ListenerService;
-import org.onosproject.net.ConnectPoint;
-
-import java.util.Set;
-
-/**
- * Service for interacting with interfaces.
- */
-@Beta
-public interface InterfaceService
-        extends ListenerService<InterfaceEvent, InterfaceListener> {
-
-    /**
-     * Returns the set of all interfaces in the system.
-     *
-     * @return set of interfaces
-     */
-    Set<Interface> getInterfaces();
-
-    /**
-     * Returns the interface with the given name.
-     *
-     * @param connectPoint connect point of the interface
-     * @param name name of the interface
-     * @return interface if it exists, otherwise null
-     */
-    Interface getInterfaceByName(ConnectPoint connectPoint, String name);
-
-    /**
-     * Returns the set of interfaces configured on the given port.
-     *
-     * @param port connect point
-     * @return set of interfaces
-     */
-    Set<Interface> getInterfacesByPort(ConnectPoint port);
-
-    /**
-     * Returns the set of interfaces with the given IP address.
-     *
-     * @param ip IP address
-     * @return set of interfaces
-     */
-    Set<Interface> getInterfacesByIp(IpAddress ip);
-
-    /**
-     * Returns the set of interfaces in the given VLAN.
-     *
-     * @param vlan VLAN ID of the interfaces
-     * @return set of interfaces
-     */
-    Set<Interface> getInterfacesByVlan(VlanId vlan);
-
-    /**
-     * Returns an interface that has an address that is in the same subnet as
-     * the given IP address.
-     *
-     * @param ip IP address to find matching subnet interface for
-     * @return interface
-     */
-    Interface getMatchingInterface(IpAddress ip);
-
-    /**
-     * Returns all interfaces that have an address that is in the same
-     * subnet as the given IP address.
-     *
-     * @param ip IP address to find matching subnet interface for
-     * @return a set of interfaces
-     */
-    Set<Interface> getMatchingInterfaces(IpAddress ip);
-}
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/intf/package-info.java b/incubator/api/src/main/java/org/onosproject/incubator/net/intf/package-info.java
deleted file mode 100644
index 2466e78..0000000
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/intf/package-info.java
+++ /dev/null
@@ -1,20 +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.
- */
-
-/**
- * Interface Service.
- */
-package org.onosproject.incubator.net.intf;
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourHandlerRegistration.java b/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourHandlerRegistration.java
index 4c55e24..df35319 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourHandlerRegistration.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourHandlerRegistration.java
@@ -17,7 +17,7 @@
 package org.onosproject.incubator.net.neighbour;
 
 import org.onosproject.core.ApplicationId;
-import org.onosproject.incubator.net.intf.Interface;
+import org.onosproject.net.intf.Interface;
 
 /**
  * Information about the registration of a neighbour message handler.
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourMessageActions.java b/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourMessageActions.java
index 9561b89..0e04aee 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourMessageActions.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourMessageActions.java
@@ -18,7 +18,7 @@
 
 import com.google.common.annotations.Beta;
 import org.onlab.packet.MacAddress;
-import org.onosproject.incubator.net.intf.Interface;
+import org.onosproject.net.intf.Interface;
 import org.onosproject.net.ConnectPoint;
 
 /**
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourMessageContext.java b/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourMessageContext.java
index 2a0ddd9..ca5e3ce 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourMessageContext.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourMessageContext.java
@@ -21,7 +21,7 @@
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
-import org.onosproject.incubator.net.intf.Interface;
+import org.onosproject.net.intf.Interface;
 import org.onosproject.net.ConnectPoint;
 
 /**
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourResolutionService.java b/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourResolutionService.java
index 986ecbe..e6e3e20 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourResolutionService.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/neighbour/NeighbourResolutionService.java
@@ -18,7 +18,7 @@
 
 import com.google.common.annotations.Beta;
 import org.onosproject.core.ApplicationId;
-import org.onosproject.incubator.net.intf.Interface;
+import org.onosproject.net.intf.Interface;
 import org.onosproject.net.ConnectPoint;
 
 import java.util.Collection;
