diff --git a/core/api/src/main/java/org/onlab/onos/cluster/MastershipTerm.java b/core/api/src/main/java/org/onlab/onos/cluster/MastershipTerm.java
new file mode 100644
index 0000000..5c3c424
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/cluster/MastershipTerm.java
@@ -0,0 +1,6 @@
+package org.onlab.onos.cluster;
+
+public class MastershipTerm {
+    private final NodeId master = null;
+    private int termNumber;
+}
diff --git a/core/api/src/main/java/org/onlab/onos/cluster/MastershipTermService.java b/core/api/src/main/java/org/onlab/onos/cluster/MastershipTermService.java
new file mode 100644
index 0000000..b03ed81
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/cluster/MastershipTermService.java
@@ -0,0 +1,20 @@
+package org.onlab.onos.cluster;
+
+import org.onlab.onos.net.DeviceId;
+
+// TODO give me a better name
+/**
+ * Service to obtain mastership term information.
+ */
+public interface MastershipTermService {
+
+    // TBD: manage/increment per device mastership change
+    //      or increment on any change
+    /**
+     * Returns the term number of mastership change occurred for given device.
+     *
+     * @param deviceId the identifier of the device
+     * @return current master's term.
+     */
+    MastershipTerm getMastershipTerm(DeviceId deviceId);
+}
diff --git a/core/api/src/main/java/org/onlab/onos/net/device/DeviceProviderService.java b/core/api/src/main/java/org/onlab/onos/net/device/DeviceProviderService.java
index 7f28374..d043eca 100644
--- a/core/api/src/main/java/org/onlab/onos/net/device/DeviceProviderService.java
+++ b/core/api/src/main/java/org/onlab/onos/net/device/DeviceProviderService.java
@@ -51,7 +51,7 @@
      * mastership role on the device.
      *
      * @param deviceId identity of the device
-     * @param role mastership role being asserted
+     * @param role mastership role that was asserted but failed
      */
     void unableToAssertRole(DeviceId deviceId, MastershipRole role);
 
