diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java
index c09b1ac..62a9467 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java
@@ -82,7 +82,7 @@
     private ConsistentMap<MeterKey, MeterData> meters;
     private NodeId local;
 
-    private MapEventListener mapListener = new InternalMapEventListener();
+    private MapEventListener<MeterKey, MeterData> mapListener = new InternalMapEventListener();
 
     private Map<MeterKey, CompletableFuture<MeterStoreResult>> futures =
             Maps.newConcurrentMap();
@@ -216,9 +216,10 @@
         meters.remove(key);
     }
 
-    private class InternalMapEventListener implements MapEventListener<MeterId, MeterData> {
+    private class InternalMapEventListener implements MapEventListener<MeterKey, MeterData> {
         @Override
-        public void event(MapEvent<MeterId, MeterData> event) {
+        public void event(MapEvent<MeterKey, MeterData> event) {
+            MeterKey key = event.key();
             MeterData data = event.value().value();
             NodeId master = mastershipService.getMasterFor(data.meter().deviceId());
             switch (event.type()) {
@@ -235,17 +236,17 @@
                                 } else if (data.reason().isPresent() && local.equals(data.origin())) {
                                     MeterStoreResult msr = MeterStoreResult.fail(data.reason().get());
                                     //TODO: No future -> no friend
-                                    futures.get(data.meter().id()).complete(msr);
+                                    futures.get(key).complete(msr);
                                 }
                                 break;
                             case ADDED:
                                 if (local.equals(data.origin()) && data.meter().state() == MeterState.PENDING_ADD) {
-                                    futures.remove(data.meter().id()).complete(MeterStoreResult.success());
+                                    futures.remove(key).complete(MeterStoreResult.success());
                                 }
                                 break;
                             case REMOVED:
                                 if (local.equals(data.origin()) && data.meter().state() == MeterState.PENDING_REMOVE) {
-                                    futures.remove(data.meter().id()).complete(MeterStoreResult.success());
+                                    futures.remove(key).complete(MeterStoreResult.success());
                                 }
                                 break;
                             default:
