diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/OpenstackSwitchingManager.java b/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/OpenstackSwitchingManager.java
index 0e7ebac..d881d81 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/OpenstackSwitchingManager.java
+++ b/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/OpenstackSwitchingManager.java
@@ -17,7 +17,6 @@
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -26,8 +25,6 @@
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.Ip4Address;
-import org.onlab.packet.Ip4Prefix;
-import org.onlab.packet.MacAddress;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.dhcp.DhcpService;
@@ -41,6 +38,7 @@
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.driver.DriverService;
 import org.onosproject.net.flowobjective.FlowObjectiveService;
 import org.onosproject.net.packet.InboundPacket;
 import org.onosproject.net.packet.PacketContext;
@@ -49,7 +47,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import java.util.List;
-import java.util.Map;
 import java.util.Collection;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
@@ -82,18 +79,23 @@
     protected FlowObjectiveService flowObjectiveService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected DhcpService dhcpService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected NetworkConfigRegistry cfgService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DhcpService dhcpService;
-
-    public static final int DHCP_PORT = 67;
+    protected DriverService driverService;
 
     private ApplicationId appId;
     private boolean doNotPushFlows;
+    private Ip4Address neutronServer;
+    private Ip4Address keystoneServer;
+    private String userName;
+    private String password;
     private OpenstackArpHandler arpHandler;
+    private OpenstackRestHandler restHandler;
 
-    private OpenstackSwitchingRulePopulator rulePopulator;
     private ExecutorService deviceEventExcutorService = Executors.newFixedThreadPool(10);
 
     private InternalPacketProcessor internalPacketProcessor = new InternalPacketProcessor();
@@ -109,38 +111,18 @@
                 }
             }
     );
-    // Map <port_id, OpenstackPort>
-    private Map<String, OpenstackPort> openstackPortMap;
-    // Map <network_id, OpenstackNetwork>
-    private Map<String, OpenstackNetwork> openstackNetworkMap;
-    // Map <subnet_id, OpenstackSubner>
-    private Map<String, OpenstackSubnet> openstackSubnetMap;
-    // Map <vni, List <Entry <portName, host ip>>
-    private Map<String, List<PortInfo>> vniPortMap;
-    private Map<Ip4Address, Port> tunnelPortMap;
-
 
     @Activate
     protected void activate() {
         appId = coreService
                 .registerApplication("org.onosproject.openstackswitching");
+
+        factories.forEach(cfgService::registerConfigFactory);
         packetService.addProcessor(internalPacketProcessor, PacketProcessor.director(1));
         deviceService.addListener(internalDeviceListener);
         cfgService.addListener(internalConfigListener);
-        factories.forEach(cfgService::registerConfigFactory);
-        OpenstackSwitchingConfig cfg =
-                cfgService.getConfig(appId, OpenstackSwitchingConfig.class);
-        if (cfg != null) {
-            doNotPushFlows = cfg.doNotPushFlows();
-        }
-        openstackPortMap = Maps.newHashMap();
-        openstackNetworkMap = Maps.newHashMap();
-        openstackSubnetMap = Maps.newHashMap();
 
-        vniPortMap = Maps.newHashMap();
-        tunnelPortMap = Maps.newHashMap();
-
-        arpHandler = new OpenstackArpHandler(openstackPortMap, packetService);
+        internalConfigListener.configureNetwork();
 
         log.info("Started");
     }
@@ -159,7 +141,6 @@
     @Override
     public void createPorts(OpenstackPort openstackPort) {
         registerDhcpInfo(openstackPort);
-        openstackPortMap.put(openstackPort.id(), openstackPort);
     }
 
     @Override
@@ -174,19 +155,16 @@
 
     @Override
     public void createNetwork(OpenstackNetwork openstackNetwork) {
-        openstackNetworkMap.put(openstackNetwork.id(), openstackNetwork);
     }
 
     @Override
     public void createSubnet(OpenstackSubnet openstackSubnet) {
-        openstackSubnetMap.put(openstackSubnet.id(), openstackSubnet);
-        log.debug("Added Subnet Info {}", openstackNetworkMap.get(openstackSubnet.id()));
     }
 
     @Override
     public Collection<OpenstackPort> ports(String networkId) {
-
-        List<OpenstackPort> portList = openstackPortMap.values().stream()
+        Collection<OpenstackPort> ports = restHandler.getPorts();
+        List<OpenstackPort> portList = ports.stream()
                 .filter(p -> p.networkId().equals(networkId))
                 .collect(Collectors.toList());
 
@@ -194,47 +172,46 @@
     }
 
     @Override
