diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/Constants.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/Constants.java
index 3d2f14c..0957fb7 100644
--- a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/Constants.java
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/Constants.java
@@ -49,4 +49,11 @@
     public static final String DEFAULT_CLUSTER_NAME = "default";
 
     public static final String SONA_PROJECT_DOMAIN = "sonaproject.github.io";
+
+    // CLI item length
+    public static final int CLI_NAME_LENGTH = 30;
+    public static final int CLI_IP_ADDRESSES_LENGTH = 50;
+    public static final int CLI_IP_ADDRESS_LENGTH = 25;
+    public static final int CLI_MAC_ADDRESS_LENGTH = 25;
+    public static final int CLI_MARGIN_LENGTH = 2;
 }
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubernetesExternalLbConfig.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubernetesExternalLbConfig.java
new file mode 100644
index 0000000..1147ac7
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubernetesExternalLbConfig.java
@@ -0,0 +1,155 @@
+/*
+ * 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.api;
+
+import com.google.common.base.MoreObjects;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+/**
+ * Default implementation of kubernetes external lb config.
+ */
+public final class DefaultKubernetesExternalLbConfig implements KubernetesExternalLbConfig {
+
+    private static final String NOT_NULL_MSG = "ExternalLbConfig % cannot be null";
+
+    private final String configName;
+    private final IpAddress loadBalancerGwIp;
+    private final MacAddress loadBalancerGwMac;
+    private final String globalIpRange;
+
+    public DefaultKubernetesExternalLbConfig(String configName, IpAddress loadBalancerGwIp,
+                                             MacAddress loadBalancerGwMac, String globalIpRange) {
+        this.configName = configName;
+        this.loadBalancerGwIp = loadBalancerGwIp;
+        this.loadBalancerGwMac = loadBalancerGwMac;
+        this.globalIpRange = globalIpRange;
+    }
+
+    @Override
+    public String configName() {
+        return configName;
+    }
+
+    @Override
+    public IpAddress loadBalancerGwIp() {
+        return loadBalancerGwIp;
+    }
+
+    @Override
+    public MacAddress loadBalancerGwMac() {
+        return loadBalancerGwMac;
+    }
+
+    @Override
+    public String globalIpRange() {
+        return globalIpRange;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        DefaultKubernetesExternalLbConfig that = (DefaultKubernetesExternalLbConfig) o;
+
+        return Objects.equals(configName, that.configName) &&
+                Objects.equals(loadBalancerGwIp, that.loadBalancerGwIp) &&
+                Objects.equals(globalIpRange, that.globalIpRange);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(configName, loadBalancerGwIp, globalIpRange);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("configName", configName)
+                .add("loadBalancerGwIp", loadBalancerGwIp)
+                .add("loadBalancerGwMac", loadBalancerGwMac)
+                .add("globalIpRange", globalIpRange)
+                .toString();
+    }
+
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    @Override
+    public KubernetesExternalLbConfig updateLbGatewayMac(MacAddress gatewayMac) {
+        return DefaultKubernetesExternalLbConfig.builder()
+                .configName(configName)
+                .loadBalancerGwIp(loadBalancerGwIp)
+                .loadBalancerGwMac(loadBalancerGwMac)
+                .globalIpRange(globalIpRange)
+                .build();
+    }
+
+    public static final class Builder implements KubernetesExternalLbConfig.Builder {
+
+        private String configName;
+        private IpAddress loadBalancerGwIp;
+        private MacAddress loadBalancerGwMac;
+        private String globalIpRange;
+
+        private Builder() {
+        }
+
+        @Override
+        public KubernetesExternalLbConfig build() {
+            checkArgument(configName != null, NOT_NULL_MSG, "configName");
+            checkArgument(loadBalancerGwIp != null, NOT_NULL_MSG, "loadBalancerGwIp");
+            checkArgument(globalIpRange != null, NOT_NULL_MSG, "globalIpRange");
+
+            return new DefaultKubernetesExternalLbConfig(configName, loadBalancerGwIp,
+                    loadBalancerGwMac, globalIpRange);
+        }
+
+        @Override
+        public Builder configName(String configName) {
+            this.configName = configName;
+            return this;
+        }
+
+        @Override
+        public Builder loadBalancerGwIp(IpAddress loadBalancerGwIp) {
+            this.loadBalancerGwIp = loadBalancerGwIp;
+            return this;
+        }
+
+        @Override
+        public KubernetesExternalLbConfig.Builder loadBalancerGwMac(MacAddress loadBalancerGwMac) {
+            this.loadBalancerGwMac = loadBalancerGwMac;
+            return this;
+        }
+
+        @Override
+        public Builder globalIpRange(String globalIpRange) {
+            this.globalIpRange = globalIpRange;
+            return this;
+        }
+    }
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubernetesExternalLbInterface.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubernetesExternalLbInterface.java
new file mode 100644
index 0000000..fe53b53
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubernetesExternalLbInterface.java
@@ -0,0 +1,141 @@
+/*
+ * 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.api;
+
+import com.google.common.base.MoreObjects;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+public class DefaultKubernetesExternalLbInterface implements KubernetesExternalLbInterface {
+
+    private static final String NOT_NULL_MSG = "KubernetesExternalLbInterface % cannot be null";
+
+    private String elbBridgeName;
+    private IpAddress elbIp;
+    private IpAddress elbGwIp;
+    private MacAddress elbGwMac;
+
+    public DefaultKubernetesExternalLbInterface(String elbBridgeName, IpAddress elbIp,
+                                                IpAddress elbGwIp, MacAddress elbGwMac) {
+        this.elbBridgeName = elbBridgeName;
+        this.elbIp = elbIp;
+        this.elbGwIp = elbGwIp;
+        this.elbGwMac = elbGwMac;
+    }
+
+    @Override
+    public String externalLbBridgeName() {
+        return elbBridgeName;
+    }
+
+    @Override
+    public IpAddress externalLbIp() {
+        return elbIp;
+    }
+
+    @Override
+    public IpAddress externalLbGwIp() {
+        return elbGwIp;
+    }
+
+    @Override
+    public MacAddress externalLbGwMac() {
+        return elbGwMac;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        DefaultKubernetesExternalLbInterface that = (DefaultKubernetesExternalLbInterface) o;
+
+        return Objects.equals(elbBridgeName, that.elbBridgeName) &&
+                Objects.equals(elbIp, that.elbIp) &&
+                Objects.equals(elbGwIp, that.elbGwIp);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("elbBridgeName", elbBridgeName)
+                .add("elbIp", elbIp)
+                .add("elbGwIp", elbGwIp)
+                .add("elbGwMac", elbGwMac)
+                .toString();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(elbBridgeName, elbIp, elbGwIp);
+    }
+
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    public static final class Builder implements KubernetesExternalLbInterface.Builder {
+        private String elbBridgeName;
+        private IpAddress elbIp;
+        private IpAddress elbGwIp;
+        private MacAddress elbGwMac;
+
+        private Builder() {
+        }
+
+        @Override
+        public KubernetesExternalLbInterface build() {
+            checkArgument(elbBridgeName != null, NOT_NULL_MSG, "externalLbBridgeName");
+            checkArgument(elbIp != null, NOT_NULL_MSG, "externalLbIp");
+            checkArgument(elbGwIp != null, NOT_NULL_MSG, "externalLbGwIp");
+            checkArgument(elbGwMac != null, NOT_NULL_MSG, "externalLbGwMac");
+
+            return new DefaultKubernetesExternalLbInterface(elbBridgeName, elbIp, elbGwIp, elbGwMac);
+        }
+
+        @Override
+        public Builder externalLbBridgeName(String elbBridgeName) {
+            this.elbBridgeName = elbBridgeName;
+            return this;
+        }
+
+        @Override
+        public Builder externalLbIp(IpAddress elbIp) {
+            this.elbIp = elbIp;
+            return this;
+        }
+
+        @Override
+        public Builder externallbGwIp(IpAddress elbGwIp) {
+            this.elbGwIp = elbGwIp;
+            return this;
+        }
+
+        @Override
+        public Builder externalLbGwMac(MacAddress elbGwMac) {
+            this.elbGwMac = elbGwMac;
+            return this;
+        }
+    }
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java
index 16f7034..2c3d0be 100644
--- a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java
@@ -59,10 +59,7 @@
     private final KubevirtNodeState state;
     private final Collection<KubevirtPhyInterface> phyIntfs;
     private final String gatewayBridgeName;
-    private final String elbBridgeName;
-    private final IpAddress elbIp;
-    private final IpAddress elbGwIp;
-    private final MacAddress elbGwMac;
+    private final KubernetesExternalLbInterface kubernetesExternalLbIntf;
 
     /**
      * A default constructor of kubevirt node.
@@ -77,18 +74,15 @@
      * @param state             node state
      * @param phyIntfs          physical interfaces
      * @param gatewayBridgeName  gateway bridge name
-     * @param elbBridgeName     elb bridge name
-     * @param elbIp             elb IP address
-     * @param elbGwIp           elb gw IP address
-     * @param elbGwMac          elb gw MAC address
+     * @param kubernetesExternalLbIntf kubernetesExternalLbIntf
      */
     protected DefaultKubevirtNode(String clusterName, String hostname, Type type,
                                   DeviceId intgBridge, DeviceId tunBridge,
                                   IpAddress managementIp, IpAddress dataIp,
                                   KubevirtNodeState state,
                                   Collection<KubevirtPhyInterface> phyIntfs,
-                                  String gatewayBridgeName, String elbBridgeName, IpAddress elbIp,
-                                  IpAddress elbGwIp, MacAddress elbGwMac) {
+                                  String gatewayBridgeName,
+                                  KubernetesExternalLbInterface kubernetesExternalLbIntf) {
         this.clusterName = clusterName;
         this.hostname = hostname;
         this.type = type;
@@ -99,10 +93,7 @@
         this.state = state;
         this.phyIntfs = phyIntfs;
         this.gatewayBridgeName = gatewayBridgeName;
-        this.elbBridgeName = elbBridgeName;
-        this.elbIp = elbIp;
-        this.elbGwIp = elbGwIp;
-        this.elbGwMac = elbGwMac;
+        this.kubernetesExternalLbIntf = kubernetesExternalLbIntf;
     }
 
     @Override
@@ -163,10 +154,7 @@
                 .state(newState)
                 .phyIntfs(phyIntfs)
                 .gatewayBridgeName(gatewayBridgeName)
-                .elbBridgeName(elbBridgeName)
-                .elbIp(elbIp)
-                .elbGwIp(elbGwIp)
-                .elbGwMac(elbGwMac)
+                .kubernetesExternalLbInterface(kubernetesExternalLbIntf)
                 .build();
     }
 
