diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultFiveTuple.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultFiveTuple.java
index fc7fd4f..c13e922 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultFiveTuple.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/DefaultFiveTuple.java
@@ -22,6 +22,7 @@
 
 import org.onlab.packet.IPv4;
 import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
 import org.onosproject.net.PortNumber;
 
 /**
@@ -29,6 +30,8 @@
  */
 public final class DefaultFiveTuple implements FiveTuple {
 
+    private final MacAddress macSrc;
+    private final MacAddress macDst;
     private final IpAddress ipSrc;
     private final IpAddress ipDst;
     private final PortNumber portSrc;
@@ -46,7 +49,7 @@
      * @param portDst destination port of the packet
      */
     private DefaultFiveTuple(byte protocol, IpAddress ipSrc, IpAddress ipDst, PortNumber portSrc, PortNumber portDst,
-                             TenantId tenantId) {
+                             TenantId tenantId, MacAddress macSrc, MacAddress macDst) {
 
         this.protocol = protocol;
         this.ipSrc = ipSrc;
@@ -54,6 +57,8 @@
         this.portSrc = portSrc;
         this.portDst = portDst;
         this.tenantId = tenantId;
+        this.macSrc = macSrc;
+        this.macDst = macDst;
     }
 
     @Override
@@ -82,6 +87,16 @@
     }
 
     @Override
+    public MacAddress macSrc() {
+        return macSrc;
+    }
+
+    @Override
+    public MacAddress macDst() {
+        return macDst;
+    }
+
+    @Override
     public TenantId tenantId() {
         return tenantId;
     }
@@ -139,6 +154,8 @@
         private PortNumber portDst;
         private byte protocol;
         private TenantId tenantId;
+        private MacAddress macSrc;
+        private MacAddress macDst;
 
         @Override
         public Builder setIpSrc(IpAddress ipSrc) {
@@ -171,17 +188,29 @@
         }
 
         @Override
-        public org.onosproject.vtnrsc.FiveTuple.Builder setTenantId(TenantId tenantId) {
+        public Builder setTenantId(TenantId tenantId) {
             this.tenantId = tenantId;
             return this;
         }
 
         @Override
+        public Builder setMacSrc(MacAddress macSrc) {
+            this.macSrc = macSrc;
+            return this;
+        }
+
+        @Override
+        public Builder setMacDst(MacAddress macDst) {
+            this.macDst = macDst;
+            return this;
+        }
+
+        @Override
         public FiveTuple build() {
             checkArgument(protocol == IPv4.PROTOCOL_TCP || protocol == IPv4.PROTOCOL_UDP ||
                     protocol == IPv4.PROTOCOL_ICMP, "Unsupported value for protocol while creating five tuple");
 
-            return new DefaultFiveTuple(protocol, ipSrc, ipDst, portSrc, portDst, tenantId);
+            return new DefaultFiveTuple(protocol, ipSrc, ipDst, portSrc, portDst, tenantId, macSrc, macDst);
         }
     }
 }
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/FiveTuple.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/FiveTuple.java
index 557b79f..8946abf 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/FiveTuple.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/FiveTuple.java
@@ -16,6 +16,7 @@
 package org.onosproject.vtnrsc;
 
 import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
 import org.onosproject.net.PortNumber;
 
 /**
@@ -61,6 +62,20 @@
     PortNumber portDst();
 
     /**
+     * Returns source mac.
+     *
+     * @return srcMac
+     */
+    MacAddress macSrc();
+
+    /**
+     * Returns destination mac.
+     *
+     * @return dstMac
+     */
+    MacAddress macDst();
+
+    /**
      * Returns the tenant id.
      *
      * @return tenantId
@@ -105,6 +120,22 @@
         Builder setPortDst(PortNumber portDst);
 
         /**
+         * Assign the source mac address to this object.
+         *
+         * @param macSrc source mac address
+         * @return this the builder object
+         */
+        Builder setMacSrc(MacAddress macSrc);
+
+        /**
+         * Assign the destination mac address to this object.
+         *
+         * @param macDst destination mac address
+         * @return this the builder object
+         */
+        Builder setMacDst(MacAddress macDst);
+
+        /**
          * Assign the protocol to this object.
          *
          * @param protocol packet protocol
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/event/VtnRscEvent.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/event/VtnRscEvent.java
index e71dc5d..fb8d0d7 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/event/VtnRscEvent.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/event/VtnRscEvent.java
@@ -107,7 +107,15 @@
         /**
          * Signifies that port-chain has update.
          */
