diff --git a/core/store/dist/src/main/java/org/onosproject/store/ecmap/MapValue.java b/core/store/dist/src/main/java/org/onosproject/store/ecmap/MapValue.java
index aa57962..1a89c6b 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/ecmap/MapValue.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/ecmap/MapValue.java
@@ -1,7 +1,24 @@
+/*
+ * 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.store.ecmap;
 
 import org.onosproject.store.Timestamp;
+
 import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
 
 /**
  * Representation of a value in EventuallyConsistentMap.
@@ -54,7 +71,7 @@
     }
 
     public boolean isNewerThan(Timestamp timestamp) {
-        return timestamp.isNewerThan(timestamp);
+        return this.timestamp.isNewerThan(timestamp);
     }
 
     public Digest digest() {
@@ -62,6 +79,21 @@
     }
 
     @Override
+    public int hashCode() {
+        return Objects.hashCode(timestamp, value);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (other instanceof MapValue) {
+            MapValue<V> that = (MapValue) other;
+            return Objects.equal(this.timestamp, that.timestamp) &&
+                    Objects.equal(this.value, that.value);
+        }
+        return false;
+    }
+
+    @Override
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
                 .add("timestamp", timestamp)
@@ -100,6 +132,21 @@
         }
 
         @Override
+        public int hashCode() {
+            return Objects.hashCode(timestamp, isTombstone);
+        }
+
+        @Override
+        public boolean equals(Object other) {
+            if (other instanceof Digest) {
+                Digest that = (Digest) other;
+                return Objects.equal(this.timestamp, that.timestamp) &&
+                        Objects.equal(this.isTombstone, that.isTombstone);
+            }
+            return false;
+        }
+
+        @Override
         public String toString() {
             return MoreObjects.toStringHelper(getClass())
                     .add("timestamp", timestamp)
diff --git a/core/store/dist/src/test/java/org/onosproject/store/ecmap/MapValueTest.java b/core/store/dist/src/test/java/org/onosproject/store/ecmap/MapValueTest.java
new file mode 100644
index 0000000..d6dca9b
--- /dev/null
+++ b/core/store/dist/src/test/java/org/onosproject/store/ecmap/MapValueTest.java
@@ -0,0 +1,79 @@
+/*
+ * 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.store.ecmap;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.onosproject.store.Timestamp;
+import org.onosproject.store.ecmap.MapValue.Digest;
+import org.onosproject.store.impl.LogicalTimestamp;
+
+/**
+ * Unit tests for MapValue.
+ */
+public class MapValueTest {
+
+    @Test
+    public void testConstruction() {
+        Timestamp ts = new LogicalTimestamp(10);
+        MapValue<String> mv = new MapValue<>("foo", ts);
+        assertEquals("foo", mv.get());
+        assertEquals(ts, mv.timestamp());
+        assertTrue(mv.isAlive());
+    }
+
+    @Test
+    public void testDigest() {
+        Timestamp ts = new LogicalTimestamp(10);
+        MapValue<String> mv = new MapValue<>("foo", ts);
+        Digest actual = mv.digest();
+        Digest expected = new MapValue.Digest(ts, false);
+        assertEquals(actual, expected);
+    }
+
+    @Test
+    public void testComparison() {
+        Timestamp ts1 = new LogicalTimestamp(9);
+        Timestamp ts2 = new LogicalTimestamp(10);
+        Timestamp ts3 = new LogicalTimestamp(11);
+        MapValue<String> mv1 = new MapValue<>("foo", ts1);
+        MapValue<String> mv2 = new MapValue<>("foo", ts2);
+        MapValue<String> mv3 = new MapValue<>("foo", ts3);
+        assertTrue(mv2.isNewerThan(mv1));
+        assertFalse(mv1.isNewerThan(mv3));
+
+        assertTrue(mv3.isNewerThan(ts2));
+        assertFalse(mv1.isNewerThan(ts2));
+
+        assertTrue(mv1.compareTo(mv2) < 0);
+        assertTrue(mv1.compareTo(mv1) == 0);
+        assertTrue(mv3.compareTo(mv2) > 0);
+    }
+
+    @Test
+    public void testTombstone() {
+        Timestamp ts1 = new LogicalTimestamp(9);
+        MapValue<String> mv = MapValue.tombstone(ts1);
+        assertTrue(mv.isTombstone());
+        assertFalse(mv.isAlive());
+        assertNull(mv.get());
+        assertEquals(ts1, mv.timestamp());
+    }
+}
