diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualNetworkStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualNetworkStore.java
index 9007c21..967504c 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualNetworkStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualNetworkStore.java
@@ -74,6 +74,7 @@
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.BiFunction;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
@@ -109,7 +110,14 @@
     private Map<NetworkId, VirtualNetwork> networkIdVirtualNetworkMap;
 
     // Listener for virtual network events
-    private final MapEventListener<NetworkId, VirtualNetwork> virtualMapListener = new InternalMapListener();
+    private final MapEventListener<NetworkId, VirtualNetwork> virtualNetworkMapListener =
+            new InternalMapListener<>((mapEventType, virtualNetwork) -> {
+                VirtualNetworkEvent.Type eventType =
+                    mapEventType.equals(MapEvent.Type.INSERT) ? VirtualNetworkEvent.Type.NETWORK_ADDED :
+                    mapEventType.equals(MapEvent.Type.UPDATE) ? VirtualNetworkEvent.Type.NETWORK_UPDATED :
+                    mapEventType.equals(MapEvent.Type.REMOVE) ? VirtualNetworkEvent.Type.NETWORK_REMOVED : null;
+                return eventType == null ? null : new VirtualNetworkEvent(eventType, virtualNetwork.id());
+            });
 
     // Track virtual network IDs by tenant Id
     private ConsistentMap<TenantId, Set<NetworkId>> tenantIdNetworkIdSetConsistentMap;
@@ -119,6 +127,17 @@
     private ConsistentMap<DeviceId, VirtualDevice> deviceIdVirtualDeviceConsistentMap;
     private Map<DeviceId, VirtualDevice> deviceIdVirtualDeviceMap;
 
+    // Listener for virtual device events
+    private final MapEventListener<DeviceId, VirtualDevice> virtualDeviceMapListener =
+            new InternalMapListener<>((mapEventType, virtualDevice) -> {
+                VirtualNetworkEvent.Type eventType =
+                    mapEventType.equals(MapEvent.Type.INSERT) ? VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED :
+                    mapEventType.equals(MapEvent.Type.UPDATE) ? VirtualNetworkEvent.Type.VIRTUAL_DEVICE_UPDATED :
+                    mapEventType.equals(MapEvent.Type.REMOVE) ? VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED : null;
+                return eventType == null ? null :
+                        new VirtualNetworkEvent(eventType, virtualDevice.networkId(), virtualDevice);
+            });
+
     // Track device IDs by network Id
     private ConsistentMap<NetworkId, Set<DeviceId>> networkIdDeviceIdSetConsistentMap;
     private Map<NetworkId, Set<DeviceId>> networkIdDeviceIdSetMap;
@@ -189,7 +208,7 @@
                 .withName("onos-networkId-virtualnetwork")
                 .withRelaxedReadConsistency()
                 .build();
-        networkIdVirtualNetworkConsistentMap.addListener(virtualMapListener);
+        networkIdVirtualNetworkConsistentMap.addListener(virtualNetworkMapListener);
         networkIdVirtualNetworkMap = networkIdVirtualNetworkConsistentMap.asJavaMap();
 
         tenantIdNetworkIdSetConsistentMap = storageService.<TenantId, Set<NetworkId>>consistentMapBuilder()
@@ -204,6 +223,7 @@
                 .withName("onos-deviceId-virtualdevice")
                 .withRelaxedReadConsistency()
                 .build();
+        deviceIdVirtualDeviceConsistentMap.addListener(virtualDeviceMapListener);
         deviceIdVirtualDeviceMap = deviceIdVirtualDeviceConsistentMap.asJavaMap();
 
         networkIdDeviceIdSetConsistentMap = storageService.<NetworkId, Set<DeviceId>>consistentMapBuilder()
@@ -264,7 +284,8 @@
     @Deactivate
     public void deactivate() {
         tenantIdSet.removeListener(setListener);
-        networkIdVirtualNetworkConsistentMap.removeListener(virtualMapListener);
+        networkIdVirtualNetworkConsistentMap.removeListener(virtualNetworkMapListener);
+        deviceIdVirtualDeviceConsistentMap.removeListener(virtualDeviceMapListener);
         log.info("Stopped");
     }
 
@@ -772,29 +793,40 @@
     /**
      * Listener class to map listener map events to the virtual network events.
      */
-    private class InternalMapListener implements MapEventListener<NetworkId, VirtualNetwork> {
+    private class InternalMapListener<K, V> implements MapEventListener<K, V> {
+
+        private final BiFunction<MapEvent.Type, V, VirtualNetworkEvent> createEvent;
+
+        InternalMapListener(BiFunction<MapEvent.Type, V, VirtualNetworkEvent> createEvent) {
+            this.createEvent = createEvent;
+        }
+
         @Override
-        public void event(MapEvent<NetworkId, VirtualNetwork> event) {
-            NetworkId networkId = checkNotNull(event.key());
-            VirtualNetworkEvent.Type type = null;
+        public void event(MapEvent<K, V> event) {
+            checkNotNull(event.key());
+            VirtualNetworkEvent vnetEvent = null;
             switch (event.type()) {
                 case INSERT:
-                    type = VirtualNetworkEvent.Type.NETWORK_ADDED;
+                    vnetEvent = createEvent.apply(event.type(), event.newValue().value());
                     break;
                 case UPDATE:
                     if ((event.oldValue().value() != null) && (event.newValue().value() == null)) {
-                        type = VirtualNetworkEvent.Type.NETWORK_REMOVED;
+                        vnetEvent = createEvent.apply(MapEvent.Type.REMOVE, event.oldValue().value());
                     } else {
-                        type = VirtualNetworkEvent.Type.NETWORK_UPDATED;
+                        vnetEvent = createEvent.apply(event.type(), event.newValue().value());
                     }
                     break;
                 case REMOVE:
-                    type = VirtualNetworkEvent.Type.NETWORK_REMOVED;
+                    if (event.oldValue() != null) {
+                        vnetEvent = createEvent.apply(event.type(), event.oldValue().value());
+                    }
                     break;
                 default:
                     log.error("Unsupported event type: " + event.type());
             }
-            notifyDelegate(new VirtualNetworkEvent(type, networkId));
+            if (vnetEvent != null) {
+                notifyDelegate(vnetEvent);
+            }
         }
     }
 }
