diff --git a/cli/src/main/java/org/onosproject/cli/net/InterfaceAddCommand.java b/cli/src/main/java/org/onosproject/cli/net/InterfaceAddCommand.java
new file mode 100644
index 0000000..eefb711
--- /dev/null
+++ b/cli/src/main/java/org/onosproject/cli/net/InterfaceAddCommand.java
@@ -0,0 +1,79 @@
+/*
+ * 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.cli.net;
+
+import com.google.common.collect.Sets;
+import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.commands.Option;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.incubator.net.intf.Interface;
+import org.onosproject.incubator.net.intf.InterfaceAdminService;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.host.InterfaceIpAddress;
+
+import java.util.Set;
+
+/**
+ * Adds a new interface configuration.
+ */
+@Command(scope = "onos", name = "add-interface",
+        description = "Adds a new configured interface")
+public class InterfaceAddCommand extends AbstractShellCommand {
+
+    @Option(name = "-c", aliases = "--connectPoint",
+            description = "Device port that the interface is associated with",
+            required = true, multiValued = false)
+    private String connectPoint = null;
+
+    @Option(name = "-m", aliases = "--mac",
+            description = "MAC address of the interface",
+            required = true, multiValued = false)
+    private String mac = null;
+
+    @Option(name = "-i", aliases = "--ip",
+            description = "IP address configured on the interface\n" +
+            "(e.g. 10.0.1.1/24). Can be specified multiple times.",
+            required = false, multiValued = true)
+    private String[] ips = null;
+
+    @Option(name = "-v", aliases = "--vlan",
+            description = "VLAN configured on the interface",
+            required = false, multiValued = false)
+    private String vlan = null;
+
+    @Override
+    protected void execute() {
+        InterfaceAdminService interfaceService = get(InterfaceAdminService.class);
+
+        Set<InterfaceIpAddress> ipAddresses = Sets.newHashSet();
+        if (ips != null) {
+            for (String strIp : ips) {
+                ipAddresses.add(InterfaceIpAddress.valueOf(strIp));
+            }
+        }
+
+        VlanId vlanId = vlan == null ? VlanId.NONE : VlanId.vlanId(Short.parseShort(vlan));
+
+        Interface intf = new Interface(ConnectPoint.deviceConnectPoint(connectPoint),
+                ipAddresses, MacAddress.valueOf(mac), vlanId);
+
+        interfaceService.add(intf);
+    }
+
+}
diff --git a/cli/src/main/java/org/onosproject/cli/net/InterfaceRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/InterfaceRemoveCommand.java
new file mode 100644
index 0000000..941a65d
--- /dev/null
+++ b/cli/src/main/java/org/onosproject/cli/net/InterfaceRemoveCommand.java
@@ -0,0 +1,51 @@
+/*
+ * 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.cli.net;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onlab.packet.VlanId;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.incubator.net.intf.InterfaceAdminService;
+import org.onosproject.net.ConnectPoint;
+
+/**
+ * Removes an interface configuration.
+ */
+@Command(scope = "onos", name = "remove-interface",
+        description = "Removes a configured interface")
+public class InterfaceRemoveCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "connectPoint",
+            description = "Connect point of the interface",
+            required = true, multiValued = false)
+    private String connectPoint = null;
+
+    @Argument(index = 1, name = "vlan",
+            description = "Interface vlan",
+            required = true, multiValued = false)
+    private String vlan = null;
+
+    @Override
+    protected void execute() {
+        InterfaceAdminService interfaceService = get(InterfaceAdminService.class);
+
+        interfaceService.remove(ConnectPoint.deviceConnectPoint(connectPoint),
+                VlanId.vlanId(Short.parseShort(vlan)));
+    }
+
+}
diff --git a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index e7fe5c4..28461e2 100644
--- a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -352,6 +352,19 @@
             <action class="org.onosproject.cli.net.InterfacesListCommand"/>
         </command>
         <command>
+            <action class="org.onosproject.cli.net.InterfaceAddCommand"/>
+            <optional-completers>
+                <entry key="-c" value-ref="connectPointCompleter"/>
+                <entry key="--connectPoint" value-ref="connectPointCompleter"/>
+            </optional-completers>
+        </command>
+        <command>
+            <action class="org.onosproject.cli.net.InterfaceRemoveCommand"/>
+            <completers>
+                <ref component-id="connectPointCompleter"/>
+            </completers>
+        </command>
+        <command>
             <action class="org.onosproject.cli.net.GroupsListCommand"/>
         </command>
 
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 af2b47d..592336c 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
@@ -17,13 +17,15 @@
 package org.onosproject.incubator.net.config.basics;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.annotations.Beta;
 import com.google.common.collect.Sets;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
-import org.onosproject.net.config.Config;
 import org.onosproject.incubator.net.intf.Interface;
 import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.config.Config;
 import org.onosproject.net.host.InterfaceIpAddress;
 
 import java.util.Set;
@@ -37,7 +39,6 @@
     public static final String MAC = "mac";
     public static final String VLAN = "vlan";
 
-    public static final String IP_MISSING_ERROR = "Must have at least one IP address";
     public static final String MAC_MISSING_ERROR = "Must have a MAC address for each interface";
     public static final String CONFIG_VALUE_ERROR = "Error parsing config value";
 
