diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/Constants.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/Constants.java
index 0ff5fec..c0afe45 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/Constants.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/Constants.java
@@ -53,6 +53,7 @@
 
     // flow rule priority
     public static final int PRIORITY_SWITCHING_RULE = 30000;
+    public static final int PRIORITY_DHCP_RULE = 42000;
 
     // CLI item length
     public static final int CLI_ID_LENGTH = 30;
diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtPort.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtPort.java
index 4fe0125..992eb90 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtPort.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtPort.java
@@ -82,23 +82,34 @@
     }
 
     @Override
-    public KubevirtPort updatePortNumber(PortNumber portNumber) {
+    public KubevirtPort updateIpAddress(IpAddress updateIpAddress) {
         return new Builder()
                 .networkId(networkId)
                 .macAddress(macAddress)
-                .ipAddress(ipAddress)
+                .ipAddress(updateIpAddress)
                 .deviceId(deviceId)
                 .portNumber(portNumber)
                 .build();
     }
 
     @Override
-    public KubevirtPort updateDeviceId(DeviceId deviceId) {
+    public KubevirtPort updatePortNumber(PortNumber updatedPortNumber) {
         return new Builder()
                 .networkId(networkId)
                 .macAddress(macAddress)
                 .ipAddress(ipAddress)
                 .deviceId(deviceId)
+                .portNumber(updatedPortNumber)
+                .build();
+    }
+
+    @Override
+    public KubevirtPort updateDeviceId(DeviceId updatedDeviceId) {
+        return new Builder()
+                .networkId(networkId)
+                .macAddress(macAddress)
+                .ipAddress(ipAddress)
+                .deviceId(updatedDeviceId)
                 .portNumber(portNumber)
                 .build();
     }
@@ -161,7 +172,6 @@
         public KubevirtPort build() {
             checkArgument(networkId != null, NOT_NULL_MSG, "networkId");
             checkArgument(macAddress != null, NOT_NULL_MSG, "macAddress");
-            checkArgument(ipAddress != null, NOT_NULL_MSG, "ipAddress");
 
             return new DefaultKubevirtPort(networkId, macAddress, ipAddress,
                     deviceId, portNumber);
diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtNetworkAdminService.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtNetworkAdminService.java
index f0fa716..aeabd84 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtNetworkAdminService.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtNetworkAdminService.java
@@ -15,6 +15,8 @@
  */
 package org.onosproject.kubevirtnetworking.api;
 
+import org.onlab.packet.IpAddress;
+
 public interface KubevirtNetworkAdminService extends KubevirtNetworkService {
 
     /**
@@ -38,5 +40,21 @@
      */
     void removeNetwork(String networkId);
 
+    /**
+     * Allocate an IP address.
+     *
+     * @param networkId network identifier
+     * @return IP address
+     */
+    IpAddress allocateIp(String networkId);
+
+    /**
+     * Release the existing IP address.
+     *
+     * @param networkId network identifier
+     * @param ip IP address to be released
+     */
+    void releaseIp(String networkId, IpAddress ip);
+
     void clear();
 }
diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtPort.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtPort.java
index a7ae75e..850ac6f 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtPort.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtPort.java
@@ -61,20 +61,28 @@
     PortNumber portNumber();
 
     /**
-     * Returns new port instance with the given port number.
+     * Returns new port instance with the given IP address.
      *
-     * @param portNumber updated port number
+     * @param updatedIpAddress updated ip address
      * @return updated port
      */
-    KubevirtPort updatePortNumber(PortNumber portNumber);
+    KubevirtPort updateIpAddress(IpAddress updatedIpAddress);
+
+    /**
+     * Returns new port instance with the given port number.
+     *
+     * @param updatedPortNumber updated port number
+     * @return updated port
+     */
+    KubevirtPort updatePortNumber(PortNumber updatedPortNumber);
 
     /**
      * Returns new port instance with the given device ID.
      *
-     * @param deviceId device identifier
+     * @param updatedDeviceId device identifier
      * @return updated port
      */
-    KubevirtPort updateDeviceId(DeviceId deviceId);
+    KubevirtPort updateDeviceId(DeviceId updatedDeviceId);
 
     /**
      * Builder of new port.
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListPortCommand.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListPortCommand.java
new file mode 100644
index 0000000..5752436
--- /dev/null
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListPortCommand.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2021-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.kubevirtnetworking.cli;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import org.apache.commons.lang.StringUtils;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.kubevirtnetworking.api.KubevirtPort;
+import org.onosproject.kubevirtnetworking.api.KubevirtPortService;
+
+import java.util.Comparator;
+import java.util.List;
+
+import static org.onosproject.kubevirtnetworking.api.Constants.CLI_IP_ADDRESSES_LENGTH;
+import static org.onosproject.kubevirtnetworking.api.Constants.CLI_MAC_ADDRESS_LENGTH;
+import static org.onosproject.kubevirtnetworking.api.Constants.CLI_MARGIN_LENGTH;
+import static org.onosproject.kubevirtnetworking.api.Constants.CLI_NAME_LENGTH;
+import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.genFormatString;
+import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.prettyJson;
+
+/**
+ * Lists kubevirt ports.
+ */
+@Service
+@Command(scope = "onos", name = "kubevirt-ports",
+        description = "Lists all kubevirt ports")
+public class KubevirtListPortCommand extends AbstractShellCommand {
+
+    @Argument(name = "networkId", description = "Network ID")
+    @Completion(KubevirtNetworkIdCompleter.class)
+    private String networkId = null;
+
+    @Override
+    protected void doExecute() throws Exception {
+        KubevirtPortService service = get(KubevirtPortService.class);
+
+        List<KubevirtPort> ports = Lists.newArrayList(service.ports());
+        ports.sort(Comparator.comparing(KubevirtPort::networkId));
+
+        String format = genFormatString(ImmutableList.of(CLI_NAME_LENGTH,
+                CLI_MAC_ADDRESS_LENGTH, CLI_IP_ADDRESSES_LENGTH));
+
+        if (!Strings.isNullOrEmpty(networkId)) {
+            ports.removeIf(port -> !port.networkId().equals(networkId));
+        }
+
+        if (outputJson()) {
+            print("%s", json(ports));
+        } else {
+            print(format, "Network", "MAC Address", "Fixed IPs");
+            for (KubevirtPort port: ports) {
+                print(format,
+                        StringUtils.substring(port.networkId(), 0,
+                                CLI_NAME_LENGTH - CLI_MARGIN_LENGTH),
+                        StringUtils.substring(port.macAddress().toString(), 0,
+                                CLI_MAC_ADDRESS_LENGTH - CLI_MARGIN_LENGTH),
+                        port.ipAddress() == null ? "" : port.ipAddress());
+            }
+        }
+    }
+
+    private String json(List<KubevirtPort> ports) {
+        ObjectMapper mapper = new ObjectMapper();
+        ArrayNode result = mapper.createArrayNode();
+
+        for (KubevirtPort port : ports) {
+            result.add(jsonForEntity(port, KubevirtPort.class));
+        }
+
+        return prettyJson(mapper, result.toString());
+    }
+}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortCodec.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortCodec.java
new file mode 100644
index 0000000..dbbf9c8
--- /dev/null
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortCodec.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2021-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.kubevirtnetworking.codec;
+
+import com.fasterxml.jackson.databind.JsonNode;
+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.kubevirtnetworking.api.DefaultKubevirtPort;
+import org.onosproject.kubevirtnetworking.api.KubevirtPort;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+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;
+
+public final class KubevirtPortCodec extends JsonCodec<KubevirtPort> {
+
+    private final Logger log = getLogger(getClass());
+
+    private static final String NETWORK_ID = "networkId";
+    private static final String MAC_ADDRESS = "macAddress";
+    private static final String IP_ADDRESS = "ipAddress";
+    private static final String DEVICE_ID = "deviceId";
+    private static final String PORT_NUMBER = "portNumber";
+
+    private static final String MISSING_MESSAGE = " is required in KubevirtPort";
+
+    @Override
+    public ObjectNode encode(KubevirtPort port, CodecContext context) {
+        checkNotNull(port, "Kubevirt port cannot be null");
+
+        ObjectNode result = context.mapper().createObjectNode()
+                .put(NETWORK_ID, port.networkId())
+                .put(MAC_ADDRESS, port.macAddress().toString());
+
+        if (port.ipAddress() != null) {
+            result.put(IP_ADDRESS, port.ipAddress().toString());
+        }
+
+        if (port.deviceId() != null) {
+            result.put(DEVICE_ID, port.deviceId().toString());
+        }
+
+        if (port.portNumber() != null) {
+            result.put(PORT_NUMBER, port.portNumber().toString());
+        }
+
+        return result;
+    }
+
+    @Override
+    public KubevirtPort decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        String networkId = nullIsIllegal(json.get(NETWORK_ID).asText(),
+                NETWORK_ID + MISSING_MESSAGE);
+
+        String macAddress = nullIsIllegal(json.get(MAC_ADDRESS).asText(),
+                MAC_ADDRESS + MISSING_MESSAGE);
+
+        KubevirtPort.Builder builder = DefaultKubevirtPort.builder()
+                .networkId(networkId)
+                .macAddress(MacAddress.valueOf(macAddress));
+
+        JsonNode ipAddressJson = json.get(IP_ADDRESS);
+        if (ipAddressJson != null) {
+            final IpAddress ipAddress = IpAddress.valueOf(ipAddressJson.asText());
+            builder.ipAddress(ipAddress);
+        }
+
+        JsonNode deviceIdJson = json.get(DEVICE_ID);
+        if (deviceIdJson != null) {
+            final DeviceId deviceId = DeviceId.deviceId(deviceIdJson.asText());
+            builder.deviceId(deviceId);
+        }
+
+        JsonNode portNumberJson = json.get(PORT_NUMBER);
+        if (portNumberJson != null) {
+            final PortNumber portNumber = PortNumber.portNumber(portNumberJson.asText());
+            builder.portNumber(portNumber);
+        }
+
+        log.trace("Port is {}", builder.build().toString());
+
+        return builder.build();
+    }
+}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtDhcpHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtDhcpHandler.java
index 74b7c8a..e3b9469 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtDhcpHandler.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtDhcpHandler.java
@@ -25,6 +25,7 @@
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
+import org.onlab.packet.TpPort;
 import org.onlab.packet.UDP;
 import org.onlab.packet.dhcp.DhcpOption;
 import org.onlab.util.Tools;
@@ -40,11 +41,14 @@
 import org.onosproject.kubevirtnetworking.api.KubevirtNetworkService;
 import org.onosproject.kubevirtnetworking.api.KubevirtPort;
 import org.onosproject.kubevirtnetworking.api.KubevirtPortService;
+import org.onosproject.kubevirtnode.api.KubevirtNode;
 import org.onosproject.kubevirtnode.api.KubevirtNodeEvent;
 import org.onosproject.kubevirtnode.api.KubevirtNodeListener;
 import org.onosproject.kubevirtnode.api.KubevirtNodeService;
 import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
+import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.packet.DefaultOutboundPacket;
 import org.onosproject.net.packet.PacketContext;
@@ -79,7 +83,9 @@
 import static org.onlab.packet.DHCP.MsgType.DHCPACK;
 import static org.onlab.packet.DHCP.MsgType.DHCPOFFER;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.kubevirtnetworking.api.Constants.DHCP_TABLE;
 import static org.onosproject.kubevirtnetworking.api.Constants.KUBEVIRT_NETWORKING_APP_ID;
+import static org.onosproject.kubevirtnetworking.api.Constants.PRIORITY_DHCP_RULE;
 import static org.onosproject.kubevirtnetworking.impl.OsgiPropertyConstants.DHCP_SERVER_MAC;
 import static org.onosproject.kubevirtnetworking.impl.OsgiPropertyConstants.DHCP_SERVER_MAC_DEFAULT;
 import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.getBroadcastAddr;
@@ -616,7 +622,47 @@
 
         @Override
         public void event(KubevirtNodeEvent event) {
+            KubevirtNode node = event.subject();
+            switch (event.type()) {
+                case KUBEVIRT_NODE_COMPLETE:
+                    eventExecutor.execute(() -> processNodeCompletion(node));
+                    break;
+                case KUBEVIRT_NODE_CREATED:
+                case KUBEVIRT_NODE_INCOMPLETE:
+                case KUBEVIRT_NODE_REMOVED:
+                case KUBEVIRT_NODE_UPDATED:
+                default:
+                    break;
+            }
+        }
 
+        private void processNodeCompletion(KubevirtNode node) {
+            if (!isRelevantHelper()) {
+                return;
+            }
+            setDhcpRule(node, true);
+        }
+
+        private void setDhcpRule(KubevirtNode node, boolean install) {
+            TrafficSelector selector = DefaultTrafficSelector.builder()
+                    .matchEthType(Ethernet.TYPE_IPV4)
+                    .matchIPProtocol(IPv4.PROTOCOL_UDP)
+                    .matchUdpDst(TpPort.tpPort(UDP.DHCP_SERVER_PORT))
+                    .matchUdpSrc(TpPort.tpPort(UDP.DHCP_CLIENT_PORT))
+                    .build();
+
+            TrafficTreatment treatment = DefaultTrafficTreatment.builder()
+                    .punt()
+                    .build();
+
+            flowService.setRule(
+                    appId,
+                    node.intgBridge(),
+                    selector,
+                    treatment,
+                    PRIORITY_DHCP_RULE,
+                    DHCP_TABLE,
+                    install);
         }
     }
 }
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkManager.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkManager.java
index 581fd29..d761ff7 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkManager.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkManager.java
@@ -18,6 +18,7 @@
 
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
+import org.onlab.packet.IpAddress;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.event.ListenerRegistry;
@@ -64,6 +65,7 @@
 
     private static final String ERR_NULL_NETWORK  = "Kubernetes network cannot be null";
     private static final String ERR_NULL_NETWORK_ID  = "Kubernetes network ID cannot be null";
