diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sNodeHandler.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sNodeHandler.java
index 83e537c..f31301f 100644
--- a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sNodeHandler.java
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sNodeHandler.java
@@ -74,6 +74,9 @@
 import static org.onosproject.k8snode.api.Constants.GRE_TUNNEL;
 import static org.onosproject.k8snode.api.Constants.INTEGRATION_BRIDGE;
 import static org.onosproject.k8snode.api.Constants.INTEGRATION_TO_EXTERNAL_BRIDGE;
+import static org.onosproject.k8snode.api.Constants.INTEGRATION_TO_LOCAL_BRIDGE;
+import static org.onosproject.k8snode.api.Constants.LOCAL_BRIDGE;
+import static org.onosproject.k8snode.api.Constants.LOCAL_TO_INTEGRATION_BRIDGE;
 import static org.onosproject.k8snode.api.Constants.PHYSICAL_EXTERNAL_BRIDGE;
 import static org.onosproject.k8snode.api.Constants.VXLAN;
 import static org.onosproject.k8snode.api.Constants.VXLAN_TUNNEL;
@@ -196,6 +199,9 @@
         if (!deviceService.isAvailable(k8sNode.extBridge())) {
             createBridge(k8sNode, EXTERNAL_BRIDGE, k8sNode.extBridge());
         }
+        if (!deviceService.isAvailable(k8sNode.localBridge())) {
+            createBridge(k8sNode, LOCAL_BRIDGE, k8sNode.localBridge());
+        }
     }
 
     @Override
@@ -328,23 +334,43 @@
             return;
         }
 
-        PatchDescription brIntPatchDesc =
+        // integration bridge -> external bridge
+        PatchDescription brIntExtPatchDesc =
                 DefaultPatchDescription.builder()
                 .deviceId(INTEGRATION_BRIDGE)
                 .ifaceName(INTEGRATION_TO_EXTERNAL_BRIDGE)
                 .peer(PHYSICAL_EXTERNAL_BRIDGE)
                 .build();
 
-        PatchDescription brExtPatchDesc =
+        // external bridge -> integration bridge
+        PatchDescription brExtIntPatchDesc =
                 DefaultPatchDescription.builder()
                 .deviceId(EXTERNAL_BRIDGE)
                 .ifaceName(PHYSICAL_EXTERNAL_BRIDGE)
                 .peer(INTEGRATION_TO_EXTERNAL_BRIDGE)
                 .build();
 
+        // integration bridge -> local bridge
+        PatchDescription brIntLocalPatchDesc =
+                DefaultPatchDescription.builder()
+                        .deviceId(INTEGRATION_BRIDGE)
+                        .ifaceName(INTEGRATION_TO_LOCAL_BRIDGE)
+                        .peer(LOCAL_TO_INTEGRATION_BRIDGE)
+                        .build();
+
+        // local bridge -> integration bridge
+        PatchDescription brLocalIntPatchDesc =
+                DefaultPatchDescription.builder()
+                        .deviceId(LOCAL_BRIDGE)
+                        .ifaceName(LOCAL_TO_INTEGRATION_BRIDGE)
+                        .peer(INTEGRATION_TO_LOCAL_BRIDGE)
+                        .build();
+
         InterfaceConfig ifaceConfig = device.as(InterfaceConfig.class);
