diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/cli/KubernetesExternalLbConfigCommand.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/cli/KubernetesExternalLbConfigCommand.java
new file mode 100644
index 0000000..6eeb220
--- /dev/null
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/cli/KubernetesExternalLbConfigCommand.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2022-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.kubevirtnode.cli;
+
+import com.google.common.collect.ImmutableList;
+import org.apache.commons.lang.StringUtils;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.onlab.packet.IpAddress;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbConfig;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbConfigService;
+
+import static org.onosproject.kubevirtnode.api.Constants.CLI_IP_ADDRESSES_LENGTH;
+import static org.onosproject.kubevirtnode.api.Constants.CLI_IP_ADDRESS_LENGTH;
+import static org.onosproject.kubevirtnode.api.Constants.CLI_MAC_ADDRESS_LENGTH;
+import static org.onosproject.kubevirtnode.api.Constants.CLI_MARGIN_LENGTH;
+import static org.onosproject.kubevirtnode.api.Constants.CLI_NAME_LENGTH;
+import static org.onosproject.kubevirtnode.util.KubevirtNodeUtil.genFormatString;
+
+/**
+ * Lists all Kubernetes External LB config registered to the service.
+ */
+@Service
+@Command(scope = "onos", name = "kubernetes-lb-configs",
+        description = "Lists all Kubernetes External LB config registered to the service")
+public class KubernetesExternalLbConfigCommand extends AbstractShellCommand {
+
+    private static final String KUBE_VIP = "kubevip";
+
+    @Override
+    protected void doExecute() throws Exception {
+        KubernetesExternalLbConfigService service = get(KubernetesExternalLbConfigService.class);
+
+        String format = genFormatString(ImmutableList.of(CLI_NAME_LENGTH,
+                org.onosproject.kubevirtnode.api.Constants.CLI_IP_ADDRESS_LENGTH,
+                CLI_MAC_ADDRESS_LENGTH, CLI_IP_ADDRESSES_LENGTH));
+
+        KubernetesExternalLbConfig lbConfig = service.lbConfig(KUBE_VIP);
+
+        if (lbConfig == null) {
+            print("LB config not found!");
+        } else {
+            print(format, "ConfigName", "Gateway IP", "Gateway MAC", "Global-Range");
+
+            String configName = lbConfig.configName();
+            IpAddress gatewayIp = lbConfig.loadBalancerGwIp();
+            String gatewayMac = lbConfig.loadBalancerGwMac() == null ? "N/A" : lbConfig.loadBalancerGwMac().toString();
+            String globalRange = lbConfig.globalIpRange() == null ? "N/A" : lbConfig.globalIpRange();
+
+            print(format, StringUtils.substring(configName, 0,
+                    CLI_NAME_LENGTH - CLI_MARGIN_LENGTH),
+                    StringUtils.substring(gatewayIp.toString(), 0,
+                           CLI_IP_ADDRESS_LENGTH - CLI_MARGIN_LENGTH),
+                    StringUtils.substring(gatewayMac, 0,
+                            CLI_MAC_ADDRESS_LENGTH - CLI_MARGIN_LENGTH),
+                    StringUtils.substring(globalRange, 0,
+                            CLI_IP_ADDRESSES_LENGTH - CLI_MARGIN_LENGTH)
+                    );
+        }
+    }
+}
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/cli/KubevirtShowNodeCommand.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/cli/KubevirtShowNodeCommand.java
index 5927530..39a18f0 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/cli/KubevirtShowNodeCommand.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/cli/KubevirtShowNodeCommand.java
@@ -67,7 +67,7 @@
     }
 
     private void printNode(KubevirtNode node) {
-        print("node: %s", node.toString());
+        print("Node: %s", node.toString());
         print("Name: %s", node.hostname());
         print("  Type: %s", node.type());
         print("  State: %s", node.state());
@@ -88,11 +88,11 @@
             print("  GatewayBridgeName: %s", node.gatewayBridgeName());
         }
 
