diff --git a/core/api/src/main/java/org/onosproject/store/service/AtomicValueEvent.java b/core/api/src/main/java/org/onosproject/store/service/AtomicValueEvent.java
index 226b164..1bce136 100644
--- a/core/api/src/main/java/org/onosproject/store/service/AtomicValueEvent.java
+++ b/core/api/src/main/java/org/onosproject/store/service/AtomicValueEvent.java
@@ -24,7 +24,7 @@
  *
  * @param <V> atomic value type
  */
-public class AtomicValueEvent<V> {
+public final class AtomicValueEvent<V> {
 
     /**
      * AtomicValueEvent type.
@@ -87,7 +87,7 @@
             return false;
         }
 
-        AtomicValueEvent<V> that = (AtomicValueEvent) o;
+        AtomicValueEvent that = (AtomicValueEvent) o;
         return Objects.equals(this.name, that.name) &&
                 Objects.equals(this.type, that.type) &&
                 Objects.equals(this.value, that.value);
@@ -106,4 +106,4 @@
                 .add("value", value)
                 .toString();
     }
-}
\ No newline at end of file
+}
diff --git a/core/api/src/main/java/org/onosproject/store/service/SetEvent.java b/core/api/src/main/java/org/onosproject/store/service/SetEvent.java
index e294bae..a869e72 100644
--- a/core/api/src/main/java/org/onosproject/store/service/SetEvent.java
+++ b/core/api/src/main/java/org/onosproject/store/service/SetEvent.java
@@ -24,7 +24,7 @@
  *
  * @param <E> set element type
  */
-public class SetEvent<E> {
+public final class SetEvent<E> {
 
     /**
      * SetEvent type.
@@ -91,7 +91,7 @@
             return false;
         }
 
-        SetEvent<E> that = (SetEvent) o;
+        SetEvent that = (SetEvent) o;
         return Objects.equals(this.name, that.name) &&
                 Objects.equals(this.type, that.type) &&
                 Objects.equals(this.entry, that.entry);
diff --git a/core/api/src/test/java/org/onosproject/store/service/AtomicValueEventTest.java b/core/api/src/test/java/org/onosproject/store/service/AtomicValueEventTest.java
new file mode 100644
index 0000000..39481ca
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/store/service/AtomicValueEventTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.service;
+
+import org.junit.Test;
+
+import com.google.common.testing.EqualsTester;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+import static org.onosproject.store.service.AtomicValueEvent.Type.UPDATE;
+
+/**
+ * Unit tests for the AtomicValueEvent class.
+ */
+public class AtomicValueEventTest {
+
+    AtomicValueEvent<String> event1 =
+            new AtomicValueEvent<>("map1", UPDATE, "e1");
+    AtomicValueEvent<String> event2 =
+            new AtomicValueEvent<>("map1", UPDATE, "e2");
+    AtomicValueEvent<String> sameAsEvent2 =
+            new AtomicValueEvent<>("map1", UPDATE, "e2");
+    AtomicValueEvent<String> event3 =
+            new AtomicValueEvent<>("map2", UPDATE, "e2");
+
+    /**
+     * Checks that the SetEvent class is immutable.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(AtomicValueEvent.class);
+    }
+
+    /**
+     * Checks the equals(), hashCode() and toString() operations.
+     */
+    @Test
+    public void testEquals() {
+        new EqualsTester()
+                .addEqualityGroup(event1)
+                .addEqualityGroup(event2, sameAsEvent2)
+                .addEqualityGroup(event3)
+                .testEquals();
+    }
+
+    /**
+     * Checks that construction of the object is correct.
+     */
+    @Test
+    public void testConstruction() {
+        assertThat(event1.type(), is(UPDATE));
+        assertThat(event1.value(), is("e1"));
+        assertThat(event1.name(), is("map1"));
+    }
+
+}
diff --git a/core/api/src/test/java/org/onosproject/store/service/SetEventTest.java b/core/api/src/test/java/org/onosproject/store/service/SetEventTest.java
new file mode 100644
index 0000000..5cc89d8
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/store/service/SetEventTest.java
@@ -0,0 +1,75 @@
+/*
+ * 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.service;
+
+import org.junit.Test;
+
+import com.google.common.testing.EqualsTester;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+import static org.onosproject.store.service.SetEvent.Type.ADD;
+import static org.onosproject.store.service.SetEvent.Type.REMOVE;
+
+/**
+ * Unit tests for the SetEvent class.
+ */
+public class SetEventTest {
+
+    SetEvent<String> event1 =
+            new SetEvent<>("map1", ADD, "e1");
+    SetEvent<String> event2 =
+            new SetEvent<>("map1", REMOVE, "e1");
+    SetEvent<String> sameAsEvent2 =
+            new SetEvent<>("map1", REMOVE, "e1");
+    SetEvent<String> event3 =
+            new SetEvent<>("map1", ADD, "e2");
+    SetEvent<String> event4 =
+            new SetEvent<>("map1", REMOVE, "e2");
+
+    /**
+     * Checks that the SetEvent class is immutable.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(EventuallyConsistentMapEvent.class);
+    }
+
+    /**
+     * Checks the equals(), hashCode() and toString() operations.
+     */
+    @Test
+    public void testEquals() {
+        new EqualsTester()
+                .addEqualityGroup(event1)
+                .addEqualityGroup(event2, sameAsEvent2)
+                .addEqualityGroup(event3)
+                .addEqualityGroup(event4)
+                .testEquals();
+    }
+
+    /**
+     * Checks that construction of the object is correct.
+     */
+    @Test
+    public void testConstruction() {
+        assertThat(event1.type(), is(ADD));
+        assertThat(event1.entry(), is("e1"));
+        assertThat(event1.name(), is("map1"));
+    }
+
+}
