diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/cli/K8sHostListCommand.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/cli/K8sHostListCommand.java
new file mode 100644
index 0000000..fa996ba
--- /dev/null
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/cli/K8sHostListCommand.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2019-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.k8snode.cli;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.k8snode.api.K8sHost;
+import org.onosproject.k8snode.api.K8sHostService;
+import org.onosproject.k8snode.api.K8sTunnelBridge;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.onosproject.k8snode.util.K8sNodeUtil.genFormatString;
+import static org.onosproject.k8snode.util.K8sNodeUtil.prettyJson;
+
+/**
+ * Lists all host registered to the service.
+ */
+@Service
+@Command(scope = "onos", name = "k8s-hosts",
+        description = "Lists all hosts registered in kubernetes host service")
+public class K8sHostListCommand extends AbstractShellCommand {
+
+    private static final int HOST_IP_LENGTH = 15;
+    private static final int NODES_LENGTH = 40;
+    private static final int TUNBRS_LENGTH = 40;
+    private static final int STATUS_LENGTH = 15;
+
+    @Override
+    protected void doExecute() {
+        K8sHostService hostService = get(K8sHostService.class);
+        List<K8sHost> hosts = Lists.newArrayList(hostService.hosts());
+        hosts.sort(Comparator.comparing(K8sHost::hostIp));
+
+        String format = genFormatString(
+                ImmutableList.of(HOST_IP_LENGTH, NODES_LENGTH, TUNBRS_LENGTH, STATUS_LENGTH));
+
+        if (outputJson()) {
+            print("%s", json(hosts));
+        } else {
+            print(format, "Host IP", "Nodes", "Tunnel Bridges", "State");
+            for (K8sHost host : hosts) {
+                print(format,
+                        host.hostIp().toString(),
+                        host.nodeNames().toString(),
+                        host.tunBridges().stream().map(K8sTunnelBridge::name)
+                                .collect(Collectors.toSet()).toString(),
+                        host.state().toString());
+            }
+            print("Total %s hosts", hosts.size());
+        }
+    }
+
+    private String json(List<K8sHost> hosts) {
+        ObjectMapper mapper = new ObjectMapper();
+        ArrayNode result = mapper.createArrayNode();
+        for (K8sHost host: hosts) {
+            result.add(jsonForEntity(host, K8sHost.class));
+        }
+        return prettyJson(mapper, result.toString());
+    }
+}
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sApiConfigHandler.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sApiConfigHandler.java
index 33415a8..c188871 100644
--- a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sApiConfigHandler.java
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sApiConfigHandler.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.k8snode.impl;
 
+import com.google.common.collect.ImmutableSet;
 import io.fabric8.kubernetes.api.model.Node;
 import io.fabric8.kubernetes.api.model.NodeAddress;
 import io.fabric8.kubernetes.client.KubernetesClient;
@@ -24,6 +25,7 @@
 import org.onosproject.cluster.NodeId;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
+import org.onosproject.k8snode.api.DefaultK8sHost;
 import org.onosproject.k8snode.api.DefaultK8sNode;
 import org.onosproject.k8snode.api.ExternalNetworkService;
 import org.onosproject.k8snode.api.HostNodesInfo;
@@ -31,8 +33,12 @@
 import org.onosproject.k8snode.api.K8sApiConfigAdminService;
 import org.onosproject.k8snode.api.K8sApiConfigEvent;
 import org.onosproject.k8snode.api.K8sApiConfigListener;
+import org.onosproject.k8snode.api.K8sHost;
+import org.onosproject.k8snode.api.K8sHostAdminService;
+import org.onosproject.k8snode.api.K8sHostState;
 import org.onosproject.k8snode.api.K8sNode;
 import org.onosproject.k8snode.api.K8sNodeAdminService;
+import org.onosproject.k8snode.api.K8sTunnelBridge;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
@@ -44,6 +50,7 @@
 import java.util.Objects;
 import java.util.concurrent.ExecutorService;
 
+import static java.lang.Thread.sleep;
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.k8snode.api.Constants.DEFAULT_CLUSTER_NAME;
@@ -73,6 +80,8 @@
     private static final String DEFAULT_GATEWAY_IP = "127.0.0.1";
     private static final String DEFAULT_BRIDGE_IP = "127.0.0.1";
 
