diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/config/basics/BasicPortConfig.java b/incubator/api/src/main/java/org/onosproject/incubator/net/config/basics/BasicPortConfig.java
deleted file mode 100644
index 5fcc43e..0000000
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/config/basics/BasicPortConfig.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * 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.incubator.net.config.basics;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.google.common.collect.Sets;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.VlanId;
-import org.onosproject.incubator.net.config.Config;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.host.InterfaceIpAddress;
-
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * Basic configuration for a port on a device.
- */
-public class BasicPortConfig extends Config<ConnectPoint> {
-    public static final String IPS = "ips";
-    public static final String MAC = "mac";
-    public static final String VLAN = "vlan";
-
-    /**
-     * Returns the set of IP addresses assigned to the port.
-     *
-     * @return set ip IP addresses
-     */
-    public Set<InterfaceIpAddress> ips() {
-        Set<InterfaceIpAddress> ips = Sets.newHashSet();
-
-        JsonNode ipsNode = node.get(IPS);
-        ipsNode.forEach(jsonNode -> ips.add(InterfaceIpAddress.valueOf(jsonNode.asText())));
-
-        return ips;
-    }
-
-    /**
-     * Adds an IP address to configuration of the port.
-     *
-     * @param ip ip address to add
-     * @return this
-     */
-    public BasicPortConfig addIp(InterfaceIpAddress ip) {
-        ArrayNode ipsNode = (ArrayNode) node.get(IPS);
-        if (ipsNode == null) {
-            ipsNode = node.putArray(IPS);
-        }
-
-        // Check if the value is already there
-        if (ipsNode.findValue(ip.toString()) != null) {
-            ipsNode.add(ip.toString());
-        }
-
-        return this;
-    }
-
-    /**
-     * Removes an IP address from the configuration of the port.
-     *
-     * @param ip ip address to remove
-     * @return this
-     */
-    public BasicPortConfig removeIp(InterfaceIpAddress ip) {
-        ArrayNode ipsNode = (ArrayNode) node.get(IPS);
-
-        if (ipsNode != null) {
-            if (ipsNode.size() == 1) {
-                node.remove(IPS);
-            } else {
-                Iterator<JsonNode> it = ipsNode.iterator();
-                while (it.hasNext()) {
-                    if (it.next().asText().equals(ip.toString())) {
-                        it.remove();
-                        break;
-                    }
-                }
-            }
-        }
-
-        return this;
-    }
-
-    /**
-     * Clear all IP addresses from the configuration.
-     *
-     * @return this
-     */
-    public BasicPortConfig clearIps() {
-        node.remove(IPS);
-        return this;
-    }
-
-    /**
-     * Returns the MAC address configured on the port.
-     *
-     * @return MAC address
-     */
-    public MacAddress mac() {
-        JsonNode macNode = node.get(MAC);
-        if (macNode == null) {
-            return null;
-        }
-
-        return MacAddress.valueOf(macNode.asText());
-    }
-
-    /**
-     * Sets the MAC address configured on the port.
-     *
-     * @param mac MAC address
-     * @return this
-     */
-    public BasicPortConfig mac(MacAddress mac) {
-        String macString = (mac == null) ? null : mac.toString();
-        return (BasicPortConfig) setOrClear(MAC, macString);
-    }
-
-    /**
-     * Returns the VLAN configured on the port.
-     *
-     * @return VLAN ID
-     */
-    public VlanId vlan() {
-        JsonNode macNode = node.get(VLAN);
-        if (macNode == null) {
-            return null;
-        }
-
-        return VlanId.vlanId(Short.parseShort(macNode.asText()));
-    }
-
-    /**
-     * Sets the VLAN configured on the port.
-     *
-     * @param vlan VLAN ID
-     * @return this
-     */
-    public BasicPortConfig vlan(VlanId vlan) {
-        Integer vlanId = (vlan == null) ? null : Integer.valueOf(vlan.toShort());
-        return (BasicPortConfig) setOrClear(VLAN, vlanId);
-    }
-}
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
new file mode 100644
index 0000000..4211fd2
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/config/basics/InterfaceConfig.java
@@ -0,0 +1,66 @@
+/*
+ * 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.incubator.net.config.basics;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.Sets;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.incubator.net.config.Config;
+import org.onosproject.incubator.net.intf.Interface;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.host.InterfaceIpAddress;
+
+import java.util.Set;
+
+/**
+ * Configuration for interfaces.
+ */
+public class InterfaceConfig extends Config<ConnectPoint> {
+    public static final String INTERFACES = "interfaces";
+    public static final String IPS = "ips";
+    public static final String MAC = "mac";
+    public static final String VLAN = "vlan";
+
+    /**
+     * Retrieves all interfaces configured on this port.
+     *
+     * @return set of interfaces
+     */
+    public Set<Interface> getInterfaces() {
+        Set<Interface> interfaces = Sets.newHashSet();
+
+        for (JsonNode intfNode : node.path(INTERFACES)) {
+            interfaces.add(new Interface(subject,
+                    getIps(intfNode),
+                    MacAddress.valueOf(intfNode.path(MAC).asText()),
+                    VlanId.vlanId(Short.parseShort(intfNode.path(VLAN).asText()))));
+        }
+
+        return interfaces;
+    }
+
+    private Set<InterfaceIpAddress> getIps(JsonNode node) {
+        Set<InterfaceIpAddress> ips = Sets.newHashSet();
+
+        JsonNode ipsNode = node.get(IPS);
+        ipsNode.forEach(jsonNode -> ips.add(InterfaceIpAddress.valueOf(jsonNode.asText())));
+
+        return ips;
+    }
+
+}
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
new file mode 100644
index 0000000..09b8cf2
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/intf/Interface.java
@@ -0,0 +1,119 @@
+/*
+ * 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.incubator.net.intf;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.Sets;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.host.InterfaceIpAddress;
+
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * An Interface maps network configuration information (such as addresses and
+ * vlans) to a port in the network.
+ */
+public class Interface {
+    private final ConnectPoint connectPoint;
+    private final Set<InterfaceIpAddress> ipAddresses;
+    private final MacAddress macAddress;
+    private final VlanId vlan;
+
+    /**
+     * Creates new Interface with the provided configuration.
+     *
+     * @param connectPoint the connect point this interface maps to
+     * @param ipAddresses Set of IP addresses
+     * @param macAddress MAC address
+     * @param vlan VLAN ID
+     */
+    public Interface(ConnectPoint connectPoint,
+                     Set<InterfaceIpAddress> ipAddresses,
+                     MacAddress macAddress, VlanId vlan) {
+        this.connectPoint = connectPoint;
+        this.ipAddresses = Sets.newHashSet(ipAddresses);
+        this.macAddress = macAddress;
+        this.vlan = vlan;
+    }
+
+    /**
+     * Retrieves the connection point that this interface maps to.
+     *
+     * @return the connection point
+     */
+    public ConnectPoint connectPoint() {
+        return connectPoint;
+    }
+
+    /**
+     * Retrieves the set of IP addresses that are assigned to the interface.
+     *
+     * @return the set of interface IP addresses
+     */
+    public Set<InterfaceIpAddress> ipAddresses() {
+        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;
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (!(other instanceof Interface)) {
+            return false;
+        }
+
+        Interface otherInterface = (Interface) other;
+
+        return Objects.equals(connectPoint, otherInterface.connectPoint) &&
+                Objects.equals(ipAddresses, otherInterface.ipAddresses) &&
+                Objects.equals(macAddress, otherInterface.macAddress) &&
+                Objects.equals(vlan, otherInterface.vlan);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(connectPoint, ipAddresses, macAddress, vlan);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("connectPoint", connectPoint)
+                .add("ipAddresses", ipAddresses)
+                .add("macAddress", macAddress)
+                .add("vlan", vlan)
+                .toString();
+    }
+}
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
new file mode 100644
index 0000000..ad1bf34
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/intf/InterfaceService.java
@@ -0,0 +1,69 @@
+/*
+ * 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.incubator.net.intf;
+
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.net.ConnectPoint;
+
+import java.util.Set;
+
+/**
+ * Service for interacting with interfaces.
+ */
+public interface InterfaceService {
+
+    /**
+     * Returns the set of all interfaces in the system.
+     *
+     * @return set of interfaces
+     */
+    Set<Interface> getInterfaces();
+
+    /**
+     * 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);
+}