@@ -183,10 +171,7 @@
                 .state(state)
                 .phyIntfs(phyIntfs)
                 .gatewayBridgeName(gatewayBridgeName)
-                .elbBridgeName(elbBridgeName)
-                .elbIp(elbIp)
-                .elbGwIp(elbGwIp)
-                .elbGwMac(elbGwMac)
+                .kubernetesExternalLbInterface(kubernetesExternalLbIntf)
                 .build();
     }
 
@@ -203,10 +188,7 @@
                 .state(state)
                 .phyIntfs(phyIntfs)
                 .gatewayBridgeName(gatewayBridgeName)
-                .elbBridgeName(elbBridgeName)
-                .elbIp(elbIp)
-                .elbGwIp(elbGwIp)
-                .elbGwMac(elbGwMac)
+                .kubernetesExternalLbInterface(kubernetesExternalLbIntf)
                 .build();
     }
 
@@ -259,23 +241,8 @@
     }
 
     @Override
-    public String elbBridgeName() {
-        return elbBridgeName;
-    }
-
-    @Override
-    public IpAddress elbIp() {
-        return elbIp;
-    }
-
-    @Override
-    public IpAddress elbGwIp() {
-        return elbGwIp;
-    }
-
-    @Override
-    public MacAddress elbGwMac() {
-        return elbGwMac;
+    public KubernetesExternalLbInterface kubernetesExternalLbInterface() {
+        return kubernetesExternalLbIntf;
     }
 
     private PortNumber tunnelPort(String tunnelType) {
@@ -343,10 +310,7 @@
                 .state(node.state())
                 .phyIntfs(node.phyIntfs())
                 .gatewayBridgeName(node.gatewayBridgeName())
-                .elbBridgeName(node.elbBridgeName())
-                .elbIp(node.elbIp())
-                .elbGwIp(node.elbGwIp())
-                .elbGwMac(node.elbGwMac());
+                .kubernetesExternalLbInterface(node.kubernetesExternalLbInterface());
     }
 
     @Override
@@ -386,10 +350,7 @@
                 .add("state", state)
                 .add("phyIntfs", phyIntfs)
                 .add("gatewayBridgeName", gatewayBridgeName)
-                .add("elbBridgeName", elbBridgeName)
-                .add("elbIp", elbIp)
-                .add("elbGwIp", elbGwIp)
-                .add("elbGwMac", elbGwMac)
+                .add("kubernetesExternalLbInterface", kubernetesExternalLbIntf)
                 .toString();
     }
 
