diff --git a/core/api/src/test/java/org/onosproject/net/meter/DefaultMeterTest.java b/core/api/src/test/java/org/onosproject/net/meter/DefaultMeterTest.java
new file mode 100644
index 0000000..b39d2ef
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/meter/DefaultMeterTest.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.net.meter;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Collections;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.onosproject.net.NetTestTools.APP_ID;
+import static org.onosproject.net.NetTestTools.did;
+
+
+/**
+ * DefaultMeter Tests.
+ */
+public class DefaultMeterTest {
+
+    private Meter m1;
+    private Meter sameAsm1;
+    private Meter m2;
+
+    @Before
+    public void setup() {
+
+        Band band = DefaultBand.builder()
+                .ofType(Band.Type.DROP)
+                .withRate(500)
+                .build();
+
+        m1 = DefaultMeter.builder()
+                .forDevice(did("1"))
+                .fromApp(APP_ID)
+                .withId(MeterId.meterId(1))
+                .withUnit(Meter.Unit.KB_PER_SEC)
+                .withBands(Collections.singletonList(band))
+                .build();
+
+        sameAsm1 = DefaultMeter.builder()
+                .forDevice(did("1"))
+                .fromApp(APP_ID)
+                .withId(MeterId.meterId(1))
+                .withUnit(Meter.Unit.KB_PER_SEC)
+                .withBands(Collections.singletonList(band))
+                .build();
+
+        m2 = DefaultMeter.builder()
+                .forDevice(did("2"))
+                .fromApp(APP_ID)
+                .withId(MeterId.meterId(2))
+                .withUnit(Meter.Unit.KB_PER_SEC)
+                .withBands(Collections.singletonList(band))
+                .build();
+
+    }
+
+    @Test
+    public void testEquality() {
+        new EqualsTester()
+                .addEqualityGroup(m1, sameAsm1)
+                .addEqualityGroup(m2).testEquals();
+    }
+
+    @Test
+    public void testConstruction() {
+        DefaultMeter m = (DefaultMeter) m1;
+
+        assertThat(m.deviceId(), is(did("1")));
+        assertThat(m.appId(), is(APP_ID));
+        assertThat(m.id(), is(MeterId.meterId(1)));
+        assertThat(m.isBurst(), is(false));
+
+        assertThat(m.life(), is(0L));
+        assertThat(m.bytesSeen(), is(0L));
+        assertThat(m.packetsSeen(), is(0L));
+        assertThat(m.referenceCount(), is(0L));
+
+    }
+
+
+
+
+}
diff --git a/core/api/src/test/java/org/onosproject/net/meter/MeterOperationTest.java b/core/api/src/test/java/org/onosproject/net/meter/MeterOperationTest.java
new file mode 100644
index 0000000..ad53e3a
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/meter/MeterOperationTest.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.net.meter;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.net.DeviceId;
+
+import java.util.Collection;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutableBaseClass;
+
+/**
+ * Unit tests for the MeterOperationTest object.
+ */
+public class MeterOperationTest {
+
+
+
+    /**
+     * Checks that the MeterOperation class is immutable.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutableBaseClass(MeterOperation.class);
+    }
+
+    @Test
+    public void testEquality() {
+        final Meter m1 = new TestMeter();
+        final Meter m2 = new TestMeter();
+        final MeterOperation op1 = new MeterOperation(m1,
+                                                      MeterOperation.Type.ADD);
+        final MeterOperation sameAsOp1 = new MeterOperation(m1,
+                                                            MeterOperation.Type.ADD);
+        final MeterOperation op2 = new MeterOperation(m2,
+                                            MeterOperation.Type.ADD);
+
+        new EqualsTester()
+                .addEqualityGroup(op1, sameAsOp1)
+                .addEqualityGroup(op2)
+                .testEquals();
+    }
+
+    @Test
+    public void testConstruction() {
+        final Meter m1 = new TestMeter();
+
+        final MeterOperation op = new MeterOperation(m1, MeterOperation.Type.ADD);
+
+        assertThat(op.meter(), is(m1));
+    }
+
+    private static final class TestMeter implements Meter {
+
+        @Override
+        public DeviceId deviceId() {
+            return null;
+        }
+
+        @Override
+        public MeterId id() {
+            return null;
+        }
+
+        @Override
+        public ApplicationId appId() {
+            return null;
+        }
+
+        @Override
+        public Unit unit() {
+            return null;
+        }
+
+        @Override
+        public boolean isBurst() {
+            return false;
+        }
+
+        @Override
+        public Collection<Band> bands() {
+            return null;
+        }
+
+        @Override
+        public MeterState state() {
+            return null;
+        }
+
+        @Override
+        public long life() {
+            return 0;
+        }
+
+        @Override
+        public long referenceCount() {
+            return 0;
+        }
+
+        @Override
+        public long packetsSeen() {
+            return 0;
+        }
+
+        @Override
+        public long bytesSeen() {
+            return 0;
+        }
+    }
+
+}
diff --git a/core/api/src/test/java/org/onosproject/store/service/TestConsistentMap.java b/core/api/src/test/java/org/onosproject/store/service/TestConsistentMap.java
index c45f696..0136a94 100644
--- a/core/api/src/test/java/org/onosproject/store/service/TestConsistentMap.java
+++ b/core/api/src/test/java/org/onosproject/store/service/TestConsistentMap.java
@@ -21,6 +21,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.function.BiFunction;
 import java.util.function.Function;
 import java.util.function.Predicate;
@@ -38,6 +39,7 @@
     private final List<MapEventListener<K, V>> listeners;
     private final HashMap<K, V> map;
     private final String mapName;
+    private final AtomicLong counter = new AtomicLong(0);
 
     private TestConsistentMap(String mapName) {
         map = new HashMap<>();
@@ -46,7 +48,7 @@
     }
 
     private Versioned<V> version(V v) {
-        return new Versioned<>(v, 1, System.currentTimeMillis());
+        return new Versioned<>(v, counter.incrementAndGet(), System.currentTimeMillis());
     }
 
     /**
@@ -115,8 +117,12 @@
 
     @Override
     public Versioned<V> put(K key, V value) {
-        Versioned<V> result = version(map.put(key, value));
-        notifyListeners(mapName, INSERT, key, result);
+        Versioned<V> result = version(value);
+        if (map.put(key, value) == null) {
+            notifyListeners(mapName, INSERT, key, result);
+        } else {
+            notifyListeners(mapName, UPDATE, key, result);
+        }
         return result;
     }
 
@@ -213,6 +219,11 @@
         listeners.remove(listener);
     }
 
+    @Override
+    public Map<K, V> asJavaMap() {
+        return map;
+    }
+
     public static Builder builder() {
         return new Builder();
     }
