diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceAddCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceAddCommand.java
index e0901e4..36778c0 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceAddCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceAddCommand.java
@@ -35,17 +35,20 @@
          description = "Configures a device interface")
 public class DeviceInterfaceAddCommand extends AbstractShellCommand {
 
+    private static final String ONE_ACTION_ALLOWED =
+            "One configuration action allowed at a time";
     private static final String CONFIG_VLAN_SUCCESS =
             "VLAN %s added on device %s interface %s.";
     private static final String CONFIG_VLAN_FAILURE =
             "Failed to add VLAN %s on device %s interface %s.";
-    private static final String ONE_VLAN_ALLOWED =
-            "Only one VLAN allowed for access mode on device %s interface %s.";
-
     private static final String CONFIG_TRUNK_SUCCESS =
             "Trunk mode added for VLAN %s on device %s interface %s.";
     private static final String CONFIG_TRUNK_FAILURE =
             "Failed to add trunk mode for VLAN %s on device %s interface %s.";
+    private static final String CONFIG_RATE_SUCCESS =
+            "Rate limit %d%% added on device %s interface %s.";
+    private static final String CONFIG_RATE_FAILURE =
+            "Failed to add rate limit %d%% on device %s interface %s.";
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
@@ -56,15 +59,20 @@
               required = true, multiValued = false)
     private String portName = null;
 
-    @Argument(index = 2, name = "vlan",
-            description = "VLAN ID",
-            required = true, multiValued = true)
-    private String[] vlanStrings = null;
+    @Option(name = "-r", aliases = "--rate-limit",
+            description = "Percentage for egress bandwidth limit",
+            required = false, multiValued = false)
+    private String limitString = null;
 
     @Option(name = "-t", aliases = "--trunk",
-            description = "Configure interface as trunk for VLAN(s)",
+            description = "VLAN(s) for trunk port (multiple values are allowed)",
+            required = false, multiValued = true)
+    private String[] trunkVlanStrings = null;
+
+    @Option(name = "-a", aliases = "--access",
+            description = "VLAN for access port",
             required = false, multiValued = false)