-    public OpenstackPort port(String portName) {
-        String uuid = portName.substring(3);
-        return (OpenstackPort) openstackPortMap.values().stream()
+    public OpenstackPort port(Port port) {
+        Collection<OpenstackPort> ports = restHandler.getPorts();
+        String uuid = port.annotations().value("portName").substring(3);
+        return ports.stream()
                 .filter(p -> p.id().startsWith(uuid))
-                .findFirst().get().clone();
+                .findFirst().orElse(null);
+    }
+
+    @Override
+    public OpenstackPort port(String portId) {
+        Collection<OpenstackPort> ports = restHandler.getPorts();
+        return ports.stream()
+                .filter(p -> p.id().equals(portId))
+                .findFirst().orElse(null);
     }
 
     @Override
     public OpenstackNetwork network(String networkId) {
-        OpenstackNetwork on = null;
-        try {
-            on = (OpenstackNetwork) openstackNetworkMap.get(networkId).clone();
-        } catch (CloneNotSupportedException e) {
-            log.error("Cloning is not supported {}", e);
-        }
-        return on;
+        Collection<OpenstackNetwork> networks = restHandler.getNetworks();
+        return networks.stream()
+                .filter(n -> n.id().equals(networkId))
+                .findFirst().orElse(null);
     }
 
     private void processDeviceAdded(Device device) {
         log.debug("device {} is added", device.id());
-        rulePopulator.populateDefaultRules(device.id());
     }
 
     private void processPortAdded(Device device, Port port) {
-        // TODO: Simplify the data structure to store the network info
-        // TODO: Make it stateless
-        // TODO: All the logics need to be processed inside of the rulePopulator class
-        synchronized (vniPortMap) {
-            log.debug("port {} is updated", port.toString());
-
-            updatePortMaps(device, port);
-            if (!port.annotations().value("portName").equals("vxlan")) {
-                populateFlowRulesForTrafficToSameCnode(device, port);
-                populateFlowRulesForTrafficToDifferentCnode(device, port);
-            }
+        if (!port.annotations().value("portName").equals("vxlan")) {
+            OpenstackSwitchingRulePopulator rulePopulator =
+                    new OpenstackSwitchingRulePopulator(appId, flowObjectiveService,
+                            deviceService, restHandler, driverService);
+            rulePopulator.populateSwitchingRules(device, port);
         }
     }
 
     private void processPortRemoved(Device device, Port port) {
+        // TODO: Remove flow rules for the VM removed
         log.debug("port {} is removed", port.toString());
-        // TODO: need to update the vniPortMap
     }
 
     private void registerDhcpInfo(OpenstackPort openstackPort) {
@@ -247,7 +224,7 @@
 
         ip4Address = (Ip4Address) openstackPort.fixedIps().values().toArray()[0];
 
-        openstackSubnet = openstackSubnetMap.values().stream()
+        openstackSubnet = restHandler.getSubnets().stream()
                 .filter(n -> n.networkId().equals(openstackPort.networkId()))
                 .findFirst().get();
 
@@ -280,180 +257,7 @@
         return bytes;
     }
 
-    /**
-     * Populates the flow rules for traffic to VMs in different Cnode using
-     * Nicira extention.
-     *
-     * @param device device to put rules
-     * @param port port information of the VM
-     */
-    private void populateFlowRulesForTrafficToDifferentCnode(Device device, Port port) {
-        String portName = port.annotations().value("portName");
-        String channelId = device.annotations().value("channelId");
-        Ip4Address hostIpAddress = Ip4Address.valueOf(channelId.split(":")[0]);
-        Ip4Address fixedIp = getFixedIpAddressForPort(portName);
-        // TODO: Avoid duplicate flow rule set up for VMs in other Cnode
-        //       (possibly avoided by flowrule subsystem?)
-        if (tunnelPortMap.get(hostIpAddress) == null) {
-            log.debug("There is no tunnel port information");
-            return;
-        }
-        String vni = getVniForPort(portName);
-        MacAddress vmMac = getVmMacAddressForPort(portName);
-        if (!vniPortMap.isEmpty() && vniPortMap.get(vni) != null) {
-            for (PortInfo portInfo : vniPortMap.get(vni)) {
-                if (!portInfo.portName.equals(portName) &&
-                        !portInfo.hostIp.equals(hostIpAddress)) {
-                    MacAddress vmMacx = getVmMacAddressForPort(portInfo.portName);
-                    rulePopulator.populateForwardingRuleForOtherCnode(vni,
-                            device.id(), portInfo.hostIp, portInfo.fixedIp, vmMacx,
-                            tunnelPortMap.get(hostIpAddress).number(),
-                            portInfo.deviceId, hostIpAddress, fixedIp, vmMac,
-                            tunnelPortMap.get(portInfo.hostIp).number());
-                }
-            }
-        }
-    }
 
-    /**
-     * Populates the flow rules for traffic to VMs in the same Cnode as the sender.
-     *
-     * @param device device to put the rules
-     * @param port port info of the VM
-     */
-    private void populateFlowRulesForTrafficToSameCnode(Device device, Port port) {
-        Ip4Prefix cidr = getCidrForPort(port.annotations().value("portName"));
-        Ip4Address vmIp = getFixedIpAddressForPort(port.annotations().value("portName"));
-        if (vmIp != null) {
-            rulePopulator.populateForwardingRule(vmIp, device.id(), port, cidr);
-        }
-    }
-
-    /**
-     * Updates the port maps using the port information.
-     *
-     * @param device device info
-     * @param port port of the VM
-     */
-    private void updatePortMaps(Device device, Port port) {
-        String portName = port.annotations().value("portName");
-        String channelId = device.annotations().value("channelId");
-        Ip4Address hostIpAddress = Ip4Address.valueOf(channelId.split(":")[0]);
-        if (portName.startsWith("vxlan")) {
-            tunnelPortMap.put(hostIpAddress, port);
-        } else {
-            String vni = getVniForPort(portName);
-            Ip4Address fixedIp = getFixedIpAddressForPort(portName);
-            if (vniPortMap.get(vni) == null) {
-                vniPortMap.put(vni, Lists.newArrayList());
-            }
-            vniPortMap.get(vni).add(new PortInfo(device.id(), portName, fixedIp, hostIpAddress));
-        }
-    }
-
-    /**
-     * Returns CIDR information from the subnet map for the port.
-     *
-     * @param portName port name of the port of the VM
-     * @return CIDR of the VNI of the VM
-     */
-    private Ip4Prefix getCidrForPort(String portName) {
-        String networkId = null;
-        String uuid = portName.substring(3);
-        OpenstackPort port = openstackPortMap.values().stream()
-                .filter(p -> p.id().startsWith(uuid))
-                .findFirst().get();
-        if (port == null) {
-            log.debug("No port information for port {}", portName);
-            return null;
-        }
-
-        OpenstackSubnet subnet = openstackSubnetMap.values().stream()
-                .filter(s -> s.networkId().equals(port.networkId()))
-                .findFirst().get();
-        if (subnet == null) {
-            log.debug("No subnet information for network {}", port.networkId());
-            return null;
-        }
-
-        return Ip4Prefix.valueOf(subnet.cidr());
-    }
-
-    /**
-     * Returns the VNI of the VM of the port.
-     *
-     * @param portName VM port
-     * @return VNI
-     */
-    private String getVniForPort(String portName) {
-        String networkId = null;
-        String uuid = portName.substring(3);
-        OpenstackPort port = openstackPortMap.values().stream()
-                .filter(p -> p.id().startsWith(uuid))
-                .findFirst().get();
-        if (port == null) {
-            log.debug("No port information for port {}", portName);
-            return null;
-        }
-        OpenstackNetwork network = openstackNetworkMap.values().stream()
-                .filter(n -> n.id().equals(port.networkId()))
-                .findFirst().get();
-        if (network == null) {
-            log.debug("No VNI information for network {}", network.id());
-            return null;
-        }
-
-        return network.segmentId();
-    }
-
-    /**
-     * Returns the Fixed IP address of the VM.
-     *
-     * @param portName VM port info
-     * @return IP address of the VM
-     */
-    private Ip4Address getFixedIpAddressForPort(String portName) {
-
-        // FIXME - For now we use the information stored from neutron Rest API call.
-        // TODO - Later, the information needs to be extracted from Neutron on-demand.
-        String uuid = portName.substring(3);
-        OpenstackPort port = openstackPortMap.values().stream()
-                        .filter(p -> p.id().startsWith(uuid))
-                        .findFirst().get();
-
-        if (port == null) {
-            log.error("There is no port information for port name {}", portName);
-            return null;
-        }
-
-        if (port.fixedIps().isEmpty()) {
-            log.error("There is no fixed IP info in the port information");
-            return null;
-        }
-
-        return (Ip4Address) port.fixedIps().values().toArray()[0];
-    }
-
-    /**
-     * Returns the MAC address of the VM of the port.
-     *
-     * @param portName VM port
-     * @return MAC address of the VM
-     */
-    private MacAddress getVmMacAddressForPort(String portName) {
-
-        String uuid = portName.substring(3);
-        OpenstackPort port = openstackPortMap.values().stream()
-                .filter(p -> p.id().startsWith(uuid))
-                .findFirst().get();
-
-        if (port == null) {
-            log.error("There is no mac information for port name {}", portName);
-            return null;
-        }
-
-        return port.macAddress();
-    }
 
     private class InternalPacketProcessor implements PacketProcessor {
 
@@ -529,20 +333,28 @@
 
     private class InternalConfigListener implements NetworkConfigListener {
 
+        public void configureNetwork() {
+            OpenstackSwitchingConfig cfg =
+                    cfgService.getConfig(appId, OpenstackSwitchingConfig.class);
+            if (cfg == null) {
+                log.error("There is no openstack server information in config.");
+                return;
+            }
+            doNotPushFlows = cfg.doNotPushFlows();
+            restHandler = new OpenstackRestHandler(cfg);
+            arpHandler = new OpenstackArpHandler(restHandler, packetService);
+        }
+
         @Override
         public void event(NetworkConfigEvent event) {
             if (((event.type() == NetworkConfigEvent.Type.CONFIG_ADDED ||
             event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED)) &&
                     event.configClass().equals(OpenstackSwitchingConfig.class)) {
-                OpenstackSwitchingConfig cfg = cfgService.getConfig(appId,
-                        OpenstackSwitchingConfig.class);
-                if (cfg != null) {
-                    doNotPushFlows = cfg.doNotPushFlows();
-                    log.info("Switching mode reconfigured");
-                }
+               configureNetwork();
             }
         }
-   }
+
+    }
 
     private final class PortInfo {
         DeviceId deviceId;
