diff --git a/core/api/src/main/java/org/onosproject/store/cluster/messaging/MessageSubject.java b/core/api/src/main/java/org/onosproject/store/cluster/messaging/MessageSubject.java
index d81e6f1..8d5e313 100644
--- a/core/api/src/main/java/org/onosproject/store/cluster/messaging/MessageSubject.java
+++ b/core/api/src/main/java/org/onosproject/store/cluster/messaging/MessageSubject.java
@@ -24,7 +24,7 @@
  * Cluster messages have associated subjects that dictate how they get handled
  * on the receiving side.
  */
-public class MessageSubject {
+public final class MessageSubject {
 
     private final String value;
 
diff --git a/core/api/src/test/java/org/onosproject/store/cluster/messaging/ClusterMessageTest.java b/core/api/src/test/java/org/onosproject/store/cluster/messaging/ClusterMessageTest.java
new file mode 100644
index 0000000..22f841b
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/store/cluster/messaging/ClusterMessageTest.java
@@ -0,0 +1,82 @@
+/*
+ * 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.cluster.messaging;
+
+import org.junit.Test;
+import org.onosproject.cluster.NodeId;
+
+import com.google.common.testing.EqualsTester;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * Units tests for ClusterMessage class.
+ */
+public class ClusterMessageTest {
+    private final MessageSubject subject1 = new MessageSubject("Message 1");
+    private final MessageSubject subject2 = new MessageSubject("Message 2");
+
+    private final byte[] payload1 = {0, 1, 2, 3, 4, 5};
+    private final byte[] payload2 = {0, 1, 2, 3, 4, 5, 6};
+
+    private final NodeId nodeId = new NodeId("node");
+
+    private final ClusterMessage message1 =
+            new ClusterMessage(nodeId, subject1, payload1);
+    private final ClusterMessage sameAsMessage1 =
+            new ClusterMessage(nodeId, subject1, payload1);
+    private final ClusterMessage message2 =
+            new ClusterMessage(nodeId, subject1, payload2);
+    private final ClusterMessage message3 =
+            new ClusterMessage(nodeId, subject2, payload1);
+
+    /**
+     * Checks the operation of equals(), hashCode() and toString() methods.
+     */
+    @Test
+    public void testEquals() {
+        new EqualsTester()
+                .addEqualityGroup(message1, sameAsMessage1)
+                .addEqualityGroup(message2)
+                .addEqualityGroup(message3)
+                .testEquals();
+    }
+
+    /**
+     * Checks the construction of a FlowId object.
+     */
+    @Test
+    public void testConstruction() {
+        assertThat(message1.payload(), is(payload1));
+        assertThat(message1.sender(), is(nodeId));
+        assertThat(message1.subject(), is(subject1));
+
+        byte[] response = {2, 2, 2, 2, 2, 2, 2, 2};
+        message1.respond(response);
+        assertThat(message1.response(), is(response));
+    }
+
+    /**
+     * Tests the toBytes and fromBytes methods.
+     */
+    @Test
+    public void testByteMethods() {
+        byte[] fromBytes = message3.getBytes();
+        ClusterMessage message = ClusterMessage.fromBytes(fromBytes);
+        assertThat(message, is(message3));
+    }
+}
diff --git a/core/api/src/test/java/org/onosproject/store/cluster/messaging/EndpointTest.java b/core/api/src/test/java/org/onosproject/store/cluster/messaging/EndpointTest.java
new file mode 100644
index 0000000..c88c711
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/store/cluster/messaging/EndpointTest.java
@@ -0,0 +1,68 @@
+/*
+ * 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.cluster.messaging;
+
+
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+
+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;
+
+/**
+ * Unit tests for the Endpoint class.
+ */
+public class EndpointTest {
+    IpAddress host1 = IpAddress.valueOf("1.2.3.4");
+    IpAddress host2 = IpAddress.valueOf("1.2.3.5");
+
+    private final Endpoint endpoint1 = new Endpoint(host1, 1);
+    private final Endpoint sameAsEndpoint1 = new Endpoint(host1, 1);
+    private final Endpoint endpoint2 = new Endpoint(host2, 1);
+    private final Endpoint endpoint3 = new Endpoint(host1, 2);
+
+    /**
+     * Checks that the MessageSubject class is immutable.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(Endpoint.class);
+    }
+
+    /**
+     * Checks the operation of equals(), hashCode() and toString() methods.
+     */
+    @Test
+    public void testEquals() {
+        new EqualsTester()
+                .addEqualityGroup(endpoint1, sameAsEndpoint1)
+                .addEqualityGroup(endpoint2)
+                .addEqualityGroup(endpoint3)
+                .testEquals();
+    }
+
+    /**
+     * Checks the construction of a MessageSubject object.
+     */
+    @Test
+    public void testConstruction() {
+        assertThat(endpoint2.host(), is(host2));
+        assertThat(endpoint2.port(), is(1));
+    }
+}
diff --git a/core/api/src/test/java/org/onosproject/store/cluster/messaging/MessageSubjectTest.java b/core/api/src/test/java/org/onosproject/store/cluster/messaging/MessageSubjectTest.java
new file mode 100644
index 0000000..498edd3
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/store/cluster/messaging/MessageSubjectTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.cluster.messaging;
+
+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;
+
+/**
+ * Unit tests for MessageSubject class.
+ */
+public class MessageSubjectTest {
+    private final MessageSubject subject1 = new MessageSubject("Message 1");
+    private final MessageSubject sameAsSubject1 = new MessageSubject("Message 1");
+    private final MessageSubject subject2 = new MessageSubject("Message 2");
+    private final MessageSubject subject3 = new MessageSubject("Message 3");
+
+    /**
+     * Checks that the MessageSubject class is immutable.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(MessageSubject.class);
+    }
+
+    /**
+     * Checks the operation of equals(), hashCode() and toString() methods.
+     */
+    @Test
+    public void testEquals() {
+        new EqualsTester()
+                .addEqualityGroup(subject1, sameAsSubject1)
+                .addEqualityGroup(subject2)
+                .addEqualityGroup(subject3)
+                .testEquals();
+    }
+
+    /**
+     * Checks the construction of a MessageSubject object.
+     */
+    @Test
+    public void testConstruction() {
+        assertThat(subject3.value(), is("Message 3"));
+        MessageSubject serializerObject = new MessageSubject();
+        assertThat(serializerObject.value(), is(""));
+    }
+}