-        PORT_CHAIN_UPDATE
+        PORT_CHAIN_UPDATE,
+        /**
+         * Signifies that virtual-port has created.
+         */
+        VIRTUAL_PORT_PUT,
+        /**
+         * Signifies that virtual-port has removed.
+         */
+        VIRTUAL_PORT_DELETE
     }
 
     /**
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/event/VtnRscEventFeedback.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/event/VtnRscEventFeedback.java
index 4d610b6..ec5885c 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/event/VtnRscEventFeedback.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/event/VtnRscEventFeedback.java
@@ -24,6 +24,7 @@
 import org.onosproject.vtnrsc.PortPairGroup;
 import org.onosproject.vtnrsc.FlowClassifier;
 import org.onosproject.vtnrsc.PortChain;
+import org.onosproject.vtnrsc.VirtualPort;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -39,6 +40,7 @@
     private final PortPairGroup portPairGroup;
     private final FlowClassifier flowClassifier;
     private final PortChain portChain;
+    private final VirtualPort virtualPort;
 
     /**
      * Creates VtnRscEventFeedback object.
@@ -53,6 +55,7 @@
         this.portPairGroup = null;
         this.flowClassifier = null;
         this.portChain = null;
+        this.virtualPort = null;
     }
 
     /**
@@ -68,6 +71,7 @@
         this.portPairGroup = null;
         this.flowClassifier = null;
         this.portChain = null;
+        this.virtualPort = null;
     }
 
     /**
@@ -84,6 +88,7 @@
         this.portPairGroup = null;
         this.flowClassifier = null;
         this.portChain = null;
+        this.virtualPort = null;
     }
 
     /**
@@ -100,6 +105,7 @@
         this.portPairGroup = null;
         this.flowClassifier = null;
         this.portChain = null;
+        this.virtualPort = null;
     }
 
     /**
@@ -113,9 +119,10 @@
         this.routerInterface = null;
         this.portPair = null;
         this.portPairGroup = checkNotNull(portPairGroup,
-                                     "Port-Pair-Group cannot be null");
+                "Port-Pair-Group cannot be null");
         this.flowClassifier = null;
         this.portChain = null;
+        this.virtualPort = null;
     }
 
     /**
@@ -130,8 +137,9 @@
         this.portPair = null;
         this.portPairGroup = null;
         this.flowClassifier = checkNotNull(flowClassifier,
-                                     "Flow-Classifier cannot be null");
+                "Flow-Classifier cannot be null");
         this.portChain = null;
+        this.virtualPort = null;
     }
 
     /**
@@ -147,7 +155,25 @@
         this.portPairGroup = null;
         this.flowClassifier = null;
         this.portChain = checkNotNull(portChain,
-                                     "Port-Chain cannot be null");
+                "Port-Chain cannot be null");
+        this.virtualPort = null;
+    }
+
+    /**
+     * Creates VtnRscEventFeedback object.
+     *
+     * @param virtualPort the Virtual-Port
+     */
+    public VtnRscEventFeedback(VirtualPort virtualPort) {
+        this.floaingtIp = null;
+        this.router = null;
+        this.routerInterface = null;
+        this.portPair = null;
+        this.portPairGroup = null;
+        this.flowClassifier = null;
+        this.portChain = null;
+        this.virtualPort = checkNotNull(virtualPort,
+                "Virtual-port cannot be null");
     }
 
     /**
@@ -213,10 +239,19 @@
         return portChain;
     }
 
+    /**
+     * Returns Virtual-Port.
+     *
+     * @return virtualPort the Virtual-Port
+     */
+    public VirtualPort virtualPort() {
+        return virtualPort;
+    }
+
     @Override
     public int hashCode() {
         return Objects.hash(floaingtIp, router, routerInterface, portPair,
-                            portPairGroup, flowClassifier, portChain);
+                            portPairGroup, flowClassifier, portChain, virtualPort);
     }
 
     @Override