diff --git a/core/api/src/main/java/org/onlab/onos/store/Timestamp.java b/core/api/src/main/java/org/onlab/onos/store/Timestamp.java
new file mode 100644
index 0000000..b9d3648
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/store/Timestamp.java
@@ -0,0 +1,8 @@
+package org.onlab.onos.store;
+
+/**
+ * Opaque version structure.
+ */
+public interface Timestamp extends Comparable<Timestamp> {
+
+}
diff --git a/core/store/src/main/java/org/onlab/onos/store/impl/OnosTimestamp.java b/core/store/src/main/java/org/onlab/onos/store/impl/OnosTimestamp.java
new file mode 100644
index 0000000..f994e02
--- /dev/null
+++ b/core/store/src/main/java/org/onlab/onos/store/impl/OnosTimestamp.java
@@ -0,0 +1,105 @@
+package org.onlab.onos.store.impl;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkArgument;
+
+import java.util.Objects;
+
+import org.onlab.onos.net.ElementId;
+import org.onlab.onos.store.Timestamp;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ComparisonChain;
+
+// If it is store specific, implement serializable interfaces?
+/**
+ * Default implementation of Timestamp.
+ */
+public final class OnosTimestamp implements Timestamp {
+
+    private final ElementId id;
+    private final int termNumber;
+    private final int sequenceNumber;
+
+    /**
+     * Default version tuple.
+     *
+     * @param id identifier of the element
+     * @param termNumber the mastership termNumber
+     * @param sequenceNumber  the sequenceNumber number within the termNumber
+     */
+    public OnosTimestamp(ElementId id, int termNumber, int sequenceNumber) {
+        this.id = checkNotNull(id);
+        this.termNumber = termNumber;
+        this.sequenceNumber = sequenceNumber;
+    }
+
+    @Override
+    public int compareTo(Timestamp o) {
+        checkArgument(o instanceof OnosTimestamp, "Must be OnosTimestamp", o);
+        OnosTimestamp that = (OnosTimestamp) o;
+        checkArgument(this.id.equals(that.id),
+                "Cannot compare version for different element this:%s, that:%s",
+                    this, that);
+
+        return ComparisonChain.start()
+                .compare(this.termNumber, that.termNumber)
+                .compare(this.sequenceNumber, that.sequenceNumber)
+                .result();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, termNumber, sequenceNumber);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof OnosTimestamp)) {
+            return false;
+        }
+        OnosTimestamp that = (OnosTimestamp) obj;
+        return Objects.equals(this.id, that.id) &&
+                Objects.equals(this.termNumber, that.termNumber) &&
+                Objects.equals(this.sequenceNumber, that.sequenceNumber);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                    .add("id", id)
+                    .add("termNumber", termNumber)
+                    .add("sequenceNumber", sequenceNumber)
+                    .toString();
+    }
+
+    /**
+     * Returns the element.
+     *
+     * @return element identifier
+     */
+    public ElementId id() {
+        return id;
+    }
+
+    /**
+     * Returns the termNumber.
+     *
+     * @return termNumber
+     */
+    public int termNumber() {
+        return termNumber;
+    }
+
+    /**
+     * Returns the sequenceNumber number.
+     *
+     * @return sequenceNumber
+     */
+    public int sequenceNumber() {
+        return sequenceNumber;
+    }
+}
diff --git a/core/store/src/main/java/org/onlab/onos/store/impl/StoreManager.java b/core/store/src/main/java/org/onlab/onos/store/impl/StoreManager.java
index abd8ade..c22d915 100644
--- a/core/store/src/main/java/org/onlab/onos/store/impl/StoreManager.java
+++ b/core/store/src/main/java/org/onlab/onos/store/impl/StoreManager.java
@@ -4,7 +4,9 @@
 import com.hazelcast.config.FileSystemXmlConfig;
 import com.hazelcast.core.Hazelcast;
 import com.hazelcast.core.HazelcastInstance;
+
 import de.javakaffee.kryoserializers.URISerializer;
+
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -26,6 +28,7 @@
 import org.onlab.onos.store.serializers.DeviceIdSerializer;
 import org.onlab.onos.store.serializers.IpPrefixSerializer;
 import org.onlab.onos.store.serializers.NodeIdSerializer;
+import org.onlab.onos.store.serializers.OnosTimestampSerializer;
 import org.onlab.onos.store.serializers.PortNumberSerializer;
 import org.onlab.onos.store.serializers.ProviderIdSerializer;
 import org.onlab.packet.IpPrefix;
@@ -90,6 +93,7 @@
                 .register(DeviceId.class, new DeviceIdSerializer())
                 .register(PortNumber.class, new PortNumberSerializer())
                 .register(DefaultPort.class, new DefaultPortSerializer())
+                .register(OnosTimestamp.class, new OnosTimestampSerializer())
                 .build()
                 .populate(10);
     }
diff --git a/core/store/src/main/java/org/onlab/onos/store/serializers/DefaultPortSerializer.java b/core/store/src/main/java/org/onlab/onos/store/serializers/DefaultPortSerializer.java
index 836adea..8455e80 100644
--- a/core/store/src/main/java/org/onlab/onos/store/serializers/DefaultPortSerializer.java
+++ b/core/store/src/main/java/org/onlab/onos/store/serializers/DefaultPortSerializer.java
@@ -9,7 +9,6 @@
 import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
 
-// TODO move to util, etc.
 /**
  * Kryo Serializer for {@link DefaultPort}.
  */