+    private static final long SLEEP_MS = 3000; // we wait 3s
+
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
@@ -89,6 +98,9 @@
     protected K8sNodeAdminService k8sNodeAdminService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected K8sHostAdminService k8sHostAdminService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ExternalNetworkService extNetworkService;
 
     private final ExecutorService eventExecutor = newSingleThreadExecutor(
@@ -142,6 +154,32 @@
         );
     }
 
+    private void bootstrapK8sHosts(K8sApiConfig config) {
+        KubernetesClient k8sClient = k8sClient(config);
+
+        if (k8sClient == null) {
+            log.warn("Failed to connect to kubernetes API server");
+            return;
+        }
+
+        config.infos().forEach(h -> {
+            k8sHostAdminService.createHost(buildK8sHost(h, config));
+        });
+
+    }
+
+    private K8sHost buildK8sHost(HostNodesInfo hostNodesInfo, K8sApiConfig config) {
+        int segmentId = config.segmentId();
+        K8sTunnelBridge bridge = new K8sTunnelBridge(segmentId);
+
+        return DefaultK8sHost.builder()
+                .hostIp(hostNodesInfo.hostIp())
+                .state(K8sHostState.INIT)
+                .tunBridges(ImmutableSet.of(bridge))
+                .nodeNames(hostNodesInfo.nodes())
+                .build();
+    }
+
     private K8sNode buildK8sNode(Node node, K8sApiConfig config) {
         String hostname = node.getMetadata().getName();
         IpAddress managementIp = null;
@@ -253,6 +291,14 @@
                 k8sApiConfigAdminService.updateApiConfig(newConfig);
 
                 bootstrapK8sNodes(config);
+
+                try {
+                    sleep(SLEEP_MS);
+                } catch (InterruptedException e) {
+                    log.error("Exception caused during init state checking...");
+                }
+
+                bootstrapK8sHosts(config);
             }
         }
     }
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sHostHandler.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sHostHandler.java
new file mode 100644
index 0000000..5da9624
--- /dev/null
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sHostHandler.java
@@ -0,0 +1,620 @@
+/*
+ * Copyright 2020-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.k8snode.impl;
+
+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.k8snode.api.K8sHost;
+import org.onosproject.k8snode.api.K8sHostAdminService;
+import org.onosproject.k8snode.api.K8sHostEvent;
+import org.onosproject.k8snode.api.K8sHostHandler;
+import org.onosproject.k8snode.api.K8sHostListener;
+import org.onosproject.k8snode.api.K8sHostState;
+import org.onosproject.k8snode.api.K8sNode;
+import org.onosproject.k8snode.api.K8sNodeAdminService;
+import org.onosproject.k8snode.api.K8sTunnelBridge;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Port;
+import org.onosproject.net.behaviour.BridgeConfig;
+import org.onosproject.net.behaviour.BridgeDescription;
+import org.onosproject.net.behaviour.ControllerInfo;
+import org.onosproject.net.behaviour.DefaultBridgeDescription;
+import org.onosproject.net.behaviour.DefaultPatchDescription;
+import org.onosproject.net.behaviour.DefaultTunnelDescription;
+import org.onosproject.net.behaviour.InterfaceConfig;
+import org.onosproject.net.behaviour.PatchDescription;
+import org.onosproject.net.behaviour.TunnelDescription;
+import org.onosproject.net.behaviour.TunnelEndPoints;
+import org.onosproject.net.behaviour.TunnelKey;
+import org.onosproject.net.device.DeviceAdminService;
+import org.onosproject.net.device.DeviceEvent;
+import org.onosproject.net.device.DeviceListener;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.ovsdb.controller.OvsdbClientService;
+import org.onosproject.ovsdb.controller.OvsdbController;
+import org.onosproject.ovsdb.controller.OvsdbNodeId;
+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.List;
+import java.util.Objects;
+import java.util.concurrent.ExecutorService;
+import java.util.stream.Collectors;
+
+import static java.lang.Thread.sleep;
+import static java.util.concurrent.Executors.newSingleThreadExecutor;
+import static org.onlab.packet.TpPort.tpPort;
+import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.k8snode.api.Constants.GENEVE;
+import static org.onosproject.k8snode.api.Constants.GRE;
+import static org.onosproject.k8snode.api.Constants.VXLAN;
+import static org.onosproject.k8snode.api.K8sHostState.COMPLETE;
+import static org.onosproject.k8snode.api.K8sHostState.DEVICE_CREATED;
+import static org.onosproject.k8snode.api.K8sHostState.INCOMPLETE;
+import static org.onosproject.k8snode.api.K8sHostState.INIT;
+import static org.onosproject.k8snode.api.K8sNodeService.APP_ID;
+import static org.onosproject.net.AnnotationKeys.PORT_NAME;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Service bootstraps kubernetes host.
+ */
+@Component(immediate = true)
+public class DefaultK8sHostHandler implements K8sHostHandler {
+
+    private final Logger log = getLogger(getClass());
+
+    private static final String DEFAULT_OF_PROTO = "tcp";
+    private static final int DEFAULT_OFPORT = 6653;
+    private static final int DPID_BEGIN = 3;
+    private static final long SLEEP_MS = 3000; // we wait 3s
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected LeadershipService leadershipService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected ClusterService clusterService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected DeviceService deviceService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected DeviceAdminService deviceAdminService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected OvsdbController ovsdbController;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected K8sHostAdminService k8sHostAdminService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected K8sNodeAdminService k8sNodeAdminService;
+
+
+    private int ovsdbPortNum = 6640;
+
+    private final ExecutorService eventExecutor = newSingleThreadExecutor(
+            groupedThreads(this.getClass().getSimpleName(), "event-handler", log));
+
+    private final DeviceListener ovsdbListener = new InternalOvsdbListener();
+    private final DeviceListener bridgeListener = new InternalBridgeListener();
+    private final K8sHostListener k8sHostListener = new InternalK8sHostListener();
+
+    private ApplicationId appId;
+    private NodeId localNode;
+
+    @Activate
+    protected void activate() {
+        appId = coreService.getAppId(APP_ID);
+        localNode = clusterService.getLocalNode().id();
+
+        leadershipService.runForLeadership(appId.name());
+        deviceService.addListener(ovsdbListener);
+        deviceService.addListener(bridgeListener);
+        k8sHostAdminService.addListener(k8sHostListener);
+
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        k8sHostAdminService.removeListener(k8sHostListener);
+        deviceService.removeListener(bridgeListener);
+        deviceService.removeListener(ovsdbListener);
+        leadershipService.withdraw(appId.name());
+        eventExecutor.shutdown();
+
+        log.info("Stopped");
+    }
+
+    @Override
+    public void processInitState(K8sHost k8sHost) {
+        if (!isOvsdbConnected(k8sHost, ovsdbPortNum, ovsdbController, deviceService)) {
+            ovsdbController.connect(k8sHost.hostIp(), tpPort(ovsdbPortNum));
+            return;
+        }
+
+        for (K8sTunnelBridge tunBridge : k8sHost.tunBridges()) {
+            if (!deviceService.isAvailable(tunBridge.deviceId())) {
+                createBridge(k8sHost.ovsdb(), tunBridge);
+            }
+        }
+    }
+
+    @Override
+    public void processDeviceCreatedState(K8sHost k8sHost) {
+        try {
+            if (!isOvsdbConnected(k8sHost, ovsdbPortNum, ovsdbController, deviceService)) {
+                ovsdbController.connect(k8sHost.hostIp(), tpPort(ovsdbPortNum));
+                return;
+            }
+
+            // create patch ports into tunnel bridge face to integration bridge
+            for (K8sTunnelBridge bridge : k8sHost.tunBridges()) {
+                for (String node : k8sHost.nodeNames()) {
+                    K8sNode k8sNode = k8sNodeAdminService.node(node);
+                    if (k8sNode.segmentId() == bridge.tunnelId()) {
+                        createPatchInterfaces(k8sHost.ovsdb(), bridge, k8sNode);
+                    }
+                }
+            }
+
+            // create tunnel ports
+            for (K8sTunnelBridge bridge : k8sHost.tunBridges()) {
+                if (!isTunPortEnabled(bridge, bridge.vxlanPortName())) {
+                    createVxlanTunnelInterface(k8sHost.ovsdb(), bridge);
+                }
+
+                if (!isTunPortEnabled(bridge, bridge.grePortName())) {
+                    createGreTunnelInterface(k8sHost.ovsdb(), bridge);
+                }
+
+                if (!isTunPortEnabled(bridge, bridge.genevePortName())) {
+                    createGeneveTunnelInterface(k8sHost.ovsdb(), bridge);
+                }
+            }
+        } catch (Exception e) {
+            log.error("Exception occurred because of {}", e);
+        }
+    }
+
+    @Override
+    public void processCompleteState(K8sHost k8sHost) {
+        // do something if needed
+    }
+
+    @Override
+    public void processIncompleteState(K8sHost k8sHost) {
+        // do something if needed
+    }
+
+    private void createBridge(DeviceId ovsdb, K8sTunnelBridge bridge) {
+        Device device = deviceService.getDevice(ovsdb);
+
+        List<ControllerInfo> controllers = clusterService.getNodes().stream()
+                .map(n -> new ControllerInfo(n.ip(), DEFAULT_OFPORT, DEFAULT_OF_PROTO))
+                .collect(Collectors.toList());
+
+        String dpid = bridge.dpid().substring(DPID_BEGIN);
+
+        BridgeDescription.Builder builder = DefaultBridgeDescription.builder()
+                .name(bridge.name())
+                .failMode(BridgeDescription.FailMode.SECURE)
+                .datapathId(dpid)
+                .disableInBand()
+                .controllers(controllers);
+
+        BridgeConfig bridgeConfig = device.as(BridgeConfig.class);
+        bridgeConfig.addBridge(builder.build());
+    }
+
+    private void createPatchInterfaces(DeviceId ovsdb, K8sTunnelBridge bridge, K8sNode k8sNode) {
+        Device device = deviceService.getDevice(ovsdb);
+        if (device == null || !device.is(InterfaceConfig.class)) {
+            log.error("Failed to create patch interface on {}", ovsdb);
+            return;
+        }
+
+        InterfaceConfig ifaceConfig = device.as(InterfaceConfig.class);
+
+        // tunnel bridge -> integration bridge
+        PatchDescription brTunIntPatchDesc =
+                DefaultPatchDescription.builder()
+                        .deviceId(bridge.name())
+                        .ifaceName(k8sNode.tunToIntgPatchPortName())
+                        .peer(k8sNode.intgToTunPatchPortName())
+                        .build();
+
+        ifaceConfig.addPatchMode(k8sNode.tunToIntgPatchPortName(), brTunIntPatchDesc);
+    }
+
+    private void createVxlanTunnelInterface(DeviceId ovsdb, K8sTunnelBridge bridge) {
+        createTunnelInterface(ovsdb, bridge, VXLAN, bridge.vxlanPortName());
+    }
+
+    private void createGreTunnelInterface(DeviceId ovsdb, K8sTunnelBridge bridge) {
+        createTunnelInterface(ovsdb, bridge, GRE, bridge.grePortName());
+    }
+
+    private void createGeneveTunnelInterface(DeviceId ovsdb, K8sTunnelBridge bridge) {
+        createTunnelInterface(ovsdb, bridge, GENEVE, bridge.genevePortName());
+    }
+
+    private void createTunnelInterface(DeviceId ovsdb, K8sTunnelBridge bridge,
+                                       String type, String intfName) {
+        if (isTunPortEnabled(bridge, intfName)) {
+            return;
+        }
+
+        Device device = deviceService.getDevice(ovsdb);
+        if (device == null || !device.is(InterfaceConfig.class)) {
+            log.error("Failed to create tunnel interface on {}", ovsdb);
+            return;
+        }
+
+        TunnelDescription tunnelDesc = buildTunnelDesc(bridge, type, intfName);
+
+        InterfaceConfig ifaceConfig = device.as(InterfaceConfig.class);
+        ifaceConfig.addTunnelMode(intfName, tunnelDesc);
+    }
+
+    private TunnelDescription buildTunnelDesc(K8sTunnelBridge bridge, String type, String intfName) {
+        TunnelKey<String> key = new TunnelKey<>(String.valueOf(bridge.tunnelId()));
+
+        if (VXLAN.equals(type) || GRE.equals(type) || GENEVE.equals(type)) {
+            TunnelDescription.Builder tdBuilder =
+                    DefaultTunnelDescription.builder()
+                            .deviceId(bridge.name())
+                            .ifaceName(intfName)
+                            .remote(TunnelEndPoints.flowTunnelEndpoint())
+                            .key(key);
+
+            switch (type) {
+                case VXLAN:
+                    tdBuilder.type(TunnelDescription.Type.VXLAN);
+                    break;
+                case GRE:
+                    tdBuilder.type(TunnelDescription.Type.GRE);
+                    break;
+                case GENEVE:
+                    tdBuilder.type(TunnelDescription.Type.GENEVE);
+                    break;
+                default:
+                    return null;
+            }
+
+            return tdBuilder.build();
+        }
+
+        return null;
+    }
+
+    private boolean isOvsdbConnected(K8sHost host, int ovsdbPort,
+                                     OvsdbController ovsdbController,
+                                     DeviceService deviceService) {
+        OvsdbClientService client = getOvsdbClient(host, ovsdbPort, ovsdbController);
+        return deviceService.isAvailable(host.ovsdb()) &&
+                client != null &&
+                client.isConnected();
+    }
+
+    private OvsdbClientService getOvsdbClient(K8sHost host, int ovsdbPort,
+                                              OvsdbController ovsdbController) {
+        OvsdbNodeId ovsdb = new OvsdbNodeId(host.hostIp(), ovsdbPort);
+        return ovsdbController.getOvsdbClient(ovsdb);
+    }
+
+    private boolean isCurrentStateDone(K8sHost k8sHost) {
+        switch (k8sHost.state()) {
+            case INIT:
+                return isInitStateDone(k8sHost);
+            case DEVICE_CREATED:
+                return isDeviceCreatedStateDone(k8sHost);
+            case COMPLETE:
+            case INCOMPLETE:
+                return false;
+            default:
+                return true;
+        }
+    }
+
+    private boolean isInitStateDone(K8sHost k8sHost) {
+        if (!isOvsdbConnected(k8sHost, ovsdbPortNum,
+                ovsdbController, deviceService)) {
+            return false;
+        }
+
+        try {
+            // we need to wait a while, in case interface and bridge
+            // creation requires some time
+            sleep(SLEEP_MS);
+        } catch (InterruptedException e) {
+            log.error("Exception caused during init state checking...");
+        }
+
+        for (K8sTunnelBridge tunBridge : k8sHost.tunBridges()) {
+            if (!deviceService.isAvailable(tunBridge.deviceId())) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private boolean isDeviceCreatedStateDone(K8sHost k8sHost) {
+        try {
+            // we need to wait a while, in case interface and bridge
+            // creation requires some time
+            sleep(SLEEP_MS);
+        } catch (InterruptedException e) {
+            log.error("Exception caused during init state checking...");
+        }
+
+        for (K8sTunnelBridge bridge: k8sHost.tunBridges()) {
+            if (!isTunPortEnabled(bridge, bridge.vxlanPortName())) {
+                return false;
+            }
+            if (!isTunPortEnabled(bridge, bridge.grePortName())) {
+                return false;
+            }
+            if (!isTunPortEnabled(bridge, bridge.genevePortName())) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private boolean isTunPortEnabled(K8sTunnelBridge tunBridge, String intf) {
+        return deviceService.isAvailable(tunBridge.deviceId()) &&
+                deviceService.getPorts(tunBridge.deviceId()).stream()
+                        .anyMatch(port -> Objects.equals(
+                                port.annotations().value(PORT_NAME), intf) &&
+                                port.isEnabled());
+    }
+
+    /**
+     * Configures the kubernetes host with new state.
+     *
+     * @param k8sHost       kubernetes host
+     * @param newState      a new state
+     */
+    private void setState(K8sHost k8sHost, K8sHostState newState) {
+        if (k8sHost.state() == newState) {
+            return;
+        }
+        K8sHost updated = k8sHost.updateState(newState);
+        k8sHostAdminService.updateHost(updated);
+        log.info("Changed {} state: {}", k8sHost.hostIp(), newState);
+    }
+
+    /**
+     * Bootstraps a new kubernetes host.
+     *
+     * @param k8sHost kubernetes host
+     */
+    private void bootstrapHost(K8sHost k8sHost) {
+        if (isCurrentStateDone(k8sHost)) {
+            setState(k8sHost, k8sHost.state().nextState());
+        } else {
+            log.trace("Processing {} state for {}", k8sHost.state(),
+                    k8sHost.hostIp());
+            k8sHost.state().process(this, k8sHost);
+        }
+    }
+
+    private class InternalOvsdbListener implements DeviceListener {
+
+        @Override
+        public boolean isRelevant(DeviceEvent event) {
+            return event.subject().type() == Device.Type.CONTROLLER;
+        }
+
+        private boolean isRelevantHelper() {
+            return Objects.equals(localNode, leadershipService.getLeader(appId.name()));
+        }
+
+        @Override
+        public void event(DeviceEvent event) {
+            Device device = event.subject();
+
+            switch (event.type()) {
+                case DEVICE_AVAILABILITY_CHANGED:
+                case DEVICE_ADDED:
+                    eventExecutor.execute(() -> {
+                        if (!isRelevantHelper()) {
+                            return;
+                        }
+
+                        K8sHost k8sHost = k8sHostAdminService.host(device.id());
+
+                        if (k8sHost == null) {
+                            return;
+                        }
+
+                        if (deviceService.isAvailable(device.id())) {
+                            log.debug("OVSDB {} detected", device.id());
+                            bootstrapHost(k8sHost);
+                        }
+                    });
+                    break;
+                case PORT_ADDED:
+                case PORT_REMOVED:
+                case DEVICE_REMOVED:
+                default:
+                    // do nothing
+                    break;
+            }
+        }
+    }
+
+    private class InternalBridgeListener implements DeviceListener {
+
+        @Override
+        public boolean isRelevant(DeviceEvent event) {
+            return event.subject().type() == Device.Type.SWITCH;
+        }
+
+        private boolean isRelevantHelper() {
+            return Objects.equals(localNode, leadershipService.getLeader(appId.name()));
+        }
+
+        @Override
+        public void event(DeviceEvent event) {
+            Device device = event.subject();
+
+            switch (event.type()) {
+                case DEVICE_AVAILABILITY_CHANGED:
+                case DEVICE_ADDED:
+                    eventExecutor.execute(() -> {
+                        if (!isRelevantHelper()) {
+                            return;
+                        }
+
+                        K8sHost k8sHost = k8sHostAdminService.hostByTunBridge(device.id());
+
+                        if (k8sHost == null) {
+                            return;
+                        }
+
+                        if (deviceService.isAvailable(device.id())) {
+                            log.debug("Tunnel bridge created on {}",
+                                    k8sHost.hostIp());
+                            log.debug("OVSDB {} detected", device.id());
+                            bootstrapHost(k8sHost);
+                        } else if (k8sHost.state() == COMPLETE) {
+                            log.info("Device {} disconnected", device.id());
+                            setState(k8sHost, INCOMPLETE);
+                        }
+
+                        if (k8sHost.state() == INCOMPLETE ||
+                                k8sHost.state() == DEVICE_CREATED) {
+                            log.info("Device {} is reconnected", device.id());
+                            k8sHostAdminService.updateHost(
+                                    k8sHost.updateState(INIT));
+                        }
+                    });
+                    break;
+                case PORT_UPDATED:
+                case PORT_ADDED:
+                    eventExecutor.execute(() -> {
+                        if (!isRelevantHelper()) {
+                            return;
+                        }
+
+                        K8sHost k8sHost = k8sHostAdminService.hostByTunBridge(device.id());
+
+                        if (k8sHost == null) {
+                            return;
+                        }
+
+                        Port port = event.port();
+                        String portName = port.annotations().value(PORT_NAME);
+                        if (k8sHost.state() == DEVICE_CREATED) {
+
+                            K8sTunnelBridge tunBridge = k8sHost.tunBridges().stream().filter(
+                                    br -> br.deviceId().equals(device.id())
+                            ).findAny().orElse(null);
+
+                            if (tunBridge != null) {
+                                if (Objects.equals(portName, tunBridge.vxlanPortName()) ||
+                                        Objects.equals(portName, tunBridge.grePortName()) ||
+                                        Objects.equals(portName, tunBridge.genevePortName())) {
+                                    log.info("Interface {} added or updated to {}",
+                                            portName, device.id());
+                                    bootstrapHost(k8sHost);
+                                }
+                            }
+                        }
+                    });
+                    break;
+                case PORT_REMOVED:
+                    eventExecutor.execute(() -> {
+                        if (!isRelevantHelper()) {
+                            return;
+                        }
+
+                        K8sHost k8sHost = k8sHostAdminService.hostByTunBridge(device.id());
+
+                        if (k8sHost == null) {
+                            return;
+                        }
+
+                        Port port = event.port();
+                        String portName = port.annotations().value(PORT_NAME);
+                        if (k8sHost.state() == COMPLETE) {
+                            K8sTunnelBridge tunBridge = k8sHost.tunBridges().stream().filter(
+                                    br -> br.deviceId().equals(device.id())
+                            ).findAny().orElse(null);
+
+                            if (tunBridge != null) {
+                                if (Objects.equals(portName, tunBridge.vxlanPortName()) ||
+                                        Objects.equals(portName, tunBridge.grePortName()) ||
+                                        Objects.equals(portName, tunBridge.genevePortName())) {
+                                    log.warn("Interface {} removed from {}",
+                                            portName, event.subject().id());
+                                    setState(k8sHost, INCOMPLETE);
+                                }
+                            }
+                        }
+                    });
+                    break;
+                case DEVICE_REMOVED:
+                default:
+                    // do nothing
+                    break;
+            }
+        }
+    }
+
+    private class InternalK8sHostListener implements K8sHostListener {
+
+        private boolean isRelevantHelper() {
+            return Objects.equals(localNode, leadershipService.getLeader(appId.name()));
+        }
+
+        @Override
+        public void event(K8sHostEvent event) {
+            switch (event.type()) {
+                case K8S_HOST_CREATED:
+                case K8S_HOST_UPDATED:
+                    eventExecutor.execute(() -> {
+                        if (!isRelevantHelper()) {
+                            return;
+                        }
+
+                        bootstrapHost(event.subject());
+                    });
+                    break;
+                case K8S_HOST_REMOVED:
+                case K8S_HOST_INCOMPLETE:
+                default:
+                    break;
+            }
+        }
+    }
+}
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DistributedK8sHostStore.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DistributedK8sHostStore.java
index 17b9fde..73dd7a4 100644
--- a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DistributedK8sHostStore.java
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DistributedK8sHostStore.java
@@ -26,6 +26,7 @@
 import org.onosproject.k8snode.api.K8sHostState;
 import org.onosproject.k8snode.api.K8sHostStore;
 import org.onosproject.k8snode.api.K8sHostStoreDelegate;
+import org.onosproject.k8snode.api.K8sTunnelBridge;
 import org.onosproject.store.AbstractStore;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.ConsistentMap;
@@ -80,6 +81,7 @@
             .register(K8sHost.class)
             .register(DefaultK8sHost.class)
             .register(K8sHostState.class)
+            .register(K8sTunnelBridge.class)
             .register(Collection.class)
             .build();
 
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/K8sHostManager.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/K8sHostManager.java
index fd26763..1747ada 100644
--- a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/K8sHostManager.java
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/K8sHostManager.java
@@ -30,6 +30,7 @@
 import org.onosproject.k8snode.api.K8sHostService;
 import org.onosproject.k8snode.api.K8sHostStore;
 import org.onosproject.k8snode.api.K8sHostStoreDelegate;
+import org.onosproject.net.DeviceId;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.store.service.StorageService;
 import org.osgi.service.component.ComponentContext;
@@ -186,6 +187,25 @@
                 .findFirst().orElse(null);
     }
 
+    @Override
+    public K8sHost host(DeviceId deviceId) {
+        return hostStore.hosts().stream()
+                .filter(host -> Objects.equals(host.ovsdb(), deviceId))
+                .findFirst().orElse(null);
+    }
+
+    @Override
+    public K8sHost hostByTunBridge(DeviceId deviceId) {
+        for (K8sHost host : hostStore.hosts()) {
+            long cnt = host.tunBridges().stream().filter(
+                    br -> br.dpid().equals(deviceId.toString())).count();
+            if (cnt > 0) {
+                return host;
+            }
+        }
+        return null;
+    }
+
     private class InternalHostStoreDelegate implements K8sHostStoreDelegate {
 
         @Override
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/util/K8sNodeUtil.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/util/K8sNodeUtil.java
index bf76feb..fc05eca 100644
--- a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/util/K8sNodeUtil.java
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/util/K8sNodeUtil.java
@@ -259,4 +259,19 @@
 
         return new DefaultKubernetesClient(configBuilder.build());
     }
+
+    /**
+     * Auto generates DPID from the given name.
+     *
+     * @param name name
+     * @return auto generated DPID
+     */
+    public static String genDpidFromName(String name) {
+        if (name != null) {
+            String hexString = Integer.toHexString(name.hashCode());
+            return OF_PREFIX + Strings.padStart(hexString, 16, '0');
+        }
+
+        return null;
+    }
 }