-        if (node.elbBridgeName() != null && node.elbIp() != null) {
-            print("  ElbBridgeName: %s", node.elbBridgeName());
-            print("  ElbIp: %s", node.elbIp().toString());
-            print("  ElbGwIp: %s", node.elbGwIp().toString());
-            print("  ElbGwMac: %s", node.elbGwMac().toString());
+        if (node.kubernetesExternalLbInterface() != null) {
+            print("  ElbBridgeName: %s", node.kubernetesExternalLbInterface().externalLbBridgeName());
+            print("  ElbIp: %s", node.kubernetesExternalLbInterface().externalLbIp().toString());
+            print("  ElbGwIp: %s", node.kubernetesExternalLbInterface().externalLbGwIp().toString());
+            print("  ElbGwMac: %s", node.kubernetesExternalLbInterface().externalLbGwMac().toString());
         }
     }
 
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/codec/KubernetesExternalLbInterfaceCodec.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/codec/KubernetesExternalLbInterfaceCodec.java
new file mode 100644
index 0000000..cdd4402
--- /dev/null
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/codec/KubernetesExternalLbInterfaceCodec.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2022-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.kubevirtnode.codec;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.kubevirtnode.api.DefaultKubernetesExternalLbInterface;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbInterface;
+import org.slf4j.Logger;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.nullIsIllegal;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Kubernetes external load balancer interface codec used for serializing and de-serializing JSON string.
+ */
+public class KubernetesExternalLbInterfaceCodec extends JsonCodec<KubernetesExternalLbInterface> {
+    private final Logger log = getLogger(getClass());
+
+    private static final String ELB_BRIDGE_NAME = "externalLbBridgeName";
+    private static final String ELB_IP = "externalLbIp";
+    private static final String ELB_GW_IP = "externalLbGwIp";
+    private static final String ELB_GW_MAC = "externalLbGwMac";
+
+    private static final String MISSING_MESSAGE = " is required in KubernetesExternalLbInterfaceCodec";
+
+    @Override
+    public ObjectNode encode(KubernetesExternalLbInterface externalLbInterface, CodecContext context) {
+        checkNotNull(externalLbInterface, "checkNotNull cannot be null");
+
+        ObjectNode result = context.mapper().createObjectNode()
+                .put(ELB_BRIDGE_NAME, externalLbInterface.externalLbBridgeName())
+                .put(ELB_IP, externalLbInterface.externalLbIp().toString())
+                .put(ELB_GW_IP, externalLbInterface.externalLbGwIp().toString())
+                .put(ELB_GW_MAC, externalLbInterface.externalLbGwMac().toString());
+
+        return result;
+    }
+
+    @Override
+    public KubernetesExternalLbInterface decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        String elbBridgeName = nullIsIllegal(json.get(ELB_BRIDGE_NAME).asText(),
+                ELB_BRIDGE_NAME + MISSING_MESSAGE);
+
+        String elbIp = nullIsIllegal(json.get(ELB_IP).asText(),
+                ELB_IP + MISSING_MESSAGE);
+
+        String elbGwIp = nullIsIllegal(json.get(ELB_GW_IP).asText(),
+                ELB_GW_IP + MISSING_MESSAGE);
+
+        String elbGwMac = nullIsIllegal(json.get(ELB_GW_MAC).asText(),
+                ELB_GW_MAC + MISSING_MESSAGE);
+
+        KubernetesExternalLbInterface externalLbInterface = DefaultKubernetesExternalLbInterface.builder()
+                .externalLbBridgeName(elbBridgeName)
+                .externallbGwIp(IpAddress.valueOf(elbGwIp))
+                .externalLbIp(IpAddress.valueOf(elbIp))
+                .externalLbGwMac(MacAddress.valueOf(elbGwMac))
+                .build();
+
+        return externalLbInterface;
+    }
+}
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/codec/KubevirtNodeCodec.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/codec/KubevirtNodeCodec.java
index ec6f6bf..5267c77 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/codec/KubevirtNodeCodec.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/codec/KubevirtNodeCodec.java
@@ -19,10 +19,10 @@
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
 import org.onosproject.kubevirtnode.api.DefaultKubevirtNode;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbInterface;
 import org.onosproject.kubevirtnode.api.KubevirtNode;
 import org.onosproject.kubevirtnode.api.KubevirtNodeState;
 import org.onosproject.kubevirtnode.api.KubevirtPhyInterface;
@@ -53,12 +53,9 @@
     private static final String STATE = "state";
     private static final String PHYSICAL_INTERFACES = "phyIntfs";
     private static final String GATEWAY_BRIDGE_NAME = "gatewayBridgeName";
-    private static final String ELB_BRIDGE_NAME = "elbBridgeName";
-    private static final String ELB_IP = "elbIp";
-    private static final String ELB_GW_IP = "elbGwIp";
-    private static final String ELB_GW_MAC = "elbGwMac";
+    private static final String KUBERNETES_EXTERNAL_LB_INTERFACE = "kubernetesExternalLbInterface";
 
-    private static final String MISSING_MESSAGE = " is required in OpenstackNode";
+    private static final String MISSING_MESSAGE = " is required in KubevirtNode";
 
     @Override
     public ObjectNode encode(KubevirtNode node, CodecContext context) {
@@ -101,21 +98,11 @@
             result.put(GATEWAY_BRIDGE_NAME, node.gatewayBridgeName());
         }
 
-        //serialize elb bridge and ip address if exist
-        if (node.elbBridgeName() != null) {
-            result.put(ELB_BRIDGE_NAME, node.elbBridgeName());
-        }
-
-        if (node.elbIp() != null) {
-            result.put(ELB_IP, node.elbIp().toString());
-        }
-
-        if (node.elbGwIp() != null) {
-            result.put(ELB_GW_IP, node.elbGwIp().toString());
-        }
-
-        if (node.elbGwMac() != null) {
-            result.put(ELB_GW_MAC, node.elbGwMac().toString());
+        // serialize kubernetex external load balancer interface if exist
+        if (node.kubernetesExternalLbInterface() != null) {
+            ObjectNode elbIntfJson = context.codec(KubernetesExternalLbInterface.class)
+                    .encode(node.kubernetesExternalLbInterface(), context);
+            result.put(KUBERNETES_EXTERNAL_LB_INTERFACE, elbIntfJson.toString());
         }
 
         return result;
@@ -173,24 +160,16 @@
             nodeBuilder.gatewayBridgeName(externalBridgeJson.asText());
         }
 
