diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
index 7be2074..dab1fc11 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
@@ -149,7 +149,8 @@
     /** OVSDB server listen port. */
     private int ovsdbPortNum = OVSDB_PORT_NUM_DEFAULT;
 
-    /** A flag which indicates whether auto-recover openstack node status on switch reconnecting event. */
+    /** A flag which indicates whether auto-recover openstack node status on
+     *  switch reconnecting event. */
     private boolean autoRecovery = AUTO_RECOVERY_DEFAULT;
 
     private final ExecutorService eventExecutor = newSingleThreadExecutor(
@@ -229,14 +230,14 @@
 
             if (osNode.dpdkConfig() != null && osNode.dpdkConfig().dpdkIntfs() != null) {
                 osNode.dpdkConfig().dpdkIntfs().stream()
-                        .filter(dpdkInterface -> dpdkInterface.deviceName().equals(TUNNEL_BRIDGE))
-                        .forEach(dpdkInterface -> addOrRemoveDpdkInterface(
-                                osNode, dpdkInterface, ovsdbPortNum, ovsdbController, true));
+                        .filter(dpdkintf -> dpdkintf.deviceName().equals(TUNNEL_BRIDGE))
+                        .forEach(dpdkintf -> addOrRemoveDpdkInterface(
+                                osNode, dpdkintf, ovsdbPortNum, ovsdbController, true));
 
                 osNode.dpdkConfig().dpdkIntfs().stream()
-                        .filter(dpdkInterface -> dpdkInterface.deviceName().equals(INTEGRATION_BRIDGE))
-                        .forEach(dpdkInterface -> addOrRemoveDpdkInterface(
-                                osNode, dpdkInterface, ovsdbPortNum, ovsdbController, true));
+                        .filter(dpdkintf -> dpdkintf.deviceName().equals(INTEGRATION_BRIDGE))
+                        .forEach(dpdkintf -> addOrRemoveDpdkInterface(
+                                osNode, dpdkintf, ovsdbPortNum, ovsdbController, true));
             }
 
             osNode.phyIntfs().forEach(i -> {
@@ -249,7 +250,7 @@
             if (osNode.vlanIntf() != null &&
                     !isIntfEnabled(osNode, osNode.vlanIntf())) {
                 addOrRemoveSystemInterface(osNode, INTEGRATION_BRIDGE,
-                                        osNode.vlanIntf(), deviceService, true);
+                            osNode.vlanIntf(), deviceService, true);
             }
         } catch (Exception e) {
             log.error("Exception occurred because of {}", e.toString());
@@ -367,7 +368,8 @@
     }
 
     /**
-     * Checks whether a given network interface in a given openstack node is enabled or not.
+     * Checks whether a given network interface in a given openstack node
+     * is enabled or not.
      *
      * @param osNode openstack node
      * @param intf network interface name
@@ -390,7 +392,8 @@
     private boolean isCurrentStateDone(OpenstackNode osNode) {
         switch (osNode.state()) {
             case INIT:
-                if (!isOvsdbConnected(osNode, ovsdbPortNum, ovsdbController, deviceService)) {
+                if (!isOvsdbConnected(osNode, ovsdbPortNum,
+                                                ovsdbController, deviceService)) {
                     return false;
                 }
 
@@ -445,15 +448,15 @@
 
         Set<OvsdbPort> ports = client.getPorts();
 
-        for (DpdkInterface dpdkInterface : dpdkInterfaces) {
+        for (DpdkInterface dpdkIntf : dpdkInterfaces) {
             Optional<OvsdbPort> port = ports.stream()
-                    .filter(ovsdbPort -> ovsdbPort.portName().value().equals(dpdkInterface.intf()))
+                    .filter(ovsdbPort -> ovsdbPort.portName().value().equals(dpdkIntf.intf()))
                     .findAny();
 
             if (!port.isPresent()) {
                 return false;
             }
-            Interface intf = client.getInterface(dpdkInterface.intf());
+            Interface intf = client.getInterface(dpdkIntf.intf());
             if (intf == null) {
                 return false;
             }
@@ -468,8 +471,8 @@
                 return false;
             }
 
-            if (!mtu.set().contains(dpdkInterface.mtu().intValue()) ||
-                    !option.toString().contains(dpdkInterface.pciAddress())) {
+            if (!mtu.set().contains(dpdkIntf.mtu().intValue()) ||
+                    !option.toString().contains(dpdkIntf.pciAddress())) {
                 log.trace("The dpdk interface {} was created but mtu or " +
                           "pci address is different from the config.");
                 return false;
@@ -516,21 +519,23 @@
 
     private void removeVlanInterface(OpenstackNode osNode) {
         if (osNode.vlanIntf() != null) {
-            Optional<DpdkInterface> dpdkInterface = dpdkInterfaceByIntfName(osNode, osNode.vlanIntf());
+            Optional<DpdkInterface> dpdkIntf =
+                                dpdkInterfaceByIntfName(osNode, osNode.vlanIntf());
 
-            removeInterfaceOnIntegrationBridge(osNode, osNode.vlanIntf(), dpdkInterface);
+            removeInterfaceOnIntegrationBridge(osNode, osNode.vlanIntf(), dpdkIntf);
         }
     }
 
     private void removePhysicalInterface(OpenstackNode osNode) {
         osNode.phyIntfs().forEach(phyIntf -> {
-            Optional<DpdkInterface> dpdkInterface = dpdkInterfaceByIntfName(osNode, phyIntf.intf());
+            Optional<DpdkInterface> dpdkIntf = dpdkInterfaceByIntfName(osNode, phyIntf.intf());
 
-            removeInterfaceOnIntegrationBridge(osNode, phyIntf.intf(), dpdkInterface);
+            removeInterfaceOnIntegrationBridge(osNode, phyIntf.intf(), dpdkIntf);
         });
     }
 
-    private Optional<DpdkInterface> dpdkInterfaceByIntfName(OpenstackNode osNode, String intf) {
+    private Optional<DpdkInterface> dpdkInterfaceByIntfName(OpenstackNode osNode,
+                                                            String intf) {
         return osNode.dpdkConfig() == null ? Optional.empty() :
                 osNode.dpdkConfig().dpdkIntfs().stream()
                         .filter(dpdkIntf -> dpdkIntf.intf().equals(intf))
