diff --git a/apps/routing/src/main/java/org/onosproject/routing/impl/ControlPlaneRedirectManager.java b/apps/routing/src/main/java/org/onosproject/routing/impl/ControlPlaneRedirectManager.java
index b85f79f..a82d4ff 100644
--- a/apps/routing/src/main/java/org/onosproject/routing/impl/ControlPlaneRedirectManager.java
+++ b/apps/routing/src/main/java/org/onosproject/routing/impl/ControlPlaneRedirectManager.java
@@ -16,8 +16,16 @@
 
 package org.onosproject.routing.impl;
 
-import com.google.common.collect.ImmutableSortedSet;
-import com.google.common.collect.Maps;
+import static com.google.common.base.Preconditions.checkState;
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -30,6 +38,8 @@
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.incubator.net.intf.Interface;
+import org.onosproject.incubator.net.intf.InterfaceEvent;
+import org.onosproject.incubator.net.intf.InterfaceListener;
 import org.onosproject.incubator.net.intf.InterfaceService;
 import org.onosproject.mastership.MastershipService;
 import org.onosproject.net.ConnectPoint;
@@ -59,15 +69,8 @@
 import org.onosproject.routing.config.RouterConfig;
 import org.slf4j.Logger;
 
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-
-import static org.slf4j.LoggerFactory.getLogger;
-import static com.google.common.base.Preconditions.checkState;
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.common.collect.Maps;
 
 /**
  * Manages connectivity between peers redirecting control traffic to a routing
@@ -115,6 +118,7 @@
     private final InternalNetworkConfigListener networkConfigListener =
             new InternalNetworkConfigListener();
     private final InternalHostListener hostListener = new InternalHostListener();
+    private final InternalInterfaceListener interfaceListener = new InternalInterfaceListener();
 
     @Activate
     public void activate() {
@@ -123,6 +127,7 @@
         deviceService.addListener(deviceListener);
         networkConfigService.addListener(networkConfigListener);
         hostService.addListener(hostListener);
+        interfaceService.addListener(interfaceListener);
 
         updateConfig();
     }
@@ -132,6 +137,7 @@
         deviceService.removeListener(deviceListener);
         networkConfigService.removeListener(networkConfigListener);
         hostService.removeListener(hostListener);
+        interfaceService.removeListener(interfaceListener);
     }
 
     private void updateConfig() {
@@ -167,33 +173,44 @@
         }
     }
 
-    private void provisionInterface(Interface intf) {
-        addBasicInterfaceForwarding(intf);
-        updateOspfForwarding(intf);
+    private void removeInterface(Interface intf) {
+        modifyBasicInterfaceForwarding(intf, false);
+        updateOspfForwarding(intf, false);
     }
 
-    private void addBasicInterfaceForwarding(Interface intf) {
+    private void provisionInterface(Interface intf) {
+        modifyBasicInterfaceForwarding(intf, true);
+        updateOspfForwarding(intf, true);
+    }
+    /**
+     * Install or removes the basic forwarding flows for each interface
+     * based on the flag used.
+     *
+     * @param intf the Interface on which event is received
+     * @param install true to create an add objective, false to create a remove
+     *            objective
+     **/
+    private void modifyBasicInterfaceForwarding(Interface intf, boolean install) {
         log.debug("Adding interface objectives for {}", intf);
 
         DeviceId deviceId = controlPlaneConnectPoint.deviceId();
         PortNumber controlPlanePort = controlPlaneConnectPoint.port();
-
         for (InterfaceIpAddress ip : intf.ipAddresses()) {
             // create nextObjectives for forwarding to this interface and the
             // controlPlaneConnectPoint
             int cpNextId, intfNextId;
             if (intf.vlan() == VlanId.NONE) {
-                cpNextId = createNextObjective(deviceId, controlPlanePort,
+                cpNextId = modifyNextObjective(deviceId, controlPlanePort,
                                VlanId.vlanId(SingleSwitchFibInstaller.ASSIGNED_VLAN),
-                               true);
-                intfNextId = createNextObjective(deviceId, intf.connectPoint().port(),
+                               true, install);
+                intfNextId = modifyNextObjective(deviceId, intf.connectPoint().port(),
                                VlanId.vlanId(SingleSwitchFibInstaller.ASSIGNED_VLAN),
-                               true);
+                               true, install);
             } else {
-                cpNextId = createNextObjective(deviceId, controlPlanePort,
-                                               intf.vlan(), false);
-                intfNextId = createNextObjective(deviceId, intf.connectPoint().port(),
-                                                 intf.vlan(), false);
+                cpNextId = modifyNextObjective(deviceId, controlPlanePort,
+                                               intf.vlan(), false, install);
+                intfNextId = modifyNextObjective(deviceId, intf.connectPoint().port(),
+                                                 intf.vlan(), false, install);
             }
 
             // IPv4 to router
@@ -206,7 +223,7 @@
                     .build();
 
             flowObjectiveService.forward(deviceId,
-                    buildForwardingObjective(toSelector, null, cpNextId, true));
+                    buildForwardingObjective(toSelector, null, cpNextId, install));
 
             // IPv4 from router
             TrafficSelector fromSelector = DefaultTrafficSelector.builder()
@@ -218,7 +235,7 @@
                     .build();
 
             flowObjectiveService.forward(deviceId,
-                    buildForwardingObjective(fromSelector, null, intfNextId, true));
+                    buildForwardingObjective(fromSelector, null, intfNextId, install));
 
             // ARP to router
             toSelector = DefaultTrafficSelector.builder()