-        ifaceConfig.addPatchMode(INTEGRATION_TO_EXTERNAL_BRIDGE, brIntPatchDesc);
-        ifaceConfig.addPatchMode(PHYSICAL_EXTERNAL_BRIDGE, brExtPatchDesc);
+        ifaceConfig.addPatchMode(INTEGRATION_TO_EXTERNAL_BRIDGE, brIntExtPatchDesc);
+        ifaceConfig.addPatchMode(PHYSICAL_EXTERNAL_BRIDGE, brExtIntPatchDesc);
+        ifaceConfig.addPatchMode(INTEGRATION_TO_LOCAL_BRIDGE, brIntLocalPatchDesc);
+        ifaceConfig.addPatchMode(LOCAL_TO_INTEGRATION_BRIDGE, brLocalIntPatchDesc);
     }
 
     /**
@@ -436,7 +462,8 @@
 
                 return k8sNode.intgBridge() != null && k8sNode.extBridge() != null &&
                         deviceService.isAvailable(k8sNode.intgBridge()) &&
-                        deviceService.isAvailable(k8sNode.extBridge());
+                        deviceService.isAvailable(k8sNode.extBridge()) &&
+                        deviceService.isAvailable(k8sNode.localBridge());
             case DEVICE_CREATED:
                 if (k8sNode.dataIp() != null &&
                         !isIntfEnabled(k8sNode, VXLAN_TUNNEL)) {
@@ -505,6 +532,9 @@
         // delete external bridge from the node
         client.dropBridge(EXTERNAL_BRIDGE);
 
+        // delete local bridge from the node
+        client.dropBridge(LOCAL_BRIDGE);
+
         // disconnect ovsdb
         client.disconnect();
     }
@@ -597,6 +627,7 @@
                         }
 
                         // TODO: also need to check the external bridge's availability
+                        // TODO: also need to check the local bridge's availability
                         if (deviceService.isAvailable(device.id())) {
                             log.debug("Integration bridge created on {}",
                                     k8sNode.hostname());
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/K8sNodeManager.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/K8sNodeManager.java
index 122a27b..5b3f353 100644
--- a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/K8sNodeManager.java
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/K8sNodeManager.java
@@ -158,6 +158,7 @@
 
         K8sNode intNode;
         K8sNode extNode;
+        K8sNode localNode;
 
         if (node.intgBridge() == null) {
             String deviceIdStr = genDpid(deviceIdCounter.incrementAndGet());
@@ -183,7 +184,19 @@
                     NOT_DUPLICATED_MSG, extNode.extBridge());
         }
 
-        nodeStore.createNode(extNode);
+        if (node.localBridge() == null) {
+            String deviceIdStr = genDpid(deviceIdCounter.incrementAndGet());
+            checkNotNull(deviceIdStr, ERR_NULL_DEVICE_ID);
+            localNode = extNode.updateLocalBridge(DeviceId.deviceId(deviceIdStr));
+            checkArgument(!hasLocalBridge(localNode.localBridge(), localNode.hostname()),
+                    NOT_DUPLICATED_MSG, localNode.localBridge());
+        } else {
+            localNode = extNode;
+            checkArgument(!hasLocalBridge(localNode.localBridge(), localNode.hostname()),
+                    NOT_DUPLICATED_MSG, localNode.localBridge());
+        }
+
+        nodeStore.createNode(localNode);
         log.info(String.format(MSG_NODE, extNode.hostname(), MSG_CREATED));
     }
 
@@ -193,6 +206,7 @@
 
         K8sNode intNode;
         K8sNode extNode;
+        K8sNode localNode;
 
         K8sNode existingNode = nodeStore.node(node.hostname());
         checkNotNull(existingNode, ERR_NULL_NODE);
@@ -221,7 +235,19 @@
                     NOT_DUPLICATED_MSG, extNode.extBridge());
         }
 
-        nodeStore.updateNode(extNode);
+        DeviceId existLocalBridge = nodeStore.node(node.hostname()).localBridge();
+
+        if (extNode.localBridge() == null) {
+            localNode = extNode.updateLocalBridge(existLocalBridge);
+            checkArgument(!hasLocalBridge(localNode.localBridge(), localNode.hostname()),
+                    NOT_DUPLICATED_MSG, localNode.localBridge());
+        } else {
+            localNode = extNode;
+            checkArgument(!hasLocalBridge(localNode.localBridge(), localNode.hostname()),
+                    NOT_DUPLICATED_MSG, localNode.localBridge());
+        }
+
+        nodeStore.updateNode(localNode);
         log.info(String.format(MSG_NODE, extNode.hostname(), MSG_UPDATED));
     }
 
@@ -295,6 +321,15 @@
         return existNode.isPresent();
     }
 
+    private boolean hasLocalBridge(DeviceId deviceId, String hostname) {
+        Optional<K8sNode> existNode = nodeStore.nodes().stream()
+                .filter(n -> !n.hostname().equals(hostname))
+                .filter(n -> deviceId.equals(n.localBridge()))
+                .findFirst();
+
+        return existNode.isPresent();
+    }
+
     private class InternalNodeStoreDelegate implements K8sNodeStoreDelegate {
 
         @Override