+    private static final String ERR_NULL_IP = "IP address cannot be null";
 
     private static final String ERR_IN_USE = " still in use";
 
@@ -129,6 +131,35 @@
     }
 
     @Override
+    public IpAddress allocateIp(String networkId) {
+        checkArgument(!Strings.isNullOrEmpty(networkId), ERR_NULL_NETWORK_ID);
+
+        try {
+            KubevirtNetwork network = networkStore.network(networkId);
+            IpAddress ip = network.ipPool().allocateIp();
+            networkStore.updateNetwork(network);
+            return ip;
+        } catch (Exception e) {
+            log.error("Failed to allocate IP address");
+        }
+        return null;
+    }
+
+    @Override
+    public void releaseIp(String networkId, IpAddress ip) {
+        checkArgument(!Strings.isNullOrEmpty(networkId), ERR_NULL_NETWORK_ID);
+        checkArgument(ip != null, ERR_NULL_IP);
+
+        try {
+            KubevirtNetwork network = networkStore.network(networkId);
+            network.ipPool().releaseIp(ip);
+            networkStore.updateNetwork(network);
+        } catch (Exception e) {
+            log.error("Failed to allocate IP address");
+        }
+    }
+
+    @Override
     public void clear() {
         networkStore.clear();
     }
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtPodPortMapper.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtPodPortMapper.java
new file mode 100644
index 0000000..595b775
--- /dev/null
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtPodPortMapper.java
@@ -0,0 +1,231 @@
+/*
+ * Copyright 2021-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.kubevirtnetworking.impl;
+
+import io.fabric8.kubernetes.api.model.Pod;
+import io.fabric8.kubernetes.api.model.PodBuilder;
+import io.fabric8.kubernetes.client.KubernetesClient;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.onlab.packet.IpAddress;
+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.kubevirtnetworking.api.KubevirtNetwork;
+import org.onosproject.kubevirtnetworking.api.KubevirtNetworkAdminService;
+import org.onosproject.kubevirtnetworking.api.KubevirtPodAdminService;
+import org.onosproject.kubevirtnetworking.api.KubevirtPodEvent;
+import org.onosproject.kubevirtnetworking.api.KubevirtPodListener;
+import org.onosproject.kubevirtnetworking.api.KubevirtPort;
+import org.onosproject.kubevirtnetworking.api.KubevirtPortAdminService;
+import org.onosproject.kubevirtnode.api.KubevirtApiConfigService;
+import org.onosproject.mastership.MastershipService;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.driver.DriverService;
+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.Map;
+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.kubevirtnetworking.api.Constants.KUBEVIRT_NETWORKING_APP_ID;
+import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.getPort;
+import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.k8sClient;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Associates the kubevirt container port and pod.
+ */
+@Component(immediate = true)
+public class KubevirtPodPortMapper {
+
+    private final Logger log = getLogger(getClass());
+
+    private static final String NETWORK_STATUS_KEY = "k8s.v1.cni.cncf.io/network-status";
+    private static final String NAME = "name";
+    private static final String IPS = "ips";
+    private static final String NETWORK_PREFIX = "default/";
+
+    @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 DeviceService deviceService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected DriverService driverService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected KubevirtPortAdminService kubevirtPortAdminService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected KubevirtNetworkAdminService kubevirtNetworkAdminService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected KubevirtPodAdminService kubevirtPodAdminService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected KubevirtApiConfigService kubevirtApiConfigService;
+
+    private final ExecutorService eventExecutor = newSingleThreadExecutor(
+            groupedThreads(this.getClass().getSimpleName(), "event-handler"));
+
+    private final InternalKubevirtPodListener kubevirtPodListener =
+            new InternalKubevirtPodListener();
+
+    private ApplicationId appId;
+    private NodeId localNodeId;
+
+    @Activate
+    protected void activate() {
+        appId = coreService.registerApplication(KUBEVIRT_NETWORKING_APP_ID);
+        localNodeId = clusterService.getLocalNode().id();
+        leadershipService.runForLeadership(appId.name());
+        kubevirtPodAdminService.addListener(kubevirtPodListener);
+
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        kubevirtPodAdminService.removeListener(kubevirtPodListener);
+        leadershipService.withdraw(appId.name());
+        eventExecutor.shutdown();
+
+        log.info("Stopped");
+    }
+
+    private class InternalKubevirtPodListener implements KubevirtPodListener {
+
+        private boolean isRelevantHelper() {
+            return Objects.equals(localNodeId, leadershipService.getLeader(appId.name()));
+        }
+
+        @Override
+        public void event(KubevirtPodEvent event) {
+            switch (event.type()) {
+                case KUBEVIRT_POD_UPDATED:
+                    eventExecutor.execute(() -> processPodUpdate(event.subject()));
+                    break;
+                case KUBEVIRT_POD_REMOVED:
+                    eventExecutor.execute(() -> processPodDeletion(event.subject()));
+                    break;
+                case KUBEVIRT_POD_CREATED:
+                default:
+                    // do nothing
+                    break;
+            }
+        }
+
+        private void processPodUpdate(Pod pod) {
+            if (!isRelevantHelper()) {
+                return;
+            }
+
+            KubernetesClient client = k8sClient(kubevirtApiConfigService);
+
+            if (client == null) {
+                return;
+            }
+
+            KubevirtPort port = getPort(kubevirtNetworkAdminService.networks(), pod);
+            if (port == null) {
+                return;
+            }
+
+            if (kubevirtPortAdminService.port(port.macAddress()) != null) {
+                return;
+            }
+
+            if (port.ipAddress() == null) {
+                try {
+                    IpAddress ip = kubevirtNetworkAdminService.allocateIp(port.networkId());
+                    port = port.updateIpAddress(ip);
+
+                    // update the POD annotation to inject the allocated IP address
+                    String networkStatusStr = pod.getMetadata().getAnnotations().get(NETWORK_STATUS_KEY);
+                    JSONArray networkStatus = new JSONArray(networkStatusStr);
+                    for (int i = 0; i < networkStatus.length(); i++) {
+                        JSONObject object = networkStatus.getJSONObject(i);
+                        String name = object.getString(NAME);
+                        KubevirtNetwork jsonNetwork = kubevirtNetworkAdminService.networks().stream()
+                                .filter(n -> (NETWORK_PREFIX + n.name()).equals(name))
+                                .findAny().orElse(null);
+                        if (jsonNetwork != null) {
+                            JSONArray ipsJson = new JSONArray();
+                            ipsJson.put(ip.toString());
+                            object.put(IPS, ipsJson);
+                        }
+                    }
+                    Map<String, String> annots = pod.getMetadata().getAnnotations();
+                    annots.put(NETWORK_STATUS_KEY, networkStatus.toString(4));
+
+                    client.pods().inNamespace(pod.getMetadata().getNamespace())
+                            .withName(pod.getMetadata().getName())
+                            .edit(r -> new PodBuilder(r)
+                                    .editMetadata()
+                                    .addToAnnotations(annots)
+                                    .endMetadata().build()
+                            );
+                } catch (Exception e) {
+                    log.error("Failed to allocate IP address", e);
+                }
+            }
+            kubevirtPortAdminService.createPort(port);
+        }
+
+        private void processPodDeletion(Pod pod) {
+            if (!isRelevantHelper()) {
+                return;
+            }
+
+            KubernetesClient client = k8sClient(kubevirtApiConfigService);
+
+            if (client == null) {
+                return;
+            }
+
+            KubevirtPort port = getPort(kubevirtNetworkAdminService.networks(), pod);
+            if (port == null) {
+                return;
+            }
+
+            if (port.ipAddress() != null) {
+                kubevirtNetworkAdminService.releaseIp(port.networkId(), port.ipAddress());
+            }
+
+            kubevirtPortAdminService.removePort(port.macAddress());
+        }
+    }
+}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
index cef1f95..5e14817 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
@@ -16,13 +16,21 @@
 package org.onosproject.kubevirtnetworking.util;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import io.fabric8.kubernetes.api.model.Pod;
 import io.fabric8.kubernetes.client.ConfigBuilder;
 import io.fabric8.kubernetes.client.DefaultKubernetesClient;
 import io.fabric8.kubernetes.client.KubernetesClient;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.net.util.SubnetUtils;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
 import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
 import org.onosproject.cfg.ConfigProperty;
