diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedSecurityGroupStore.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedSecurityGroupStore.java
index f4fbf52..c7a47faa 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedSecurityGroupStore.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedSecurityGroupStore.java
@@ -159,21 +159,19 @@
             switch (event.type()) {
                 case INSERT:
                     log.debug("OpenStack security group created {}", event.newValue());
-                    eventExecutor.execute(() ->
-                            notifyDelegate(new OpenstackSecurityGroupEvent(
+                    eventExecutor.execute(() -> notifyDelegate(new OpenstackSecurityGroupEvent(
                                     OPENSTACK_SECURITY_GROUP_CREATED,
                                     event.newValue().value())));
                     break;
                 case UPDATE:
                     log.debug("OpenStack security group updated {}", event.newValue());
                     eventExecutor.execute(() -> processUpdate(
-                            event.oldValue().value(),
-                            event.newValue().value()));
+                                    event.oldValue().value(),
+                                    event.newValue().value()));
                     break;
                 case REMOVE:
                     log.debug("OpenStack security group removed {}", event.oldValue());
-                    eventExecutor.execute(() ->
-                            notifyDelegate(new OpenstackSecurityGroupEvent(
+                    eventExecutor.execute(() -> notifyDelegate(new OpenstackSecurityGroupEvent(
                                     OPENSTACK_SECURITY_GROUP_REMOVED,
                                     event.oldValue().value())));
                     break;
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java
index 8263f63..f04071f 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java
@@ -307,80 +307,89 @@
                     updateInstancePort(instPort);
                     break;
                 case HOST_ADDED:
-                    InstancePort existingPort = instancePort(instPort.portId());
-                    if (existingPort == null) {
-                        // first time to add instance
-                        createInstancePort(instPort);
-                    } else {
-                        if (existingPort.state() == INACTIVE) {
-
-                            if (instPort.deviceId().equals(existingPort.deviceId())) {
-
-                                // VM RESTART case
-                                // if the ID of switch where VM is attached to is
-                                // identical, we can assume that the VM was
-                                // restarted in the same location;
-                                // note that the switch port number where VM is
-                                // attached can be varied per each restart
-                                updateInstancePort(instPort);
-                            } else {
-
-                                // VM COLD MIGRATION case
-                                // if the ID of switch where VM is attached to is
-                                // varied, we can assume that the VM was migrated
-                                // to a new location
-                                updateInstancePort(instPort.updateState(MIGRATING));
-                                InstancePort updated = instPort.updateState(MIGRATED);
-                                updateInstancePort(updated.updatePrevLocation(
-                                        existingPort.deviceId(), existingPort.portNumber()));
-                            }
-                        }
-                    }
+                    processHostAddition(instPort);
                     break;
                 case HOST_REMOVED:
-
-                    // in case the instance port cannot be found in the store,
-                    // this indicates that the instance port was removed due to
-                    // the removal of openstack port; in some cases, openstack
-                    // port removal message arrives before ovs port removal message
-                    if (instancePortStore.instancePort(instPort.portId()) == null) {
-                        log.debug("instance port was removed before ovs port removal");
-                        break;
-                    }
-
-                    // we will remove instance port from persistent store,
-                    // only if we receive port removal signal from neutron.
-                    // by default, we update the instance port state to INACTIVE
-                    // to indicate the instance is terminated
-                    updateInstancePort(instPort.updateState(INACTIVE));
+                    processHostRemoval(instPort);
                     break;
                 case HOST_MOVED:
-                    Host oldHost = event.prevSubject();
-                    Host currHost = event.subject();
-
-                    // in the middle of VM migration
-                    if (oldHost.locations().size() < currHost.locations().size()) {
-                        updateInstancePort(instPort.updateState(MIGRATING));
-                    }
-
-                    // finish of VM migration
-                    if (oldHost.locations().size() > currHost.locations().size()) {
-                        Set<HostLocation> diff =
-                                Sets.difference(oldHost.locations(), currHost.locations());
-                        HostLocation location = diff.stream().findFirst().orElse(null);
-
-                        if (location != null) {
-                            InstancePort updated = instPort.updateState(MIGRATED);
-                            updateInstancePort(updated.updatePrevLocation(
-                                        location.deviceId(), location.port()));
-                        }
-                    }
+                    processHostMove(event, instPort);
                     break;
                 default:
                     break;
             }
         }
 
+        private void processHostAddition(InstancePort instPort) {
+            InstancePort existingPort = instancePort(instPort.portId());
+            if (existingPort == null) {
+                // first time to add instance
+                createInstancePort(instPort);
+            } else {
+                if (existingPort.state() == INACTIVE) {
+
+                    if (instPort.deviceId().equals(existingPort.deviceId())) {
+                        // VM RESTART case
+                        // if the ID of switch where VM is attached to is
+                        // identical, we can assume that the VM was
+                        // restarted in the same location;
+                        // note that the switch port number where VM is
+                        // attached can be varied per each restart
+                        updateInstancePort(instPort);
+                    } else {
+                        // VM COLD MIGRATION case
+                        // if the ID of switch where VM is attached to is
+                        // varied, we can assume that the VM was migrated
+                        // to a new location
+                        updateInstancePort(instPort.updateState(MIGRATING));
+                        InstancePort updated = instPort.updateState(MIGRATED);
+                        updateInstancePort(updated.updatePrevLocation(
+                                existingPort.deviceId(), existingPort.portNumber()));
+                    }
+                }
+            }
+        }
+
+        private void processHostRemoval(InstancePort instPort) {
+            /* in case the instance port cannot be found in the store,
+               this indicates that the instance port was removed due to
+               the removal of openstack port; in some cases, openstack
+               port removal message arrives before ovs port removal message */
+            if (instancePortStore.instancePort(instPort.portId()) == null) {
+                log.debug("instance port was removed before ovs port removal");
+                return;
+            }
+
+            /* we will remove instance port from persistent store,
+               only if we receive port removal signal from neutron.
+               by default, we update the instance port state to INACTIVE
+               to indicate the instance is terminated */
+            updateInstancePort(instPort.updateState(INACTIVE));
+        }
+
+        private void processHostMove(HostEvent event, InstancePort instPort) {
+            Host oldHost = event.prevSubject();
+            Host currHost = event.subject();
+
+            // in the middle of VM migration
+            if (oldHost.locations().size() < currHost.locations().size()) {
+                updateInstancePort(instPort.updateState(MIGRATING));
+            }
+
+            // finish of VM migration
+            if (oldHost.locations().size() > currHost.locations().size()) {
+                Set<HostLocation> diff =
+                        Sets.difference(oldHost.locations(), currHost.locations());
+                HostLocation location = diff.stream().findFirst().orElse(null);
+
+                if (location != null) {
+                    InstancePort updated = instPort.updateState(MIGRATED);
+                    updateInstancePort(updated.updatePrevLocation(
+                            location.deviceId(), location.port()));
+                }
+            }
+        }
+
         private boolean isValidHost(Host host) {
             return !host.ipAddresses().isEmpty() &&
                     host.annotations().value(ANNOTATION_NETWORK_ID) != null &&
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenStackSwitchingDirectPortProvider.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenStackSwitchingDirectPortProvider.java
index 642b686..382c054 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenStackSwitchingDirectPortProvider.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenStackSwitchingDirectPortProvider.java
@@ -62,7 +62,7 @@
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.CONTROLLER;
 
 @Component(immediate = true)
-public final class OpenStackSwitchingDirectPortProvider {
+public class OpenStackSwitchingDirectPortProvider {
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     private static final String UNBOUND = "unbound";
@@ -102,7 +102,7 @@
     private ApplicationId appId;
 
     @Activate
-    void activate() {
+    protected void activate() {
         appId = coreService.registerApplication(OPENSTACK_NETWORKING_APP_ID);
         localNodeId = clusterService.getLocalNode().id();
         leadershipService.runForLeadership(appId.name());
@@ -113,7 +113,7 @@
     }
 
     @Deactivate
-    void deactivate() {
+    protected void deactivate() {
         leadershipService.withdraw(appId.name());
         osNetworkService.removeListener(openstackNetworkListener);
         osNodeService.removeListener(internalNodeListener);
@@ -131,44 +131,41 @@
         public void event(OpenstackNetworkEvent event) {
             switch (event.type()) {
                 case OPENSTACK_PORT_UPDATED:
-
-                    executor.execute(() -> {
-
-                        if (!isRelevantHelper()) {
-                            return;
-                        }
-
-                        if (event.port().getState() == State.DOWN) {
-                            processPortRemoved(event.port());
-                        } else {
-                            processPortAdded(event.port());
-                        }
-                    });
-
+                    executor.execute(() -> processPortUpdate(event));
                     break;
                 case OPENSTACK_PORT_REMOVED:
-
-                    executor.execute(() -> {
-
-                        if (!isRelevantHelper()) {
-                            return;
-                        }
-
-                        processPortRemoved(event.port());
-                    });
-
+                    executor.execute(() -> processPortRemoval(event));
                     break;
                 default:
                     break;
-
             }
         }
 
-        private void processPortAdded(Port port) {
+        private void processPortUpdate(OpenstackNetworkEvent event) {
+            if (!isRelevantHelper()) {
+                return;
+            }
+
+            if (event.port().getState() == State.DOWN) {
+                removePort(event.port());
+            } else {
+                addPort(event.port());
+            }
+        }
+
+        private void processPortRemoval(OpenstackNetworkEvent event) {
+            if (!isRelevantHelper()) {
+                return;
+            }
+
+            removePort(event.port());
+        }
+
+        private void addPort(Port port) {
             if (!port.getvNicType().equals(DIRECT)) {
                 return;
             } else if (!port.isAdminStateUp() || port.getVifType().equals(UNBOUND)) {
-                log.trace("processPortAdded skipped because of status: {}, adminStateUp: {}, vifType: {}",
+                log.trace("AddPort skipped because of status: {}, adminStateUp: {}, vifType: {}",
                         port.getState(), port.isAdminStateUp(), port.getVifType());
                 return;
             } else {
@@ -176,7 +173,7 @@
                         .filter(node -> node.hostname().equals(port.getHostId()))
                         .findAny();
                 if (!osNode.isPresent()) {
-                    log.error("processPortAdded failed because openstackNode doesn't exist that matches hostname {}",
+                    log.error("AddPort failed because openstackNode doesn't exist that matches hostname {}",
                             port.getHostId());
                     return;
                 }
@@ -184,7 +181,7 @@
 
                 String intfName = getIntfNameFromPciAddress(port);
                 if (intfName == null) {
-                    log.error("Failed to execute processPortAdded because of null interface name");
+                    log.error("Failed to execute AddPort because of null interface name");
                     return;
                 } else if (intfName.equals(UNSUPPORTED_VENDOR)) {
                     return;
@@ -211,11 +208,11 @@
             }
         }
 
-        private void processPortRemoved(Port port) {
+        private void removePort(Port port) {
             if (!port.getvNicType().equals(DIRECT)) {
                 return;
             } else if (instancePortService.instancePort(port.getId()) == null) {
-                log.trace("processPortRemoved skipped because no instance port exist for portId: {}", port.getId());
+                log.trace("RemovePort skipped because no instance port exist for portId: {}", port.getId());
                 return;
             } else {
                 InstancePort instancePort = instancePortService.instancePort(port.getId());
@@ -236,14 +233,14 @@
                         .findAny();
 
                 if (!removedPort.isPresent()) {
-                    log.error("Failed to execute processPortAdded because port number doesn't exist");
+                    log.error("Failed to execute RemovePort because port number doesn't exist");
                     return;
                 }
 
                 String intfName = removedPort.get().annotations().value(PORT_NAME);
 
                 if (intfName == null) {
-                    log.error("Failed to execute processPortAdded because of null interface name");
+                    log.error("Failed to execute RemovePort because of null interface name");
                     return;
                 }
                 log.trace("Retrieved interface name: {}", intfName);
@@ -276,29 +273,27 @@
 
             switch (event.type()) {
                 case OPENSTACK_NODE_COMPLETE:
-                    log.info("COMPLETE node {} is detected", osNode.hostname());
-
-                    executor.execute(() -> {
-
-                        if (!isRelevantHelper(event)) {
-                            return;
-                        }
-
-                        processComputeState(event.subject());
-                    });
-
+                    executor.execute(() -> processNodeCompletion(event, osNode));
                     break;
                 case OPENSTACK_NODE_INCOMPLETE:
                 case OPENSTACK_NODE_CREATED:
                 case OPENSTACK_NODE_UPDATED:
                 case OPENSTACK_NODE_REMOVED:
-                    // not reacts to the events other than complete and incomplete states
-                    break;
                 default:
                     break;
             }
         }
 
+        private void processNodeCompletion(OpenstackNodeEvent event,
+                                           OpenstackNode osNode) {
+            log.info("COMPLETE node {} is detected", osNode.hostname());
+            if (!isRelevantHelper(event)) {
+                return;
+            }
+
+            processComputeState(event.subject());
+        }
+
         private void processComputeState(OpenstackNode node) {
             List<Port> ports = osNetworkService.ports().stream()
                     .filter(port -> port.getvNicType().equals(DIRECT))
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackMetadataProxyHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackMetadataProxyHandler.java
index 9446976..66250e0 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackMetadataProxyHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackMetadataProxyHandler.java
@@ -454,9 +454,6 @@
             log.info("Sending HTTP {} request to metadata endpoint {}...", method, url);
 
             switch (method) {
-                case HTTP_GET_METHOD:
-                    request = new HttpGet(url);
-                    break;
                 case HTTP_POST_METHOD:
                     request = new HttpPost(url);
                     HttpEntityEnclosingRequest postRequest =
@@ -472,6 +469,7 @@
                 case HTTP_DELETE_METHOD:
                     request = new HttpDelete(url);
                     break;
+                case HTTP_GET_METHOD:
                 default:
                     request = new HttpGet(url);
                     break;
@@ -532,6 +530,17 @@
                     ByteBuffer.wrap(ethReply.serialize())));
             context.block();
         }
+
+        private String metadataSecret() {
+            OpenstackNode controller = osNodeService.completeNodes(CONTROLLER)
+                    .stream().findFirst().orElse(null);
+
+            if (controller != null && controller.neutronConfig() != null) {
+                return controller.neutronConfig().metadataProxySecret();
+            }
+
+            return null;
+        }
     }
 
     private class InternalNodeEventListener implements OpenstackNodeListener {
@@ -550,28 +559,10 @@
             OpenstackNode osNode = event.subject();
             switch (event.type()) {
                 case OPENSTACK_NODE_COMPLETE:
-
-                    eventExecutor.execute(() -> {
-
-                        if (!isRelevantHelper()) {
-                            return;
-                        }
-
-                        setMetadataRule(osNode, true);
-                    });
-
+                    eventExecutor.execute(() -> processNodeCompletion(osNode));
                     break;
                 case OPENSTACK_NODE_INCOMPLETE:
-
-                    eventExecutor.execute(() -> {
-
-                        if (!isRelevantHelper()) {
-                            return;
-                        }
-
-                        setMetadataRule(osNode, false);
-                    });
-
+                    eventExecutor.execute(() -> processNodeIncompletion(osNode));
                     break;
                 case OPENSTACK_NODE_CREATED:
                 case OPENSTACK_NODE_UPDATED:
@@ -581,6 +572,22 @@
             }
         }
 
+        private void processNodeCompletion(OpenstackNode osNode) {
+            if (!isRelevantHelper()) {
+                return;
+            }
+
+            setMetadataRule(osNode, true);
+        }
+
+        private void processNodeIncompletion(OpenstackNode osNode) {
+            if (!isRelevantHelper()) {
+                return;
+            }
+
+            setMetadataRule(osNode, false);
+        }
+
         /**
          * Installs metadata rule for receiving all metadata request packets.
          *
@@ -622,17 +629,6 @@
         return false;
     }
 
-    private String metadataSecret() {
-        OpenstackNode controller = osNodeService.completeNodes(CONTROLLER)
-                .stream().findFirst().orElse(null);
-
-        if (controller != null && controller.neutronConfig() != null) {
-            return controller.neutronConfig().metadataProxySecret();
-        }
-
-        return null;
-    }
-
     /**
      * Implements Http packet format.
      */
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackNetworkManager.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackNetworkManager.java
index 3491450..c028331 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackNetworkManager.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackNetworkManager.java
@@ -99,7 +99,6 @@
 
     private static final String ERR_NULL_NETWORK  = "OpenStack network cannot be null";
     private static final String ERR_NULL_NETWORK_ID  = "OpenStack network ID cannot be null";
-    private static final String ERR_NULL_NETWORK_NAME  = "OpenStack network name cannot be null";
     private static final String ERR_NULL_SUBNET = "OpenStack subnet cannot be null";
     private static final String ERR_NULL_SUBNET_ID = "OpenStack subnet ID cannot be null";
     private static final String ERR_NULL_SUBNET_NET_ID = "OpenStack subnet network ID cannot be null";
@@ -108,9 +107,7 @@
     private static final String ERR_NULL_PORT_ID = "OpenStack port ID cannot be null";
     private static final String ERR_NULL_PORT_NET_ID = "OpenStack port network ID cannot be null";
 
-    private static final String ERR_NOT_FOUND = " does not exist";
     private static final String ERR_IN_USE = " still in use";
-    private static final String ERR_DUPLICATE = " already exists";
 
     private static final int PREFIX_LENGTH = 32;
 
@@ -331,7 +328,6 @@
                             .filter(p -> p.getId().contains(portName.substring(3)))
                             .findFirst();
                     return osPort.orElse(null);
-
                 case DIRECT:
                     //Additional prefixes will be added
                     osPort = osNetworkStore.ports()
@@ -340,7 +336,6 @@
                             .filter(p -> Objects.requireNonNull(getIntfNameFromPciAddress(p)).equals(portName))
                             .findFirst();
                     return osPort.orElse(null);
-
                 default:
                     return null;
             }
@@ -532,11 +527,10 @@
             log.info("Updated external peer router map {}",
                     externalPeerRouterMap.get(ipAddress.toString()).value().toString());
         } catch (Exception e) {
-            log.error("Exception occurred because of {}", e.toString());
+            log.error("Exception occurred because of {}", e);
         }
     }
 
-
     @Override
     public void updateExternalPeerRouter(IpAddress ipAddress, MacAddress macAddress, VlanId vlanId) {
         try {
@@ -548,7 +542,7 @@
                             .build());
 
         } catch (Exception e) {
-            log.error("Exception occurred because of {}", e.toString());
+            log.error("Exception occurred because of {}", e);
         }
     }
 
@@ -577,7 +571,7 @@
                             .vlanId(vlanId).build());
 
         } catch (Exception e) {
-            log.error("Exception occurred because of {}", e.toString());
+            log.error("Exception occurred because of {}", e);
         }
     }
 
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java
index 75db5a6..5b60976 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java
@@ -193,30 +193,32 @@
             OpenstackNode osNode = event.subject();
             switch (event.type()) {
                 case OPENSTACK_NODE_COMPLETE:
-                    eventExecutor.execute(() -> {
-
-                        if (!isRelevantHelper()) {
-                            return;
-                        }
-
-                        setIcmpReplyRules(osNode.intgBridge(), true);
-                    });
+                    eventExecutor.execute(() -> processNodeCompletion(osNode));
                     break;
                 case OPENSTACK_NODE_INCOMPLETE:
-                    eventExecutor.execute(() -> {
-
-                        if (!isRelevantHelper()) {
-                            return;
-                        }
-
-                        setIcmpReplyRules(osNode.intgBridge(), false);
-                    });
+                    eventExecutor.execute(() -> processNodeInCompletion(osNode));
                     break;
                 default:
                     break;
             }
         }
 
+        private void processNodeCompletion(OpenstackNode osNode) {
+            if (!isRelevantHelper()) {
+                return;
+            }
+
+            setIcmpReplyRules(osNode.intgBridge(), true);
+        }
+
+        private void processNodeInCompletion(OpenstackNode osNode) {
+            if (!isRelevantHelper()) {
+                return;
+            }
+
+            setIcmpReplyRules(osNode.intgBridge(), false);
+        }
+
         private void setIcmpReplyRules(DeviceId deviceId, boolean install) {
             // Sends ICMP response to controller for SNATing ingress traffic
             TrafficSelector selector = DefaultTrafficSelector.builder()
@@ -289,9 +291,7 @@
             switch (icmp.getIcmpType()) {
                 case TYPE_ECHO_REQUEST:
                     if (handleEchoRequest(context.inPacket().receivedFrom().deviceId(),
-                            ethernet.getSourceMAC(),
-                            ipPacket,
-                            icmp)) {
+                            ethernet.getSourceMAC(), ipPacket, icmp)) {
                         context.block();
                     }
                     break;
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java
index 6203740..1d76063 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java
@@ -92,6 +92,7 @@
     private static final long TIME_OUT_SNAT_PORT_MS = 120L * 1000L;
     private static final int TP_PORT_MINIMUM_NUM = 65000;
     private static final int TP_PORT_MAXIMUM_NUM = 65535;
+    private static final int VM_PREFIX = 32;
 
     private static final KryoNamespace.Builder NUMBER_SERIALIZER = KryoNamespace.newBuilder()
             .register(KryoNamespaces.API);
@@ -258,8 +259,8 @@
         TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder()
                 .matchEthType(Ethernet.TYPE_IPV4)
                 .matchIPProtocol(iPacket.getProtocol())
-                .matchIPDst(IpPrefix.valueOf(externalIp.getIp4Address(), 32))
-                .matchIPSrc(IpPrefix.valueOf(iPacket.getDestinationAddress(), 32));
+                .matchIPDst(IpPrefix.valueOf(externalIp.getIp4Address(), VM_PREFIX))
+                .matchIPSrc(IpPrefix.valueOf(iPacket.getDestinationAddress(), VM_PREFIX));
 
         TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder()
                 .setEthDst(packetIn.parsed().getSourceMAC())
@@ -304,36 +305,45 @@
 
         OpenstackNode srcNode = osNodeService.node(srcInstPort.deviceId());
         osNodeService.completeNodes(GATEWAY).forEach(gNode -> {
-            TrafficTreatment.Builder tmpBuilder =
-                    DefaultTrafficTreatment.builder(tBuilder.build());
-            switch (networkType) {
-                case VXLAN:
-                    tmpBuilder.extension(RulePopulatorUtil.buildExtension(
-                            deviceService,
-                            gNode.intgBridge(),
-                            srcNode.dataIp().getIp4Address()), gNode.intgBridge())
-                            .setOutput(gNode.tunnelPortNum());
-                    break;
-                case VLAN:
-                    tmpBuilder.setOutput(gNode.vlanPortNum());
-                    break;
-                default:
-                    final String error = String.format("%s %s",
-                            ERR_UNSUPPORTED_NET_TYPE, networkType.toString());
-                    throw new IllegalStateException(error);
-            }
-
+            TrafficTreatment treatment =
+                    getDownStreamTreatment(networkType, tBuilder, gNode, srcNode);
             osFlowRuleService.setRule(
                     appId,
                     gNode.intgBridge(),
                     sBuilder.build(),
-                    tmpBuilder.build(),
+                    treatment,
                     PRIORITY_SNAT_RULE,
                     GW_COMMON_TABLE,
                     true);
         });
     }
 
+    private TrafficTreatment getDownStreamTreatment(NetworkType networkType,
+                                                    TrafficTreatment.Builder tBuilder,
+                                                    OpenstackNode gNode,
+                                                    OpenstackNode srcNode) {
+        TrafficTreatment.Builder tmpBuilder =
+                DefaultTrafficTreatment.builder(tBuilder.build());
+        switch (networkType) {
+            case VXLAN:
+                tmpBuilder.extension(RulePopulatorUtil.buildExtension(
+                        deviceService,
+                        gNode.intgBridge(),
+                        srcNode.dataIp().getIp4Address()), gNode.intgBridge())
+                        .setOutput(gNode.tunnelPortNum());
+                break;
+            case VLAN:
+                tmpBuilder.setOutput(gNode.vlanPortNum());
+                break;
+            default:
+                final String error = String.format("%s %s",
+                        ERR_UNSUPPORTED_NET_TYPE, networkType.toString());
+                throw new IllegalStateException(error);
+        }
+
+        return tmpBuilder.build();
+    }
+
     private void setUpstreamRules(String segmentId, NetworkType networkType,
                                   IpAddress externalIp, ExternalPeerRouter externalPeerRouter,
                                   TpPort patPort,
@@ -343,8 +353,8 @@
         TrafficSelector.Builder sBuilder =  DefaultTrafficSelector.builder()
                 .matchEthType(Ethernet.TYPE_IPV4)
                 .matchIPProtocol(iPacket.getProtocol())
-                .matchIPSrc(IpPrefix.valueOf(iPacket.getSourceAddress(), 32))
-                .matchIPDst(IpPrefix.valueOf(iPacket.getDestinationAddress(), 32));
+                .matchIPSrc(IpPrefix.valueOf(iPacket.getSourceAddress(), VM_PREFIX))
+                .matchIPDst(IpPrefix.valueOf(iPacket.getDestinationAddress(), VM_PREFIX));
 
         TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
 
@@ -367,15 +377,13 @@
                 TCP tcpPacket = (TCP) iPacket.getPayload();
                 sBuilder.matchTcpSrc(TpPort.tpPort(tcpPacket.getSourcePort()))
                         .matchTcpDst(TpPort.tpPort(tcpPacket.getDestinationPort()));
-                tBuilder.setTcpSrc(patPort)
-                        .setEthDst(externalPeerRouter.macAddress());
+                tBuilder.setTcpSrc(patPort).setEthDst(externalPeerRouter.macAddress());
                 break;
             case IPv4.PROTOCOL_UDP:
                 UDP udpPacket = (UDP) iPacket.getPayload();
                 sBuilder.matchUdpSrc(TpPort.tpPort(udpPacket.getSourcePort()))
                         .matchUdpDst(TpPort.tpPort(udpPacket.getDestinationPort()));
-                tBuilder.setUdpSrc(patPort)
-                        .setEthDst(externalPeerRouter.macAddress());
+                tBuilder.setUdpSrc(patPort).setEthDst(externalPeerRouter.macAddress());
                 break;
             default:
                 log.debug("Unsupported IPv4 protocol {}");
@@ -408,18 +416,10 @@
         IPv4 iPacket = (IPv4) ethPacketIn.getPayload();
         switch (iPacket.getProtocol()) {
             case IPv4.PROTOCOL_TCP:
-                TCP tcpPacket = (TCP) iPacket.getPayload();
-                tcpPacket.setSourcePort(patPort);
-                tcpPacket.resetChecksum();
-                tcpPacket.setParent(iPacket);
-                iPacket.setPayload(tcpPacket);
+                iPacket.setPayload(buildPacketOutTcp(iPacket, patPort));
                 break;
             case IPv4.PROTOCOL_UDP:
-                UDP udpPacket = (UDP) iPacket.getPayload();
-                udpPacket.setSourcePort(patPort);
-                udpPacket.resetChecksum();
-                udpPacket.setParent(iPacket);
-                iPacket.setPayload(udpPacket);
+                iPacket.setPayload(buildPacketOutUdp(iPacket, patPort));
                 break;
             default:
                 log.trace("Temporally, this method can process UDP and TCP protocol.");
@@ -454,6 +454,24 @@
                 ByteBuffer.wrap(ethPacketIn.serialize())));
     }
 
+    private TCP buildPacketOutTcp(IPv4 iPacket, int patPort) {
+        TCP tcpPacket = (TCP) iPacket.getPayload();
+        tcpPacket.setSourcePort(patPort);
+        tcpPacket.resetChecksum();
+        tcpPacket.setParent(iPacket);
+
+        return tcpPacket;
+    }
+
+    private UDP buildPacketOutUdp(IPv4 iPacket, int patPort) {
+        UDP udpPacket = (UDP) iPacket.getPayload();
+        udpPacket.setSourcePort(patPort);
+        udpPacket.resetChecksum();
+        udpPacket.setParent(iPacket);
+
+        return udpPacket;
+    }
+
     private int getPortNum() {
         if (unUsedPortNumSet.isEmpty()) {
             clearPortNumMap();
@@ -502,16 +520,13 @@
                     UDP udpPacket = (UDP) iPacket.getPayload();
                     if (udpPacket.getDestinationPort() == UDP.DHCP_SERVER_PORT &&
                             udpPacket.getSourcePort() == UDP.DHCP_CLIENT_PORT) {
-                        // don't process DHCP
-                        break;
+                        break; // don't process DHCP
                     }
                 default:
                     eventExecutor.execute(() -> {
-
                         if (!isRelevantHelper(context)) {
                             return;
                         }
-
                         processSnatPacket(context, eth);
                     });
                     break;
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
index d6b0adc..ae91613 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
@@ -101,42 +101,42 @@
     immediate = true,
     property = {
         GATEWAY_MAC + "=" + GATEWAY_MAC_DEFAULT,
-        ARP_MODE + "=" + ARP_MODE_DEFAULT,
+        ARP_MODE + "=" + ARP_MODE_DEFAULT
     }
 )
-public final class OpenstackSwitchingArpHandler {
+public class OpenstackSwitchingArpHandler {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    CoreService coreService;
+    protected CoreService coreService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    PacketService packetService;
+    protected PacketService packetService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    OpenstackFlowRuleService osFlowRuleService;
+    protected OpenstackFlowRuleService osFlowRuleService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    ComponentConfigService configService;
+    protected ComponentConfigService configService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    ClusterService clusterService;
+    protected ClusterService clusterService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    LeadershipService leadershipService;
+    protected LeadershipService leadershipService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    DeviceService deviceService;
+    protected DeviceService deviceService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    MastershipService mastershipService;
+    protected MastershipService mastershipService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    InstancePortService instancePortService;
+    protected InstancePortService instancePortService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    OpenstackNetworkService osNetworkService;
+    protected OpenstackNetworkService osNetworkService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeService osNodeService;
@@ -713,26 +713,10 @@
             switch (event.type()) {
                 case OPENSTACK_SUBNET_CREATED:
                 case OPENSTACK_SUBNET_UPDATED:
-                    eventExecutor.execute(() -> {
-
-                        if (!isRelevantHelper()) {
-                            return;
-                        }
-
-                        setFakeGatewayArpRule(event.subnet(), event.subject(),
-                                true, null);
-                    });
+                    eventExecutor.execute(() -> processSubnetCreation(event));
                     break;
                 case OPENSTACK_SUBNET_REMOVED:
-                    eventExecutor.execute(() -> {
-
-                        if (!isRelevantHelper()) {
-                            return;
-                        }
-
-                        setFakeGatewayArpRule(event.subnet(), event.subject(),
-                                false, null);
-                    });
+                    eventExecutor.execute(() -> processSubnetRemoval(event));
                     break;
                 case OPENSTACK_NETWORK_CREATED:
                 case OPENSTACK_NETWORK_UPDATED:
@@ -745,6 +729,24 @@
                     break;
             }
         }
+
+        private void processSubnetCreation(OpenstackNetworkEvent event) {
+            if (!isRelevantHelper()) {
+                return;
+            }
+
+            setFakeGatewayArpRule(event.subnet(), event.subject(),
+                    true, null);
+        }
+
+        private void processSubnetRemoval(OpenstackNetworkEvent event) {
+            if (!isRelevantHelper()) {
+                return;
+            }
+
+            setFakeGatewayArpRule(event.subnet(), event.subject(),
+                    false, null);
+        }
     }
 
     /**
@@ -767,32 +769,34 @@
             OpenstackNode osNode = event.subject();
             switch (event.type()) {
                 case OPENSTACK_NODE_COMPLETE:
-                    eventExecutor.execute(() -> {
-
-                        if (!isRelevantHelper()) {
-                            return;
-                        }
-
-                        setDefaultArpRule(osNode, true);
-                        setAllArpRules(osNode, true);
-                    });
+                    eventExecutor.execute(() -> processNodeCompletion(osNode));
                     break;
                 case OPENSTACK_NODE_INCOMPLETE:
-                    eventExecutor.execute(() -> {
-
-                        if (!isRelevantHelper()) {
-                            return;
-                        }
-
-                        setDefaultArpRule(osNode, false);
-                        setAllArpRules(osNode, false);
-                    });
+                    eventExecutor.execute(() -> processNodeIncompletion(osNode));
                     break;
                 default:
                     break;
             }
         }
 
+        private void processNodeCompletion(OpenstackNode osNode) {
+            if (!isRelevantHelper()) {
+                return;
+            }
+
+            setDefaultArpRule(osNode, true);
+            setAllArpRules(osNode, true);
+        }
+
+        private void processNodeIncompletion(OpenstackNode osNode) {
+            if (!isRelevantHelper()) {
+                return;
+            }
+
+            setDefaultArpRule(osNode, false);
+            setAllArpRules(osNode, false);
+        }
+
         private void setDefaultArpRule(OpenstackNode osNode, boolean install) {
 
             if (getArpMode() == null) {
@@ -804,20 +808,7 @@
                     setDefaultArpRuleForProxyMode(osNode, install);
                     break;
                 case ARP_BROADCAST_MODE:
-                    setDefaultArpRuleForBroadcastMode(osNode, install);
-
-                    // we do not add fake gateway ARP rules for FLAT network
-                    // ARP packets generated by FLAT typed VM should not be
-                    // delegated to switch to handle
-                    osNetworkService.subnets().stream().filter(subnet ->
-                        osNetworkService.network(subnet.getNetworkId()) != null &&
-                            osNetworkService.network(subnet.getNetworkId())
-                                    .getNetworkType() != NetworkType.FLAT)
-                                    .forEach(subnet -> {
-                                        String netId = subnet.getNetworkId();
-                                        Network net = osNetworkService.network(netId);
-                                        setFakeGatewayArpRule(subnet, net, install, osNode);
-                                    });
+                    processDefaultArpRuleForBroadcastMode(osNode, install);
                     break;
                 default:
                     log.warn("Invalid ARP mode {}. Please use either " +
@@ -826,6 +817,24 @@
             }
         }
 
+        private void processDefaultArpRuleForBroadcastMode(OpenstackNode osNode,
+                                                           boolean install) {
+            setDefaultArpRuleForBroadcastMode(osNode, install);
+
+            // we do not add fake gateway ARP rules for FLAT network
+            // ARP packets generated by FLAT typed VM should not be
+            // delegated to switch to handle
+            osNetworkService.subnets().stream().filter(subnet ->
+                    osNetworkService.network(subnet.getNetworkId()) != null &&
+                            osNetworkService.network(subnet.getNetworkId())
+                                    .getNetworkType() != NetworkType.FLAT)
+                    .forEach(subnet -> {
+                        String netId = subnet.getNetworkId();
+                        Network net = osNetworkService.network(netId);
+                        setFakeGatewayArpRule(subnet, net, install, osNode);
+                    });
+        }
+
         private void setDefaultArpRuleForProxyMode(OpenstackNode osNode, boolean install) {
             TrafficSelector selector = DefaultTrafficSelector.builder()
                     .matchEthType(EthType.EtherType.ARP.ethType().toShort())
@@ -904,41 +913,44 @@
                 case OPENSTACK_INSTANCE_PORT_DETECTED:
                 case OPENSTACK_INSTANCE_PORT_UPDATED:
                 case OPENSTACK_INSTANCE_MIGRATION_STARTED:
-                    eventExecutor.execute(() -> {
-
-                        if (!isRelevantHelper(event)) {
-                            return;
-                        }
-
-                        setArpRequestRule(event.subject(), true);
-                        setArpReplyRule(event.subject(), true);
-                    });
+                    eventExecutor.execute(() -> processInstanceMigrationStart(event));
                     break;
                 case OPENSTACK_INSTANCE_PORT_VANISHED:
-                    eventExecutor.execute(() -> {
-
-                        if (!isRelevantHelper(event)) {
-                            return;
-                        }
-
-                        setArpRequestRule(event.subject(), false);
-                        setArpReplyRule(event.subject(), false);
-                    });
+                    eventExecutor.execute(() -> processInstanceRemoval(event));
                     break;
                 case OPENSTACK_INSTANCE_MIGRATION_ENDED:
-                    eventExecutor.execute(() -> {
-
-                        if (!isRelevantHelper(event)) {
-                            return;
-                        }
-
-                        InstancePort revisedInstPort = swapStaleLocation(event.subject());
-                        setArpRequestRule(revisedInstPort, false);
-                    });
+                    eventExecutor.execute(() -> processInstanceMigrationEnd(event));
                     break;
                 default:
                     break;
             }
         }
+
+        private void processInstanceMigrationStart(InstancePortEvent event) {
+            if (!isRelevantHelper(event)) {
+                return;
+            }
+
+            setArpRequestRule(event.subject(), true);
+            setArpReplyRule(event.subject(), true);
+        }
+
+        private void processInstanceMigrationEnd(InstancePortEvent event) {
+            if (!isRelevantHelper(event)) {
+                return;
+            }
+
+            InstancePort revisedInstPort = swapStaleLocation(event.subject());
+            setArpRequestRule(revisedInstPort, false);
+        }
+
+        private void processInstanceRemoval(InstancePortEvent event) {
+            if (!isRelevantHelper(event)) {
+                return;
+            }
+
+            setArpRequestRule(event.subject(), false);
+            setArpReplyRule(event.subject(), false);
+        }
     }
 }
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java
index 9785c3c..6111395 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java
@@ -113,8 +113,7 @@
     private static final byte DHCP_OPTION_MTU = (byte) 26;
     private static final byte[] DHCP_DATA_LEASE_INFINITE =
             ByteBuffer.allocate(4).putInt(-1).array();
-    // we are using 1450 as a default DHCP MTU value
-    private static final int DHCP_DATA_MTU_DEFAULT = 1450;
+
     private static final int OCTET_BIT_LENGTH = 8;
     private static final int V4_BYTE_SIZE = 4;
     private static final int V4_CIDR_LOWER_BOUND = -1;
@@ -151,8 +150,6 @@
     /** Fake MAC address for virtual network subnet gateway. */
     private String dhcpServerMac = DHCP_SERVER_MAC_DEFAULT;
 
-    private int dhcpDataMtu = DHCP_DATA_MTU_DEFAULT;
-
     private final PacketProcessor packetProcessor = new InternalPacketProcessor();
     private final OpenstackNodeListener osNodeListener = new InternalNodeEventListener();
 
@@ -247,24 +244,10 @@
             Ethernet ethPacket = context.inPacket().parsed();
             switch (inPacketType) {
                 case DHCPDISCOVER:
-                    log.trace("DHCP DISCOVER received from {}", clientMac);
-                    Ethernet discoverReply = buildReply(
-                            ethPacket,
-                            (byte) DHCPOFFER.getValue(),
-                            reqInstPort);
-                    sendReply(context, discoverReply);
-                    log.trace("DHCP OFFER({}) is sent for {}",
-                            reqInstPort.ipAddress(), clientMac);
+                    processDhcpDiscover(context, clientMac, reqInstPort, ethPacket);
                     break;
                 case DHCPREQUEST:
-                    log.trace("DHCP REQUEST received from {}", clientMac);
-                    Ethernet requestReply = buildReply(
-                            ethPacket,
-                            (byte) DHCPACK.getValue(),
-                            reqInstPort);
-                    sendReply(context, requestReply);
-                    log.trace("DHCP ACK({}) is sent for {}",
-                            reqInstPort.ipAddress(), clientMac);
+                    processDhcpRequest(context, clientMac, reqInstPort, ethPacket);
                     break;
                 case DHCPRELEASE:
                     log.trace("DHCP RELEASE received from {}", clientMac);
@@ -275,6 +258,26 @@
             }
         }
 
+        private void processDhcpDiscover(PacketContext context, MacAddress clientMac,
+                                         InstancePort instPort, Ethernet ethPacket) {
+            log.trace("DHCP DISCOVER received from {}", clientMac);
+            Ethernet discoverReply = buildReply(ethPacket,
+                                                (byte) DHCPOFFER.getValue(),
+                                                instPort);
+            sendReply(context, discoverReply);
+            log.trace("DHCP OFFER({}) is sent for {}", instPort.ipAddress(), clientMac);
+        }
+
+        private void processDhcpRequest(PacketContext context, MacAddress clientMac,
+                                        InstancePort instPort, Ethernet ethPacket) {
+            log.trace("DHCP REQUEST received from {}", clientMac);
+            Ethernet requestReply = buildReply(ethPacket,
+                                                (byte) DHCPACK.getValue(),
+                                                instPort);
+            sendReply(context, requestReply);
+            log.trace("DHCP ACK({}) is sent for {}", instPort.ipAddress(), clientMac);
+        }
+
         private DHCP.MsgType getPacketType(DHCP dhcpPacket) {
             DhcpOption optType = dhcpPacket.getOption(OptionCode_MessageType);
             if (optType == null) {
@@ -366,46 +369,92 @@
             dhcpReply.setClientHardwareAddress(request.getClientHardwareAddress());
 
             List<DhcpOption> options = Lists.newArrayList();
+
             // message type
+            options.add(doMsgType(msgType));
+
+            // server identifier
+            options.add(doServerId(gatewayIp));
+
+            // lease time
+            options.add(doLeaseTime());
+
+            // subnet mask
+            options.add(doSubnetMask(subnetPrefixLen));
+
+            // broadcast address
+            options.add(doBroadcastAddr(yourIp, subnetPrefixLen));
+
+            // domain server
+            options.add(doDomainServer(osSubnet));
+
+            // mtu
+            options.add(doMtu(osSubnet));
+
+            // classless static route
+            if (!osSubnet.getHostRoutes().isEmpty()) {
+                options.add(doClasslessSr(osSubnet));
+            }
+
+            // Sets the default router address up.
+            // Performs only if the gateway is set in subnet.
+            if (!Strings.isNullOrEmpty(osSubnet.getGateway())) {
+                options.add(doRouterAddr(osSubnet));
+            }
+
+            // end option
+            options.add(doEnd());
+
+            dhcpReply.setOptions(options);
+            return dhcpReply;
+        }
+
+
+        private DhcpOption doMsgType(byte msgType) {
             DhcpOption option = new DhcpOption();
             option.setCode(OptionCode_MessageType.getValue());
             option.setLength((byte) 1);
             byte[] optionData = {msgType};
             option.setData(optionData);
-            options.add(option);
+            return option;
+        }
 
-            // server identifier
-            option = new DhcpOption();
+        private DhcpOption doServerId(IpAddress gatewayIp) {
+            DhcpOption option = new DhcpOption();
             option.setCode(OptionCode_DHCPServerIp.getValue());
             option.setLength((byte) 4);
             option.setData(gatewayIp.toOctets());
-            options.add(option);
+            return option;
+        }
 
-            // lease time
-            option = new DhcpOption();
+        private DhcpOption doLeaseTime() {
+            DhcpOption option = new DhcpOption();
             option.setCode(OptionCode_LeaseTime.getValue());
             option.setLength((byte) 4);
             option.setData(DHCP_DATA_LEASE_INFINITE);
-            options.add(option);
+            return option;
+        }
 
-            // subnet mask
+        private DhcpOption doSubnetMask(int subnetPrefixLen) {
             Ip4Address subnetMask = Ip4Address.makeMaskPrefix(subnetPrefixLen);
-            option = new DhcpOption();
+            DhcpOption option = new DhcpOption();
             option.setCode(OptionCode_SubnetMask.getValue());
             option.setLength((byte) 4);
             option.setData(subnetMask.toOctets());
-            options.add(option);
+            return option;
+        }
 
-            // broadcast address
+        private DhcpOption doBroadcastAddr(Ip4Address yourIp, int subnetPrefixLen) {
             Ip4Address broadcast = Ip4Address.makeMaskedAddress(yourIp, subnetPrefixLen);
-            option = new DhcpOption();
+            DhcpOption option = new DhcpOption();
             option.setCode(OptionCode_BroadcastAddress.getValue());
             option.setLength((byte) 4);
             option.setData(broadcast.toOctets());
-            options.add(option);
+            return option;
+        }
 
-            // domain server
-            option = new DhcpOption();
+        private DhcpOption doDomainServer(Subnet osSubnet) {
+            DhcpOption option = new DhcpOption();
 
             List<String> dnsServers = osSubnet.getDnsNames();
             option.setCode(OptionCode_DomainServer.getValue());
@@ -424,15 +473,17 @@
 
                 ByteBuffer dnsByteBuf = ByteBuffer.allocate(8);
 
-                for (int i = 0; i < dnsServers.size(); i++) {
-                    dnsByteBuf.put(IpAddress.valueOf(dnsServers.get(i)).toOctets());
+                for (String dnsServer : dnsServers) {
+                    dnsByteBuf.put(IpAddress.valueOf(dnsServer).toOctets());
                 }
                 option.setData(dnsByteBuf.array());
             }
 
-            options.add(option);
+            return option;
+        }
 
-            option = new DhcpOption();
+        private DhcpOption doMtu(Subnet osSubnet) {
+            DhcpOption option = new DhcpOption();
             option.setCode(DHCP_OPTION_MTU);
             option.setLength((byte) 2);
             Network osNetwork = osNetworkService.network(osSubnet.getNetworkId());
@@ -440,56 +491,51 @@
             checkNotNull(osNetwork.getMTU());
 
             option.setData(ByteBuffer.allocate(2).putShort(osNetwork.getMTU().shortValue()).array());
-            options.add(option);
 
-            // classless static route
-            if (!osSubnet.getHostRoutes().isEmpty()) {
-                option = new DhcpOption();
-                option.setCode(OptionCode_Classless_Static_Route.getValue());
+            return option;
+        }
 
-                int hostRoutesSize = hostRoutesSize(ImmutableList.copyOf(osSubnet.getHostRoutes()));
-                if (hostRoutesSize == 0) {
-                    throw new IllegalArgumentException("Illegal CIDR hostRoutesSize value!");
-                }
+        private DhcpOption doClasslessSr(Subnet osSubnet) {
+            DhcpOption option = new DhcpOption();
+            option.setCode(OptionCode_Classless_Static_Route.getValue());
 
-                log.trace("hostRouteSize: {}", hostRoutesSize);
-
-                option.setLength((byte) hostRoutesSize);
-                ByteBuffer hostRouteByteBuf = ByteBuffer.allocate(hostRoutesSize);
-
-                osSubnet.getHostRoutes().forEach(h -> {
-                    log.debug("processing host route information: {}", h.toString());
-
-                    IpPrefix ipPrefix = IpPrefix.valueOf(h.getDestination());
-
-                    hostRouteByteBuf.put(bytesDestinationDescriptor(ipPrefix));
-
-                    hostRouteByteBuf.put(Ip4Address.valueOf(h.getNexthop()).toOctets());
-                });
-
-                option.setData(hostRouteByteBuf.array());
-
-                options.add(option);
+            int hostRoutesSize = hostRoutesSize(ImmutableList.copyOf(osSubnet.getHostRoutes()));
+            if (hostRoutesSize == 0) {
+                throw new IllegalArgumentException("Illegal CIDR hostRoutesSize value!");
             }
 
-            // Sets the default router address up.
-            // Performs only if the gateway is set in subnet.
-            if (!Strings.isNullOrEmpty(osSubnet.getGateway())) {
-                option = new DhcpOption();
-                option.setCode(OptionCode_RouterAddress.getValue());
-                option.setLength((byte) 4);
-                option.setData(Ip4Address.valueOf(osSubnet.getGateway()).toOctets());
-                options.add(option);
-            }
+            log.trace("hostRouteSize: {}", hostRoutesSize);
 
-            // end option
-            option = new DhcpOption();
+            option.setLength((byte) hostRoutesSize);
+            ByteBuffer hostRouteByteBuf = ByteBuffer.allocate(hostRoutesSize);
+
+            osSubnet.getHostRoutes().forEach(h -> {
+                log.debug("processing host route information: {}", h.toString());
+
+                IpPrefix ipPrefix = IpPrefix.valueOf(h.getDestination());
+
+                hostRouteByteBuf.put(Objects.requireNonNull(bytesDestinationDescriptor(ipPrefix)));
+
+                hostRouteByteBuf.put(Ip4Address.valueOf(h.getNexthop()).toOctets());
+            });
+
+            option.setData(hostRouteByteBuf.array());
+            return option;
+        }
+
+        private DhcpOption doRouterAddr(Subnet osSubnet) {
+            DhcpOption option = new DhcpOption();
+            option.setCode(OptionCode_RouterAddress.getValue());
+            option.setLength((byte) 4);
+            option.setData(Ip4Address.valueOf(osSubnet.getGateway()).toOctets());
+            return option;
+        }
+
+        private DhcpOption doEnd() {
+            DhcpOption option = new DhcpOption();
             option.setCode(OptionCode_END.getValue());
             option.setLength((byte) 1);
-            options.add(option);
-
-            dhcpReply.setOptions(options);
-            return dhcpReply;
+            return option;
         }
 
         private int hostRoutesSize(List<HostRoute> hostRoutes) {
@@ -560,24 +606,10 @@
             OpenstackNode osNode = event.subject();
             switch (event.type()) {
                 case OPENSTACK_NODE_COMPLETE:
-                    eventExecutor.execute(() -> {
-
-                        if (!isRelevantHelper()) {
-                            return;
-                        }
-
-                        setDhcpRule(osNode, true);
-                    });
+                    eventExecutor.execute(() -> processNodeCompletion(osNode));
                     break;
                 case OPENSTACK_NODE_INCOMPLETE:
-                    eventExecutor.execute(() -> {
-
-                        if (!isRelevantHelper()) {
-                            return;
-                        }
-
-                        setDhcpRule(osNode, false);
-                    });
+                    eventExecutor.execute(() -> processNodeIncompletion(osNode));
                     break;
                 case OPENSTACK_NODE_CREATED:
                 case OPENSTACK_NODE_UPDATED:
@@ -587,6 +619,20 @@
             }
         }
 
+        private void processNodeCompletion(OpenstackNode osNode) {
+            if (!isRelevantHelper()) {
+                return;
+            }
+            setDhcpRule(osNode, true);
+        }
+
+        private void processNodeIncompletion(OpenstackNode osNode) {
+            if (!isRelevantHelper()) {
+                return;
+            }
+            setDhcpRule(osNode, false);
+        }
+
         private void setDhcpRule(OpenstackNode openstackNode, boolean install) {
             TrafficSelector selector = DefaultTrafficSelector.builder()
                     .matchEthType(Ethernet.TYPE_IPV4)
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java
index 4dd5ea7..c4ab10c 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java
@@ -76,7 +76,7 @@
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.CONTROLLER;
 
 @Component(immediate = true, service = HostProvider.class)
-public final class OpenstackSwitchingHostProvider
+public class OpenstackSwitchingHostProvider
         extends AbstractProvider implements HostProvider {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -122,7 +122,7 @@
     }
 
     @Activate
-    void activate() {
+    protected void activate() {
         coreService.registerApplication(OPENSTACK_NETWORKING_APP_ID);
         deviceService.addListener(internalDeviceListener);
         osNodeService.addListener(internalNodeListener);
@@ -132,7 +132,7 @@
     }
 
     @Deactivate
-    void deactivate() {
+    protected void deactivate() {
         hostProviderRegistry.unregister(this);
         osNodeService.removeListener(internalNodeListener);
         deviceService.removeListener(internalDeviceListener);
@@ -153,7 +153,7 @@
      *
      * @param event device event
      */
-    protected void portAddedHelper(DeviceEvent event) {
+    void portAddedHelper(DeviceEvent event) {
         log.debug("Instance port {} is detected from {}",
                 event.port().annotations().value(PORT_NAME),
                 event.subject().id());
@@ -166,7 +166,7 @@
      *
      * @param event device event
      */
-    protected void portRemovedHelper(DeviceEvent event) {
+    void portRemovedHelper(DeviceEvent event) {
         log.debug("Instance port {} is removed from {}",
                 event.port().annotations().value(PORT_NAME),
                 event.subject().id());
@@ -181,7 +181,7 @@
      *
      * @param port port object used in ONOS
      */
-    protected void processPortAdded(Port port) {
+    void processPortAdded(Port port) {
         // TODO check the node state is COMPLETE
         org.openstack4j.model.network.Port osPort = osNetworkService.port(port);
         if (osPort == null) {
@@ -204,9 +204,9 @@
         MacAddress mac = MacAddress.valueOf(osPort.getMacAddress());
         HostId hostId = HostId.hostId(mac);
 
-        // typically one openstack port should only be bound to one fix IP address;
-        // however, openstack4j binds multiple fixed IPs to one port, this might
-        // be a defect of openstack4j implementation
+        /* typically one openstack port should only be bound to one fix IP address;
+           however, openstack4j binds multiple fixed IPs to one port, this might
+           be a defect of openstack4j implementation */
 
         // TODO: we need to find a way to bind multiple ports from multiple
         // openstack networks into one host sooner or later
@@ -250,7 +250,7 @@
 
             // newly added location is not in the existing location list,
             // therefore, we simply add this into the location list
-            if (locations.size() == 0) {
+            if (locations.isEmpty()) {
                 hostProviderService.addLocationToHost(hostId,
                         new HostLocation(connectPoint, createTime));
             }
@@ -273,7 +273,7 @@
      *
      * @param port ONOS port
      */
-    protected void processPortRemoved(Port port) {
+    private void processPortRemoved(Port port) {
         ConnectPoint connectPoint = new ConnectPoint(port.element().id(), port.number());
 
         Set<Host> hosts = hostService.getConnectedHosts(connectPoint);
@@ -330,43 +330,46 @@
             log.info("Device event occurred with type {}", event.type());
             switch (event.type()) {
                 case PORT_UPDATED:
-                    executor.execute(() -> {
-                        if (!isRelevantHelper(event)) {
-                            return;
-                        }
-
-                        if (!event.port().isEnabled()) {
-                            portRemovedHelper(event);
-                        } else if (event.port().isEnabled()) {
-                            portAddedHelper(event);
-                        }
-                    });
-
+                    executor.execute(() -> processPortUpdate(event));
                     break;
                 case PORT_ADDED:
-                    executor.execute(() -> {
-
-                        if (!isRelevantHelper(event)) {
-                            return;
-                        }
-
-                        portAddedHelper(event);
-                    });
+                    executor.execute(() -> processPortAddition(event));
                     break;
                 case PORT_REMOVED:
-                    executor.execute(() -> {
-
-                        if (!isRelevantHelper(event)) {
-                            return;
-                        }
-
-                        portRemovedHelper(event);
-                    });
+                    executor.execute(() -> processPortRemoval(event));
                     break;
                 default:
                     break;
             }
         }
+
+        private void processPortUpdate(DeviceEvent event) {
+            if (!isRelevantHelper(event)) {
+                return;
+            }
+
+            if (!event.port().isEnabled()) {
+                portRemovedHelper(event);
+            } else if (event.port().isEnabled()) {
+                portAddedHelper(event);
+            }
+        }
+
+        private void processPortAddition(DeviceEvent event) {
+            if (!isRelevantHelper(event)) {
+                return;
+            }
+
+            portAddedHelper(event);
+        }
+
+        private void processPortRemoval(DeviceEvent event) {
+            if (!isRelevantHelper(event)) {
+                return;
+            }
+
+            portRemovedHelper(event);
+        }
     }
 
     private class InternalOpenstackNodeListener implements OpenstackNodeListener {
@@ -391,15 +394,7 @@
 
             switch (event.type()) {
                 case OPENSTACK_NODE_COMPLETE:
-                    log.info("COMPLETE node {} is detected", osNode.hostname());
-                    executor.execute(() -> {
-
-                        if (!isRelevantHelper(event)) {
-                            return;
-                        }
-
-                        processCompleteNode(event.subject());
-                    });
+                    executor.execute(() -> processCompleteNode(event, event.subject()));
                     break;
                 case OPENSTACK_NODE_INCOMPLETE:
                     log.warn("{} is changed to INCOMPLETE state", osNode);
@@ -407,14 +402,20 @@
                 case OPENSTACK_NODE_CREATED:
                 case OPENSTACK_NODE_UPDATED:
                 case OPENSTACK_NODE_REMOVED:
-                    // not reacts to the events other than complete and incomplete states
-                    break;
                 default:
                     break;
             }
         }
 
-        private void processCompleteNode(OpenstackNode osNode) {
+        private void processCompleteNode(OpenstackNodeEvent event,
+                                         OpenstackNode osNode) {
+
+            if (!isRelevantHelper(event)) {
+                return;
+            }
+
+            log.info("COMPLETE node {} is detected", osNode.hostname());
+
             deviceService.getPorts(osNode.intgBridge()).stream()
                     .filter(port -> vnicType(port.annotations().value(PORT_NAME))
                                     .equals(Constants.VnicType.NORMAL) ||