@@ -232,7 +249,7 @@
                     .build();
 
             flowObjectiveService.forward(deviceId,
-                    buildForwardingObjective(toSelector, puntTreatment, cpNextId, true));
+                    buildForwardingObjective(toSelector, puntTreatment, cpNextId, install));
 
             // ARP from router
             fromSelector = DefaultTrafficSelector.builder()
@@ -244,11 +261,18 @@
                     .build();
 
             flowObjectiveService.forward(deviceId,
-            buildForwardingObjective(fromSelector, puntTreatment, intfNextId, true));
+            buildForwardingObjective(fromSelector, puntTreatment, intfNextId, install));
         }
     }
 
-    private void updateOspfForwarding(Interface intf) {
+    /**
+     * Install or removes ospf forwarding rules.
+     *
+     * @param intf the Interface on which event is received
+     * @param install true to create an add objective, false to create a remove
+     *            objective
+     **/
+    private void updateOspfForwarding(Interface intf, boolean install) {
         // OSPF to router
         TrafficSelector toSelector = DefaultTrafficSelector.builder()
                 .matchInPort(intf.connectPoint().port())
@@ -262,16 +286,16 @@
         PortNumber controlPlanePort = controlPlaneConnectPoint.port();
         int cpNextId;
         if (intf.vlan() == VlanId.NONE) {
-            cpNextId = createNextObjective(deviceId, controlPlanePort,
+            cpNextId = modifyNextObjective(deviceId, controlPlanePort,
                            VlanId.vlanId(SingleSwitchFibInstaller.ASSIGNED_VLAN),
-                           true);
+                           true, install);
         } else {
-            cpNextId = createNextObjective(deviceId, controlPlanePort,
-                                           intf.vlan(), false);
+            cpNextId = modifyNextObjective(deviceId, controlPlanePort,
+                                           intf.vlan(), false, install);
         }
         log.debug("ospf flows intf:{} nextid:{}", intf, cpNextId);
         flowObjectiveService.forward(controlPlaneConnectPoint.deviceId(),
-                buildForwardingObjective(toSelector, null, cpNextId, ospfEnabled));
+                buildForwardingObjective(toSelector, null, cpNextId, install ? ospfEnabled : install));
     }
 
     /**
@@ -282,10 +306,12 @@
      * @param portNumber the egress port
      * @param vlanId vlan information for egress port
      * @param popVlan if vlan tag should be popped or not
+     * @param install true to create an add next objective, false to create a remove
+     *            next objective
      * @return nextId of the next objective created
      */
-    private int createNextObjective(DeviceId deviceId, PortNumber portNumber,
-                                    VlanId vlanId, boolean popVlan) {
+    private int modifyNextObjective(DeviceId deviceId, PortNumber portNumber,
+                                    VlanId vlanId, boolean popVlan, boolean install) {
         int nextId = flowObjectiveService.allocateNextId();
         NextObjective.Builder nextObjBuilder = DefaultNextObjective
                 .builder().withId(nextId)
@@ -307,10 +333,13 @@
         nextObjBuilder.addTreatment(ttBuilder.build());
         log.debug("Submited next objective {} in device {} for port/vlan {}/{}",
                 nextId, deviceId, portNumber, vlanId);
-        flowObjectiveService.next(deviceId, nextObjBuilder.add());
+        if (install) {
+             flowObjectiveService.next(deviceId, nextObjBuilder.add());
+        } else {
+             flowObjectiveService.next(deviceId, nextObjBuilder.remove());
+        }
         return nextId;
     }
-
     /**
      * Builds a forwarding objective from the given selector, treatment and nextId.
      *
@@ -344,6 +373,7 @@
      * Listener for device events.
      */
     private class InternalDeviceListener implements DeviceListener {
+
         @Override
         public void event(DeviceEvent event) {
             if (controlPlaneConnectPoint != null &&
@@ -374,6 +404,7 @@
      * Listener for network config events.
      */
     private class InternalNetworkConfigListener implements NetworkConfigListener {
+
         @Override
         public void event(NetworkConfigEvent event) {
             if (event.configClass().equals(RoutingService.ROUTER_CONFIG_CLASS)) {
@@ -396,6 +427,7 @@
      * Listener for host events.
      */
     private class InternalHostListener implements HostListener {
+
         private void peerAdded(HostEvent event) {
             Host peer = event.subject();
             Optional<Interface> peerIntf =
@@ -536,4 +568,27 @@
                 2000 * prefix.prefixLength() + MIN_IP_PRIORITY :
                 500 * prefix.prefixLength() + MIN_IP_PRIORITY;
     }
+    private class InternalInterfaceListener implements InterfaceListener {
+
+        @Override
+        public void event(InterfaceEvent event) {
+             Interface intf = event.subject();
+                switch (event.type()) {
+                case INTERFACE_ADDED:
+                    if (intf != null && !intf.connectPoint().equals(controlPlaneConnectPoint)) {
+                        provisionInterface(intf);
+                    }
+                    break;
+                case INTERFACE_UPDATED:
+                    break;
+                case INTERFACE_REMOVED:
+                    if (intf != null && !intf.connectPoint().equals(controlPlaneConnectPoint)) {
+                        removeInterface(intf);
+                    }
+                    break;
+                default:
+                    break;
+                }
+        }
+    }
 }