@@ -53,9 +54,6 @@
         try {
             for (JsonNode intfNode : array) {
                 Set<InterfaceIpAddress> ips = getIps(intfNode);
-                if (ips.isEmpty()) {
-                    throw new ConfigException(IP_MISSING_ERROR);
-                }
 
                 if (intfNode.path(MAC).isMissingNode()) {
                     throw new ConfigException(MAC_MISSING_ERROR);
@@ -63,10 +61,7 @@
 
                 MacAddress mac = MacAddress.valueOf(intfNode.path(MAC).asText());
 
-                VlanId vlan = VlanId.NONE;
-                if (!intfNode.path(VLAN).isMissingNode()) {
-                    vlan = VlanId.vlanId(Short.valueOf(intfNode.path(VLAN).asText()));
-                }
+                VlanId vlan = getVlan(intfNode);
 
                 interfaces.add(new Interface(subject, ips, mac, vlan));
             }
@@ -77,13 +72,64 @@
         return interfaces;
     }
 
+    /**
+     * Adds an interface to the config.
+     *
+     * @param intf interface to add
+     */
+    public void addInterface(Interface intf) {
+        ObjectNode intfNode = array.addObject();
+        intfNode.put(MAC, intf.mac().toString());
+
+        if (!intf.ipAddresses().isEmpty()) {
+            intfNode.set(IPS, putIps(intf.ipAddresses()));
+        }
+
+        if (!intf.vlan().equals(VlanId.NONE)) {
+            intfNode.put(VLAN, intf.vlan().toString());
+        }
+    }
+
+    /**
+     * Removes an interface from the config.
+     *
+     * @param intf interface to remove
+     */
+    public void removeInterface(Interface intf) {
+        for (int i = 0; i < array.size(); i++) {
+            if (intf.vlan().equals(getVlan(node))) {
+                array.remove(i);
+                break;
+            }
+        }
+    }
+
+    private VlanId getVlan(JsonNode node) {
+        VlanId vlan = VlanId.NONE;
+        if (!node.path(VLAN).isMissingNode()) {
+            vlan = VlanId.vlanId(Short.valueOf(node.path(VLAN).asText()));
+        }
+        return vlan;
+    }
+
     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())));
+        if (ipsNode != null) {
+            ipsNode.forEach(jsonNode ->
+                    ips.add(InterfaceIpAddress.valueOf(jsonNode.asText())));
+        }
 
         return ips;
     }
 
+    private ArrayNode putIps(Set<InterfaceIpAddress> intfIpAddresses) {
+        ArrayNode ipArray = mapper.createArrayNode();
+
+        intfIpAddresses.forEach(i -> ipArray.add(i.toString()));
+
+        return ipArray;
+    }
+
 }
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
new file mode 100644
index 0000000..56d5aec
--- /dev/null
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/intf/InterfaceAdminService.java
@@ -0,0 +1,40 @@
+/*
+ * 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.VlanId;
+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 vlanId vlan id
+     */
+    void remove(ConnectPoint connectPoint, VlanId vlanId);
+}
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/intf/impl/InterfaceManager.java b/incubator/net/src/main/java/org/onosproject/incubator/net/intf/impl/InterfaceManager.java
index f82cdbf..0439d03 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/intf/impl/InterfaceManager.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/intf/impl/InterfaceManager.java
@@ -29,6 +29,7 @@
 import org.onosproject.incubator.net.config.basics.ConfigException;
 import org.onosproject.incubator.net.config.basics.InterfaceConfig;
 import org.onosproject.incubator.net.intf.Interface;
+import org.onosproject.incubator.net.intf.InterfaceAdminService;
 import org.onosproject.incubator.net.intf.InterfaceService;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.config.NetworkConfigEvent;
@@ -50,7 +51,8 @@
  */
 @Service
 @Component(immediate = true)
-public class InterfaceManager implements InterfaceService {
+public class InterfaceManager implements InterfaceService,
+        InterfaceAdminService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -153,6 +155,54 @@
         interfaces.remove(port);
     }
 
+    @Override
+    public void add(Interface intf) {
+        if (interfaces.containsKey(intf.connectPoint())) {
+            boolean conflict = interfaces.get(intf.connectPoint()).stream()
+                    .filter(i -> i.connectPoint().equals(intf.connectPoint()))
+                    .filter(i -> i.mac().equals(intf.mac()))
+                    .filter(i -> i.vlan().equals(intf.vlan()))
+                    .findAny().isPresent();
+
+            if (conflict) {
+                log.error("Can't add interface because it conflicts with existing config");
+                return;
+            }
+        }
+
+        InterfaceConfig config =
+                configService.addConfig(intf.connectPoint(), CONFIG_CLASS);
+
+        config.addInterface(intf);
+
+        configService.applyConfig(intf.connectPoint(), CONFIG_CLASS, config.node());
+    }
+
+    @Override
+    public void remove(ConnectPoint connectPoint, VlanId vlanId) {
+        Optional<Interface> intf = interfaces.get(connectPoint).stream()
+                .filter(i -> i.vlan().equals(vlanId))
+                .findAny();
+
+        if (!intf.isPresent()) {
+            log.error("Can't find interface {}/{} to remove", connectPoint, vlanId);
+            return;
+        }
+
+        InterfaceConfig config = configService.addConfig(intf.get().connectPoint(), CONFIG_CLASS);
+        config.removeInterface(intf.get());
+
+        try {
+            if (config.getInterfaces().isEmpty()) {
+                configService.removeConfig(connectPoint, CONFIG_CLASS);
+            } else {
+                configService.applyConfig(intf.get().connectPoint(), CONFIG_CLASS, config.node());
+            }
+        } catch (ConfigException e) {
+            log.error("Error reading interfaces JSON", e);
+        }
+    }
+
     /**
      * Listener for network config events.
      */
