diff --git a/apps/sdnip/src/main/java/org/onlab/onos/sdnip/config/Interface.java b/apps/sdnip/src/main/java/org/onlab/onos/sdnip/config/Interface.java
new file mode 100644
index 0000000..33287ad
--- /dev/null
+++ b/apps/sdnip/src/main/java/org/onlab/onos/sdnip/config/Interface.java
@@ -0,0 +1,101 @@
+package org.onlab.onos.sdnip.config;
+
+import java.util.Objects;
+
+import org.codehaus.jackson.annotate.JsonCreator;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.onlab.onos.net.ConnectPoint;
+import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.PortNumber;
+import org.onlab.packet.IpPrefix;
+
+/**
+ * Represents an interface, which is an external-facing switch port that
+ * connects to another network.
+ * <p/>
+ * SDN-IP treats external-facing ports similarly to router ports. Logically, it
+ * assigns an IP subnetwork prefix and several IP addresses to each port which
+ * are used for communication with the BGP peers located in other networks, for
+ * example, the BGP peering sessions. The peers in other networks will be
+ * configured to peer with the IP addresses (logically) assigned to the
+ * interface. The logical {@code Interface} construct maps on to a physical
+ * port in the data plane, which of course has no notion of IP addresses.
+ * <p/>
+ * Each interface has a name, which is a unique identifying String that is used
+ * to reference this interface in the configuration (for example, to map
+ * {@link BgpPeer}s to {@code Interfaces}.
+ */
+public class Interface {
+    private final String name;
+    private final ConnectPoint switchPort;
+    private final IpPrefix ip4Prefix;
+
+    /**
+     * Class constructor used by the JSON library to create an object.
+     *
+     * @param name the name of the interface
+     * @param dpid the dpid of the switch
+     * @param port the port on the switch
+     * @param prefixAddress the network prefix address logically assigned to the
+     * interface
+     * @param prefixLength the length of the network prefix of the IP address
+     */
+    @JsonCreator
+    public Interface(@JsonProperty("name") String name,
+                     @JsonProperty("dpid") String dpid,
+                     @JsonProperty("port") int port,
+                     @JsonProperty("ipAddress") String prefixAddress,
+                     @JsonProperty("prefixLength") short prefixLength) {
+        this.name = name;
+        this.switchPort = new ConnectPoint(
+                DeviceId.deviceId(SdnIpConfigReader.dpidToUri(dpid)),
+                PortNumber.portNumber(port));
+        this.ip4Prefix = IpPrefix.valueOf(prefixAddress + "/" + prefixLength);
+    }
+
+    /**
+     * Gets the name of the interface.
+     *
+     * @return the name of the interface
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Gets the {@link SwitchPort} that this interface maps to.
+     *
+     * @return the switch port
+     */
+    public ConnectPoint getSwitchPort() {
+        return switchPort;
+    }
+
+    /**
+     * Gets the IP prefix of the subnetwork which is logically assigned
+     * to the switch port.
+     *
+     * @return the IP prefix
+     */
+   public IpPrefix getIp4Prefix() {
+        return ip4Prefix;
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (!(other instanceof Interface)) {
+            return false;
+        }
+
+        Interface otherInterface = (Interface) other;
+
+        return  name.equals(otherInterface.name) &&
+                switchPort.equals(otherInterface.switchPort) &&
+                ip4Prefix.equals(otherInterface.ip4Prefix);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(name, switchPort, ip4Prefix);
+    }
+}