@@ -232,7 +267,8 @@
                     && Objects.equals(this.portPair, that.portPair)
                     && Objects.equals(this.portPairGroup, that.portPairGroup)
                     && Objects.equals(this.flowClassifier, that.flowClassifier)
-                    && Objects.equals(this.portChain, that.portChain);
+                    && Objects.equals(this.portChain, that.portChain)
+                    && Objects.equals(this.virtualPort, that.virtualPort);
         }
         return false;
     }
@@ -247,6 +283,7 @@
                 .add("portPairGroup", portPairGroup)
                 .add("flowClassifier", flowClassifier)
                 .add("portChain", portChain)
+                .add("virtualPort", virtualPort)
                 .toString();
     }
 }
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/impl/PortChainManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/impl/PortChainManager.java
index 21a3d2d..6d7fe04 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/impl/PortChainManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/impl/PortChainManager.java
@@ -97,6 +97,7 @@
     @Deactivate
     public void deactivate() {
         eventDispatcher.removeSink(PortChainEvent.class);
+        portChainStore.removeListener(portChainListener);
         portChainStore.destroy();
         log.info("Stopped");
     }
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/service/impl/VtnRscManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/service/impl/VtnRscManager.java
index b39e82c..f6d54a9 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/service/impl/VtnRscManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/service/impl/VtnRscManager.java
@@ -87,6 +87,8 @@
 import org.onosproject.vtnrsc.service.VtnRscService;
 import org.onosproject.vtnrsc.subnet.SubnetService;
 import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
+import org.onosproject.vtnrsc.virtualport.VirtualPortEvent;
+import org.onosproject.vtnrsc.virtualport.VirtualPortListener;
 import org.onosproject.vtnrsc.virtualport.VirtualPortService;
 import org.slf4j.Logger;
 
@@ -112,6 +114,7 @@
     private PortPairGroupListener portPairGroupListener = new InnerPortPairGroupListener();
     private FlowClassifierListener flowClassifierListener = new InnerFlowClassifierListener();
     private PortChainListener portChainListener = new InnerPortChainListener();
+    private VirtualPortListener virtualPortListener = new InnerVirtualPortListener();
 
     private EventuallyConsistentMap<TenantId, SegmentationId> l3vniTenantMap;
     private EventuallyConsistentMap<TenantRouter, SegmentationId> l3vniTenantRouterMap;
@@ -165,6 +168,7 @@
         portPairGroupService.addListener(portPairGroupListener);
         flowClassifierService.addListener(flowClassifierListener);
         portChainService.addListener(portChainListener);
+        virtualPortService.addListener(virtualPortListener);
 
         KryoNamespace.Builder serializer = KryoNamespace.newBuilder()
                 .register(KryoNamespaces.API)
@@ -205,6 +209,7 @@
         portPairGroupService.removeListener(portPairGroupListener);
         flowClassifierService.removeListener(flowClassifierListener);
         portChainService.removeListener(portChainListener);
+        virtualPortService.removeListener(virtualPortListener);
 
         l3vniTenantMap.destroy();
         l3vniTenantRouterMap.destroy();
@@ -401,6 +406,22 @@
         }
     }
 