+import org.onosproject.kubevirtnetworking.api.DefaultKubevirtPort;
+import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
+import org.onosproject.kubevirtnetworking.api.KubevirtPort;
 import org.onosproject.kubevirtnode.api.KubevirtApiConfig;
 import org.onosproject.kubevirtnode.api.KubevirtApiConfigService;
 import org.slf4j.Logger;
@@ -32,6 +40,7 @@
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -47,6 +56,12 @@
     private static final String COLON_SLASH = "://";
     private static final String COLON = ":";
 
+    private static final String NETWORK_STATUS_KEY = "k8s.v1.cni.cncf.io/network-status";
+    private static final String NAME = "name";
+    private static final String NETWORK_PREFIX = "default/";
+    private static final String MAC = "mac";
+    private static final String IPS = "ips";
+
     /**
      * Prevents object installation from external.
      */
@@ -232,4 +247,52 @@
 
         return client;
     }
+
+    /**
+     * Obtains the kubevirt port from kubevirt POD.
+     *
+     * @param networks set of existing kubevirt networks
+     * @param pod kubevirt POD
+     * @return kubevirt port
+     */
+    public static KubevirtPort getPort(Set<KubevirtNetwork> networks, Pod pod) {
+        try {
+            Map<String, String> annots = pod.getMetadata().getAnnotations();
+            String networkStatusStr = annots.get(NETWORK_STATUS_KEY);
+
+            if (networkStatusStr == null) {
+                return null;
+            }
+
+            JSONArray networkStatus = new JSONArray(networkStatusStr);
+
+            for (int i = 0; i < networkStatus.length(); i++) {
+                JSONObject object = networkStatus.getJSONObject(i);
+                String name = object.getString(NAME);
+                KubevirtNetwork network = networks.stream()
+                        .filter(n -> (NETWORK_PREFIX + n.name()).equals(name))
+                        .findAny().orElse(null);
+                if (network != null) {
+                    String mac = object.getString(MAC);
+
+                    KubevirtPort.Builder builder = DefaultKubevirtPort.builder()
+                            .macAddress(MacAddress.valueOf(mac))
+                            .networkId(network.networkId());
+
+                    if (object.has(IPS)) {
+                        JSONArray ips = object.getJSONArray(IPS);
+                        String ip = (String) ips.get(0);
+                        builder.ipAddress(IpAddress.valueOf(ip));
+                    }
+
+                    return builder.build();
+                }
+            }
+
+        } catch (JSONException e) {
+            log.error("Failed to parse network status object", e);
+        }
+
+        return null;
+    }
 }
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkingCodecRegister.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkingCodecRegister.java
index a9d2d20..4691b8b 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkingCodecRegister.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkingCodecRegister.java
@@ -19,9 +19,11 @@
 import org.onosproject.kubevirtnetworking.api.KubevirtHostRoute;
 import org.onosproject.kubevirtnetworking.api.KubevirtIpPool;
 import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
