diff --git a/core/api/src/main/java/org/onosproject/net/meter/DefaultBand.java b/core/api/src/main/java/org/onosproject/net/meter/DefaultBand.java
index a3a4fc2..58a2476 100644
--- a/core/api/src/main/java/org/onosproject/net/meter/DefaultBand.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/DefaultBand.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.net.meter;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkArgument;
 
 /**
@@ -24,13 +25,14 @@
 
     private final Type type;
     private final long rate;
-    private final long burstSize;
-    private final short prec;
+    //TODO: should be made optional
+    private final Long burstSize;
+    private final Short prec;
     private long packets;
     private long bytes;
 
     public DefaultBand(Type type, long rate,
-                       long burstSize, short prec) {
+                       Long burstSize, Short prec) {
         this.type = type;
         this.rate = rate;
         this.burstSize = burstSize;
@@ -77,6 +79,15 @@
         this.bytes = bytes;
     }
 
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("rate", rate)
+                .add("burst-size", burstSize)
+                .add("type", type)
+                .add("drop-precedence", prec).toString();
+    }
+
     public static Builder builder() {
         return new Builder();
     }
@@ -84,7 +95,7 @@
     public static final class Builder implements Band.Builder {
 
         private long rate;
-        private long burstSize;
+        private Long burstSize;
         private Short prec;
         private Type type;
 
@@ -114,7 +125,7 @@
 
         @Override
         public DefaultBand build() {
-            checkArgument(prec != null && type == Type.REMARK,
+            checkArgument(type != Type.REMARK && prec == null,
                           "Only REMARK bands can have a precendence.");
 
             return new DefaultBand(type, rate, burstSize, prec);
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 611a23e..ab6b444 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
@@ -15,12 +15,13 @@
  */
 package org.onosproject.net.meter;
 
+import com.google.common.collect.ImmutableSet;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.DeviceId;
 
 import java.util.Collection;
-import java.util.Collections;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
@@ -138,6 +139,18 @@
         this.bytes = bytes;
     }
 
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("device", deviceId)
+                .add("id", id)
+                .add("appId", appId.name())
+                .add("unit", unit)
+                .add("isBurst", burst)
+                .add("state", state)
+                .add("bands", bands).toString();
+    }
+
     public static final class Builder implements Meter.Builder {
 
         private MeterId id;
@@ -155,8 +168,8 @@
         }
 
         @Override
-        public Meter.Builder withId(long id) {
-            this.id = MeterId.meterId(id);
+        public Meter.Builder withId(MeterId id) {
+            this.id = id;
             return this;
         }
 
@@ -180,7 +193,7 @@
 
         @Override
         public Meter.Builder withBands(Collection<Band> bands) {
-            this.bands = Collections.unmodifiableCollection(bands);
+            this.bands = ImmutableSet.copyOf(bands);
             return this;
         }
 
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 5181c92..8ea04b0 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
@@ -130,10 +130,10 @@
         /**
          * Assigns the id to this meter.
          *
-         * @param id a long
+         * @param id a meter id
          * @return this
          */
-        Builder withId(long id);
+        Builder withId(MeterId id);
 
         /**
          * Assigns the application that built this meter.
diff --git a/core/api/src/main/java/org/onosproject/net/meter/MeterId.java b/core/api/src/main/java/org/onosproject/net/meter/MeterId.java
index f479ac5..872de2d 100644
--- a/core/api/src/main/java/org/onosproject/net/meter/MeterId.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterId.java
@@ -32,7 +32,7 @@
     public static final MeterId ALL = new MeterId(0xFFFFFFFF);
 
     private MeterId(long id) {
-        checkArgument(id <= MAX, "id cannot be larger than 0xFFFF0000");
+        checkArgument(id >= MAX, "id cannot be larger than 0xFFFF0000");
         this.id = id;
     }
 
@@ -65,6 +65,11 @@
         return Long.hashCode(id);
     }
 
+    @Override
+    public String toString() {
+        return Long.toHexString(this.id);
+    }
+
     public static MeterId meterId(long id) {
         return new MeterId(id);
 
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 eaa2a50..31aa17f 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
@@ -17,6 +17,8 @@
 
 import org.onosproject.event.ListenerService;
 
+import java.util.Collection;
+
 /**
  * Service for add/updating and removing meters. Meters are
  * are assigned to flow to rate limit them and provide a certain
@@ -55,6 +57,13 @@
     Meter getMeter(MeterId id);
 
     /**
+     * Fetches all the meters.
+     *
+     * @return a collection of meters
+     */
+    Collection<Meter> getAllMeters();
+
+    /**
      * Allocate a meter id which must be used to create the meter.
      *
      * @return a meter id