diff --git a/core/store/src/main/java/org/onlab/onos/store/serializers/DeviceIdSerializer.java b/core/store/src/main/java/org/onlab/onos/store/serializers/DeviceIdSerializer.java
index 709dce0..c63b676 100644
--- a/core/store/src/main/java/org/onlab/onos/store/serializers/DeviceIdSerializer.java
+++ b/core/store/src/main/java/org/onlab/onos/store/serializers/DeviceIdSerializer.java
@@ -9,7 +9,6 @@
 import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
 
-//TODO move to util, etc.
 /**
 * Kryo Serializer for {@link DeviceId}.
 */
diff --git a/core/store/src/main/java/org/onlab/onos/store/serializers/IpPrefixSerializer.java b/core/store/src/main/java/org/onlab/onos/store/serializers/IpPrefixSerializer.java
index 8ac6679..2dbec57 100644
--- a/core/store/src/main/java/org/onlab/onos/store/serializers/IpPrefixSerializer.java
+++ b/core/store/src/main/java/org/onlab/onos/store/serializers/IpPrefixSerializer.java
@@ -7,7 +7,6 @@
 import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
 
-// TODO move to util, etc.
 /**
  * Kryo Serializer for {@link IpPrefix}.
  */
diff --git a/core/store/src/main/java/org/onlab/onos/store/serializers/OnosTimestampSerializer.java b/core/store/src/main/java/org/onlab/onos/store/serializers/OnosTimestampSerializer.java
new file mode 100644
index 0000000..812bc9d
--- /dev/null
+++ b/core/store/src/main/java/org/onlab/onos/store/serializers/OnosTimestampSerializer.java
@@ -0,0 +1,37 @@
+package org.onlab.onos.store.serializers;
+
+import org.onlab.onos.net.ElementId;
+import org.onlab.onos.store.impl.OnosTimestamp;
+
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.Serializer;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+
+/**
+ * Kryo Serializer for {@link OnosTimestamp}.
+ */
+public class OnosTimestampSerializer extends Serializer<OnosTimestamp> {
+
+    /**
+     * Default constructor.
+     */
+    public OnosTimestampSerializer() {
+        // non-null, immutable
+        super(false, true);
+    }
+    @Override
+    public void write(Kryo kryo, Output output, OnosTimestamp object) {
+        kryo.writeClassAndObject(output, object.id());
+        output.writeInt(object.termNumber());
+        output.writeInt(object.sequenceNumber());
+    }
+
+    @Override
+    public OnosTimestamp read(Kryo kryo, Input input, Class<OnosTimestamp> type) {
+        ElementId id = (ElementId) kryo.readClassAndObject(input);
+        final int term = input.readInt();
+        final int sequence = input.readInt();
+        return new OnosTimestamp(id, term, sequence);
+    }
+}
diff --git a/core/store/src/main/java/org/onlab/onos/store/serializers/PortNumberSerializer.java b/core/store/src/main/java/org/onlab/onos/store/serializers/PortNumberSerializer.java
index e89c379..02805bb 100644
--- a/core/store/src/main/java/org/onlab/onos/store/serializers/PortNumberSerializer.java
+++ b/core/store/src/main/java/org/onlab/onos/store/serializers/PortNumberSerializer.java
@@ -7,7 +7,6 @@
 import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
 
-// TODO move to util, etc.
 /**
  * Serializer for {@link PortNumber}.
  */
diff --git a/core/store/src/main/java/org/onlab/onos/store/serializers/ProviderIdSerializer.java b/core/store/src/main/java/org/onlab/onos/store/serializers/ProviderIdSerializer.java
index 3abb784..1a1c6f6 100644
--- a/core/store/src/main/java/org/onlab/onos/store/serializers/ProviderIdSerializer.java
+++ b/core/store/src/main/java/org/onlab/onos/store/serializers/ProviderIdSerializer.java
@@ -7,7 +7,6 @@
 import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
 
-//TODO move to util, etc.
 /**
  * Serializer for {@link ProviderId}.
  */