-    private boolean trunkMode = false;
+    private String accessVlanString = null;
 
     @Override
     protected void execute() {
@@ -73,31 +81,51 @@
         DriverHandler h = service.createHandler(deviceId);
         InterfaceConfig interfaceConfig = h.behaviour(InterfaceConfig.class);
 
+        if (accessVlanString != null && trunkVlanStrings == null &&
+                limitString == null) {
+            // Access mode to be enabled for VLAN.
+            addAccessModeToIntf(interfaceConfig);
+        } else if (trunkVlanStrings != null && accessVlanString == null &&
+                limitString == null) {
+            // Trunk mode to be enabled for VLANs.
+            addTrunkModeToIntf(interfaceConfig);
+        } else if (limitString != null && accessVlanString == null &&
+                trunkVlanStrings == null) {
+            // Rate limit to be set on interface.
+            addRateLimitToIntf(interfaceConfig);
+        } else {
+            // Option has not been correctly set.
+            print(ONE_ACTION_ALLOWED);
+        }
+    }
+
+    private void addRateLimitToIntf(InterfaceConfig config) {
+        short rate = Short.parseShort(limitString);
+        if (config.addRateLimit(portName, rate)) {
+            print(CONFIG_RATE_SUCCESS, rate, uri, portName);
+        } else {
+            print(CONFIG_RATE_FAILURE, rate, uri, portName);
+        }
+    }
+
+    private void addTrunkModeToIntf(InterfaceConfig config) {
         List<VlanId> vlanIds = new ArrayList<>();
-        for (String vlanString : vlanStrings) {
+        for (String vlanString : trunkVlanStrings) {
             vlanIds.add(VlanId.vlanId(Short.parseShort(vlanString)));
         }
-
-        if (trunkMode) {
-            // Trunk mode to be enabled for VLAN.
-            if (interfaceConfig.addTrunkInterface(deviceId, portName, vlanIds)) {
-                print(CONFIG_TRUNK_SUCCESS, vlanIds, deviceId, portName);
-            } else {
-                print(CONFIG_TRUNK_FAILURE, vlanIds, deviceId, portName);
-            }
-            return;
-        }
-
-        // Access mode to be enabled for VLAN.
-        if (vlanIds.size() != 1) {
-            print(ONE_VLAN_ALLOWED, deviceId, portName);
-            return;
-        }
-        VlanId accessVlanId = vlanIds.get(0);
-        if (interfaceConfig.addAccessInterface(deviceId, portName, accessVlanId)) {
-            print(CONFIG_VLAN_SUCCESS, accessVlanId, deviceId, portName);
+        if (config.addTrunkMode(portName, vlanIds)) {
+            print(CONFIG_TRUNK_SUCCESS, vlanIds, uri, portName);
         } else {
-            print(CONFIG_VLAN_FAILURE, accessVlanId, deviceId, portName);
+            print(CONFIG_TRUNK_FAILURE, vlanIds, uri, portName);
+        }
+    }
+
+    private void addAccessModeToIntf(InterfaceConfig config) {
+        VlanId accessVlanId = VlanId.vlanId(Short.parseShort(accessVlanString));
+        if (config.addAccessMode(portName, accessVlanId)) {
+            print(CONFIG_VLAN_SUCCESS, accessVlanId, uri, portName);
+        } else {
+            print(CONFIG_VLAN_FAILURE, accessVlanId, uri, portName);
         }
     }
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceRemoveCommand.java
index 79bedf3..3daa77f 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceRemoveCommand.java
@@ -25,36 +25,51 @@
 import org.onosproject.net.driver.DriverService;
 
 /**
- * Removes configured interface from a device.
+ * Removes an interface configurion from a device.
  */
 @Command(scope = "onos", name = "device-remove-interface",
          description = "Removes an interface configuration from a device")
 public class DeviceInterfaceRemoveCommand extends AbstractShellCommand {
 
+    private static final String ONE_ACTION_ALLOWED =
+            "One configuration removal allowed at a time";
     private static final String REMOVE_ACCESS_SUCCESS =
-            "Access mode deleted from device %s interface %s.";
+            "Access mode removed from device %s interface %s.";
     private static final String REMOVE_ACCESS_FAILURE =
-            "Failed to delete access mode from device %s interface %s.";
-
+            "Failed to remove access mode from device %s interface %s.";
     private static final String REMOVE_TRUNK_SUCCESS =
-            "Trunk mode deleted from device %s interface %s.";
+            "Trunk mode removed from device %s interface %s.";
     private static final String REMOVE_TRUNK_FAILURE =
-            "Failed to delete trunk mode from device %s interface %s.";
+            "Failed to remove trunk mode from device %s interface %s.";
+    private static final String REMOVE_RATE_SUCCESS =
+            "Rate limit removed from device %s interface %s.";
+    private static final String REMOVE_RATE_FAILURE =
+            "Failed to remove rate limit from device %s interface %s.";
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
     private String uri = null;
 
     @Argument(index = 1, name = "interface",
-              description = "Interface name",
-              required = true, multiValued = false)
+            description = "Interface name",
+            required = true, multiValued = false)
     private String portName = null;
 
+    @Option(name = "-r", aliases = "--rate-limit",
+            description = "Percentage for egress bandwidth limit",
+            required = false, multiValued = false)
+    private boolean rateLimit = false;
+
     @Option(name = "-t", aliases = "--trunk",
             description = "Remove trunk mode for VLAN(s)",
             required = false, multiValued = false)
     private boolean trunkMode = false;
 
+    @Option(name = "-a", aliases = "--access",
+            description = "Remove access mode for VLAN",
+            required = false, multiValued = false)
+    private boolean accessMode = false;
+
     @Override
     protected void execute() {
         DriverService service = get(DriverService.class);
@@ -62,21 +77,42 @@
         DriverHandler h = service.createHandler(deviceId);
         InterfaceConfig interfaceConfig = h.behaviour(InterfaceConfig.class);
 
-        if (trunkMode) {
+        if (trunkMode && !accessMode && !rateLimit) {
             // Trunk mode for VLAN to be removed.
-            if (interfaceConfig.removeTrunkInterface(deviceId, portName)) {
-                print(REMOVE_TRUNK_SUCCESS, deviceId, portName);
-            } else {
-                print(REMOVE_TRUNK_FAILURE, deviceId, portName);
-            }
-            return;
-        }
-
-        // Access mode for VLAN to be removed.
-        if (interfaceConfig.removeAccessInterface(deviceId, portName)) {
-            print(REMOVE_ACCESS_SUCCESS, deviceId, portName);
+            removeTrunkModeFromIntf(interfaceConfig);
+        } else if (accessMode && !trunkMode && !rateLimit) {
+            // Access mode for VLAN to be removed.
+            removeAccessModeFromIntf(interfaceConfig);
+        } else if (rateLimit && !trunkMode && !accessMode) {
+            // Rate limit to be removed.
+            removeRateLimitFromIntf(interfaceConfig);
         } else {
-            print(REMOVE_ACCESS_FAILURE, deviceId, portName);
+            // Option has not been correctly set.
+            print(ONE_ACTION_ALLOWED);
+        }
+    }
+
+    private void removeAccessModeFromIntf(InterfaceConfig interfaceConfig) {
+        if (interfaceConfig.removeAccessMode(portName)) {
+            print(REMOVE_ACCESS_SUCCESS, uri, portName);
+        } else {
+            print(REMOVE_ACCESS_FAILURE, uri, portName);
+        }
+    }
+
+    private void removeTrunkModeFromIntf(InterfaceConfig interfaceConfig) {
+        if (interfaceConfig.removeTrunkMode(portName)) {
+            print(REMOVE_TRUNK_SUCCESS, uri, portName);
+        } else {
+            print(REMOVE_TRUNK_FAILURE, uri, portName);
+        }
+    }
+
+    private void removeRateLimitFromIntf(InterfaceConfig config) {
+        if (config.removeRateLimit(portName)) {
+            print(REMOVE_RATE_SUCCESS, uri, portName);
+        } else {
+            print(REMOVE_RATE_FAILURE, uri, portName);
         }
     }
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceInterfacesListCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceInterfacesListCommand.java
index 5a3c17c..c2078be 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceInterfacesListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceInterfacesListCommand.java
@@ -78,7 +78,7 @@
         InterfaceConfig interfaceConfig = h.behaviour(InterfaceConfig.class);
 
         List<DeviceInterfaceDescription> interfaces =
-                interfaceConfig.getInterfaces(device.id());
+                interfaceConfig.getInterfaces();
         if (interfaces == null) {
             print(ERROR_RESULT);
         } else if (interfaces.isEmpty()) {
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/InterfaceConfig.java b/core/api/src/main/java/org/onosproject/net/behaviour/InterfaceConfig.java
index 22c2d8a..fecdf7f 100644
--- a/core/api/src/main/java/org/onosproject/net/behaviour/InterfaceConfig.java
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/InterfaceConfig.java
@@ -34,8 +34,19 @@
      * @param intf the name of the interface
      * @param vlanId the VLAN ID
      * @return the result of operation
+     * @deprecated in 1.7.0 Hummingbird release - use of addAccessMode() instead
      */
-    boolean addAccessInterface(DeviceId deviceId, String intf, VlanId vlanId);
+    @Deprecated
+    public boolean addAccessInterface(DeviceId deviceId, String intf, VlanId vlanId);
+
+    /**
+     * Adds an access interface to a VLAN.
+     *
+     * @param intf the name of the interface
+     * @param vlanId the VLAN ID
+     * @return the result of operation
+     */
+    boolean addAccessMode(String intf, VlanId vlanId);
 
     /**
      * Removes an access interface to a VLAN.
@@ -43,40 +54,99 @@
      * @param deviceId the device ID
      * @param intf the name of the interface
      * @return the result of operation
+     * @deprecated in 1.7.0 Hummingbird release - use of removeAccessMode() instead
      */
+    @Deprecated
     boolean removeAccessInterface(DeviceId deviceId, String intf);
 
     /**
+     * Removes an access interface to a VLAN.
+     *
+     * @param intf the name of the interface
+     * @return the result of operation
+     */
+    boolean removeAccessMode(String intf);
+
+    /**
      *  Adds a trunk interface for VLANs.
      *
      * @param deviceId the device ID
      * @param intf the name of the interface
      * @param vlanIds the VLAN IDs
      * @return the result of operation
+     * @deprecated in 1.7.0 Hummingbird release - use of addTrunkMode() instead
      */
+    @Deprecated
     boolean addTrunkInterface(DeviceId deviceId, String intf, List<VlanId> vlanIds);
 
     /**
-     *  Removes trunk mode configuration from an interface.
+     *  Adds a trunk interface for VLANs.
+     *
+     * @param intf the name of the interface
+     * @param vlanIds the VLAN IDs
+     * @return the result of operation
+     */
+    boolean addTrunkMode(String intf, List<VlanId> vlanIds);
+
+    /**
+     * Removes trunk mode configuration from an interface.
      *
      * @param deviceId the device ID
      * @param intf the name of the interface
      * @return the result of operation
+     * @deprecated in 1.7.0 Hummingbird release - use of removeTrunkMode() instead
      */
+    @Deprecated
     boolean removeTrunkInterface(DeviceId deviceId, String intf);
 
     /**
+     *  Removes trunk mode configuration from an interface.
+     *
+     * @param intf the name of the interface
+     * @return the result of operation
+     */
+    boolean removeTrunkMode(String intf);
+
+    /**
+     * Adds a rate limit on an interface.
+     *
+     * @param intf the name of the interface
+     * @param limit the limit as a percentage
+     * @return the result of operation
+     */
+    boolean addRateLimit(String intf, short limit);
+
+    /**
+     * Removes rate limit from an interface.
+     *
+     * @param intf the name of the interface
+     * @return the result of operation
+     */
+    boolean removeRateLimit(String intf);
+
+    /**
      * Provides the interfaces configured on a device.
      *
      * @param deviceId the device ID
      * @return the list of the configured interfaces
+     * @deprecated in 1.7.0 Hummingbird release - use of getInterfaces() without
+     * deviceId as parameter instead
      */
-    List<DeviceInterfaceDescription> getInterfaces(DeviceId deviceId);
+    @Deprecated
+    public List<DeviceInterfaceDescription> getInterfaces(DeviceId deviceId);
+
+    /**
+     * Provides the interfaces configured on a device.
+     *
+     * @return the list of the configured interfaces
+     */
+    List<DeviceInterfaceDescription> getInterfaces();
 
     /**
      *  TODO Addition of more methods to make the behavior symmetrical.
-     *  Methods getInterfacesForVlan, getVlansForInterface, getTrunkforInterface,
-     *  getInterfacesForTrunk should be added to complete the behavior.
+     *  Methods getInterfacesForVlan(VlanId), hasAccessMode(), hasTrunkMode(),
+     *  getTrunkVlans(Interface), getAccessVlan(Interface) should be added to
+     *  complete the behavior.
      */
 
 }
diff --git a/drivers/cisco/src/main/java/org/onosproject/drivers/cisco/InterfaceConfigCiscoIosImpl.java b/drivers/cisco/src/main/java/org/onosproject/drivers/cisco/InterfaceConfigCiscoIosImpl.java
index ae703cf..f31c8b0 100644
--- a/drivers/cisco/src/main/java/org/onosproject/drivers/cisco/InterfaceConfigCiscoIosImpl.java
+++ b/drivers/cisco/src/main/java/org/onosproject/drivers/cisco/InterfaceConfigCiscoIosImpl.java
@@ -54,6 +54,18 @@
      */
     @Override
     public boolean addAccessInterface(DeviceId deviceId, String intf, VlanId vlanId) {
+        return addAccessMode(intf, vlanId);
+    }
+
+    /**
+     * Adds an access interface to a VLAN.
+     *
+     * @param intf the name of the interface
+     * @param vlanId the VLAN ID
+     * @return the result of operation
+     */
+    @Override
+    public boolean addAccessMode(String intf, VlanId vlanId) {
         NetconfController controller = checkNotNull(handler()
                                        .get(NetconfController.class));
 
@@ -61,10 +73,10 @@
                                  .data().deviceId()).getSession();
         String reply;
         try {
-            reply = session.requestSync(addAccessInterfaceBuilder(intf, vlanId));
+            reply = session.requestSync(addAccessModeBuilder(intf, vlanId));
         } catch (NetconfException e) {
             log.error("Failed to configure VLAN ID {} on device {} interface {}.",
-                      vlanId, deviceId, intf, e);
+                      vlanId, handler().data().deviceId(), intf, e);
             return false;
         }
 
@@ -79,31 +91,13 @@
      * @param vlanId the VLAN ID
      * @return the request string.
      */
-    private String addAccessInterfaceBuilder(String intf, VlanId vlanId) {
-        StringBuilder rpc =
-                new StringBuilder("<rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" ");
-        rpc.append("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">");
-        rpc.append("<edit-config>");
-        rpc.append("<target>");
-        rpc.append("<running/>");
-        rpc.append("</target>");
-        rpc.append("<config>");
-        rpc.append("<xml-config-data>");
-        rpc.append("<Device-Configuration><interface><Param>");
-        rpc.append(intf);
-        rpc.append("</Param>");
-        rpc.append("<ConfigIf-Configuration>");
+    private String addAccessModeBuilder(String intf, VlanId vlanId) {
+        StringBuilder rpc = new StringBuilder(getOpeningString(intf));
         rpc.append("<switchport><access><vlan><VLANIDVLANPortAccessMode>");
         rpc.append(vlanId);
         rpc.append("</VLANIDVLANPortAccessMode></vlan></access></switchport>");
         rpc.append("<switchport><mode><access/></mode></switchport>");
-        rpc.append("</ConfigIf-Configuration>");
-        rpc.append("</interface>");
-        rpc.append("</Device-Configuration>");
-        rpc.append("</xml-config-data>");
-        rpc.append("</config>");
-        rpc.append("</edit-config>");
-        rpc.append("</rpc>");
+        rpc.append(getClosingString());
 
         return rpc.toString();
     }
@@ -117,6 +111,17 @@
      */
     @Override
     public boolean removeAccessInterface(DeviceId deviceId, String intf) {
+        return removeAccessMode(intf);
+    }
+
+    /**
+     * Removes an access interface to a VLAN.
+     *
+     * @param intf the name of the interface
+     * @return the result of operation
+     */
+    @Override
+    public boolean removeAccessMode(String intf) {
         NetconfController controller = checkNotNull(handler()
                                                             .get(NetconfController.class));
 
@@ -124,10 +129,10 @@
                                  .data().deviceId()).getSession();
         String reply;
         try {
-            reply = session.requestSync(removeAccessInterfaceBuilder(intf));
+            reply = session.requestSync(removeAccessModeBuilder(intf));
         } catch (NetconfException e) {
             log.error("Failed to remove access mode from device {} interface {}.",
-                      deviceId, intf, e);
+                      handler().data().deviceId(), intf, e);
             return false;
         }
 
@@ -141,30 +146,12 @@
      * @param intf the name of the interface
      * @return the request string.
      */
-    private String removeAccessInterfaceBuilder(String intf) {
-        StringBuilder rpc =
-                new StringBuilder("<rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" ");
-        rpc.append("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">");
-        rpc.append("<edit-config>");
-        rpc.append("<target>");
-        rpc.append("<running/>");
-        rpc.append("</target>");
-        rpc.append("<config>");
-        rpc.append("<xml-config-data>");
-        rpc.append("<Device-Configuration><interface><Param>");
-        rpc.append(intf);
-        rpc.append("</Param>");
-        rpc.append("<ConfigIf-Configuration>");
+    private String removeAccessModeBuilder(String intf) {
+        StringBuilder rpc = new StringBuilder(getOpeningString(intf));
         rpc.append("<switchport operation=\"delete\"><access><vlan><VLANIDVLANPortAccessMode>");
         rpc.append("</VLANIDVLANPortAccessMode></vlan></access></switchport>");
         rpc.append("<switchport operation=\"delete\"><mode><access/></mode></switchport>");
-        rpc.append("</ConfigIf-Configuration>");
-        rpc.append("</interface>");
-        rpc.append("</Device-Configuration>");
-        rpc.append("</xml-config-data>");
-        rpc.append("</config>");
-        rpc.append("</edit-config>");
-        rpc.append("</rpc>");
+        rpc.append(getClosingString());
 
         return rpc.toString();
     }
@@ -179,6 +166,18 @@
      */
     @Override
     public boolean addTrunkInterface(DeviceId deviceId, String intf, List<VlanId> vlanIds) {
+        return addTrunkMode(intf, vlanIds);
+    }
+
+    /**
+     *  Adds a trunk interface for VLANs.
+     *
+     * @param intf the name of the interface
+     * @param vlanIds the VLAN IDs
+     * @return the result of operation
+     */
+    @Override
+    public boolean addTrunkMode(String intf, List<VlanId> vlanIds) {
         NetconfController controller = checkNotNull(handler()
                                        .get(NetconfController.class));
 
@@ -186,10 +185,10 @@
                                  .data().deviceId()).getSession();
         String reply;
         try {
-            reply = session.requestSync(addTrunkInterfaceBuilder(intf, vlanIds));
+            reply = session.requestSync(addTrunkModeBuilder(intf, vlanIds));
         } catch (NetconfException e) {
             log.error("Failed to configure trunk mode for VLAN ID {} on device {} interface {}.",
-                      vlanIds, deviceId, intf, e);
+                      vlanIds, handler().data().deviceId(), intf, e);
             return false;
         }
 
@@ -204,33 +203,15 @@
      * @param vlanIds the VLAN IDs
      * @return the request string.
      */
-    private String addTrunkInterfaceBuilder(String intf, List<VlanId> vlanIds) {
-        StringBuilder rpc =
-                new StringBuilder("<rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" ");
-        rpc.append("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">");
-        rpc.append("<edit-config>");
-        rpc.append("<target>");
-        rpc.append("<running/>");
-        rpc.append("</target>");
-        rpc.append("<config>");
-        rpc.append("<xml-config-data>");
-        rpc.append("<Device-Configuration><interface><Param>");
-        rpc.append(intf);
-        rpc.append("</Param>");
-        rpc.append("<ConfigIf-Configuration>");
+    private String addTrunkModeBuilder(String intf, List<VlanId> vlanIds) {
+        StringBuilder rpc = new StringBuilder(getOpeningString(intf));
         rpc.append("<switchport><trunk><encapsulation><dot1q/></encapsulation>");
         rpc.append("</trunk></switchport><switchport><trunk><allowed><vlan>");
         rpc.append("<VLANIDsAllowedVLANsPortTrunkingMode>");
         rpc.append(getVlansString(vlanIds));
         rpc.append("</VLANIDsAllowedVLANsPortTrunkingMode></vlan></allowed></trunk>");
         rpc.append("</switchport><switchport><mode><trunk/></mode></switchport>");
-        rpc.append("</ConfigIf-Configuration>");
-        rpc.append("</interface>");
-        rpc.append("</Device-Configuration>");
-        rpc.append("</xml-config-data>");
-        rpc.append("</config>");
-        rpc.append("</edit-config>");
-        rpc.append("</rpc>");
+        rpc.append(getClosingString());
 
         return rpc.toString();
     }
@@ -244,6 +225,17 @@
      */
     @Override
     public boolean removeTrunkInterface(DeviceId deviceId, String intf) {
+        return removeTrunkMode(intf);
+    }
+
+    /**
+     * Removes trunk mode configuration from an interface.
+     *
+     * @param intf the name of the interface
+     * @return the result of operation
+     */
+    @Override
+    public boolean removeTrunkMode(String intf) {
         NetconfController controller = checkNotNull(handler()
                                        .get(NetconfController.class));
 
@@ -251,10 +243,10 @@
                              .data().deviceId()).getSession();
     String reply;
     try {
-        reply = session.requestSync(removeTrunkInterfaceBuilder(intf));
+        reply = session.requestSync(removeTrunkModeBuilder(intf));
     } catch (NetconfException e) {
-        log.error("Failed to remove trunk mode on device {} interface {}.",
-                  deviceId, intf, e);
+        log.error("Failed to remove trunk mode from device {} interface {}.",
+                  handler().data().deviceId(), intf, e);
         return false;
     }
 
@@ -268,7 +260,114 @@
      * @param intf the name of the interface
      * @return the request string.
      */
-    private String removeTrunkInterfaceBuilder(String intf) {
+    private String removeTrunkModeBuilder(String intf) {
+        StringBuilder rpc = new StringBuilder(getOpeningString(intf));
+        rpc.append("<switchport><mode operation=\"delete\"><trunk/></mode></switchport>");
+        rpc.append("<switchport><trunk operation=\"delete\"><encapsulation>");
+        rpc.append("<dot1q/></encapsulation></trunk></switchport>");
+        rpc.append("<switchport><trunk operation=\"delete\"><allowed><vlan>");
+        rpc.append("<VLANIDsAllowedVLANsPortTrunkingMode>");
+        rpc.append("</VLANIDsAllowedVLANsPortTrunkingMode></vlan></allowed>");
+        rpc.append("</trunk></switchport>");
+        rpc.append(getClosingString());
+
+        return rpc.toString();
+    }
+
+    /**
+     * Adds a rate limit on an interface.
+     *
+     * @param intf the name of the interface
+     * @param limit the limit as a percentage
+     * @return the result of operation
+     */
+    @Override
+    public boolean addRateLimit(String intf, short limit) {
+        NetconfController controller = checkNotNull(handler()
+                                       .get(NetconfController.class));
+
+        NetconfSession session = controller.getDevicesMap().get(handler()
+                                 .data().deviceId()).getSession();
+        String reply;
+        try {
+            reply = session.requestSync(addRateLimitBuilder(intf, limit));
+        } catch (NetconfException e) {
+            log.error("Failed to configure rate limit {}%% on device {} interface {}.",
+                      limit, handler().data().deviceId(), intf, e);
+            return false;
+        }
+
+        return XmlConfigParser.configSuccess(XmlConfigParser.loadXml(
+                new ByteArrayInputStream(reply.getBytes(StandardCharsets.UTF_8))));
+    }
+
+    /**
+     * Builds a request to configure an interface with rate limit.
+     *
+     * @param intf the name of the interface
+     * @param limit the limit as a percentage
+     * @return the request string.
+     */
+    private String addRateLimitBuilder(String intf, short limit) {
+        StringBuilder rpc = new StringBuilder(getOpeningString(intf));
+        rpc.append("<srr-queue><bandwidth><limit>");
+        rpc.append("<EnterBandwidthLimitInterfaceAsPercentage>");
+        rpc.append(limit);
+        rpc.append("</EnterBandwidthLimitInterfaceAsPercentage>");
+        rpc.append("</limit></bandwidth></srr-queue>");
+        rpc.append(getClosingString());
+
+        return rpc.toString();
+    }
+
+    /**
+     * Removes rate limit from an interface.
+     *
+     * @param intf the name of the interface
+     * @return the result of operation
+     */
+    @Override
+    public boolean removeRateLimit(String intf) {
+        NetconfController controller = checkNotNull(handler()
+                                       .get(NetconfController.class));
+
+        NetconfSession session = controller.getDevicesMap().get(handler()
+                                 .data().deviceId()).getSession();
+        String reply;
+        try {
+            reply = session.requestSync(removeRateLimitBuilder(intf));
+        } catch (NetconfException e) {
+            log.error("Failed to remove rate limit from device {} interface {}.",
+                      handler().data().deviceId(), intf, e);
+            return false;
+        }
+
+        return XmlConfigParser.configSuccess(XmlConfigParser.loadXml(
+                new ByteArrayInputStream(reply.getBytes(StandardCharsets.UTF_8))));
+    }
+
+    /**
+     * Builds a request to remove a rate limit from an interface.
+     *
+     * @param intf the name of the interface
+     * @return the request string.
+     */
+    private String removeRateLimitBuilder(String intf) {
+        StringBuilder rpc = new StringBuilder(getOpeningString(intf));
+        rpc.append("<srr-queue operation=\"delete\"><bandwidth><limit>");
+        rpc.append("</limit></bandwidth></srr-queue>");
+        rpc.append(getClosingString());
+
+        return rpc.toString();
+    }
+
+    /**
+     * Builds the opening of a request for the configuration of an interface.
+     *
+     * @param intf the interface to be configured
+     * @return the opening string
+     */
+    private String getOpeningString(String intf) {
         StringBuilder rpc =
                 new StringBuilder("<rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" ");
         rpc.append("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">");
@@ -282,13 +381,17 @@
         rpc.append(intf);
         rpc.append("</Param>");
         rpc.append("<ConfigIf-Configuration>");
-        rpc.append("<switchport><mode operation=\"delete\"><trunk/></mode></switchport>");
-        rpc.append("<switchport><trunk operation=\"delete\"><encapsulation>");
-        rpc.append("<dot1q/></encapsulation></trunk></switchport>");
-        rpc.append("<switchport><trunk operation=\"delete\"><allowed><vlan>");
-        rpc.append("<VLANIDsAllowedVLANsPortTrunkingMode>");
-        rpc.append("</VLANIDsAllowedVLANsPortTrunkingMode></vlan></allowed>");
-        rpc.append("</trunk></switchport></ConfigIf-Configuration>");
+
+        return rpc.toString();
+    }
+
+    /**
+     * Builds the closing of a request for the configuration of an interface.
+     *
+     * @return the closing string
+     */
+    private String getClosingString() {
+        StringBuilder rpc = new StringBuilder("</ConfigIf-Configuration>");
         rpc.append("</interface>");
         rpc.append("</Device-Configuration>");
         rpc.append("</xml-config-data>");
@@ -326,6 +429,16 @@
      */
     @Override
     public List<DeviceInterfaceDescription> getInterfaces(DeviceId deviceId) {
+        return getInterfaces();
+    }
+
+    /**
+     * Provides the interfaces configured on a device.
+     *
+     * @return the list of the configured interfaces
+     */
+    @Override
+    public List<DeviceInterfaceDescription> getInterfaces() {
         NetconfController controller =
                 checkNotNull(handler().get(NetconfController.class));
 
@@ -336,7 +449,7 @@
             reply = session.requestSync(getConfigBuilder());
         } catch (NetconfException e) {
             log.error("Failed to retrieve configuration from device {}.",
-                      deviceId, e);
+                      handler().data().deviceId(), e);
             return null;
         }
 