+    private class InnerVirtualPortListener implements VirtualPortListener {
+
+        @Override
+        public void event(VirtualPortEvent event) {
+            checkNotNull(event, EVENT_NOT_NULL);
+            VirtualPort virtualPort = event.subject();
+            if (VirtualPortEvent.Type.VIRTUAL_PORT_PUT == event.type()) {
+                notifyListeners(new VtnRscEvent(VtnRscEvent.Type.VIRTUAL_PORT_PUT,
+                                                new VtnRscEventFeedback(virtualPort)));
+            } else if (VirtualPortEvent.Type.VIRTUAL_PORT_DELETE == event.type()) {
+                notifyListeners(new VtnRscEvent(VtnRscEvent.Type.VIRTUAL_PORT_DELETE,
+                                                new VtnRscEventFeedback(virtualPort)));
+            }
+        }
+    }
+
     @Override
     public Iterator<Device> getClassifierOfTenant(TenantId tenantId) {
         checkNotNull(tenantId, TENANTID_NOT_NULL);
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/VirtualPortEvent.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/VirtualPortEvent.java
new file mode 100644
index 0000000..e0d3aac
--- /dev/null
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/VirtualPortEvent.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.vtnrsc.virtualport;
+
+import org.onosproject.event.AbstractEvent;
+import org.onosproject.vtnrsc.VirtualPort;
+
+/**
+ * Describes virtual port event.
+ */
+public class VirtualPortEvent extends AbstractEvent<VirtualPortEvent.Type, VirtualPort> {
+    /**
+     * Type of virtual port events.
+     */
+    public enum Type {
+        /**
+         * Signifies that virtual port has been created.
+         */
+        VIRTUAL_PORT_PUT,
+        /**
+         * Signifies that virtual port has been deleted.
+         */
+        VIRTUAL_PORT_DELETE,
+        /**
+         * Signifies that virtual port has been updated.
+         */
+        VIRTUAL_PORT_UPDATE
+    }
+
+    /**
+     * Creates an event of a given type and for the specified virtual port.
+     *
+     * @param type virtual port event type
+     * @param virtualPort virtual port subject
+     */
+    public VirtualPortEvent(Type type, VirtualPort virtualPort) {
+        super(type, virtualPort);
+    }
+
+    /**
+     * Creates an event of a given type and for the specified virtual port.
+     *
+     * @param type virtual port event type
+     * @param virtualPort virtual port subject
+     * @param time occurrence time
+     */
+    public VirtualPortEvent(Type type, VirtualPort virtualPort, long time) {
+        super(type, virtualPort, time);
+    }
+}
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/VirtualPortListener.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/VirtualPortListener.java
new file mode 100644
index 0000000..c2d848d
--- /dev/null
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/VirtualPortListener.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.vtnrsc.virtualport;
+
+import org.onosproject.event.EventListener;
+
+/**
+ * Entity capable of virtual port related events.
+ */
+public interface VirtualPortListener extends EventListener<VirtualPortEvent> {
+
+}
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/VirtualPortService.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/VirtualPortService.java
index 25ef028..3808291 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/VirtualPortService.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/VirtualPortService.java
@@ -18,6 +18,7 @@
 import java.util.Collection;
 
 import org.onlab.packet.IpAddress;
+import org.onosproject.event.ListenerService;
 import org.onosproject.net.DeviceId;
 import org.onosproject.vtnrsc.FixedIp;
 import org.onosproject.vtnrsc.TenantId;
@@ -28,7 +29,7 @@
 /**
  * Service for interacting with the inventory of virtualPort.
  */
-public interface VirtualPortService {
+public interface VirtualPortService extends ListenerService<VirtualPortEvent, VirtualPortListener> {
     /**
      * Returns if the virtualPort is existed.
      *
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/impl/VirtualPortManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/impl/VirtualPortManager.java
index 2722123..d352cb3 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/impl/VirtualPortManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/impl/VirtualPortManager.java
@@ -18,12 +18,10 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 import java.util.stream.Collectors;
 
 import org.apache.felix.scr.annotations.Activate;
@@ -33,12 +31,18 @@
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.packet.IpAddress;
+import org.onlab.util.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
+import org.onosproject.event.AbstractListenerManager;
 import org.onosproject.net.DeviceId;
 import org.onosproject.store.serializers.KryoNamespaces;
-import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.EventuallyConsistentMap;
+import org.onosproject.store.service.EventuallyConsistentMapEvent;
+import org.onosproject.store.service.EventuallyConsistentMapListener;
+import org.onosproject.store.service.MultiValuedTimestamp;
 import org.onosproject.store.service.StorageService;
+import org.onosproject.store.service.WallClockTimestamp;
 import org.onosproject.vtnrsc.AllowedAddressPair;
 import org.onosproject.vtnrsc.BindingHostId;
 import org.onosproject.vtnrsc.DefaultVirtualPort;
@@ -50,6 +54,8 @@
 import org.onosproject.vtnrsc.VirtualPort;
 import org.onosproject.vtnrsc.VirtualPortId;
 import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
+import org.onosproject.vtnrsc.virtualport.VirtualPortEvent;
+import org.onosproject.vtnrsc.virtualport.VirtualPortListener;
 import org.onosproject.vtnrsc.virtualport.VirtualPortService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -59,7 +65,8 @@
  */
 @Component(immediate = true)
 @Service
-public class VirtualPortManager implements VirtualPortService {
+public class VirtualPortManager extends AbstractListenerManager<VirtualPortEvent, VirtualPortListener>
+implements VirtualPortService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -73,8 +80,9 @@
     private static final String DEVICEID_NOT_NULL = "DeviceId  cannot be null";
     private static final String FIXEDIP_NOT_NULL = "FixedIp  cannot be null";
     private static final String IP_NOT_NULL = "Ip  cannot be null";
+    private static final String EVENT_NOT_NULL = "event cannot be null";
 
-    protected Map<VirtualPortId, VirtualPort> vPortStore;
+    protected EventuallyConsistentMap<VirtualPortId, VirtualPort> vPortStore;
     protected ApplicationId appId;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -86,28 +94,35 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected CoreService coreService;
 
+    private EventuallyConsistentMapListener<VirtualPortId, VirtualPort> virtualPortListener =
+            new InnerVirtualPortStoreListener();
+
     @Activate
     public void activate() {
 
         appId = coreService.registerApplication(VTNRSC_APP);
 
-        vPortStore = storageService.<VirtualPortId, VirtualPort>consistentMapBuilder()
+        eventDispatcher.addSink(VirtualPortEvent.class, listenerRegistry);
+
+        vPortStore = storageService.<VirtualPortId, VirtualPort>eventuallyConsistentMapBuilder()
                 .withName(VIRTUALPORT)
-                .withApplicationId(appId)
-                .withPurgeOnUninstall()
-                .withSerializer(Serializer.using(Arrays.asList(KryoNamespaces.API),
-                                                 VirtualPortId.class,
-                                                 TenantNetworkId.class,
-                                                 VirtualPort.State.class,
-                                                 TenantId.class,
-                                                 AllowedAddressPair.class,
-                                                 FixedIp.class,
-                                                 BindingHostId.class,
-                                                 SecurityGroup.class,
-                                                 SubnetId.class,
-                                                 IpAddress.class,
-                                                 DefaultVirtualPort.class))
-                .build().asJavaMap();
+                .withSerializer(KryoNamespace.newBuilder().register(KryoNamespaces.API)
+                                .register(MultiValuedTimestamp.class)
+                        .register(VirtualPortId.class,
+                                  TenantNetworkId.class,
+                                  VirtualPort.State.class,
+                                  TenantId.class,
+                                  AllowedAddressPair.class,
+                                  FixedIp.class,
+                                  BindingHostId.class,
+                                  SecurityGroup.class,
+                                  SubnetId.class,
+                                  IpAddress.class,
+                                  DefaultVirtualPort.class))
+                .withTimestampProvider((k, v) ->new WallClockTimestamp())
+                                          .build();
+
+        vPortStore.addListener(virtualPortListener);
         log.info("Started");
     }
 
@@ -246,4 +261,35 @@
         return true;
     }
 
+    private class InnerVirtualPortStoreListener
+    implements
+    EventuallyConsistentMapListener<VirtualPortId, VirtualPort> {
+
+        @Override
+        public void event(EventuallyConsistentMapEvent<VirtualPortId, VirtualPort> event) {
+            checkNotNull(event, EVENT_NOT_NULL);
+            log.info("virtual port event raised");
+            VirtualPort virtualPort = event.value();
+            if (EventuallyConsistentMapEvent.Type.PUT == event.type()) {
+                notifyListeners(new VirtualPortEvent(
+                                                     VirtualPortEvent.Type.VIRTUAL_PORT_PUT,
+                                                     virtualPort));
+            }
+            if (EventuallyConsistentMapEvent.Type.REMOVE == event.type()) {
+                notifyListeners(new VirtualPortEvent(
+                                                     VirtualPortEvent.Type.VIRTUAL_PORT_DELETE,
+                                                     virtualPort));
+            }
+        }
+    }
+
+    /**
+     * Notifies specify event to all listeners.
+     *
+     * @param event virtual port event
+     */
+    private void notifyListeners(VirtualPortEvent event) {
+        checkNotNull(event, EVENT_NOT_NULL);
+        post(event);
+    }
 }
