diff --git a/apps/routing/src/main/java/org/onosproject/routing/impl/SingleSwitchFibInstaller.java b/apps/routing/src/main/java/org/onosproject/routing/impl/SingleSwitchFibInstaller.java
index 00924cd..c036d8c 100644
--- a/apps/routing/src/main/java/org/onosproject/routing/impl/SingleSwitchFibInstaller.java
+++ b/apps/routing/src/main/java/org/onosproject/routing/impl/SingleSwitchFibInstaller.java
@@ -210,13 +210,19 @@
 
     //remove filtering objectives and routes before deactivate.
     private void cleanUp() {
+        //remove the route listener
+        routeService.removeListener(routeListener);
+
         //clean up the routes.
         for (Map.Entry<IpPrefix, IpAddress> routes: prefixToNextHop.entrySet()) {
             deleteRoute(new ResolvedRoute(routes.getKey(), null, null));
         }
+
         //clean up the filtering objective for interfaces.
         Set<Interface> intfs = getInterfaces();
-        processIntfFilters(false, intfs);
+        if (!intfs.isEmpty()) {
+            processIntfFilters(false, intfs);
+        }
     }
 
     private void updateConfig() {
@@ -237,10 +243,36 @@
         log.info("Using interfaces: {}", interfaces.isEmpty() ? "all" : interfaces);
 
         routeService.addListener(routeListener);
-
         updateDevice();
     }
 
+    //remove the filtering objective for interfaces which are no longer part of vRouter config.
+    private void removeFilteringObjectives(NetworkConfigEvent event) {
+        RouterConfig prevRouterConfig = (RouterConfig) event.prevConfig().get();
+        List<String> prevInterfaces = prevRouterConfig.getInterfaces();
+
+        Set<Interface> previntfs = filterInterfaces(prevInterfaces);
+        //if previous interface list is empty it means filtering objectives are
+        //installed for all the interfaces.
+        if (previntfs.isEmpty() && !interfaces.isEmpty()) {
+            Set<Interface> allIntfs = interfaceService.getInterfaces();
+            for (Interface allIntf : allIntfs) {
+                if (!interfaces.contains(allIntf.name())) {
+                    processIntfFilter(false, allIntf);
+                }
+            }
+            return;
+        }
+
+        //remove the filtering objective for the interfaces which are not
+        //part of updated interfaces list.
+        for (Interface prevIntf : previntfs) {
+            if (!interfaces.contains(prevIntf.name())) {
+                processIntfFilter(false, prevIntf);
+            }
+        }
+    }
+
     private void updateDevice() {
         if (deviceId != null && deviceService.isAvailable(deviceId)) {
             Set<Interface> intfs = getInterfaces();
@@ -254,14 +286,19 @@
             intfs = interfaceService.getInterfaces();
         } else {
             // TODO need to fix by making interface names globally unique
-            intfs = interfaceService.getInterfaces().stream()
-                    .filter(intf -> intf.connectPoint().deviceId().equals(deviceId))
-                    .filter(intf -> interfaces.contains(intf.name()))
-                    .collect(Collectors.toSet());
+            intfs = filterInterfaces(interfaces);
         }
         return intfs;
     }
 
+    private Set<Interface> filterInterfaces(List<String> interfaces) {
+        Set<Interface> intfs = interfaceService.getInterfaces().stream()
+                .filter(intf -> intf.connectPoint().deviceId().equals(deviceId))
+                .filter(intf -> interfaces.contains(intf.name()))
+                .collect(Collectors.toSet());
+        return intfs;
+    }
+
     private void updateRoute(ResolvedRoute route) {
         addNextHop(route);
 
@@ -420,6 +457,9 @@
             // Ignore interfaces if they are not on the router switch
             return;
         }
+        if (!interfaces.contains(intf.name()) && install) {
+            return;
+        }
 
         createFilteringObjective(install, intf);
         createMcastFilteringObjective(install, intf);
@@ -557,10 +597,17 @@
                 case CONFIG_ADDED:
                 case CONFIG_UPDATED:
                     updateConfig();
+                    if (event.prevConfig().isPresent()) {
+                        removeFilteringObjectives(event);
+                    }
                     break;
                 case CONFIG_REGISTERED:
+                    break;
                 case CONFIG_UNREGISTERED:
+                    break;
                 case CONFIG_REMOVED:
+                    cleanUp();
+                    break;
                 default:
                     break;
                 }
