diff --git a/core/api/src/main/java/org/onosproject/cluster/Leadership.java b/core/api/src/main/java/org/onosproject/cluster/Leadership.java
index 44a05a6..113e19c 100644
--- a/core/api/src/main/java/org/onosproject/cluster/Leadership.java
+++ b/core/api/src/main/java/org/onosproject/cluster/Leadership.java
@@ -132,7 +132,7 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(topic, leader, candidates, epoch);
+        return Objects.hash(topic, leader, candidates, epoch, electedTime);
     }
 
     @Override
@@ -143,7 +143,10 @@
         if (obj instanceof Leadership) {
             final Leadership other = (Leadership) obj;
             return Objects.equals(this.topic, other.topic) &&
-                    Objects.equals(this.epoch, other.epoch);
+                    Objects.equals(this.leader, other.leader) &&
+                    Objects.equals(this.candidates, other.candidates) &&
+                    Objects.equals(this.epoch, other.epoch) &&
+                    Objects.equals(this.electedTime, other.electedTime);
         }
         return false;
     }
diff --git a/core/api/src/test/java/org/onosproject/cluster/LeadershipEventTest.java b/core/api/src/test/java/org/onosproject/cluster/LeadershipEventTest.java
new file mode 100644
index 0000000..be0321b
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/cluster/LeadershipEventTest.java
@@ -0,0 +1,76 @@
+/*
+ * 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.cluster;
+
+import org.junit.Test;
+
+import com.google.common.testing.EqualsTester;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit tests for the leadership event test.
+ */
+public class LeadershipEventTest {
+    private final NodeId node1 = new NodeId("1");
+    private final NodeId node2 = new NodeId("2");
+    private final Leadership lead1 = new Leadership("topic1", node1, 1L, 2L);
+    private final Leadership lead2 = new Leadership("topic1", node2, 1L, 2L);
+    private final LeadershipEvent event1 =
+            new LeadershipEvent(LeadershipEvent.Type.LEADER_ELECTED, lead1);
+    private final long time = System.currentTimeMillis();
+    private final LeadershipEvent event2 =
+            new LeadershipEvent(LeadershipEvent.Type.CANDIDATES_CHANGED,
+                    lead2, time);
+    private final LeadershipEvent sameAsEvent2 =
+            new LeadershipEvent(LeadershipEvent.Type.CANDIDATES_CHANGED,
+                    lead2, time);
+    private final LeadershipEvent event3 =
+            new LeadershipEvent(LeadershipEvent.Type.LEADER_BOOTED, lead1);
+    private final LeadershipEvent event4 =
+            new LeadershipEvent(LeadershipEvent.Type.LEADER_REELECTED, lead1);
+    private final LeadershipEvent event5 =
+            new LeadershipEvent(LeadershipEvent.Type.LEADER_REELECTED, lead2);
+
+    /**
+     * Tests for proper operation of equals(), hashCode() and toString() methods.
+     */
+    @Test
+    public void checkEquals() {
+        new EqualsTester()
+                .addEqualityGroup(event1)
+                .addEqualityGroup(event2, sameAsEvent2)
+                .addEqualityGroup(event3)
+                .addEqualityGroup(event4)
+                .addEqualityGroup(event5)
+                .testEquals();
+    }
+
+    /**
+     * Tests that objects are created properly.
+     */
+    @Test
+    public void checkConstruction() {
+        assertThat(event1.type(), is(LeadershipEvent.Type.LEADER_ELECTED));
+        assertThat(event1.subject(), is(lead1));
+
+        assertThat(event2.time(), is(time));
+        assertThat(event2.type(), is(LeadershipEvent.Type.CANDIDATES_CHANGED));
+        assertThat(event2.subject(), is(lead2));
+    }
+
+}
diff --git a/core/api/src/test/java/org/onosproject/cluster/LeadershipTest.java b/core/api/src/test/java/org/onosproject/cluster/LeadershipTest.java
new file mode 100644
index 0000000..e2a8658
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/cluster/LeadershipTest.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.cluster;
+
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.testing.EqualsTester;
+
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit tests for the Leadership class.
+ */
+public class LeadershipTest {
+    private final NodeId node1 = new NodeId("1");
+    private final NodeId node2 = new NodeId("2");
+    private final Leadership lead1 = new Leadership("topic1", node1, 1L, 2L);
+    private final Leadership sameAsLead1 = new Leadership("topic1", node1, 1L, 2L);
+    private final Leadership lead2 = new Leadership("topic2", node1, 1L, 2L);
+    private final Leadership lead3 = new Leadership("topic1", node1, 2L, 2L);
+    private final Leadership lead4 = new Leadership("topic1", node1, 3L, 2L);
+    private final Leadership lead5 = new Leadership("topic1", node1, 3L, 3L);
+    private final Leadership lead6 = new Leadership("topic1", node1,
+            ImmutableList.of(node2), 1L, 2L);
+    private final Leadership lead7 = new Leadership("topic1",
+            ImmutableList.of(node2), 1L, 2L);
+
+    /**
+     * Tests for proper operation of equals(), hashCode() and toString() methods.
+     */
+    @Test
+    public void checkEquals() {
+        new EqualsTester()
+                .addEqualityGroup(lead1, sameAsLead1)
+                .addEqualityGroup(lead2)
+                .addEqualityGroup(lead3)
+                .addEqualityGroup(lead4)
+                .addEqualityGroup(lead5)
+                .addEqualityGroup(lead6)
+                .addEqualityGroup(lead7)
+                .testEquals();
+    }
+
+    /**
+     * Tests that objects are created properly and accessor methods return
+     * the correct vsalues.
+     */
+    @Test
+    public void checkConstruction() {
+        assertThat(lead6.electedTime(), is(2L));
+        assertThat(lead6.epoch(), is(1L));
+        assertThat(lead6.leader(), is(node1));
+        assertThat(lead6.topic(), is("topic1"));
+        assertThat(lead6.candidates(), hasSize(1));
+        assertThat(lead6.candidates(), contains(node2));
+    }
+
+}