@@ -409,6 +370,7 @@
         private IpAddress elbIp;
         private IpAddress elbGwIp;
         private MacAddress elbGwMac;
+        private KubernetesExternalLbInterface kubernetesExternalLbInterface;
 
         // private constructor not intended to use from external
         private Builder() {
@@ -436,10 +398,7 @@
                     state,
                     phyIntfs,
                     gatewayBridgeName,
-                    elbBridgeName,
-                    elbIp,
-                    elbGwIp,
-                    elbGwMac
+                    kubernetesExternalLbInterface
             );
         }
 
@@ -504,26 +463,8 @@
         }
 
         @Override
-        public Builder elbBridgeName(String elbBridgeName) {
-            this.elbBridgeName = elbBridgeName;
-            return this;
-        }
-
-        @Override
-        public Builder elbIp(IpAddress elbIp) {
-            this.elbIp = elbIp;
-            return this;
-        }
-
-        @Override
-        public Builder elbGwIp(IpAddress elbGwIp) {
-            this.elbGwIp = elbGwIp;
-            return this;
-        }
-
-        @Override
-        public Builder elbGwMac(MacAddress elbGwMac) {
-            this.elbGwMac = elbGwMac;
+        public Builder kubernetesExternalLbInterface(KubernetesExternalLbInterface kubernetesExternalLbInterface) {
+            this.kubernetesExternalLbInterface = kubernetesExternalLbInterface;
             return this;
         }
     }
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfig.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfig.java
new file mode 100644
index 0000000..a0f1e90
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfig.java
@@ -0,0 +1,107 @@
+/*
+ * 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.api;
+
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+
+/**
+ * Representation of configuration used in Kubernetes External Lb service.
+ */
+public interface KubernetesExternalLbConfig {
+
+    /**
+     * Returns the name of kubernetes external lb config.
+     * This is defined in the configmap.
+     *
+     * @return config name
+     */
+    String configName();
+    /**
+     * Returns the gateway IP of load balancer.
+     * TEG would send outbound traffic to this gateway.
+     *
+     * @return load balancer gateway IP
+     */
+    IpAddress loadBalancerGwIp();
+
+    /**
+     * Returns the gateway MAC of load balancer.
+     * TEG would send outbound traffic to this gateway.
+     *
+     * @return load balancer gateway IP
+     */
+    MacAddress loadBalancerGwMac();
+
+    /**
+     * Returns the global IP range used in external LB.
+     * Each service of type LoadBalancer would get the public IP out of those.
+     * Format: "223.39.6.85-223.39.6.90"
+     *
+     * @return global Ip range
+     */
+    String globalIpRange();
+
+    /**
+     * Returns the KubernetesExternalLbConfig with updated external lb gateway mac address.
+     *
+     * @param gatewayMac external lb gateway mac address
+     * @return KubernetesExternalLbConfig
+     */
+    KubernetesExternalLbConfig updateLbGatewayMac(MacAddress gatewayMac);
+
+    interface Builder {
+        /**
+         * Builds an immutable kubernal external lb config instance.
+         *
+         * @return kubernetes external lb config
+         */
+        KubernetesExternalLbConfig build();
+
+        /**
+         * Returns kubernetes external lb config builder with supplied config name.
+         *
+         * @param configName config name
+         * @return kubernetes external lb config builder
+         */
+        Builder configName(String configName);
+
+        /**
+         * Returns kubernetes external lb config builder with supplied loadbalancer gw Ip.
+         *
+         * @param loadBalancerGwIp loadbalancer gw Ip
+         * @return kubernetes external lb config builder
+         */
+        Builder loadBalancerGwIp(IpAddress loadBalancerGwIp);
+
+        /**
+         * Returns kubernetes external lb config builder with supplied loadbalancer gw Mac.
+         *
+         * @param loadBalancerGwMac loadbalancer gw Mac
+         * @return kubernetes external lb config builder
+         */
+        Builder loadBalancerGwMac(MacAddress loadBalancerGwMac);
+
+        /**
+         * Returns kubernetes external lb config builder with supplied global Ip range.
+         *
+         * @param globalIpRange global Ip range
+         * @return kubernetes external lb config builder
+         */
+        Builder globalIpRange(String globalIpRange);
+
+    }
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigAdminService.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigAdminService.java
new file mode 100644
index 0000000..36e163f
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigAdminService.java
@@ -0,0 +1,43 @@
+/*
+ * 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.api;
+
+/**
+ * Service for administering inventory of Kubernetes External Lb Configs.
+ */
+public interface KubernetesExternalLbConfigAdminService extends KubernetesExternalLbConfigService {
+
+    /**
+     * Creates a new kubernetes external lb config.
+     *
+     * @param lbConfig kubernetes external lb config
+     */
+    void createKubernetesExternalLbConfig(KubernetesExternalLbConfig lbConfig);
+
+    /**
+     * Updates a new kubernetes external lb config.
+     *
+     * @param lbConfig kubernetes external lb config
+     */
+    void updateKubernetesExternalLbConfig(KubernetesExternalLbConfig lbConfig);
+
+    /**
+     * Removes a new kubernetes external lb config.
+     *
+     * @param configName kubernetes external lb config
+     */
+    void removeKubernetesExternalLbConfig(String configName);
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigEvent.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigEvent.java
new file mode 100644
index 0000000..c42ed31
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigEvent.java
@@ -0,0 +1,46 @@
+/*
+ * 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.api;
+
+import org.onosproject.event.AbstractEvent;
+
+public class KubernetesExternalLbConfigEvent
+        extends AbstractEvent<KubernetesExternalLbConfigEvent.Type, KubernetesExternalLbConfig> {
+
+    public KubernetesExternalLbConfigEvent(Type type, KubernetesExternalLbConfig subject) {
+        super(type, subject);
+    }
+
+    /**
+     * Kubernetes external lb config events.
+     */
+    public enum Type {
+        /**
+         * Signifies that a new config is created.
+         */
+        KUBERNETES_EXTERNAL_LB_CONFIG_CREATED,
+
+        /**
+         * Signifies that a new config is updated.
+         */
+        KUBERNETES_EXTERNAL_LB_CONFIG_UPDATED,
+
+        /**
+         * Signifies that a new config is removed.
+         */
+        KUBERNETES_EXTERNAL_LB_CONFIG_REMOVED
+    }
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigListener.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigListener.java
new file mode 100644
index 0000000..a91d048
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigListener.java
@@ -0,0 +1,24 @@
+/*
+ * 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.api;
+
+import org.onosproject.event.EventListener;
+
+/**
+ * Listener for kubernetes external lb config event.
+ */
+public interface KubernetesExternalLbConfigListener extends EventListener<KubernetesExternalLbConfigEvent> {
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigService.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigService.java
new file mode 100644
index 0000000..32e07e5
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigService.java
@@ -0,0 +1,43 @@
+/*
+ * 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.api;
+
+import org.onosproject.event.ListenerService;
+
+import java.util.Set;
+
+/**
+ * Service for administering the inventory of kubernetes external lb configs.
+ */
+public interface KubernetesExternalLbConfigService
+        extends ListenerService<KubernetesExternalLbConfigEvent, KubernetesExternalLbConfigListener> {
+    String APP_ID = "org.onosproject.kubevirtnode";
+
+    /**
+     * Returns the kubernetes external lb config with the given config name.
+     *
+     * @param configName config name
+     * @return kubernetes external lb config
+     */
+    KubernetesExternalLbConfig lbConfig(String configName);
+
+    /**
+     * Returns all kubernetes external lb configs.
+     *
+     * @return set of kubernetes external lb configs
+     */
+    Set<KubernetesExternalLbConfig> lbConfigs();
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigStore.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigStore.java
new file mode 100644
index 0000000..9a1e366
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigStore.java
@@ -0,0 +1,70 @@
+/*
+ * 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.api;
+
+import org.onosproject.store.Store;
+
+import java.util.Set;
+
+/**
+ * Manages inventory of kubernetes external lb config states; not intended for direct use.
+ */
+public interface KubernetesExternalLbConfigStore
+        extends Store<KubernetesExternalLbConfigEvent, KubernetesExternalLbConfigStoreDelegate> {
+
+    /**
+     * Creates a new kubernetes external lb config.
+     *
+     * @param lbConfig kubernetes external lb config
+     */
+    void createExternalLbConfig(KubernetesExternalLbConfig lbConfig);
+
+    /**
+     * Updates a new kubernetes external lb config.
+     *
+     * @param lbConfig kubernetes external lb config
+     */
+    void updateExternalLbConfig(KubernetesExternalLbConfig lbConfig);
+
+    /**
+     * Removes a new kubernetes external lb config.
+     *
+     * @param configName kubernetes external lb config
+     * @return removed kubernetes external lb config
+     */
+    KubernetesExternalLbConfig removeExternalLbConfig(String configName);
+
+    /**
+     * Returns the kubernetes external lb config with the given config name.
+     *
+     * @param configName config name
+     * @return kubernetes external lb config
+     */
+    KubernetesExternalLbConfig externalLbConfig(String configName);
+
+    /**
+     * Returns all kubernetes external lb configs.
+     *
+     * @return set of kubernetes external lb configs
+     */
+    Set<KubernetesExternalLbConfig> externalLbConfigs();
+
+    /**
+     * Removes all kubernetes external lb configs.
+     */
+    void clear();
+
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigStoreDelegate.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigStoreDelegate.java
new file mode 100644
index 0000000..12e5e11
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigStoreDelegate.java
@@ -0,0 +1,24 @@
+/*
+ * 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.api;
+
+import org.onosproject.store.StoreDelegate;
+
+/**
+ * Kubernetes external lb config store delegate abstraction.
+ */
+public interface KubernetesExternalLbConfigStoreDelegate extends StoreDelegate<KubernetesExternalLbConfigEvent> {
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbInterface.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbInterface.java
new file mode 100644
index 0000000..df9081f
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbInterface.java
@@ -0,0 +1,97 @@
+/*
+ * 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.api;
+
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+
+/**
+ * Representation of a Kubernetes external load balancer interface for kubevirt node.
+ */
+public interface KubernetesExternalLbInterface {
+
+    /**
+     *  Returns the name of the elb bridge.
+     *  Using this bridge, TEG internally communicates with data IP's in worker nodes.
+     *
+     * @return gateway bridge name
+     */
+    String externalLbBridgeName();
+
+    /**
+     *  Returns the internal Ip Address of TEG for kubernetes external lb purpose.
+     *
+     * @return elb ip address
+     */
+    IpAddress externalLbIp();
+
+    /**
+     *  Returns the gateway IP of the elb IP.
+     *
+     * @return elb gw ip address
+     */
+    IpAddress externalLbGwIp();
+
+    /**
+     *  Returns the mac address of the elb gw.
+     *
+     * @return elb gw mac address
+     */
+    MacAddress externalLbGwMac();
+
+
+    interface Builder {
+
+        /**
+         * Builds an immutable kubernetes external load balancer interface instance.
+         *
+         * @return  external load balancer interface instance
+         */
+        KubernetesExternalLbInterface build();
+
+        /**
+         * Returns kubernetes external load balancer interface builder with supplied elb bridge name.
+         *
+         * @param elbBridgeName elb bridge name
+         * @return kubernetes external load balancer interface builder
+         */
+        Builder externalLbBridgeName(String elbBridgeName);
+
+        /**
+         * Returns kubernetes external load balancer interface builder with supplied supplied elb Ip address.
+         *
+         * @param elbIp elb ip address
+         * @return kubernetes external load balancer interface builder
+         */
+        Builder externalLbIp(IpAddress elbIp);
+
+        /**
+         * Returns kubernetes external load balancer interface builder with supplied supplied elb gw Ip address.
+         *
+         * @param elbGwIp elb gw ip address
+         * @return kubernetes external load balancer interface builder
+         */
+        Builder externallbGwIp(IpAddress elbGwIp);
+
+        /**
+         * Returns kubernetes external load balancer interface builder with supplied supplied elb gw MAC address.
+         *
+         * @param elbGwMac elb gw mac address
+         * @return kubernetes external load balancer interface builder
+         */
+        Builder externalLbGwMac(MacAddress elbGwMac);
+    }
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java
index 0015105..502784d 100644
--- a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java
@@ -16,7 +16,6 @@
 package org.onosproject.kubevirtnode.api;
 
 import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
 
@@ -190,34 +189,11 @@
     String gatewayBridgeName();
 
     /**
-     *  Returns the name of the elb bridge.
-     *  Using this bridge, TEG internally communicates with data IP's in worker nodes.
+     *  Returns the kubernetesExternalLbInterface.
      *
-     * @return gateway bridge name
+     * @return kubernetesExternalLbInterface
      */
-    String elbBridgeName();
-
-    /**
-     *  Returns the internal Ip Address of TEG for kubernetes external lb purpose.
-     *
-     * @return elb ip address
-     */
-    IpAddress elbIp();
-
-    /**
-     *  Returns the gateway IP of the elb IP.
-     *
-     * @return elb gw ip address
-     */
-    IpAddress elbGwIp();
-
-    /**
-     *  Returns the mac address of the elb gw.
-     *
-     * @return elb gw mac address
-     */
-    MacAddress elbGwMac();
-
+    KubernetesExternalLbInterface kubernetesExternalLbInterface();
 
     /**
      * Builder of new node entity.
@@ -310,36 +286,13 @@
          */
         KubevirtNode.Builder gatewayBridgeName(String gatewayBridgeName);
 
-        /**
-         * Returns kubevirt node builder with supplied elb bridge name.
-         *
-         * @param elbBridgeName elb bridge name
-         * @return kubevirt node builder
-         */
-        KubevirtNode.Builder elbBridgeName(String elbBridgeName);
 
         /**
-         * Returns kubevirt node builder with supplied supplied elb Ip address.
+         * Returns kubevirt node builder with supplied supplied kubernetesExternalLbInterface.
          *
-         * @param elbIp elb ip address
+         * @param kubernetesExternalLbInterface kubernetesExternalLbInterface
          * @return kubevirt node builder
          */
-        KubevirtNode.Builder elbIp(IpAddress elbIp);
-
-        /**
-         * Returns kubevirt node builder with supplied supplied elb gw Ip address.
-         *
-         * @param elbGwIp elb gw ip address
-         * @return kubevirt node builder
-         */
-        KubevirtNode.Builder elbGwIp(IpAddress elbGwIp);
-
-        /**
-         * Returns kubevirt node builder with supplied supplied elb gw MAC address.
-         *
-         * @param elbGwMac elb gw mac address
-         * @return kubevirt node builder
-         */
-        KubevirtNode.Builder elbGwMac(MacAddress elbGwMac);
+        KubevirtNode.Builder kubernetesExternalLbInterface(KubernetesExternalLbInterface kubernetesExternalLbInterface);
     }
 }
