diff --git a/apps/routing/fibinstaller/src/main/java/org/onosproject/routing/fibinstaller/FibInstaller.java b/apps/routing/fibinstaller/src/main/java/org/onosproject/routing/fibinstaller/FibInstaller.java
index 6401679..04b4352 100644
--- a/apps/routing/fibinstaller/src/main/java/org/onosproject/routing/fibinstaller/FibInstaller.java
+++ b/apps/routing/fibinstaller/src/main/java/org/onosproject/routing/fibinstaller/FibInstaller.java
@@ -19,7 +19,6 @@
 import com.google.common.collect.ConcurrentHashMultiset;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multiset;
-import com.google.common.collect.Sets;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -44,7 +43,6 @@
 import org.onosproject.incubator.net.routing.RouteEvent;
 import org.onosproject.incubator.net.routing.RouteListener;
 import org.onosproject.incubator.net.routing.RouteService;
-import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.config.ConfigFactory;
 import org.onosproject.net.config.NetworkConfigEvent;
@@ -70,9 +68,13 @@
 import org.onosproject.routing.AsyncDeviceFetcher;
 import org.onosproject.routing.NextHop;
 import org.onosproject.routing.NextHopGroupKey;
-import org.onosproject.routing.RouterInterfaceManager;
+import org.onosproject.routing.RouterInfo;
+import org.onosproject.routing.InterfaceProvisionRequest;
+import org.onosproject.routing.Router;
 import org.onosproject.routing.RoutingService;
-import org.onosproject.routing.config.RouterConfig;
+import org.onosproject.routing.config.RouterConfigHelper;
+import org.onosproject.routing.config.RoutersConfig;
+import org.onosproject.routing.config.RoutingConfigurationService;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -124,6 +126,9 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected ApplicationService applicationService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected RoutingConfigurationService rs;
+
     @Property(name = "routeToNextHop", boolValue = false,
             label = "Install a /32 or /128 route to each next hop")
     private boolean routeToNextHop = false;
@@ -131,9 +136,7 @@
     // Device id of data-plane switch - should be learned from config
     private DeviceId deviceId;
 
-    private ConnectPoint controlPlaneConnectPoint;
-
-    private RouterInterfaceManager interfaceManager;
+    private Router interfaceManager;
     private AsyncDeviceFetcher asyncDeviceFetcher;
 
     private ApplicationId coreAppId;
@@ -207,32 +210,27 @@
     }
 
     private void processRouterConfig() {
-        RouterConfig routerConfig =
-                networkConfigService.getConfig(routerAppId, RoutingService.ROUTER_CONFIG_CLASS);
-
-        if (routerConfig == null) {
+        Set<RoutersConfig.Router> routerConfigs =
+                RouterConfigHelper.getRouterConfigurations(networkConfigService, routerAppId);
+        if (routerConfigs.isEmpty()) {
             log.info("Router config not available");
             return;
         }
+        RoutersConfig.Router routerConfig = routerConfigs.stream().findFirst().get();
 
-        Set<String> interfaces = Sets.newHashSet(routerConfig.getInterfaces());
-
-        if (deviceId == null) {
-            controlPlaneConnectPoint = routerConfig.getControlPlaneConnectPoint();
-            log.info("Control Plane Connect Point: {}", controlPlaneConnectPoint);
-
-            deviceId = routerConfig.getControlPlaneConnectPoint().deviceId();
+        if (interfaceManager == null) {
+            deviceId = routerConfig.controlPlaneConnectPoint().deviceId();
             log.info("Router device ID is {}", deviceId);
 
             routeService.addListener(routeListener);
-            asyncDeviceFetcher.getDevice(deviceId).whenComplete((deviceId, e) ->
-                    interfaceManager = createRouter(deviceId, interfaces));
+
+            interfaceManager = createRouter(RouterInfo.from(routerConfig));
         } else {
-            interfaceManager.changeConfiguredInterfaces(interfaces);
+            interfaceManager.changeConfiguration(RouterInfo.from(routerConfig));
         }
     }
 
-    /*
+    /**
      * Removes filtering objectives and routes before deactivate.
      */
     private void cleanUp() {
@@ -249,10 +247,11 @@
         }
     }
 
-    private RouterInterfaceManager createRouter(DeviceId deviceId, Set<String> configuredInterfaces) {
-        return new RouterInterfaceManager(deviceId,
-                configuredInterfaces,
+    private Router createRouter(RouterInfo info) {
+        return new Router(
+                info,
                 interfaceService,
+                deviceService,
                 this::provisionInterface,
                 this::unprovisionInterface);
     }
@@ -410,11 +409,11 @@
         return group;
     }*/
 
-    private void provisionInterface(Interface intf) {
+    private void provisionInterface(InterfaceProvisionRequest intf) {
         updateInterfaceFilters(intf, true);
     }
 
-    private void unprovisionInterface(Interface intf) {
+    private void unprovisionInterface(InterfaceProvisionRequest intf) {
         updateInterfaceFilters(intf, false);
     }
 
@@ -424,7 +423,7 @@
      * @param intf interface to update objectives for
      * @param install true to install the objectives, false to remove them
      */
-    private void updateInterfaceFilters(Interface intf, boolean install) {
+    private void updateInterfaceFilters(InterfaceProvisionRequest intf, boolean install) {
         updateFilteringObjective(intf, install);
         updateMcastFilteringObjective(intf, install);
     }
@@ -432,10 +431,11 @@
     /**
      * Installs or removes unicast filtering objectives relating to an interface.
      *
-     * @param intf interface to update objectives for
+     * @param routerIntf interface to update objectives for
      * @param install true to install the objectives, false to remove them
      */
-    private void updateFilteringObjective(Interface intf, boolean install) {
+    private void updateFilteringObjective(InterfaceProvisionRequest routerIntf, boolean install) {
+        Interface intf = routerIntf.intf();
         VlanId assignedVlan = (egressVlan().equals(VlanId.NONE)) ?
                 VlanId.vlanId(ASSIGNED_VLAN) :
                 egressVlan();
@@ -454,20 +454,19 @@
         fob.permit().fromApp(fibAppId);
         sendFilteringObjective(install, fob, intf);
 
-        if (controlPlaneConnectPoint != null) {
-            // then add the same mac/vlan filters for control-plane connect point
-            fob.withKey(Criteria.matchInPort(controlPlaneConnectPoint.port()));
-            sendFilteringObjective(install, fob, intf);
-        }
+        // then add the same mac/vlan filters for control-plane connect point
+        fob.withKey(Criteria.matchInPort(routerIntf.controlPlaneConnectPoint().port()));
+        sendFilteringObjective(install, fob, intf);
     }
 
     /**
      * Installs or removes multicast filtering objectives relating to an interface.
      *
-     * @param intf interface to update objectives for
+     * @param routerIntf interface to update objectives for
      * @param install true to install the objectives, false to remove them
      */
-    private void updateMcastFilteringObjective(Interface intf, boolean install) {
+    private void updateMcastFilteringObjective(InterfaceProvisionRequest routerIntf, boolean install) {
+        Interface intf = routerIntf.intf();
         VlanId assignedVlan = (egressVlan().equals(VlanId.NONE)) ?
                 VlanId.vlanId(ASSIGNED_VLAN) :
                 egressVlan();
