diff --git a/apps/virtual/app/src/main/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkMeterManager.java b/apps/virtual/app/src/main/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkMeterManager.java
index 9ec530b..9d4f7e4 100644
--- a/apps/virtual/app/src/main/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkMeterManager.java
+++ b/apps/virtual/app/src/main/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkMeterManager.java
@@ -30,6 +30,7 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.meter.DefaultMeter;
 import org.onosproject.net.meter.Meter;
+import org.onosproject.net.meter.MeterCellId;
 import org.onosproject.net.meter.MeterEvent;
 import org.onosproject.net.meter.MeterFailReason;
 import org.onosproject.net.meter.MeterFeatures;
@@ -139,11 +140,16 @@
 
     @Override
     public void withdraw(MeterRequest request, MeterId meterId) {
+        withdraw(request, (MeterCellId) meterId);
+    }
+
+    @Override
+    public void withdraw(MeterRequest request, MeterCellId meterCellId) {
         Meter.Builder mBuilder = DefaultMeter.builder()
                 .forDevice(request.deviceId())
                 .fromApp(request.appId())
                 .withBands(request.bands())
-                .withId(meterId)
+                .withCellId(meterCellId)
                 .withUnit(request.unit());
 
         if (request.isBurst()) {
@@ -158,6 +164,11 @@
 
     @Override
     public Meter getMeter(DeviceId deviceId, MeterId id) {
+        return getMeter(deviceId, (MeterCellId) id);
+    }
+
+    @Override
+    public Meter getMeter(DeviceId deviceId, MeterCellId id) {
         MeterKey key = MeterKey.key(deviceId, id);
         return store.getMeter(networkId(), key);
     }
diff --git a/core/api/src/main/java/org/onosproject/net/meter/DefaultMeter.java b/core/api/src/main/java/org/onosproject/net/meter/DefaultMeter.java
index 681846f..f3e29fe 100644
--- a/core/api/src/main/java/org/onosproject/net/meter/DefaultMeter.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/DefaultMeter.java
@@ -23,6 +23,7 @@
 import org.onosproject.net.DeviceId;
 
 import java.util.Collection;
+import java.util.Optional;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkArgument;
@@ -36,7 +37,7 @@
 
 
     private final MeterCellId cellId;
-    private final ApplicationId appId;
+    private final Optional<ApplicationId> appId;
     private final Unit unit;
     private final boolean burst;
     private final Collection<Band> bands;
@@ -48,8 +49,9 @@
     private long packets;
     private long bytes;
 
-    private DefaultMeter(DeviceId deviceId, MeterCellId cellId, ApplicationId appId,
-                         Unit unit, boolean burst, Collection<Band> bands,
+    private DefaultMeter(DeviceId deviceId, MeterCellId cellId,
+                         Optional<ApplicationId> appId, Unit unit,
+                         boolean burst, Collection<Band> bands,
                          Annotations... annotations) {
         super(annotations);
         this.deviceId = deviceId;
@@ -81,7 +83,8 @@
 
     @Override
     public ApplicationId appId() {
-        return appId;
+        return appId.orElse(null);
+        // TODO: Deprecate this API because AppId becomes optional in Meter
     }
 
     @Override
@@ -158,7 +161,7 @@
         return toStringHelper(this)
                 .add("device", deviceId)
                 .add("cellId", cellId)
-                .add("appId", appId.name())
+                .add("appId", appId.orElse(null))
                 .add("unit", unit)
                 .add("isBurst", burst)
                 .add("state", state)
@@ -190,7 +193,7 @@
     public static final class Builder implements Meter.Builder {
 
         private MeterCellId cellId;
-        private ApplicationId appId;
+        private Optional<ApplicationId> appId = Optional.empty();
         private Unit unit = Unit.KB_PER_SEC;
         private boolean burst = false;
         private Collection<Band> bands;
@@ -217,7 +220,7 @@
 
         @Override
         public Meter.Builder fromApp(ApplicationId appId) {
-            this.appId = appId;
+            this.appId = Optional.ofNullable(appId);
             return this;
         }
 
@@ -250,7 +253,6 @@
             checkNotNull(deviceId, "Must specify a device");
             checkNotNull(bands, "Must have bands.");
             checkArgument(!bands.isEmpty(), "Must have at least one band.");
-            checkNotNull(appId, "Must have an application id");
             checkArgument(cellId != null, "Must specify a cell id.");
             return new DefaultMeter(deviceId, cellId, appId, unit, burst, bands,
                                     annotations);
diff --git a/core/api/src/main/java/org/onosproject/net/meter/DefaultMeterRequest.java b/core/api/src/main/java/org/onosproject/net/meter/DefaultMeterRequest.java
index e6e2d1b..0dbd4f7 100644
--- a/core/api/src/main/java/org/onosproject/net/meter/DefaultMeterRequest.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/DefaultMeterRequest.java
@@ -42,11 +42,14 @@
     private final DeviceId deviceId;
     private final Optional<MeterContext> context;
     private final Type op;
+    private final MeterScope scope;
+    private final Optional<Long> index;
 
     private DefaultMeterRequest(DeviceId deviceId, ApplicationId appId,
                                 Meter.Unit unit, boolean burst,
                                 Collection<Band> bands, MeterContext context,
-                                Type op, Annotations... annotations) {
+                                Type op, MeterScope scope, Optional<Long> index,
+                                Annotations... annotations) {
         super(annotations);
         this.deviceId = deviceId;
         this.appId = appId;
@@ -55,6 +58,8 @@
         this.bands = bands;
         this.context = Optional.ofNullable(context);
         this.op = op;
+        this.scope = scope;
+        this.index = index;
     }
 
     @Override
@@ -88,7 +93,15 @@
         return context;
     }
 
+    @Override
+    public MeterScope scope() {
+        return scope;
+    }
 
+    @Override
+    public Optional<Long> index() {
+        return index;
+    }
 
     public static Builder builder() {
         return new Builder();
@@ -102,6 +115,8 @@
                 .add("unit", unit)
                 .add("isBurst", burst)
                 .add("bands", bands)
+                .add("scope", scope)
+                .add("desired index", index.orElse(null))
                 .add("annotations", annotations())
                 .toString();
     }
@@ -114,9 +129,9 @@
         private Collection<Band> bands;
         private DeviceId deviceId;
         private MeterContext context;
-        private Optional<MeterId> desiredId = Optional.empty();
         private Annotations annotations;
-
+        private MeterScope scope = MeterScope.globalScope();
+        private Optional<Long> desiredIndex = Optional.empty();
 
         @Override
         public MeterRequest.Builder forDevice(DeviceId deviceId) {
@@ -131,19 +146,19 @@
         }
 
         @Override
-        public MeterRequest.Builder  withUnit(Meter.Unit unit) {
+        public MeterRequest.Builder withUnit(Meter.Unit unit) {
             this.unit = unit;
             return this;
         }
 
         @Override
-        public MeterRequest.Builder  burst() {
+        public MeterRequest.Builder burst() {
             this.burst = true;
             return this;
         }
 
         @Override
-        public MeterRequest.Builder  withBands(Collection<Band> bands) {
+        public MeterRequest.Builder withBands(Collection<Band> bands) {
             this.bands = ImmutableSet.copyOf(bands);
             return this;
         }
@@ -161,17 +176,29 @@
         }
 
         @Override
+        public MeterRequest.Builder withScope(MeterScope scope) {
+            this.scope = scope;
+            return this;
+        }
+
+        @Override
+        public MeterRequest.Builder withIndex(Long index) {
+            this.desiredIndex = Optional.ofNullable(index);
+            return this;
+        }
+
+        @Override
         public MeterRequest add() {
             validate();
-            return new DefaultMeterRequest(deviceId, appId, unit, burst, bands,
-                                           context, Type.ADD, annotations);
+            return new DefaultMeterRequest(deviceId, appId, unit, burst, bands, context,
+                                           Type.ADD, scope, desiredIndex, annotations);
         }
 
         @Override
         public MeterRequest remove() {
             validate();
-            return new DefaultMeterRequest(deviceId, appId, unit, burst, bands,
-                                           context, Type.REMOVE, annotations);
+            return new DefaultMeterRequest(deviceId, appId, unit, burst, bands, context,
+                                           Type.REMOVE, scope, desiredIndex, annotations);
         }
 
         private void validate() {
@@ -179,6 +206,9 @@
             checkNotNull(bands, "Must have bands.");
             checkArgument(!bands.isEmpty(), "Must have at least one band.");
             checkNotNull(appId, "Must have an application id");
+            if (desiredIndex.isPresent()) {
+                checkArgument(desiredIndex.get() >= 0, "Desired index cannot be negative");
+            }
         }
 
 
diff --git a/core/api/src/main/java/org/onosproject/net/meter/Meter.java b/core/api/src/main/java/org/onosproject/net/meter/Meter.java
index 63b6db3..64379d3 100644
--- a/core/api/src/main/java/org/onosproject/net/meter/Meter.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/Meter.java
@@ -37,7 +37,12 @@
         /**
          * Kilo bits per second.
          */
-        KB_PER_SEC
+        KB_PER_SEC,
+
+        /**
+         * Bytes per second.
+         */
+        BYTES_PER_SEC
     }
 
     /**
@@ -65,10 +70,13 @@
 
     /**
      * The id of the application which created this meter.
+     * Could be null if the meter is read from the controller southbound.
      *
      * @return an application id
      */
     ApplicationId appId();
+    // TODO: Deprecate this and create a new method returns an Optional ApplicationId
+    // TODO: Or introduce MeterEntry on south and keep this method
 
     /**
      * The unit used within this meter.
diff --git a/core/api/src/main/java/org/onosproject/net/meter/MeterRequest.java b/core/api/src/main/java/org/onosproject/net/meter/MeterRequest.java
index a2be1ce..e156fd4 100644
--- a/core/api/src/main/java/org/onosproject/net/meter/MeterRequest.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterRequest.java
@@ -77,6 +77,20 @@
     Optional<MeterContext> context();
 
     /**
+     * Returns the scope of this meter request.
+     *
+     * @return a meter scope
+     */
+    MeterScope scope();
+
+    /**
+     * Returns the desired meter index of this meter request.
+     *
+     * @return an optional long index
+     */
+    Optional<Long> index();
+
+    /**
      * A meter builder.
      */
     interface Builder {
@@ -139,6 +153,22 @@
         Builder withAnnotations(Annotations annotations);
 
         /**
+         * Sets the scope.
+         *
+         * @param scope a meter scope
+         * @return this
+         */
+        Builder withScope(MeterScope scope);
+
+        /**
+         * Sets the index.
+         *
+         * @param index an optional index
+         * @return this
+         */
+        Builder withIndex(Long index);
+
+        /**
          * Requests the addition of a meter.
          *
          * @return a meter request
diff --git a/core/api/src/main/java/org/onosproject/net/meter/MeterService.java b/core/api/src/main/java/org/onosproject/net/meter/MeterService.java
index 6339101..5b3ca3b 100644
--- a/core/api/src/main/java/org/onosproject/net/meter/MeterService.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterService.java
@@ -42,19 +42,40 @@
      *
      * @param meter a meter to remove
      * @param meterId the meter id of the meter to remove.
+     * @deprecated in onos-2.5, replace MeterId with MeterCellId
      */
+    @Deprecated
     void withdraw(MeterRequest meter, MeterId meterId);
 
     /**
+     * Remove a meter from the system and the dataplane.
+     *
+     * @param meter a meter to remove
+     * @param meterCellId the meter cell id of the meter to remove.
+     */
+    void withdraw(MeterRequest meter, MeterCellId meterCellId);
+
+    /**
      * Fetch the meter by the meter id.
      *
      * @param deviceId a device id
      * @param id a meter id
      * @return a meter
+     * @deprecated in onos-2.5, Replace MeterId with MeterCellId
      */
+    @Deprecated
     Meter getMeter(DeviceId deviceId, MeterId id);
 
     /**
+     * Fetch the meter by the meter id.
+     *
+     * @param deviceId a device id
+     * @param id a meter cell id
+     * @return a meter
+     */
+    Meter getMeter(DeviceId deviceId, MeterCellId id);
+
+    /**
      * Fetches all the meters.
      *
      * @return a collection of meters
diff --git a/core/api/src/main/java/org/onosproject/net/meter/MeterState.java b/core/api/src/main/java/org/onosproject/net/meter/MeterState.java
index 78fdd90..c098d91 100644
--- a/core/api/src/main/java/org/onosproject/net/meter/MeterState.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterState.java
@@ -35,9 +35,4 @@
      */
     PENDING_REMOVE,
 
-    /**
-     * The meter has been removed.
-     */
-    REMOVED,
-
 }
diff --git a/core/api/src/test/java/org/onosproject/net/meter/MeterServiceAdapter.java b/core/api/src/test/java/org/onosproject/net/meter/MeterServiceAdapter.java
index 7148c06..2a298b4 100644
--- a/core/api/src/test/java/org/onosproject/net/meter/MeterServiceAdapter.java
+++ b/core/api/src/test/java/org/onosproject/net/meter/MeterServiceAdapter.java
@@ -36,11 +36,21 @@
     }
 
     @Override
+    public void withdraw(MeterRequest meter, MeterCellId meterCellId) {
+
+    }
+
+    @Override
     public Meter getMeter(DeviceId deviceId, MeterId id) {
         return null;
     }
 
     @Override
+    public Meter getMeter(DeviceId deviceId, MeterCellId meterCellId) {
+        return null;
+    }
+
+    @Override
     public Collection<Meter> getAllMeters() {
         return null;
     }
diff --git a/core/net/src/main/java/org/onosproject/net/meter/impl/MeterManager.java b/core/net/src/main/java/org/onosproject/net/meter/impl/MeterManager.java
index 805009d..9b786e5 100644
--- a/core/net/src/main/java/org/onosproject/net/meter/impl/MeterManager.java
+++ b/core/net/src/main/java/org/onosproject/net/meter/impl/MeterManager.java
@@ -34,7 +34,7 @@
 import org.onosproject.net.driver.DriverService;
 import org.onosproject.net.meter.DefaultMeter;
 import org.onosproject.net.meter.Meter;
-import org.onosproject.net.meter.MeterCellId.MeterCellType;
+import org.onosproject.net.meter.MeterCellId;
 import org.onosproject.net.meter.MeterEvent;
 import org.onosproject.net.meter.MeterFailReason;
 import org.onosproject.net.meter.MeterFeatures;
@@ -46,6 +46,7 @@
 import org.onosproject.net.meter.MeterProviderRegistry;
 import org.onosproject.net.meter.MeterProviderService;
 import org.onosproject.net.meter.MeterRequest;
+import org.onosproject.net.meter.MeterScope;
 import org.onosproject.net.meter.MeterService;
 import org.onosproject.net.meter.MeterState;
 import org.onosproject.net.meter.MeterStore;
@@ -53,6 +54,8 @@
 import org.onosproject.net.meter.MeterStoreResult;
 import org.onosproject.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
+import org.onosproject.net.pi.model.PiMeterId;
+import org.onosproject.net.pi.runtime.PiMeterCellId;
 import org.osgi.service.component.ComponentContext;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
@@ -252,13 +255,24 @@
     @Override
     public Meter submit(MeterRequest request) {
         checkNotNull(request, "request cannot be null.");
-        // Allocate an id and then submit the request
-        MeterId id = allocateMeterId(request.deviceId());
+        MeterCellId cellId;
+        if (request.index().isPresent()) {
+            // User provides index
+            if (request.scope().isGlobal()) {
+                cellId = MeterId.meterId(request.index().get());
+            } else {
+                cellId = PiMeterCellId.ofIndirect(
+                    PiMeterId.of(request.scope().id()), request.index().get());
+            }
+        } else {
+            // Allocate an id
+            cellId = allocateMeterId(request.deviceId(), request.scope());
+        }
         Meter.Builder mBuilder = DefaultMeter.builder()
                 .forDevice(request.deviceId())
                 .fromApp(request.appId())
                 .withBands(request.bands())
-                .withCellId(id)
+                .withCellId(cellId)
                 .withUnit(request.unit());
         if (request.isBurst()) {
             mBuilder.burst();
@@ -277,12 +291,17 @@
 
     @Override
     public void withdraw(MeterRequest request, MeterId meterId) {
+        withdraw(request, (MeterCellId) meterId);
+    }
+
+    @Override
+    public void withdraw(MeterRequest request, MeterCellId meterCellId) {
         checkNotNull(request, "request cannot be null.");
         Meter.Builder mBuilder = DefaultMeter.builder()
                 .forDevice(request.deviceId())
                 .fromApp(request.appId())
                 .withBands(request.bands())
-                .withCellId(meterId)
+                .withCellId(meterCellId)
                 .withUnit(request.unit());
 
         if (request.isBurst()) {
@@ -299,6 +318,11 @@
 
     @Override
     public Meter getMeter(DeviceId deviceId, MeterId id) {
+        return getMeter(deviceId, (MeterCellId) id);
+    }
+
+    @Override
+    public Meter getMeter(DeviceId deviceId, MeterCellId id) {
         MeterKey key = MeterKey.key(deviceId, id);
         return store.getMeter(key);
     }
@@ -320,6 +344,10 @@
         return store.allocateMeterId(deviceId);
     }
 
+    private MeterCellId allocateMeterId(DeviceId deviceId, MeterScope scope) {
+        return store.allocateMeterId(deviceId, scope);
+    }
+
     @Override
     public void freeMeterId(DeviceId deviceId, MeterId meterId) {
         // We delegate directly to the store
@@ -361,14 +389,14 @@
             // Each update on the store is reflected on this collection
             Collection<Meter> allMeters = store.getAllMeters(deviceId);
 
-            Map<MeterId, Meter> meterEntriesMap = meterEntries.stream()
-                    .collect(Collectors.toMap(Meter::id, Meter -> Meter));
+            Map<MeterCellId, Meter> meterEntriesMap = meterEntries.stream()
+                    .collect(Collectors.toMap(Meter::meterCellId, Meter -> Meter));
 
             // Look for meters defined in onos and missing in the device (restore)
             allMeters.stream().forEach(m -> {
                 if ((m.state().equals(MeterState.PENDING_ADD) ||
                         m.state().equals(MeterState.ADDED)) &&
-                        !meterEntriesMap.containsKey(m.id())) {
+                        !meterEntriesMap.containsKey(m.meterCellId())) {
                     // The meter is missing in the device. Reinstall!
                     log.debug("Adding meter missing in device {} {}", deviceId, m);
                     // offload the task to avoid the overloading of the sb threads
@@ -378,27 +406,21 @@
 
             // Look for meters defined in the device and not in onos (remove)
             meterEntriesMap.entrySet().stream()
-                    .filter(md -> !allMeters.stream().anyMatch(m -> m.id().equals(md.getKey())))
+                    .filter(md -> !allMeters.stream().anyMatch(m -> m.meterCellId().equals(md.getKey())))
                     .forEach(mio -> {
                         Meter meter = mio.getValue();
-                        // FIXME: Removing a meter is meaningful for OpenFlow, but not for P4Runtime.
-                        // In P4Runtime meter cells cannot be removed. For the
-                        // moment, we make the distinction between OpenFlow and
-                        // P4Runtime by looking at the MeterCellType (always
-                        // INDEX for OpenFlow).
-                        if (meter.meterCellId().type() == MeterCellType.INDEX) {
-                            // The meter is missing in onos. Uninstall!
-                            log.debug("Remove meter in device not in onos {} {}", deviceId, mio.getKey());
-                            // offload the task to avoid the overloading of the sb threads
-                            meterInstallers.execute(new MeterInstaller(deviceId, meter, MeterOperation.Type.REMOVE));
-                        }
+                        // The meter is missing in onos. Uninstall!
+                        log.debug("Remove meter in device not in onos {} {}", deviceId, mio.getKey());
+                        // offload the task to avoid the overloading of the sb threads
+                        meterInstallers.execute(new MeterInstaller(deviceId, meter, MeterOperation.Type.REMOVE));
                     });
 
             // Update the meter stats in the store (first time move the state from pending to added)
             Collection<Meter> addedMeters = Sets.newHashSet();
             meterEntries.stream()
                     .filter(m -> allMeters.stream()
-                            .anyMatch(sm -> sm.deviceId().equals(deviceId) && sm.id().equals(m.id())))
+                            .anyMatch(sm -> sm.deviceId().equals(deviceId) &&
+                             sm.meterCellId().equals(m.meterCellId())))
                     .forEach(m -> {
                         Meter updatedMeter = store.updateMeterState(m);
                         if (updatedMeter != null && updatedMeter.state() == MeterState.ADDED) {
@@ -409,20 +431,13 @@
             newAllMeters.removeAll(addedMeters);
 
             newAllMeters.forEach(m -> {
-                // FIXME: Installing a meter is meaningful for OpenFlow, but not for P4Runtime.
-                // It looks like this flow is used only for p4runtime to emulate the installation
-                // since meters are already instantiated - we need just modify the params.
-                if (m.state() == MeterState.PENDING_ADD && m.meterCellId().type() != MeterCellType.INDEX) {
-                    // offload the task to avoid the overloading of the sb threads
-                    log.debug("Modify meter {} in device {}", m.id(), deviceId);
-                    meterInstallers.execute(new MeterInstaller(m.deviceId(), m, MeterOperation.Type.MODIFY));
                 // Remove workflow. Regarding OpenFlow, meters have been removed from
                 // the device but they are still in the store, we will purge them definitely.
                 // Instead, P4Runtime devices will not remove the meter. The first workaround
                 // for P4Runtime will avoid to send a remove op. Then, we reach this point
                 // and we purge the meter from the store
-                } else if (m.state() == MeterState.PENDING_REMOVE) {
-                    log.debug("Delete meter {} now in store", m.id());
+                if (m.state() == MeterState.PENDING_REMOVE) {
+                    log.debug("Delete meter {} now in store", m.meterCellId());
                     store.purgeMeter(m);
                 }
             });
@@ -498,7 +513,7 @@
             NodeId master = mastershipService.getMasterFor(meter.deviceId());
             if (!Objects.equals(local, master)) {
                 log.trace("Not the master of device {}, skipping installation of the meter {}",
-                        meter.deviceId(), meter.id());
+                        meter.deviceId(), meter.meterCellId());
                 return;
             }
             MeterProvider p = getProvider(this.deviceId);
@@ -511,7 +526,7 @@
 
         @Override
         public int hint() {
-            return meter.id().hashCode();
+            return meter.meterCellId().hashCode();
         }
     }
 
diff --git a/core/protobuf/models/proto/net/meter/MeterEnumsProto.proto b/core/protobuf/models/proto/net/meter/MeterEnumsProto.proto
index 1b0bbf5..63a35b6 100644
--- a/core/protobuf/models/proto/net/meter/MeterEnumsProto.proto
+++ b/core/protobuf/models/proto/net/meter/MeterEnumsProto.proto
@@ -28,6 +28,11 @@
     * Kilo bits per second.
     */
     KB_PER_SEC = 1;
+
+    /**
+    * Bytes per second.
+    */
+    BYTES_PER_SEC = 2;
 }
 
 enum MeterStateProto {
@@ -45,11 +50,6 @@
     * The meter is in the process of being removed.
     */
     PENDING_REMOVE = 2;
-
-    /**
-    * The meter has been removed.
-    */
-    REMOVED = 3;
 }
 
 enum MeterRequestTypeProto {
diff --git a/core/protobuf/models/src/main/java/org/onosproject/incubator/protobuf/models/net/meter/MeterEnumsProtoTranslator.java b/core/protobuf/models/src/main/java/org/onosproject/incubator/protobuf/models/net/meter/MeterEnumsProtoTranslator.java
index b73117c..bb416de 100644
--- a/core/protobuf/models/src/main/java/org/onosproject/incubator/protobuf/models/net/meter/MeterEnumsProtoTranslator.java
+++ b/core/protobuf/models/src/main/java/org/onosproject/incubator/protobuf/models/net/meter/MeterEnumsProtoTranslator.java
@@ -42,6 +42,8 @@
                 return Optional.of(Meter.Unit.PKTS_PER_SEC);
             case KB_PER_SEC:
                 return Optional.of(Meter.Unit.KB_PER_SEC);
+            case BYTES_PER_SEC:
+                return Optional.of(Meter.Unit.BYTES_PER_SEC);
             default:
                 log.warn("Unrecognized MeterUnit gRPC message: {}", unit);
                 return Optional.empty();
@@ -60,6 +62,8 @@
                 return MeterEnumsProto.MeterUnitProto.PKTS_PER_SEC;
             case KB_PER_SEC:
                 return MeterEnumsProto.MeterUnitProto.KB_PER_SEC;
+            case BYTES_PER_SEC:
+                return MeterEnumsProto.MeterUnitProto.BYTES_PER_SEC;
             default:
                 log.warn("Unrecognized MeterUnit ONOS message: {}", unit);
                 return MeterEnumsProto.MeterUnitProto.UNRECOGNIZED;
@@ -80,8 +84,6 @@
                 return MeterEnumsProto.MeterStateProto.ADDED;
             case PENDING_REMOVE:
                 return MeterEnumsProto.MeterStateProto.PENDING_REMOVE;
-            case REMOVED:
-                return MeterEnumsProto.MeterStateProto.REMOVED;
             default:
                 log.warn("Unrecognized MeterState ONOS message: {}", meterState);
                 return MeterEnumsProto.MeterStateProto.UNRECOGNIZED;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/meter/impl/DistributedMeterStore.java b/core/store/dist/src/main/java/org/onosproject/store/meter/impl/DistributedMeterStore.java
index b2034dc..7f7873c 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/meter/impl/DistributedMeterStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/meter/impl/DistributedMeterStore.java
@@ -614,7 +614,7 @@
         // Get a new value
         // If the value is smaller than the start index, get another one
         do {
-            id = meterIdGenerators.incrementAndGet(meterTableKey);
+            id = meterIdGenerators.getAndIncrement(meterTableKey);
         } while (id < startIndex);
         // Check with the end index, and if the value is bigger, cannot proceed
         if (id > endIndex) {
@@ -649,7 +649,7 @@
             return;
         }
         // Avoid to free meter not allocated
-        if (meterIdGenerators.get(meterTableKey) < index) {
+        if (meterIdGenerators.get(meterTableKey) <= index) {
             return;
         }
         // Update the availability
