diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java b/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java
index b0726d6..47450c7 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/MeterManager.java
@@ -21,6 +21,7 @@
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
+import org.onlab.util.TriConsumer;
 import org.onosproject.incubator.net.meter.DefaultMeter;
 import org.onosproject.incubator.net.meter.Meter;
 import org.onosproject.incubator.net.meter.MeterEvent;
@@ -35,6 +36,7 @@
 import org.onosproject.incubator.net.meter.MeterState;
 import org.onosproject.incubator.net.meter.MeterStore;
 import org.onosproject.incubator.net.meter.MeterStoreDelegate;
+import org.onosproject.incubator.net.meter.MeterStoreResult;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
@@ -44,7 +46,6 @@
 
 import java.util.Collection;
 
-import static com.google.common.base.Preconditions.checkNotNull;
 import static org.slf4j.LoggerFactory.getLogger;
 
 
@@ -69,11 +70,29 @@
 
     private AtomicCounter meterIdCounter;
 
+    private TriConsumer<MeterOperation, MeterStoreResult, Throwable> onComplete;
+
     @Activate
     public void activate() {
         meterIdCounter = storageService.atomicCounterBuilder()
                 .withName(meterIdentifier)
                 .build();
+
+        onComplete = (op, result, error) ->
+            {
+                op.context().ifPresent(c -> {
+                    if (error != null) {
+                        c.onError(op.meter(), MeterFailReason.UNKNOWN);
+                    } else {
+                        if (result.reason().isPresent()) {
+                            c.onError(op.meter(), result.reason().get());
+                        } else {
+                            c.onSuccess(op.meter());
+                        }
+                    }
+                });
+
+            };
         log.info("Started");
     }
 
@@ -88,31 +107,27 @@
     }
 
     @Override
-    public void addMeter(Meter meter) {
-        DefaultMeter m = (DefaultMeter) meter;
+    public void addMeter(MeterOperation op) {
+        DefaultMeter m = (DefaultMeter) op.meter();
         m.setState(MeterState.PENDING_ADD);
-        store.storeMeter(m);
+        store.storeMeter(m).whenComplete((result, error) ->
+                                                 onComplete.accept(op, result, error));
     }
 
     @Override
-    public void updateMeter(Meter meter) {
-        DefaultMeter m = (DefaultMeter) meter;
+    public void updateMeter(MeterOperation op) {
+        DefaultMeter m = (DefaultMeter) op.meter();
         m.setState(MeterState.PENDING_ADD);
-        store.updateMeter(m);
+        store.updateMeter(m).whenComplete((result, error) ->
+                                                  onComplete.accept(op, result, error));
     }
 
     @Override
-    public void removeMeter(Meter meter) {
-        DefaultMeter m = (DefaultMeter) meter;
+    public void removeMeter(MeterOperation op) {
+        DefaultMeter m = (DefaultMeter) op.meter();
         m.setState(MeterState.PENDING_REMOVE);
-        store.deleteMeter(m);
-    }
-
-    @Override
-    public void removeMeter(MeterId id) {
-        DefaultMeter meter = (DefaultMeter) store.getMeter(id);
-        checkNotNull(meter, "No such meter {}", id);
-        removeMeter(meter);
+        store.deleteMeter(m).whenComplete((result, error) ->
+                                                  onComplete.accept(op, result, error));
     }
 
     @Override
@@ -155,17 +170,18 @@
 
         @Override
         public void notify(MeterEvent event) {
-            DeviceId deviceId = event.subject().meter().deviceId();
-            MeterProvider p = getProvider(event.subject().meter().deviceId());
+            DeviceId deviceId = event.subject().deviceId();
+            MeterProvider p = getProvider(event.subject().deviceId());
             switch (event.type()) {
-                case METER_UPDATED:
+                case METER_ADD_REQ:
+                    p.performMeterOperation(deviceId, new MeterOperation(event.subject(),
+                                                                         MeterOperation.Type.ADD,
+                                                                         null));
                     break;
-                case METER_OP_FAILED:
-                    event.subject().meter().context().ifPresent(c ->
-                        c.onError(event.subject(), event.reason()));
-                    break;
-                case METER_OP_REQ:
-                    p.performMeterOperation(deviceId, event.subject());
+                case METER_REM_REQ:
+                    p.performMeterOperation(deviceId, new MeterOperation(event.subject(),
+                                                                         MeterOperation.Type.REMOVE,
+                                                                         null));
                     break;
                 default:
                     log.warn("Unknown meter event {}", event.type());