diff --git a/openflow/ctl/src/test/java/org/onlab/onos/openflow/controller/impl/RoleManagerTest.java b/openflow/ctl/src/test/java/org/onlab/onos/openflow/controller/impl/RoleManagerTest.java
new file mode 100644
index 0000000..285635a
--- /dev/null
+++ b/openflow/ctl/src/test/java/org/onlab/onos/openflow/controller/impl/RoleManagerTest.java
@@ -0,0 +1,284 @@
+package org.onlab.onos.openflow.controller.impl;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.jboss.netty.channel.Channel;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.onos.openflow.controller.RoleState;
+import org.onlab.onos.openflow.controller.driver.OpenFlowAgent;
+import org.onlab.onos.openflow.controller.driver.OpenFlowSwitchDriver;
+import org.onlab.onos.openflow.controller.driver.RoleHandler;
+import org.onlab.onos.openflow.controller.driver.RoleRecvStatus;
+import org.onlab.onos.openflow.controller.driver.RoleReplyInfo;
+import org.onlab.onos.openflow.controller.driver.SwitchStateException;
+import org.projectfloodlight.openflow.protocol.OFDescStatsReply;
+import org.projectfloodlight.openflow.protocol.OFErrorMsg;
+import org.projectfloodlight.openflow.protocol.OFFactories;
+import org.projectfloodlight.openflow.protocol.OFFactory;
+import org.projectfloodlight.openflow.protocol.OFFeaturesReply;
+import org.projectfloodlight.openflow.protocol.OFMessage;
+import org.projectfloodlight.openflow.protocol.OFPortDesc;
+import org.projectfloodlight.openflow.protocol.OFPortDescStatsReply;
+import org.projectfloodlight.openflow.protocol.OFVersion;
+import org.projectfloodlight.openflow.types.U64;
+
+import static org.junit.Assert.assertEquals;
+import static org.onlab.onos.openflow.controller.RoleState.*;
+import static org.onlab.onos.openflow.controller.driver.RoleRecvStatus.*;
+
+public class RoleManagerTest {
+
+    private static final U64 GID = U64.of(10L);
+    private static final long XID = 1L;
+
+    private OpenFlowSwitchDriver sw;
+    private RoleManager manager;
+
+    @Before
+    public void setUp() {
+        sw = new TestSwitchDriver();
+        manager = new RoleManager(sw);
+    }
+
+    @After
+    public void tearDown() {
+        manager = null;
+        sw = null;
+    }
+
+    @Test
+    public void deliverRoleReply() {
+        RoleRecvStatus status;
+
+        RoleReplyInfo asserted = new RoleReplyInfo(MASTER, GID, XID);
+        RoleReplyInfo unasserted = new RoleReplyInfo(SLAVE, GID, XID);
+
+        try {
+            //call without sendRoleReq() for requestPending = false
+            //first, sw.role == null
+            status = manager.deliverRoleReply(asserted);
+            assertEquals("expectation wrong", OTHER_EXPECTATION, status);
+
+            sw.setRole(MASTER);
+            assertEquals("expectation wrong", OTHER_EXPECTATION, status);
+            sw.setRole(SLAVE);
+
+            //match to pendingRole = MASTER, requestPending = true
+            manager.sendRoleRequest(MASTER, MATCHED_CURRENT_ROLE);
+            status = manager.deliverRoleReply(asserted);
+            assertEquals("expectation wrong", MATCHED_CURRENT_ROLE, status);
+
+            //requestPending never gets reset -- this might be a bug.
+            status = manager.deliverRoleReply(unasserted);
+            assertEquals("expectation wrong", OTHER_EXPECTATION, status);
+            assertEquals("pending role mismatch", MASTER, ((TestSwitchDriver) sw).failed);
+
+        } catch (IOException | SwitchStateException e) {
+            assertEquals("unexpected error thrown",
+                    SwitchStateException.class, e.getClass());
+        }
+    }
+
+    private class TestSwitchDriver implements OpenFlowSwitchDriver {
+
+        RoleState failed = null;
+        RoleState current = null;
+
+        @Override
+        public void sendMsg(OFMessage msg) {
+        }
+
+        @Override
+        public void sendMsg(List<OFMessage> msgs) {
+        }
+
+        @Override
+        public void handleMessage(OFMessage fromSwitch) {
+        }
+
+        @Override
+        public void setRole(RoleState role) {
+            current = role;
+        }
+
+        @Override
+        public RoleState getRole() {
+            return current;
+        }
+
+        @Override
+        public List<OFPortDesc> getPorts() {
+            return null;
+        }
+
+        @Override
+        public OFFactory factory() {
+            // return what-ever triggers requestPending = true
+            return OFFactories.getFactory(OFVersion.OF_10);
+        }
+
+        @Override
+        public String getStringId() {
+            return "100";
+        }
+
+        @Override
+        public long getId() {
+            return 0;
+        }
+
+        @Override
+        public String manfacturerDescription() {
+            return null;
+        }
+
+        @Override
+        public String datapathDescription() {
+            return null;
+        }
+
+        @Override
+        public String hardwareDescription() {
+            return null;
+        }
+
+        @Override
+        public String softwareDescription() {
+            return null;
+        }
+
+        @Override
+        public String serialNumber() {
+            return null;
+        }
+
+        @Override
+        public void disconnectSwitch() {
+        }
+
+        @Override
+        public void returnRoleAssertFailure(RoleState role) {
+            failed = role;
+        }
+
+        @Override
+        public void setAgent(OpenFlowAgent agent) {
+        }
+
+        @Override
+        public void setRoleHandler(RoleHandler roleHandler) {
+        }
+
+        @Override
+        public void reassertRole() {
+        }
+
+        @Override
+        public boolean handleRoleError(OFErrorMsg error) {
+            return false;
+        }
+
+        @Override
+        public void handleNiciraRole(OFMessage m) throws SwitchStateException {
+        }
+
+        @Override
+        public void handleRole(OFMessage m) throws SwitchStateException {
+        }
+
+        @Override
+        public void startDriverHandshake() {
+        }
+
+        @Override
+        public boolean isDriverHandshakeComplete() {
+            return false;
+        }
+
+        @Override
+        public void processDriverHandshakeMessage(OFMessage m) {
+        }
+
+        @Override
+        public boolean connectSwitch() {
+            return false;
+        }
+
+        @Override
+        public boolean activateMasterSwitch() {
+            return false;
+        }
+
+        @Override
+        public boolean activateEqualSwitch() {
+            return false;
+        }
+
+        @Override
+        public void transitionToEqualSwitch() {
+        }
+
+        @Override
+        public void transitionToMasterSwitch() {
+        }
+
+        @Override
+        public void removeConnectedSwitch() {
+        }
+
+        @Override
+        public void setPortDescReply(OFPortDescStatsReply portDescReply) {
+        }
+
+        @Override
+        public void setFeaturesReply(OFFeaturesReply featuresReply) {
+        }
+
+        @Override
+        public void setSwitchDescription(OFDescStatsReply desc) {
+        }
+
+        @Override
+        public int getNextTransactionId() {
+            return (int) XID;
+        }
+
+        @Override
+        public Boolean supportNxRole() {
+            return true;
+        }
+
+        @Override
+        public void setOFVersion(OFVersion ofV) {
+        }
+
+        @Override
+        public void setTableFull(boolean full) {
+        }
+
+        @Override
+        public void setChannel(Channel channel) {
+        }
+
+        @Override
+        public void setConnected(boolean connected) {
+        }
+
+        @Override
+        public boolean isConnected() {
+            return false;
+        }
+
+        @Override
+        public void write(OFMessage msg) {
+        }
+
+        @Override
+        public void write(List<OFMessage> msgs) {
+        }
+
+    }
+}