+import org.onosproject.kubevirtnetworking.api.KubevirtPort;
 import org.onosproject.kubevirtnetworking.codec.KubevirtHostRouteCodec;
 import org.onosproject.kubevirtnetworking.codec.KubevirtIpPoolCodec;
 import org.onosproject.kubevirtnetworking.codec.KubevirtNetworkCodec;
+import org.onosproject.kubevirtnetworking.codec.KubevirtPortCodec;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
@@ -48,6 +50,7 @@
         codecService.registerCodec(KubevirtHostRoute.class, new KubevirtHostRouteCodec());
         codecService.registerCodec(KubevirtIpPool.class, new KubevirtIpPoolCodec());
         codecService.registerCodec(KubevirtNetwork.class, new KubevirtNetworkCodec());
+        codecService.registerCodec(KubevirtPort.class, new KubevirtPortCodec());
 
         log.info("Started");
     }
@@ -58,6 +61,7 @@
         codecService.unregisterCodec(KubevirtHostRoute.class);
         codecService.unregisterCodec(KubevirtIpPool.class);
         codecService.unregisterCodec(KubevirtNetwork.class);
+        codecService.unregisterCodec(KubevirtPort.class);
 
         log.info("Stopped");
     }
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortCodecTest.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortCodecTest.java
new file mode 100644
index 0000000..e928b90
--- /dev/null
+++ b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortCodecTest.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2021-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.kubevirtnetworking.codec;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.codec.impl.CodecManager;
+import org.onosproject.core.CoreService;
+import org.onosproject.kubevirtnetworking.api.DefaultKubevirtPort;
+import org.onosproject.kubevirtnetworking.api.KubevirtPort;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.onosproject.kubevirtnetworking.codec.KubevirtPortJsonMatcher.matchesKubevirtPort;
+import static org.onosproject.net.NetTestTools.APP_ID;
+
+/**
+ * Unit tests for KubevirtPort codec.
+ */
+public final class KubevirtPortCodecTest {
+
+    MockCodecContext context;
+
+    JsonCodec<KubevirtPort> kubevirtPortCodec;
+
+    final CoreService mockCoreService = createMock(CoreService.class);
+    private static final String REST_APP_ID = "org.onosproject.rest";
+
+    @Before
+    public void setUp() {
+        context = new MockCodecContext();
+        kubevirtPortCodec = new KubevirtPortCodec();
+
+        assertThat(kubevirtPortCodec, notNullValue());
+
+        expect(mockCoreService.registerApplication(REST_APP_ID))
+                .andReturn(APP_ID).anyTimes();
+        replay(mockCoreService);
+        context.registerService(CoreService.class, mockCoreService);
+    }
+
+    /**
+     * Tests the kubevirt port encoding.
+     */
+    @Test
+    public void testKubevirtPortEncode() {
+        KubevirtPort port = DefaultKubevirtPort.builder()
+                .networkId("net-1")
+                .macAddress(MacAddress.valueOf("11:22:33:44:55:66"))
+                .ipAddress(IpAddress.valueOf("10.10.10.100"))
+                .deviceId(DeviceId.deviceId("of:foo"))
+                .portNumber(PortNumber.portNumber("1"))
+                .build();
+        ObjectNode portJson = kubevirtPortCodec.encode(port, context);
+        assertThat(portJson, matchesKubevirtPort(port));
+    }
+
+    private class MockCodecContext implements CodecContext {
+
+        private final ObjectMapper mapper = new ObjectMapper();
+        private final CodecManager manager = new CodecManager();
+        private final Map<Class<?>, Object> services = new HashMap<>();
+
+        /**
+         * Constructs a new mock codec context.
+         */
+        public MockCodecContext() {
+            manager.activate();
+        }
+
+        @Override
+        public ObjectMapper mapper() {
+            return mapper;
+        }
+
+        @Override
+        public <T> JsonCodec<T> codec(Class<T> entityClass) {
+            return manager.getCodec(entityClass);
+        }
+
+        @Override
+        public <T> T getService(Class<T> serviceClass) {
+            return (T) services.get(serviceClass);
+        }
+
+        // for registering mock services
+        public <T> void registerService(Class<T> serviceClass, T impl) {
+            services.put(serviceClass, impl);
+        }
+    }
+}
+
+
diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortJsonMatcher.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortJsonMatcher.java
new file mode 100644
index 0000000..e9fa500
--- /dev/null
+++ b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtPortJsonMatcher.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2021-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.kubevirtnetworking.codec;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeDiagnosingMatcher;
+import org.onlab.packet.IpAddress;
+import org.onosproject.kubevirtnetworking.api.KubevirtPort;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+
+/**
+ * Hamcrest matcher for kubevirt port.
+ */
+public final class KubevirtPortJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
+
+    private final KubevirtPort port;
+
+    private static final String NETWORK_ID = "networkId";
+    private static final String MAC_ADDRESS = "macAddress";
+    private static final String IP_ADDRESS = "ipAddress";
+    private static final String DEVICE_ID = "deviceId";
+    private static final String PORT_NUMBER = "portNumber";
+
+    private KubevirtPortJsonMatcher(KubevirtPort port) {
+        this.port = port;
+    }
+
+    @Override
+    protected boolean matchesSafely(JsonNode jsonNode, Description description) {
+        // check network ID
+        String jsonNetworkId = jsonNode.get(NETWORK_ID).asText();
+        String networkId = port.networkId();
+        if (!jsonNetworkId.equals(networkId)) {
+            description.appendText("network ID was " + jsonNetworkId);
+            return false;
+        }
+
+        // check MAC address
+        String jsonMacAddress = jsonNode.get(MAC_ADDRESS).asText();
+        String macAddress = port.macAddress().toString();
+        if (!jsonMacAddress.equals(macAddress)) {
+            description.appendText("MAC address was " + jsonMacAddress);
+            return false;
+        }
+
+        // check IP address
+        JsonNode jsonIpAddress = jsonNode.get(IP_ADDRESS);
+        if (jsonIpAddress != null) {
+            IpAddress ipAddress = port.ipAddress();
+            if (!jsonIpAddress.asText().equals(ipAddress.toString())) {
+                description.appendText("IP address was " + jsonIpAddress.asText());
+                return false;
+            }
+        }
+
+        // check device ID
+        JsonNode jsonDeviceId = jsonNode.get(DEVICE_ID);
+        if (jsonDeviceId != null) {
+            DeviceId deviceId = port.deviceId();
+            if (!jsonDeviceId.asText().equals(deviceId.toString())) {
+                description.appendText("Device ID was " + jsonDeviceId.asText());
+                return false;
+            }
+        }
+
+        // check port number
+        JsonNode jsonPortNumber = jsonNode.get(PORT_NUMBER);
+        if (jsonPortNumber != null) {
+            PortNumber portNUmber = port.portNumber();
+            if (!jsonPortNumber.asText().equals(portNUmber.toString())) {
+                description.appendText("Port number was " + jsonPortNumber.asText());
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    @Override
+    public void describeTo(Description description) {
+        description.appendText(port.toString());
+    }
+    /**
+     * Factory to allocate an kubevirt port matcher.
+     *
+     * @param port kubevirt port object we are looking for
+     * @return matcher
+     */
+    public static KubevirtPortJsonMatcher matchesKubevirtPort(KubevirtPort port) {
+        return new KubevirtPortJsonMatcher(port);
+    }
+}