-        JsonNode elbBridgeJson = json.get(ELB_BRIDGE_NAME);
-        if (elbBridgeJson != null) {
-            nodeBuilder.elbBridgeName(elbBridgeJson.asText());
-        }
+        JsonNode elbIntfJson = json.get(KUBERNETES_EXTERNAL_LB_INTERFACE);
 
-        JsonNode elbIpJson = json.get(ELB_IP);
-        if (elbIpJson != null) {
-            nodeBuilder.elbIp(IpAddress.valueOf(elbIpJson.asText()));
-        }
+        if (elbIntfJson != null) {
+            final JsonCodec<KubernetesExternalLbInterface>
+                    kubernetesExternalLbInterfaceCodecJsonCodec = context.codec(KubernetesExternalLbInterface.class);
+            ObjectNode elbIntfObjNode = elbIntfJson.deepCopy();
 
-        JsonNode elbGwIpJson = json.get(ELB_GW_IP);
-        if (elbIpJson != null) {
-            nodeBuilder.elbGwIp(IpAddress.valueOf(elbGwIpJson.asText()));
-        }
+            nodeBuilder.kubernetesExternalLbInterface(
+                    kubernetesExternalLbInterfaceCodecJsonCodec.decode(elbIntfObjNode, context));
 
-        JsonNode elbGwMacJson = json.get(ELB_GW_MAC);
-        if (elbIpJson != null) {
-            nodeBuilder.elbGwMac(MacAddress.valueOf(elbGwMacJson.asText()));
         }
 
         log.trace("node is {}", nodeBuilder.build());
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DistributedKubernetesExternalLbConfigStore.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DistributedKubernetesExternalLbConfigStore.java
new file mode 100644
index 0000000..16a816e
--- /dev/null
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DistributedKubernetesExternalLbConfigStore.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright 2022-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.kubevirtnode.impl;
+
+import com.google.common.collect.ImmutableSet;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.kubevirtnode.api.DefaultKubernetesExternalLbConfig;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbConfig;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbConfigEvent;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbConfigStore;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbConfigStoreDelegate;
+import org.onosproject.store.AbstractStore;
+import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.ConsistentMap;
+import org.onosproject.store.service.MapEvent;
+import org.onosproject.store.service.MapEventListener;
+import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.StorageService;
+import org.onosproject.store.service.Versioned;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.slf4j.Logger;
+
+import java.util.Collection;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.concurrent.Executors.newSingleThreadExecutor;
+import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.kubevirtnode.api.KubernetesExternalLbConfigEvent.Type
+        .KUBERNETES_EXTERNAL_LB_CONFIG_CREATED;
+import static org.onosproject.kubevirtnode.api.KubernetesExternalLbConfigEvent.Type
+        .KUBERNETES_EXTERNAL_LB_CONFIG_REMOVED;
+import static org.onosproject.kubevirtnode.api.KubernetesExternalLbConfigEvent.Type
+        .KUBERNETES_EXTERNAL_LB_CONFIG_UPDATED;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Implementation of kubernetes external lb config store using consistent map.
+ */
+@Component(immediate = true, service = KubernetesExternalLbConfigStore.class)
+public class DistributedKubernetesExternalLbConfigStore
+    extends AbstractStore<KubernetesExternalLbConfigEvent, KubernetesExternalLbConfigStoreDelegate>
+    implements KubernetesExternalLbConfigStore {
+
+    private final Logger log = getLogger(getClass());
+
+    private static final String ERR_NOT_FOUND = " does not exist";
+    private static final String ERR_DUPLICATE = " already exists";
+    private static final String APP_ID = "org.onosproject.kubevirtnode";
+
+    private static final KryoNamespace
+            SERIALIZER_KUBERNETES_EXTERNAL_LB_CONFIG = KryoNamespace.newBuilder()
+            .register(KryoNamespaces.API)
+            .register(KubernetesExternalLbConfig.class)
+            .register(DefaultKubernetesExternalLbConfig.class)
+            .register(IpAddress.class)
+            .register(MacAddress.class)
+            .register(Collection.class)
+            .build();
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected StorageService storageService;
+
+    private final ExecutorService eventExecutor = newSingleThreadExecutor(
+            groupedThreads(this.getClass().getSimpleName(), "event-handler", log));
+
+    private final MapEventListener<String, KubernetesExternalLbConfig> lbConfigMapEventListener =
+            new KubernetesExternalLbConfigMapListener();
+
+    private ConsistentMap<String, KubernetesExternalLbConfig> lbConfigStore;
+
+    @Activate
+    protected void activate() {
+        ApplicationId appId = coreService.registerApplication(APP_ID);
+        lbConfigStore = storageService.<String, KubernetesExternalLbConfig>consistentMapBuilder()
+                .withSerializer(Serializer.using(SERIALIZER_KUBERNETES_EXTERNAL_LB_CONFIG))
+                .withName("kubernetes-lbconfigstore")
+                .withApplicationId(appId)
+                .build();
+
+        lbConfigStore.addListener(lbConfigMapEventListener);
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        lbConfigStore.removeListener(lbConfigMapEventListener);
+        eventExecutor.shutdown();
+        log.info("Stopped");
+    }
+
+    @Override
+    public void createExternalLbConfig(KubernetesExternalLbConfig lbConfig) {
+        lbConfigStore.compute(lbConfig.configName(), (configName, existing) -> {
+            final String error = lbConfig.configName() + ERR_DUPLICATE;
+            checkArgument(existing == null, error);
+            return lbConfig;
+        });
+    }
+
+    @Override
+    public void updateExternalLbConfig(KubernetesExternalLbConfig lbConfig) {
+        lbConfigStore.compute(lbConfig.configName(), (configName, existing) -> {
+            final String error = lbConfig.configName() + ERR_NOT_FOUND;
+            checkArgument(existing != null, error);
+            return lbConfig;
+        });
+    }
+
+    @Override
+    public KubernetesExternalLbConfig removeExternalLbConfig(String configName) {
+
+        Versioned<KubernetesExternalLbConfig> lbConfig = lbConfigStore.remove(configName);
+
+        if (lbConfig == null) {
+            final String error = configName + ERR_NOT_FOUND;
+            throw new IllegalArgumentException(error);
+        }
+
+        return lbConfig.value();
+    }
+
+    @Override
+    public KubernetesExternalLbConfig externalLbConfig(String configName) {
+        return lbConfigStore.asJavaMap().get(configName);
+    }
+
+    @Override
+    public Set<KubernetesExternalLbConfig> externalLbConfigs() {
+
+        return ImmutableSet.copyOf(lbConfigStore.asJavaMap().values());
+    }
+
+    @Override
+    public void clear() {
+        lbConfigStore.clear();
+    }
+
+    private class KubernetesExternalLbConfigMapListener
+            implements MapEventListener<String, KubernetesExternalLbConfig> {
+
+        @Override
+        public void event(MapEvent<String, KubernetesExternalLbConfig> event) {
+            switch (event.type()) {
+                case INSERT:
+                    eventExecutor.execute(() ->
+                            notifyDelegate(new KubernetesExternalLbConfigEvent(
+                                    KUBERNETES_EXTERNAL_LB_CONFIG_CREATED, event.newValue().value())));
+                    break;
+                case UPDATE:
+                    eventExecutor.execute(() ->
+                            notifyDelegate(new KubernetesExternalLbConfigEvent(
+                                    KUBERNETES_EXTERNAL_LB_CONFIG_UPDATED, event.newValue().value())));
+                    break;
+                case REMOVE:
+                    eventExecutor.execute(() ->
+                            notifyDelegate(new KubernetesExternalLbConfigEvent(
+                                    KUBERNETES_EXTERNAL_LB_CONFIG_REMOVED, event.oldValue().value())));
+                    break;
+                default:
+                    //do nothing
+                    break;
+            }
+        }
+    }
+}
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DistributedKubevirtNodeStore.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DistributedKubevirtNodeStore.java
index d0bde71..47a28e1 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DistributedKubevirtNodeStore.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DistributedKubevirtNodeStore.java
@@ -19,8 +19,10 @@
 import org.onlab.util.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
+import org.onosproject.kubevirtnode.api.DefaultKubernetesExternalLbInterface;
 import org.onosproject.kubevirtnode.api.DefaultKubevirtNode;
 import org.onosproject.kubevirtnode.api.DefaultKubevirtPhyInterface;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbInterface;
 import org.onosproject.kubevirtnode.api.KubevirtNode;
 import org.onosproject.kubevirtnode.api.KubevirtNodeEvent;
 import org.onosproject.kubevirtnode.api.KubevirtNodeState;
@@ -77,6 +79,8 @@
             .register(DefaultKubevirtNode.class)
             .register(KubevirtPhyInterface.class)
             .register(DefaultKubevirtPhyInterface.class)
+            .register(KubernetesExternalLbInterface.class)
+            .register(DefaultKubernetesExternalLbInterface.class)
             .register(KubevirtNode.Type.class)
             .register(KubevirtNodeState.class)
             .register(Collection.class)
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/KubernetesConfigMapWatcher.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/KubernetesConfigMapWatcher.java
new file mode 100644
index 0000000..bac5e03
--- /dev/null
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/KubernetesConfigMapWatcher.java
@@ -0,0 +1,271 @@
+/*
+ * Copyright 2022-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.kubevirtnode.impl;
+
+import io.fabric8.kubernetes.api.model.ConfigMap;
+import io.fabric8.kubernetes.client.KubernetesClient;
+import io.fabric8.kubernetes.client.Watcher;
+import io.fabric8.kubernetes.client.WatcherException;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onosproject.cluster.ClusterService;
+import org.onosproject.cluster.LeadershipService;
+import org.onosproject.cluster.NodeId;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.kubevirtnode.api.DefaultKubernetesExternalLbConfig;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbConfig;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbConfigAdminService;
+import org.onosproject.kubevirtnode.api.KubevirtApiConfig;
+import org.onosproject.kubevirtnode.api.KubevirtApiConfigEvent;
+import org.onosproject.kubevirtnode.api.KubevirtApiConfigListener;
+import org.onosproject.kubevirtnode.api.KubevirtApiConfigService;
+import org.onosproject.kubevirtnode.api.KubevirtNodeService;
+import org.onosproject.mastership.MastershipService;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.slf4j.Logger;
+
+import java.util.Objects;
+import java.util.concurrent.ExecutorService;
+
+import static java.util.concurrent.Executors.newSingleThreadExecutor;
+import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.kubevirtnode.api.KubevirtNodeService.APP_ID;
+import static org.onosproject.kubevirtnode.util.KubevirtNodeUtil.k8sClient;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Kubernetes configmap watcher used for external loadbalancing among PODs.
+ */
+@Component(immediate = true)
+public class KubernetesConfigMapWatcher {
+    private final Logger log = getLogger(getClass());
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected MastershipService mastershipService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected ClusterService clusterService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected LeadershipService leadershipService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected KubevirtApiConfigService configService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected KubernetesExternalLbConfigAdminService adminService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected KubevirtNodeService nodeService;
+
+    private static final String KUBE_DASH_VIP = "kube-vip";
+    private static final String KUBE_VIP = "kubevip";
+    private static final String LOADBALANCER_IP = "loadBalancerIP";
+    private static final String TYPE_LOADBALANCER = "LoadBalancer";
+    private static final String KUBE_SYSTEM = "kube-system";
+    private static final String GATEWAY_IP = "gateway-ip";
+    private static final String GATEWAY_MAC = "gateway-mac";
+    private static final String RANGE_GLOBAL = "range-global";
+
+    private ApplicationId appId;
+    private NodeId localNodeId;
+
+    private final ExecutorService eventExecutor = newSingleThreadExecutor(
+            groupedThreads(this.getClass().getSimpleName(), "event-handler"));
+
+    private final InternalKubevirtApiConfigListener
+            configListener = new InternalKubevirtApiConfigListener();
+
+    private final InternalKubernetesConfigMapWatcher
+            mapWatcher = new InternalKubernetesConfigMapWatcher();
+
+    @Activate
+    protected void activate() {
+        appId = coreService.registerApplication(APP_ID);
+        localNodeId = clusterService.getLocalNode().id();
+        leadershipService.runForLeadership(appId.name());
+        configService.addListener(configListener);
+
+        log.info("Started");
+    }
+
+
+    @Deactivate
+    protected void deactivate() {
+        configService.removeListener(configListener);
+        leadershipService.withdraw(appId.name());
+        eventExecutor.shutdown();
+
+        log.info("Stopped");
+    }
+
+
+    private void instantiateWatcher() {
+        KubevirtApiConfig config = configService.apiConfig();
+        if (config == null) {
+            return;
+        }
+        KubernetesClient client = k8sClient(config);
+
+        if (client != null) {
+            client.configMaps().inNamespace(KUBE_SYSTEM).withName(KUBE_VIP).watch(mapWatcher);
+        }
+    }
+
+    private class InternalKubernetesConfigMapWatcher implements Watcher<ConfigMap> {
+
+        private boolean isMaster() {
+            return Objects.equals(localNodeId, leadershipService.getLeader(appId.name()));
+        }
+
+
+        @Override
+        public void eventReceived(Action action, ConfigMap configMap) {
+            switch (action) {
+                case ADDED:
+                    log.info("ConfigMap event ADDED received");
+                    eventExecutor.execute(() -> processAddOrMod(configMap));
+                    break;
+                case MODIFIED:
+                    log.info("ConfigMap event MODIFIED received");
+                    eventExecutor.execute(() -> processAddOrMod(configMap));
+                    break;
+                case DELETED:
+                    log.info("ConfigMap event DELETED received");
+                    eventExecutor.execute(() -> processDeletion(configMap));
+                    break;
+                case ERROR:
+                    log.warn("Failures processing pod manipulation.");
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        @Override
+        public void onClose(WatcherException e) {
+            // due to the bugs in fabric8, pod watcher might be closed,
+            // we will re-instantiate the pod watcher in this case
+            // FIXME: https://github.com/fabric8io/kubernetes-client/issues/2135
+            log.warn("Configmap watcher OnClose, re-instantiate the POD watcher...");
+            instantiateWatcher();
+        }
+
+        private void processAddOrMod(ConfigMap configMap) {
+            if (configMap == null || !isMaster()) {
+                return;
+            }
+
+            String configName = configMap.getMetadata().getName();
+            if (!configName.equals(KUBE_VIP)) {
+                return;
+            }
+
+            KubernetesExternalLbConfig lbConfig = parseKubernetesExternalLbConfig(configMap, configName);
+
+            if (lbConfig == null) {
+                return;
+            }
+
+            log.info("Kubernetes external LB config inserted/updated {}", lbConfig);
+
+            if (adminService.lbConfig(configName) == null) {
+                adminService.createKubernetesExternalLbConfig(lbConfig);
+            } else {
+                adminService.updateKubernetesExternalLbConfig(lbConfig);
+            }
+        }
+
+        private void processDeletion(ConfigMap configMap) {
+            if (configMap == null || !isMaster()) {
+                return;
+            }
+
+            String configName = configMap.getMetadata().getName();
+            if (!configName.equals(KUBE_VIP)) {
+                return;
+            }
+
+            KubernetesExternalLbConfig lbConfig = adminService.lbConfig(configName);
+
+            if (lbConfig == null) {
+                return;
+            }
+
+            adminService.removeKubernetesExternalLbConfig(configName);
+        }
+
+        private KubernetesExternalLbConfig parseKubernetesExternalLbConfig(ConfigMap configMap, String configName) {
+            if (configMap.getData().get(GATEWAY_IP) == null || configMap.getData().get(RANGE_GLOBAL) == null) {
+                return null;
+            }
+
+            KubernetesExternalLbConfig.Builder lbConfigBuilder = DefaultKubernetesExternalLbConfig.builder();
+
+            try {
+                lbConfigBuilder.configName(configName)
+                        .loadBalancerGwIp(IpAddress.valueOf(configMap.getData().get(GATEWAY_IP)))
+                        .globalIpRange(configMap.getData().get(RANGE_GLOBAL));
+
+                if (configMap.getData().containsKey(GATEWAY_MAC)) {
+                    lbConfigBuilder.loadBalancerGwMac(MacAddress.valueOf(configMap.getData().get(GATEWAY_MAC)));
+                }
+
+            } catch (IllegalArgumentException e) {
+                log.error("Exception occurred because of {}", e.toString());
+            }
+
+            return lbConfigBuilder.build();
+        }
+    }
+
+    private class InternalKubevirtApiConfigListener implements KubevirtApiConfigListener {
+
+        private boolean isRelevantHelper() {
+            return Objects.equals(localNodeId, leadershipService.getLeader(appId.name()));
+        }
+
+        @Override
+        public void event(KubevirtApiConfigEvent event) {
+
+            switch (event.type()) {
+                case KUBEVIRT_API_CONFIG_UPDATED:
+                    eventExecutor.execute(this::processConfigUpdate);
+                    break;
+                case KUBEVIRT_API_CONFIG_CREATED:
+                case KUBEVIRT_API_CONFIG_REMOVED:
+                default:
+                    // do nothing
+                    break;
+            }
+        }
+
+        private void processConfigUpdate() {
+            if (!isRelevantHelper()) {
+                return;
+            }
+            instantiateWatcher();
+        }
+    }
+}
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/KubernetesExternalLbConfigManager.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/KubernetesExternalLbConfigManager.java
new file mode 100644
index 0000000..0562ee9
--- /dev/null
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/KubernetesExternalLbConfigManager.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright 2022-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.kubevirtnode.impl;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.event.ListenerRegistry;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbConfig;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbConfigAdminService;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbConfigEvent;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbConfigListener;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbConfigService;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbConfigStore;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbConfigStoreDelegate;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.slf4j.Logger;
+
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Provides implementation of administrating and interfacing kubernetes external lb config.
+ */
+@Component(
+        immediate = true,
+        service = {KubernetesExternalLbConfigAdminService.class, KubernetesExternalLbConfigService.class}
+)
+public class KubernetesExternalLbConfigManager
+        extends ListenerRegistry<KubernetesExternalLbConfigEvent, KubernetesExternalLbConfigListener>
+        implements KubernetesExternalLbConfigAdminService, KubernetesExternalLbConfigService {
+    protected final Logger log = getLogger(getClass());
+
+    private static final String MSG_LOAD_BALANCER_CONFIG = "Kubernetes external lb config %s %s";
+    private static final String MSG_CREATED = "created";
+    private static final String MSG_UPDATED = "updated";
+    private static final String MSG_REMOVED = "removed";
+
+    private static final String ERR_NULL_LOAD_BALANCER_CONFIG = "Kubernetes external lb config cannot be null";
+    private static final String ERR_NULL_LOAD_BALANCER_CONFIG_NAME
+            = "Kubernetes external lb config name cannot be null";
+    private static final String ERR_IN_USE = " still in use";
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected KubernetesExternalLbConfigStore lbConfigStore;
+
+    private final InternalKubernetesExternalLbConfigStorageDelegate delegate =
+            new InternalKubernetesExternalLbConfigStorageDelegate();
+
+    private ApplicationId appId;
+
+
+    @Activate
+    protected void activate() {
+        appId = coreService.registerApplication(APP_ID);
+
+        lbConfigStore.setDelegate(delegate);
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        lbConfigStore.unsetDelegate(delegate);
+        log.info("Stopped");
+    }
+
+
+    @Override
+    public void createKubernetesExternalLbConfig(KubernetesExternalLbConfig lbConfig) {
+        checkNotNull(lbConfig, ERR_NULL_LOAD_BALANCER_CONFIG);
+        checkArgument(!Strings.isNullOrEmpty(lbConfig.configName()), ERR_NULL_LOAD_BALANCER_CONFIG_NAME);
+
+        lbConfigStore.createExternalLbConfig(lbConfig);
+        log.info(String.format(MSG_LOAD_BALANCER_CONFIG, lbConfig.configName(), MSG_CREATED));
+    }
+
+    @Override
+    public void updateKubernetesExternalLbConfig(KubernetesExternalLbConfig lbConfig) {
+        checkNotNull(lbConfig, ERR_NULL_LOAD_BALANCER_CONFIG);
+        checkArgument(!Strings.isNullOrEmpty(lbConfig.configName()), ERR_NULL_LOAD_BALANCER_CONFIG_NAME);
+
+        lbConfigStore.updateExternalLbConfig(lbConfig);
+        log.info(String.format(MSG_LOAD_BALANCER_CONFIG, lbConfig.configName(), MSG_UPDATED));
+    }
+
+    @Override
+    public void removeKubernetesExternalLbConfig(String configName) {
+
+        checkArgument(configName != null, ERR_NULL_LOAD_BALANCER_CONFIG_NAME);
+
+        synchronized (this) {
+            KubernetesExternalLbConfig lbConfig = lbConfigStore.removeExternalLbConfig(configName);
+
+            if (lbConfig != null) {
+                log.info(String.format(MSG_LOAD_BALANCER_CONFIG, lbConfig.configName(), MSG_REMOVED));
+            }
+        }
+    }
+
+    @Override
+    public KubernetesExternalLbConfig lbConfig(String configName) {
+        checkArgument(configName != null, ERR_NULL_LOAD_BALANCER_CONFIG_NAME);
+
+        return lbConfigStore.externalLbConfig(configName);
+    }
+
+    @Override
+    public Set<KubernetesExternalLbConfig> lbConfigs() {
+        return ImmutableSet.copyOf(lbConfigStore.externalLbConfigs());
+    }
+
+    private class InternalKubernetesExternalLbConfigStorageDelegate
+            implements KubernetesExternalLbConfigStoreDelegate {
+
+        @Override
+        public void notify(KubernetesExternalLbConfigEvent event) {
+            log.trace("send kubernetes external lb config event {}", event);
+            process(event);
+        }
+    }
+}
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/KubevirtNodeWatcher.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/KubevirtNodeWatcher.java
index 5ff2856..3949d79 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/KubevirtNodeWatcher.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/KubevirtNodeWatcher.java
@@ -186,7 +186,7 @@
             }
 
             KubevirtNode kubevirtNode = buildKubevirtNode(node);
-            log.info("buildKubevirtNode: {}", kubevirtNode.toString());
+            log.info("buildKubevirtNode: {}", kubevirtNode);
             if (kubevirtNode.type() == WORKER || kubevirtNode.type() == GATEWAY) {
                 if (!kubevirtNodeAdminService.hasNode(kubevirtNode.hostname())) {
                     kubevirtNodeAdminService.createNode(kubevirtNode);
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/util/KubevirtNodeUtil.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/util/KubevirtNodeUtil.java
index 2589be5..a5a5157 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/util/KubevirtNodeUtil.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/util/KubevirtNodeUtil.java
@@ -15,6 +15,8 @@
  */
 package org.onosproject.kubevirtnode.util;
 
+import com.eclipsesource.json.JsonArray;
+import com.eclipsesource.json.JsonObject;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -27,12 +29,12 @@
 import io.fabric8.kubernetes.client.DefaultKubernetesClient;
 import io.fabric8.kubernetes.client.KubernetesClient;
 import org.apache.commons.lang.StringUtils;
-import com.eclipsesource.json.JsonArray;
-import com.eclipsesource.json.JsonObject;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
+import org.onosproject.kubevirtnode.api.DefaultKubernetesExternalLbInterface;
 import org.onosproject.kubevirtnode.api.DefaultKubevirtNode;
 import org.onosproject.kubevirtnode.api.DefaultKubevirtPhyInterface;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbInterface;
 import org.onosproject.kubevirtnode.api.KubevirtApiConfig;
 import org.onosproject.kubevirtnode.api.KubevirtNode;
 import org.onosproject.kubevirtnode.api.KubevirtNodeState;
@@ -85,11 +87,11 @@
     private static final String DATA_IP_KEY = SONA_PROJECT_DOMAIN + "/data-ip";
     private static final String GATEWAY_CONFIG_KEY = SONA_PROJECT_DOMAIN + "/gateway-config";
     private static final String GATEWAY_BRIDGE_NAME = "gatewayBridgeName";
-    private static final String ELB_CONFIG_KEY = SONA_PROJECT_DOMAIN + "/elb-config";
-    private static final String ELB_BRIDGE_NAME = "elbBridgeName";
-    private static final String ELB_IP_KEY = SONA_PROJECT_DOMAIN + "/elb-ip";
-    private static final String ELB_GW_IP_KEY = SONA_PROJECT_DOMAIN + "/elb-gw-ip";
-    private static final String ELB_GW_MAC_KEY = SONA_PROJECT_DOMAIN + "/elb-gw-mac";
+    private static final String EXTERNAL_LB_CONFIG_KEY = SONA_PROJECT_DOMAIN + "/externalLb-config";
+    private static final String EXTERNAL_LB_BRIDGE_NAME = "externalLbBridgeName";
+    private static final String EXTERNAL_LB_IP_KEY = SONA_PROJECT_DOMAIN + "/externalLb-ip";
+    private static final String EXTERNAL_LB_GATEWAY_IP_KEY = SONA_PROJECT_DOMAIN + "/externalLb-gateway-ip";
+    private static final String EXTERNAL_LB_GATEWAY_MAC_KEY = SONA_PROJECT_DOMAIN + "/externalLb-gateway-mac";
     private static final String NETWORK_KEY = "network";
     private static final String INTERFACE_KEY = "interface";
     private static final String PHYS_BRIDGE_ID = "physBridgeId";
@@ -393,15 +395,17 @@
         Set<KubevirtPhyInterface> phys = new HashSet<>();
         String gatewayBridgeName = null;
 
-        String elbConfig = annots.get(ELB_CONFIG_KEY);
-        String elbIpStr = annots.get(ELB_IP_KEY);
-        String elbGwIpStr = annots.get(ELB_GW_IP_KEY);
-        String elbGwMacStr = annots.get(ELB_GW_MAC_KEY);
+        String elbConfig = annots.get(EXTERNAL_LB_CONFIG_KEY);
+        String elbIpStr = annots.get(EXTERNAL_LB_IP_KEY);
+        String elbGwIpStr = annots.get(EXTERNAL_LB_GATEWAY_IP_KEY);
+        String elbGwMacStr = annots.get(EXTERNAL_LB_GATEWAY_MAC_KEY);
         String elbBridgeName = null;
         IpAddress elbIp = null;
         IpAddress elbGwIp = null;
         MacAddress elbGwMac = null;
 
+        KubernetesExternalLbInterface kubernetesExternalLbInterface = null;
+
         try {
             if (physnetConfig != null) {
                 JsonArray configJson = JsonArray.readFrom(physnetConfig);
@@ -443,15 +447,20 @@
                 if (elbConfig != null && elbIpStr != null && elbGwIpStr != null) {
                     JsonNode elbJsonNode = new ObjectMapper().readTree(elbConfig);
 
-                    elbBridgeName = elbJsonNode.get(ELB_BRIDGE_NAME).asText();
+                    elbBridgeName = elbJsonNode.get(EXTERNAL_LB_BRIDGE_NAME).asText();
                     elbIp = IpAddress.valueOf(elbIpStr);
                     elbGwIp = IpAddress.valueOf(elbGwIpStr);
-                }
 
-                if (elbGwMacStr != null) {
-                    elbGwMac = MacAddress.valueOf(elbGwMacStr);
-                } else {
-                    //TODO: add the logic that retrieves the MAC address of the elb gw ip.
+                    if (elbGwMacStr != null) {
+                        elbGwMac = MacAddress.valueOf(elbGwMacStr);
+                    }
+
+                    kubernetesExternalLbInterface = DefaultKubernetesExternalLbInterface.builder()
+                            .externalLbBridgeName(elbBridgeName)
+                            .externalLbIp(elbIp)
+                            .externallbGwIp(elbGwIp)
+                            .externalLbGwMac(elbGwMac)
+                            .build();
                 }
             }
         } catch (JsonProcessingException e) {
@@ -483,10 +492,7 @@
                 .state(KubevirtNodeState.ON_BOARDED)
                 .phyIntfs(phys)
                 .gatewayBridgeName(gatewayBridgeName)
-                .elbBridgeName(elbBridgeName)
-                .elbIp(elbIp)
-                .elbGwIp(elbGwIp)
-                .elbGwMac(elbGwMac)
+                .kubernetesExternalLbInterface(kubernetesExternalLbInterface)
                 .build();
     }
 
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtNodeCodecRegister.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtNodeCodecRegister.java
index 55d740f..00a1007 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtNodeCodecRegister.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtNodeCodecRegister.java
@@ -16,9 +16,11 @@
 package org.onosproject.kubevirtnode.web;
 
 import org.onosproject.codec.CodecService;
+import org.onosproject.kubevirtnode.api.KubernetesExternalLbInterface;
 import org.onosproject.kubevirtnode.api.KubevirtApiConfig;
 import org.onosproject.kubevirtnode.api.KubevirtNode;
 import org.onosproject.kubevirtnode.api.KubevirtPhyInterface;
+import org.onosproject.kubevirtnode.codec.KubernetesExternalLbInterfaceCodec;
 import org.onosproject.kubevirtnode.codec.KubevirtApiConfigCodec;
 import org.onosproject.kubevirtnode.codec.KubevirtNodeCodec;
 import org.onosproject.kubevirtnode.codec.KubevirtPhyInterfaceCodec;
@@ -47,6 +49,7 @@
         codecService.registerCodec(KubevirtNode.class, new KubevirtNodeCodec());
         codecService.registerCodec(KubevirtPhyInterface.class, new KubevirtPhyInterfaceCodec());
         codecService.registerCodec(KubevirtApiConfig.class, new KubevirtApiConfigCodec());
+        codecService.registerCodec(KubernetesExternalLbInterface.class, new KubernetesExternalLbInterfaceCodec());
 
         log.info("Started");
     }
@@ -56,6 +59,7 @@
         codecService.unregisterCodec(KubevirtNode.class);
         codecService.unregisterCodec(KubevirtPhyInterface.class);
         codecService.unregisterCodec(KubevirtApiConfig.class);
+        codecService.unregisterCodec(KubernetesExternalLbInterface.class);
 
         log.info("Stopped");
     }
