Revert "Refactored code in an attempt to break dependency cycles"

This reverts commit 195af6e6b27c23c7beb98f4cd425e7d7ffff1ecd.
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/DeviceRoleCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/DeviceRoleCommand.java
index 032fb05..3418aa0 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/DeviceRoleCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/DeviceRoleCommand.java
@@ -4,8 +4,8 @@
 import org.apache.karaf.shell.commands.Command;
 import org.onlab.onos.cli.AbstractShellCommand;
 import org.onlab.onos.cluster.NodeId;
+import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.net.device.DeviceMastershipAdminService;
-import org.onlab.onos.net.device.DeviceMastershipRole;
 
 import static org.onlab.onos.net.DeviceId.deviceId;
 
@@ -31,7 +31,7 @@
     @Override
     protected void execute() {
         DeviceMastershipAdminService service = get(DeviceMastershipAdminService.class);
-        DeviceMastershipRole mastershipRole = DeviceMastershipRole.valueOf(role.toUpperCase());
+        MastershipRole mastershipRole = MastershipRole.valueOf(role.toUpperCase());
         service.setRole(new NodeId(node), deviceId(uri), mastershipRole);
     }
 
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/RoleCompleter.java b/cli/src/main/java/org/onlab/onos/cli/net/RoleCompleter.java
index 4319e19..b540fca 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/RoleCompleter.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/RoleCompleter.java
@@ -2,7 +2,7 @@
 
 import org.apache.karaf.shell.console.Completer;
 import org.apache.karaf.shell.console.completer.StringsCompleter;
-import org.onlab.onos.net.device.DeviceMastershipRole;
+import org.onlab.onos.net.MastershipRole;
 
 import java.util.List;
 import java.util.SortedSet;
@@ -16,9 +16,9 @@
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
         SortedSet<String> strings = delegate.getStrings();
-        strings.add(DeviceMastershipRole.MASTER.toString().toLowerCase());
-        strings.add(DeviceMastershipRole.STANDBY.toString().toLowerCase());
-        strings.add(DeviceMastershipRole.NONE.toString().toLowerCase());
+        strings.add(MastershipRole.MASTER.toString().toLowerCase());
+        strings.add(MastershipRole.STANDBY.toString().toLowerCase());
+        strings.add(MastershipRole.NONE.toString().toLowerCase());
 
         // Now let the completer do the work for figuring out what to offer.
         return delegate.complete(buffer, cursor, candidates);
diff --git a/core/api/src/main/java/org/onlab/onos/net/device/DeviceMastershipRole.java b/core/api/src/main/java/org/onlab/onos/net/MastershipRole.java
similarity index 89%
rename from core/api/src/main/java/org/onlab/onos/net/device/DeviceMastershipRole.java
rename to core/api/src/main/java/org/onlab/onos/net/MastershipRole.java
index 89bdc59..10d53ad 100644
--- a/core/api/src/main/java/org/onlab/onos/net/device/DeviceMastershipRole.java
+++ b/core/api/src/main/java/org/onlab/onos/net/MastershipRole.java
@@ -1,10 +1,10 @@
-package org.onlab.onos.net.device;
+package org.onlab.onos.net;
 
 /**
  * Representation of a relationship role of a controller instance to a device
  * or a region of network environment.
  */
-public enum DeviceMastershipRole {
+public enum MastershipRole {
 
     /**
      * Represents a relationship where the controller instance is the master
diff --git a/core/api/src/main/java/org/onlab/onos/net/device/DeviceMastershipAdminService.java b/core/api/src/main/java/org/onlab/onos/net/device/DeviceMastershipAdminService.java
index 3d31f37..78c9c39 100644
--- a/core/api/src/main/java/org/onlab/onos/net/device/DeviceMastershipAdminService.java
+++ b/core/api/src/main/java/org/onlab/onos/net/device/DeviceMastershipAdminService.java
@@ -2,6 +2,7 @@
 
 import org.onlab.onos.cluster.NodeId;
 import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.MastershipRole;
 
 /**
  * Service for administering the inventory of device masterships.
@@ -15,6 +16,6 @@
      * @param deviceId device identifier
      * @param role     requested role
      */
-    void setRole(NodeId instance, DeviceId deviceId, DeviceMastershipRole role);
+    void setRole(NodeId instance, DeviceId deviceId, MastershipRole role);
 
 }
diff --git a/core/api/src/main/java/org/onlab/onos/net/device/DeviceMastershipService.java b/core/api/src/main/java/org/onlab/onos/net/device/DeviceMastershipService.java
index 18683ea..a44abfd 100644
--- a/core/api/src/main/java/org/onlab/onos/net/device/DeviceMastershipService.java
+++ b/core/api/src/main/java/org/onlab/onos/net/device/DeviceMastershipService.java
@@ -4,6 +4,7 @@
 
 import org.onlab.onos.cluster.NodeId;
 import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.MastershipRole;
 
 /**
  * Service responsible for determining the controller instance mastership of
@@ -20,7 +21,7 @@
      * @param deviceId the the identifier of the device
      * @return role of the current node
      */
-    DeviceMastershipRole getLocalRole(DeviceId deviceId);
+    MastershipRole getLocalRole(DeviceId deviceId);
 
     /**
      * Returns the mastership status of the local controller for a given
@@ -29,7 +30,7 @@
      * @param deviceId the the identifier of the device
      * @return the role of this controller instance
      */
-    DeviceMastershipRole requestRoleFor(DeviceId deviceId);
+    MastershipRole requestRoleFor(DeviceId deviceId);
 
     /**
      * Abandons mastership of the specified device on the local node thus
diff --git a/core/api/src/main/java/org/onlab/onos/net/device/DeviceMastershipStore.java b/core/api/src/main/java/org/onlab/onos/net/device/DeviceMastershipStore.java
index 9c1b3e6..ee9b253 100644
--- a/core/api/src/main/java/org/onlab/onos/net/device/DeviceMastershipStore.java
+++ b/core/api/src/main/java/org/onlab/onos/net/device/DeviceMastershipStore.java
@@ -4,6 +4,7 @@
 
 import org.onlab.onos.cluster.NodeId;
 import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.store.Store;
 
 /**
@@ -20,7 +21,7 @@
      * @param deviceId device identifier
      * @return established or newly negotiated mastership role
      */
-    DeviceMastershipRole requestRole(DeviceId deviceId);
+    MastershipRole requestRole(DeviceId deviceId);
 
     /**
      * Returns the role of a device for a specific controller instance.
@@ -29,7 +30,7 @@
      * @param deviceId the device identifiers
      * @return the role
      */
-    DeviceMastershipRole getRole(NodeId nodeId, DeviceId deviceId);
+    MastershipRole getRole(NodeId nodeId, DeviceId deviceId);
 
     /**
      * Returns the master for a device.
diff --git a/core/api/src/main/java/org/onlab/onos/net/device/DeviceProvider.java b/core/api/src/main/java/org/onlab/onos/net/device/DeviceProvider.java
index 9a51a16..9934b8d 100644
--- a/core/api/src/main/java/org/onlab/onos/net/device/DeviceProvider.java
+++ b/core/api/src/main/java/org/onlab/onos/net/device/DeviceProvider.java
@@ -1,6 +1,7 @@
 package org.onlab.onos.net.device;
 
 import org.onlab.onos.net.Device;
+import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.net.provider.Provider;
 
 /**
@@ -29,6 +30,6 @@
      * @param device  affected device
      * @param newRole newly determined mastership role
      */
-    void roleChanged(Device device, DeviceMastershipRole newRole);
+    void roleChanged(Device device, MastershipRole newRole);
 
 }
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 168b684..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
@@ -1,6 +1,7 @@
 package org.onlab.onos.net.device;
 
 import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.net.provider.ProviderService;
 
 import java.util.List;
@@ -52,6 +53,6 @@
      * @param deviceId identity of the device
      * @param role mastership role that was asserted but failed
      */
-    void unableToAssertRole(DeviceId deviceId, DeviceMastershipRole role);
+    void unableToAssertRole(DeviceId deviceId, MastershipRole role);
 
 }
diff --git a/core/api/src/main/java/org/onlab/onos/net/device/DeviceService.java b/core/api/src/main/java/org/onlab/onos/net/device/DeviceService.java
index 3a6f89b..54b9d72 100644
--- a/core/api/src/main/java/org/onlab/onos/net/device/DeviceService.java
+++ b/core/api/src/main/java/org/onlab/onos/net/device/DeviceService.java
@@ -2,6 +2,7 @@
 
 import org.onlab.onos.net.Device;
 import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.net.Port;
 import org.onlab.onos.net.PortNumber;
 
@@ -42,7 +43,7 @@
      * @return designated mastership role
      */
     //XXX do we want this method here when MastershipService already does?
-    DeviceMastershipRole getRole(DeviceId deviceId);
+    MastershipRole getRole(DeviceId deviceId);
 
 
     /**
diff --git a/core/api/src/main/java/org/onlab/onos/net/device/DeviceClockProviderService.java b/core/api/src/main/java/org/onlab/onos/store/ClockProviderService.java
similarity index 64%
rename from core/api/src/main/java/org/onlab/onos/net/device/DeviceClockProviderService.java
rename to core/api/src/main/java/org/onlab/onos/store/ClockProviderService.java
index 6ef480d..fff6d15 100644
--- a/core/api/src/main/java/org/onlab/onos/net/device/DeviceClockProviderService.java
+++ b/core/api/src/main/java/org/onlab/onos/store/ClockProviderService.java
@@ -1,13 +1,14 @@
-package org.onlab.onos.net.device;
+package org.onlab.onos.store;
 
 import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.device.DeviceMastershipTerm;
 
 //TODO: Consider renaming to DeviceClockProviderService?
 /**
 * Interface for feeding term information to a logical clock service
 * that vends per device timestamps.
 */
-public interface DeviceClockProviderService {
+public interface ClockProviderService {
 
     /**
      * Updates the mastership term for the specified deviceId.
@@ -15,5 +16,5 @@
      * @param deviceId device identifier.
      * @param term mastership term.
      */
-    public void setDeviceMastershipTerm(DeviceId deviceId, DeviceMastershipTerm term);
+    public void setMastershipTerm(DeviceId deviceId, DeviceMastershipTerm term);
 }
diff --git a/core/api/src/main/java/org/onlab/onos/net/device/DeviceClockService.java b/core/api/src/main/java/org/onlab/onos/store/ClockService.java
similarity index 83%
rename from core/api/src/main/java/org/onlab/onos/net/device/DeviceClockService.java
rename to core/api/src/main/java/org/onlab/onos/store/ClockService.java
index b979db2..20549e8 100644
--- a/core/api/src/main/java/org/onlab/onos/net/device/DeviceClockService.java
+++ b/core/api/src/main/java/org/onlab/onos/store/ClockService.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.net.device;
+package org.onlab.onos.store;
 
 import org.onlab.onos.net.DeviceId;
 
@@ -6,7 +6,7 @@
 /**
  * Interface for a logical clock service that vends per device timestamps.
  */
-public interface DeviceClockService {
+public interface ClockService {
 
     /**
      * Returns a new timestamp for the specified deviceId.
diff --git a/core/api/src/main/java/org/onlab/onos/net/device/Timestamp.java b/core/api/src/main/java/org/onlab/onos/store/Timestamp.java
similarity index 90%
rename from core/api/src/main/java/org/onlab/onos/net/device/Timestamp.java
rename to core/api/src/main/java/org/onlab/onos/store/Timestamp.java
index 8acf16c..b3caf85 100644
--- a/core/api/src/main/java/org/onlab/onos/net/device/Timestamp.java
+++ b/core/api/src/main/java/org/onlab/onos/store/Timestamp.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.net.device;
+package org.onlab.onos.store;
 
 /**
  * Opaque version structure.
diff --git a/core/api/src/main/java/org/onlab/onos/net/device/Timestamped.java b/core/api/src/main/java/org/onlab/onos/store/Timestamped.java
similarity index 97%
rename from core/api/src/main/java/org/onlab/onos/net/device/Timestamped.java
rename to core/api/src/main/java/org/onlab/onos/store/Timestamped.java
index 9d3549a..9de7b0d 100644
--- a/core/api/src/main/java/org/onlab/onos/net/device/Timestamped.java
+++ b/core/api/src/main/java/org/onlab/onos/store/Timestamped.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.net.device;
+package org.onlab.onos.store;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
diff --git a/core/api/src/main/java/org/onlab/onos/net/device/VersionedValue.java b/core/api/src/main/java/org/onlab/onos/store/VersionedValue.java
similarity index 97%
rename from core/api/src/main/java/org/onlab/onos/net/device/VersionedValue.java
rename to core/api/src/main/java/org/onlab/onos/store/VersionedValue.java
index f0233ef..70602f6 100644
--- a/core/api/src/main/java/org/onlab/onos/net/device/VersionedValue.java
+++ b/core/api/src/main/java/org/onlab/onos/store/VersionedValue.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.net.device;
+package org.onlab.onos.store;
 
 import java.util.Objects;
 
diff --git a/core/api/src/test/java/org/onlab/onos/cluster/MastershipServiceAdapter.java b/core/api/src/test/java/org/onlab/onos/cluster/MastershipServiceAdapter.java
index c30ee3e..53fafd3 100644
--- a/core/api/src/test/java/org/onlab/onos/cluster/MastershipServiceAdapter.java
+++ b/core/api/src/test/java/org/onlab/onos/cluster/MastershipServiceAdapter.java
@@ -1,8 +1,8 @@
 package org.onlab.onos.cluster;
 
 import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.net.device.DeviceMastershipListener;
-import org.onlab.onos.net.device.DeviceMastershipRole;
 import org.onlab.onos.net.device.DeviceMastershipService;
 import org.onlab.onos.net.device.DeviceMastershipTermService;
 
@@ -13,12 +13,12 @@
  */
 public class MastershipServiceAdapter implements DeviceMastershipService {
     @Override
-    public DeviceMastershipRole getLocalRole(DeviceId deviceId) {
+    public MastershipRole getLocalRole(DeviceId deviceId) {
         return null;
     }
 
     @Override
-    public DeviceMastershipRole requestRoleFor(DeviceId deviceId) {
+    public MastershipRole requestRoleFor(DeviceId deviceId) {
         return null;
     }
 
diff --git a/core/api/src/test/java/org/onlab/onos/net/device/DeviceServiceAdapter.java b/core/api/src/test/java/org/onlab/onos/net/device/DeviceServiceAdapter.java
index aef5786..bfb28f6 100644
--- a/core/api/src/test/java/org/onlab/onos/net/device/DeviceServiceAdapter.java
+++ b/core/api/src/test/java/org/onlab/onos/net/device/DeviceServiceAdapter.java
@@ -2,6 +2,7 @@
 
 import org.onlab.onos.net.Device;
 import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.net.Port;
 import org.onlab.onos.net.PortNumber;
 
@@ -27,7 +28,7 @@
     }
 
     @Override
-    public DeviceMastershipRole getRole(DeviceId deviceId) {
+    public MastershipRole getRole(DeviceId deviceId) {
         return null;
     }
 
diff --git a/core/net/src/main/java/org/onlab/onos/cluster/impl/MastershipManager.java b/core/net/src/main/java/org/onlab/onos/cluster/impl/MastershipManager.java
index 7637478..b9c6ae8 100644
--- a/core/net/src/main/java/org/onlab/onos/cluster/impl/MastershipManager.java
+++ b/core/net/src/main/java/org/onlab/onos/cluster/impl/MastershipManager.java
@@ -18,10 +18,10 @@
 import org.onlab.onos.event.AbstractListenerRegistry;
 import org.onlab.onos.event.EventDeliveryService;
 import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.net.device.DeviceMastershipAdminService;
 import org.onlab.onos.net.device.DeviceMastershipEvent;
 import org.onlab.onos.net.device.DeviceMastershipListener;
-import org.onlab.onos.net.device.DeviceMastershipRole;
 import org.onlab.onos.net.device.DeviceMastershipService;
 import org.onlab.onos.net.device.DeviceMastershipStore;
 import org.onlab.onos.net.device.DeviceMastershipStoreDelegate;
@@ -73,13 +73,13 @@
     }
 
     @Override
-    public void setRole(NodeId nodeId, DeviceId deviceId, DeviceMastershipRole role) {
+    public void setRole(NodeId nodeId, DeviceId deviceId, MastershipRole role) {
         checkNotNull(nodeId, NODE_ID_NULL);
         checkNotNull(deviceId, DEVICE_ID_NULL);
         checkNotNull(role, ROLE_NULL);
 
         DeviceMastershipEvent event = null;
-        if (role.equals(DeviceMastershipRole.MASTER)) {
+        if (role.equals(MastershipRole.MASTER)) {
             event = store.setMaster(nodeId, deviceId);
         } else {
             event = store.setStandby(nodeId, deviceId);
@@ -91,7 +91,7 @@
     }
 
     @Override
-    public DeviceMastershipRole getLocalRole(DeviceId deviceId) {
+    public MastershipRole getLocalRole(DeviceId deviceId) {
         checkNotNull(deviceId, DEVICE_ID_NULL);
         return store.getRole(clusterService.getLocalNode().id(), deviceId);
     }
@@ -108,7 +108,7 @@
     }
 
     @Override
-    public DeviceMastershipRole requestRoleFor(DeviceId deviceId) {
+    public MastershipRole requestRoleFor(DeviceId deviceId) {
         checkNotNull(deviceId, DEVICE_ID_NULL);
         return store.requestRole(deviceId);
     }
diff --git a/core/net/src/main/java/org/onlab/onos/net/device/impl/DeviceManager.java b/core/net/src/main/java/org/onlab/onos/net/device/impl/DeviceManager.java
index 741ebf3..d4b8889 100644
--- a/core/net/src/main/java/org/onlab/onos/net/device/impl/DeviceManager.java
+++ b/core/net/src/main/java/org/onlab/onos/net/device/impl/DeviceManager.java
@@ -18,14 +18,13 @@
 import org.onlab.onos.event.EventDeliveryService;
 import org.onlab.onos.net.Device;
 import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.net.Port;
 import org.onlab.onos.net.PortNumber;
 import org.onlab.onos.net.device.DeviceAdminService;
-import org.onlab.onos.net.device.DeviceClockProviderService;
 import org.onlab.onos.net.device.DeviceDescription;
 import org.onlab.onos.net.device.DeviceEvent;
 import org.onlab.onos.net.device.DeviceListener;
-import org.onlab.onos.net.device.DeviceMastershipRole;
 import org.onlab.onos.net.device.DeviceProvider;
 import org.onlab.onos.net.device.DeviceProviderRegistry;
 import org.onlab.onos.net.device.DeviceProviderService;
@@ -40,6 +39,7 @@
 import org.onlab.onos.net.device.PortDescription;
 import org.onlab.onos.net.provider.AbstractProviderRegistry;
 import org.onlab.onos.net.provider.AbstractProviderService;
+import org.onlab.onos.store.ClockProviderService;
 import org.slf4j.Logger;
 
 /**
@@ -81,7 +81,7 @@
     protected DeviceMastershipTermService termService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DeviceClockProviderService clockProviderService;
+    protected ClockProviderService clockProviderService;
 
     @Activate
     public void activate() {
@@ -117,7 +117,7 @@
     }
 
     @Override
-    public DeviceMastershipRole getRole(DeviceId deviceId) {
+    public MastershipRole getRole(DeviceId deviceId) {
         checkNotNull(deviceId, DEVICE_ID_NULL);
         return mastershipService.getLocalRole(deviceId);
     }
@@ -142,8 +142,8 @@
     }
 
     // Applies the specified role to the device; ignores NONE
-    private void applyRole(DeviceId deviceId, DeviceMastershipRole newRole) {
-        if (newRole.equals(DeviceMastershipRole.NONE)) {
+    private void applyRole(DeviceId deviceId, MastershipRole newRole) {
+        if (newRole.equals(MastershipRole.NONE)) {
             Device device = store.getDevice(deviceId);
             // FIXME: Device might not be there yet. (eventual consistent)
             if (device == null) {
@@ -201,9 +201,9 @@
 
             log.info("Device {} connected", deviceId);
             // check my Role
-            DeviceMastershipRole role = mastershipService.requestRoleFor(deviceId);
+            MastershipRole role = mastershipService.requestRoleFor(deviceId);
 
-            if (role != DeviceMastershipRole.MASTER) {
+            if (role != MastershipRole.MASTER) {
                 // TODO: Do we need to explicitly tell the Provider that
                 // this instance is no longer the MASTER? probably not
                 return;
@@ -216,7 +216,7 @@
                 return;
             }
             // tell clock provider if this instance is the master
-            clockProviderService.setDeviceMastershipTerm(deviceId, term);
+            clockProviderService.setMastershipTerm(deviceId, term);
 
             DeviceEvent event = store.createOrUpdateDevice(provider().id(),
                     deviceId, deviceDescription);
@@ -255,7 +255,7 @@
             // but if I was the last STANDBY connection, etc. and no one else
             // was there to mark the device offline, this instance may need to
             // temporarily request for Master Role and mark offline.
-            if (!mastershipService.getLocalRole(deviceId).equals(DeviceMastershipRole.MASTER)) {
+            if (!mastershipService.getLocalRole(deviceId).equals(MastershipRole.MASTER)) {
                 log.debug("Device {} disconnected, but I am not the master", deviceId);
                 //let go of any role anyways
                 mastershipService.relinquishMastership(deviceId);
@@ -302,11 +302,11 @@
         }
 
         @Override
-        public void unableToAssertRole(DeviceId deviceId, DeviceMastershipRole role) {
+        public void unableToAssertRole(DeviceId deviceId, MastershipRole role) {
             // FIXME: implement response to this notification
             log.warn("Failed to assert role [{}] onto Device {}", role,
                     deviceId);
-            if (role == DeviceMastershipRole.MASTER) {
+            if (role == MastershipRole.MASTER) {
                 mastershipService.relinquishMastership(deviceId);
             }
         }
@@ -333,16 +333,16 @@
 
                     if (term.master().equals(myNodeId)) {
                         // only set the new term if I am the master
-                        clockProviderService.setDeviceMastershipTerm(did, term);
+                        clockProviderService.setMastershipTerm(did, term);
                     }
-                    applyRole(did, DeviceMastershipRole.MASTER);
+                    applyRole(did, MastershipRole.MASTER);
                 } else {
-                    applyRole(did, DeviceMastershipRole.STANDBY);
+                    applyRole(did, MastershipRole.STANDBY);
                 }
             } else {
                 //device dead to node, give up
                 mastershipService.relinquishMastership(did);
-                applyRole(did, DeviceMastershipRole.STANDBY);
+                applyRole(did, MastershipRole.STANDBY);
             }
         }
     }
diff --git a/core/net/src/test/java/org/onlab/onos/cluster/impl/MastershipManagerTest.java b/core/net/src/test/java/org/onlab/onos/cluster/impl/MastershipManagerTest.java
index d4cabba..84ca891 100644
--- a/core/net/src/test/java/org/onlab/onos/cluster/impl/MastershipManagerTest.java
+++ b/core/net/src/test/java/org/onlab/onos/cluster/impl/MastershipManagerTest.java
@@ -20,7 +20,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
-import static org.onlab.onos.net.device.DeviceMastershipRole.*;
+import static org.onlab.onos.net.MastershipRole.*;
 
 /**
  * Test codifying the mastership service contracts.
diff --git a/core/net/src/test/java/org/onlab/onos/net/device/impl/DeviceManagerTest.java b/core/net/src/test/java/org/onlab/onos/net/device/impl/DeviceManagerTest.java
index 0dc77e1..bc4e353 100644
--- a/core/net/src/test/java/org/onlab/onos/net/device/impl/DeviceManagerTest.java
+++ b/core/net/src/test/java/org/onlab/onos/net/device/impl/DeviceManagerTest.java
@@ -17,16 +17,15 @@
 import org.onlab.onos.event.impl.TestEventDispatcher;
 import org.onlab.onos.net.Device;
 import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.net.Port;
 import org.onlab.onos.net.PortNumber;
 import org.onlab.onos.net.device.DefaultDeviceDescription;
 import org.onlab.onos.net.device.DefaultPortDescription;
 import org.onlab.onos.net.device.DeviceAdminService;
-import org.onlab.onos.net.device.DeviceClockProviderService;
 import org.onlab.onos.net.device.DeviceDescription;
 import org.onlab.onos.net.device.DeviceEvent;
 import org.onlab.onos.net.device.DeviceListener;
-import org.onlab.onos.net.device.DeviceMastershipRole;
 import org.onlab.onos.net.device.DeviceProvider;
 import org.onlab.onos.net.device.DeviceProviderRegistry;
 import org.onlab.onos.net.device.DeviceProviderService;
@@ -36,6 +35,7 @@
 import org.onlab.onos.net.device.PortDescription;
 import org.onlab.onos.net.provider.AbstractProvider;
 import org.onlab.onos.net.provider.ProviderId;
+import org.onlab.onos.store.ClockProviderService;
 import org.onlab.onos.store.trivial.impl.SimpleDeviceStore;
 import org.onlab.packet.IpPrefix;
 
@@ -161,7 +161,7 @@
     @Test
     public void getRole() {
         connectDevice(DID1, SW1);
-        assertEquals("incorrect role", DeviceMastershipRole.MASTER, service.getRole(DID1));
+        assertEquals("incorrect role", MastershipRole.MASTER, service.getRole(DID1));
     }
 
     @Ignore("disabled until we settle the device-mastership wiring")
@@ -169,9 +169,9 @@
     public void setRole() throws InterruptedException {
         connectDevice(DID1, SW1);
         validateEvents(DEVICE_ADDED, DEVICE_MASTERSHIP_CHANGED);
-        assertEquals("incorrect role", DeviceMastershipRole.STANDBY, service.getRole(DID1));
+        assertEquals("incorrect role", MastershipRole.STANDBY, service.getRole(DID1));
         assertEquals("incorrect device", DID1, provider.deviceReceived.id());
-        assertEquals("incorrect role", DeviceMastershipRole.STANDBY, provider.roleReceived);
+        assertEquals("incorrect role", MastershipRole.STANDBY, provider.roleReceived);
     }
 
     @Test
@@ -246,7 +246,7 @@
 
     private class TestProvider extends AbstractProvider implements DeviceProvider {
         private Device deviceReceived;
-        private DeviceMastershipRole roleReceived;
+        private MastershipRole roleReceived;
 
         public TestProvider() {
             super(PID);
@@ -257,7 +257,7 @@
         }
 
         @Override
-        public void roleChanged(Device device, DeviceMastershipRole newRole) {
+        public void roleChanged(Device device, MastershipRole newRole) {
             deviceReceived = device;
             roleReceived = newRole;
         }
@@ -275,8 +275,8 @@
     private static class TestMastershipService
             extends MastershipServiceAdapter {
         @Override
-        public DeviceMastershipRole getLocalRole(DeviceId deviceId) {
-            return DeviceMastershipRole.MASTER;
+        public MastershipRole getLocalRole(DeviceId deviceId) {
+            return MastershipRole.MASTER;
         }
 
         @Override
@@ -285,8 +285,8 @@
         }
 
         @Override
-        public DeviceMastershipRole requestRoleFor(DeviceId deviceId) {
-            return DeviceMastershipRole.MASTER;
+        public MastershipRole requestRoleFor(DeviceId deviceId) {
+            return MastershipRole.MASTER;
         }
 
         @Override
@@ -336,10 +336,10 @@
     }
 
     private final class TestClockProviderService implements
-            DeviceClockProviderService {
+            ClockProviderService {
 
         @Override
-        public void setDeviceMastershipTerm(DeviceId deviceId, DeviceMastershipTerm term) {
+        public void setMastershipTerm(DeviceId deviceId, DeviceMastershipTerm term) {
             // TODO Auto-generated method stub
         }
     }
diff --git a/core/net/src/test/java/org/onlab/onos/net/flow/impl/FlowRuleManagerTest.java b/core/net/src/test/java/org/onlab/onos/net/flow/impl/FlowRuleManagerTest.java
index d8b3160..fb579ea 100644
--- a/core/net/src/test/java/org/onlab/onos/net/flow/impl/FlowRuleManagerTest.java
+++ b/core/net/src/test/java/org/onlab/onos/net/flow/impl/FlowRuleManagerTest.java
@@ -24,10 +24,10 @@
 import org.onlab.onos.net.Device;
 import org.onlab.onos.net.Device.Type;
 import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.net.Port;
 import org.onlab.onos.net.PortNumber;
 import org.onlab.onos.net.device.DeviceListener;
-import org.onlab.onos.net.device.DeviceMastershipRole;
 import org.onlab.onos.net.device.DeviceService;
 import org.onlab.onos.net.flow.CompletedBatchOperation;
 import org.onlab.onos.net.flow.DefaultFlowEntry;
@@ -364,7 +364,7 @@
         }
 
         @Override
-        public DeviceMastershipRole getRole(DeviceId deviceId) {
+        public MastershipRole getRole(DeviceId deviceId) {
             return null;
         }
 
diff --git a/core/net/src/test/java/org/onlab/onos/net/host/impl/HostMonitorTest.java b/core/net/src/test/java/org/onlab/onos/net/host/impl/HostMonitorTest.java
index 7191a8f..d8ddfbe 100644
--- a/core/net/src/test/java/org/onlab/onos/net/host/impl/HostMonitorTest.java
+++ b/core/net/src/test/java/org/onlab/onos/net/host/impl/HostMonitorTest.java
@@ -19,10 +19,10 @@
 import org.onlab.onos.net.Device;
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.Host;
+import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.net.Port;
 import org.onlab.onos.net.PortNumber;
 import org.onlab.onos.net.device.DeviceListener;
-import org.onlab.onos.net.device.DeviceMastershipRole;
 import org.onlab.onos.net.device.DeviceService;
 import org.onlab.onos.net.flow.instructions.Instruction;
 import org.onlab.onos.net.flow.instructions.Instructions.OutputInstruction;
@@ -189,7 +189,7 @@
         }
 
         @Override
-        public DeviceMastershipRole getRole(DeviceId deviceId) {
+        public MastershipRole getRole(DeviceId deviceId) {
             return null;
         }
 
diff --git a/core/net/src/test/java/org/onlab/onos/net/link/impl/LinkManagerTest.java b/core/net/src/test/java/org/onlab/onos/net/link/impl/LinkManagerTest.java
index 927278a..1d52ba3 100644
--- a/core/net/src/test/java/org/onlab/onos/net/link/impl/LinkManagerTest.java
+++ b/core/net/src/test/java/org/onlab/onos/net/link/impl/LinkManagerTest.java
@@ -1,7 +1,6 @@
 package org.onlab.onos.net.link.impl;
 
 import com.google.common.collect.ImmutableSet;
-
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -10,6 +9,7 @@
 import org.onlab.onos.net.Device;
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.Link;
+import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.net.PortNumber;
 import org.onlab.onos.net.link.DefaultLinkDescription;
 import org.onlab.onos.net.link.LinkAdminService;
@@ -22,7 +22,6 @@
 import org.onlab.onos.net.provider.AbstractProvider;
 import org.onlab.onos.net.provider.ProviderId;
 import org.onlab.onos.event.impl.TestEventDispatcher;
-import org.onlab.onos.net.device.DeviceMastershipRole;
 import org.onlab.onos.net.device.impl.DeviceManager;
 import org.onlab.onos.store.trivial.impl.SimpleLinkStore;
 
@@ -244,7 +243,7 @@
 
     private class TestProvider extends AbstractProvider implements LinkProvider {
         private Device deviceReceived;
-        private DeviceMastershipRole roleReceived;
+        private MastershipRole roleReceived;
 
         public TestProvider() {
             super(PID);
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/ClusterManagementMessageSubjects.java b/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/ClusterManagementMessageSubjects.java
index aa0dc83..74c22f1 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/ClusterManagementMessageSubjects.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/ClusterManagementMessageSubjects.java
@@ -6,5 +6,5 @@
     // avoid instantiation
     private ClusterManagementMessageSubjects() {}
 
-    public static final MessageSubject CLUSTER_MEMBERSHIP_EVENT = new MessageSubject("cluster-membership-event");
+    public static final MessageSubject CLUSTER_MEMBERSHIP_EVENT = new MessageSubject("CLUSTER_MEMBERSHIP_EVENT");
 }
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/ClusterNodesDelegate.java b/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/ClusterNodesDelegate.java
index 2ad2666..b82a835 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/ClusterNodesDelegate.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/ClusterNodesDelegate.java
@@ -1,6 +1,6 @@
 package org.onlab.onos.store.cluster.impl;
 
-import org.onlab.onos.cluster.ControllerNode;
+import org.onlab.onos.cluster.DefaultControllerNode;
 import org.onlab.onos.cluster.NodeId;
 import org.onlab.packet.IpPrefix;
 
@@ -18,7 +18,7 @@
      * @param tcpPort node TCP listen port
      * @return the controller node
      */
-    ControllerNode nodeDetected(NodeId nodeId, IpPrefix ip, int tcpPort);
+    DefaultControllerNode nodeDetected(NodeId nodeId, IpPrefix ip, int tcpPort);
 
     /**
      * Notifies about cluster node going offline.
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/DistributedClusterStore.java b/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/DistributedClusterStore.java
index 9433130..5e64a39 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/DistributedClusterStore.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/cluster/impl/DistributedClusterStore.java
@@ -1,5 +1,9 @@
 package org.onlab.onos.store.cluster.impl;
 
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.RemovalListener;
+import com.google.common.cache.RemovalNotification;
 import com.google.common.collect.ImmutableSet;
 
 import org.apache.felix.scr.annotations.Activate;
@@ -14,16 +18,8 @@
 import org.onlab.onos.cluster.NodeId;
 import org.onlab.onos.store.AbstractStore;
 import org.onlab.onos.store.cluster.messaging.ClusterCommunicationAdminService;
-import org.onlab.onos.store.cluster.messaging.ClusterCommunicationService;
-import org.onlab.onos.store.cluster.messaging.ClusterMessage;
-import org.onlab.onos.store.cluster.messaging.ClusterMessageHandler;
-import org.onlab.onos.store.cluster.messaging.MessageSubject;
-import org.onlab.onos.store.cluster.messaging.impl.ClusterMessageSerializer;
-import org.onlab.onos.store.cluster.messaging.impl.MessageSubjectSerializer;
-import org.onlab.onos.store.serializers.KryoPoolUtil;
-import org.onlab.onos.store.serializers.KryoSerializer;
+import org.onlab.onos.store.cluster.messaging.impl.ClusterCommunicationManager;
 import org.onlab.packet.IpPrefix;
-import org.onlab.util.KryoPool;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -31,6 +27,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
 
 import static org.onlab.onos.cluster.ControllerNode.State;
 import static org.onlab.packet.IpPrefix.valueOf;
@@ -46,33 +43,17 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private ControllerNode localNode;
-    private final Map<NodeId, ControllerNode> nodes = new ConcurrentHashMap<>();
+    private DefaultControllerNode localNode;
+    private final Map<NodeId, DefaultControllerNode> nodes = new ConcurrentHashMap<>();
     private final Map<NodeId, State> states = new ConcurrentHashMap<>();
-
-    private static final KryoSerializer SERIALIZER = new KryoSerializer() {
-        @Override
-        protected void setupKryoPool() {
-            serializerPool = KryoPool.newBuilder()
-                    .register(KryoPoolUtil.API)
-                    .register(ClusterMessage.class, new ClusterMessageSerializer())
-                    .register(ClusterMembershipEvent.class)
-                    .register(byte[].class)
-                    .register(MessageSubject.class, new MessageSubjectSerializer())
-                    .build()
-                    .populate(1);
-        }
-    };
+    private final Cache<NodeId, ControllerNode> livenessCache = CacheBuilder.newBuilder()
+            .maximumSize(1000)
+            .expireAfterWrite(ClusterCommunicationManager.HEART_BEAT_INTERVAL_MILLIS * 3, TimeUnit.MILLISECONDS)
+            .removalListener(new LivenessCacheRemovalListener()).build();
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     private ClusterCommunicationAdminService clusterCommunicationAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private ClusterCommunicationService clusterCommunicator;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private ClusterMonitorService clusterMonitor;
-
     private final ClusterNodesDelegate nodesDelegate = new InnerNodesDelegate();
 
     @Activate
@@ -80,15 +61,10 @@
         loadClusterDefinition();
         establishSelfIdentity();
 
-        clusterCommunicator.addSubscriber(
-                ClusterManagementMessageSubjects.CLUSTER_MEMBERSHIP_EVENT,
-                new ClusterMembershipEventListener());
-
-        // Start-up the monitor service and prime it with the loaded nodes.
-        clusterMonitor.initialize(localNode, nodesDelegate);
-
-        for (ControllerNode node : nodes.values()) {
-            clusterMonitor.addNode(node);
+        // Start-up the comm service and prime it with the loaded nodes.
+        clusterCommunicationAdminService.initialize(localNode, nodesDelegate);
+        for (DefaultControllerNode node : nodes.values()) {
+            clusterCommunicationAdminService.addNode(node);
         }
         log.info("Started");
     }
@@ -154,78 +130,22 @@
     @Override
     public ControllerNode addNode(NodeId nodeId, IpPrefix ip, int tcpPort) {
         DefaultControllerNode node = new DefaultControllerNode(nodeId, ip, tcpPort);
-        addNodeInternal(node);
-
-        try {
-            clusterCommunicator.broadcast(
-                    new ClusterMessage(
-                            localNode.id(),
-                            ClusterManagementMessageSubjects.CLUSTER_MEMBERSHIP_EVENT,
-                            SERIALIZER.encode(
-                                    new ClusterMembershipEvent(
-                                            ClusterMembershipEventType.NEW_MEMBER,
-                                            node))));
-        } catch (IOException e) {
-            // TODO: In a setup where cluster membership is not static (i.e. not everything has the same picture)
-            // we'll need a more consistent/dependable way to replicate membership events.
-            log.error("Failed to notify peers of a new cluster member", e);
-        }
-
+        nodes.put(nodeId, node);
+        clusterCommunicationAdminService.addNode(node);
         return node;
     }
 
-    private void addNodeInternal(ControllerNode node) {
-        nodes.put(node.id(), node);
-    }
-
     @Override
     public void removeNode(NodeId nodeId) {
-        ControllerNode node = removeNodeInternal(nodeId);
-
-        if (node != null) {
-            try {
-                clusterCommunicator.broadcast(
-                        new ClusterMessage(
-                                localNode.id(),
-                                ClusterManagementMessageSubjects.CLUSTER_MEMBERSHIP_EVENT,
-                                SERIALIZER.encode(
-                                        new ClusterMembershipEvent(
-                                                ClusterMembershipEventType.LEAVING_MEMBER,
-                                                node))));
-            } catch (IOException e) {
-                // TODO: In a setup where cluster membership is not static (i.e. not everything has the same picture)
-                // we'll need a more consistent/dependable way to replicate membership events.
-                log.error("Failed to notify peers of a existing cluster member leaving.", e);
-            }
-        }
-
-    }
-
-    private ControllerNode removeNodeInternal(NodeId nodeId) {
         if (nodeId.equals(localNode.id())) {
             nodes.clear();
             nodes.put(localNode.id(), localNode);
-            return localNode;
 
-        }
-        // Remove the other node.
-        ControllerNode node = nodes.remove(nodeId);
-        return node;
-    }
-
-    private class ClusterMembershipEventListener implements ClusterMessageHandler {
-        @Override
-        public void handle(ClusterMessage message) {
-
-            log.info("Received cluster membership event from peer: {}", message.sender());
-            ClusterMembershipEvent event = (ClusterMembershipEvent) SERIALIZER.decode(message.payload());
-            if (event.type() == ClusterMembershipEventType.NEW_MEMBER) {
-                log.info("Node {} is added", event.node().id());
-                addNodeInternal(event.node());
-            }
-            if (event.type() == ClusterMembershipEventType.LEAVING_MEMBER) {
-                log.info("Node {} is removed ", event.node().id());
-                removeNodeInternal(event.node().id());
+        } else {
+            // Remove the other node.
+            DefaultControllerNode node = nodes.remove(nodeId);
+            if (node != null) {
+                clusterCommunicationAdminService.removeNode(node);
             }
         }
     }
@@ -233,12 +153,13 @@
     // Entity to handle back calls from the connection manager.
     private class InnerNodesDelegate implements ClusterNodesDelegate {
         @Override
-        public ControllerNode nodeDetected(NodeId nodeId, IpPrefix ip, int tcpPort) {
-            ControllerNode node = nodes.get(nodeId);
+        public DefaultControllerNode nodeDetected(NodeId nodeId, IpPrefix ip, int tcpPort) {
+            DefaultControllerNode node = nodes.get(nodeId);
             if (node == null) {
                 node = (DefaultControllerNode) addNode(nodeId, ip, tcpPort);
             }
             states.put(nodeId, State.ACTIVE);
+            livenessCache.put(nodeId, node);
             return node;
         }
 
@@ -252,4 +173,14 @@
             removeNode(nodeId);
         }
     }
+
+    private class LivenessCacheRemovalListener implements RemovalListener<NodeId, ControllerNode> {
+
+        @Override
+        public void onRemoval(RemovalNotification<NodeId, ControllerNode> entry) {
+            NodeId nodeId = entry.getKey();
+            log.warn("Failed to receive heartbeats from controller: " + nodeId);
+            nodesDelegate.nodeVanished(nodeId);
+        }
+    }
 }
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/cluster/messaging/impl/ClusterCommunicationManager.java b/core/store/dist/src/main/java/org/onlab/onos/store/cluster/messaging/impl/ClusterCommunicationManager.java
index 0e6b1b8..c72fae8 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/cluster/messaging/impl/ClusterCommunicationManager.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/cluster/messaging/impl/ClusterCommunicationManager.java
@@ -4,6 +4,8 @@
 
 import java.io.IOException;
 import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
 
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -14,6 +16,10 @@
 import org.onlab.onos.cluster.ClusterService;
 import org.onlab.onos.cluster.ControllerNode;
 import org.onlab.onos.cluster.NodeId;
+import org.onlab.onos.store.cluster.impl.ClusterMembershipEvent;
+import org.onlab.onos.store.cluster.impl.ClusterMembershipEventType;
+import org.onlab.onos.store.cluster.impl.ClusterNodesDelegate;
+import org.onlab.onos.store.cluster.messaging.ClusterCommunicationAdminService;
 import org.onlab.onos.store.cluster.messaging.ClusterCommunicationService;
 import org.onlab.onos.store.cluster.messaging.ClusterMessage;
 import org.onlab.onos.store.cluster.messaging.ClusterMessageHandler;
@@ -32,7 +38,7 @@
 @Component(immediate = true)
 @Service
 public class ClusterCommunicationManager
-        implements ClusterCommunicationService {
+        implements ClusterCommunicationService, ClusterCommunicationAdminService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -41,6 +47,10 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     private ClusterService clusterService;
 
+    private ClusterNodesDelegate nodesDelegate;
+    private final Timer timer = new Timer("onos-controller-heatbeats");
+    public static final long HEART_BEAT_INTERVAL_MILLIS = 1000L;
+
     // TODO: This probably should not be a OSGi service.
     private MessagingService messagingService;
 
@@ -50,6 +60,7 @@
             serializerPool = KryoPool.newBuilder()
                     .register(KryoPoolUtil.API)
                     .register(ClusterMessage.class, new ClusterMessageSerializer())
+                    .register(ClusterMembershipEvent.class)
                     .register(byte[].class)
                     .register(MessageSubject.class, new MessageSubjectSerializer())
                     .build()
@@ -123,6 +134,61 @@
         messagingService.registerHandler(subject.value(), new InternalClusterMessageHandler(subscriber));
     }
 
+    @Override
+    public void initialize(ControllerNode localNode,
+            ClusterNodesDelegate delegate) {
+        this.localNode = localNode;
+        this.nodesDelegate = delegate;
+        this.addSubscriber(new MessageSubject("CLUSTER_MEMBERSHIP_EVENT"), new ClusterMemebershipEventHandler());
+        timer.schedule(new KeepAlive(), 0, HEART_BEAT_INTERVAL_MILLIS);
+    }
+
+    @Override
+    public void addNode(ControllerNode node) {
+        //members.put(node.id(), node);
+    }
+
+    @Override
+    public void removeNode(ControllerNode node) {
+        broadcast(new ClusterMessage(
+                localNode.id(),
+                new MessageSubject("CLUSTER_MEMBERSHIP_EVENT"),
+                SERIALIZER.encode(new ClusterMembershipEvent(ClusterMembershipEventType.LEAVING_MEMBER, node))));
+        //members.remove(node.id());
+    }
+
+    // Sends a heart beat to all peers.
+    private class KeepAlive extends TimerTask {
+
+        @Override
+        public void run() {
+            broadcast(new ClusterMessage(
+                localNode.id(),
+                new MessageSubject("CLUSTER_MEMBERSHIP_EVENT"),
+                SERIALIZER.encode(new ClusterMembershipEvent(ClusterMembershipEventType.HEART_BEAT, localNode))));
+        }
+    }
+
+    private class ClusterMemebershipEventHandler implements ClusterMessageHandler {
+
+        @Override
+        public void handle(ClusterMessage message) {
+
+            ClusterMembershipEvent event = SERIALIZER.decode(message.payload());
+            ControllerNode node = event.node();
+            if (event.type() == ClusterMembershipEventType.HEART_BEAT) {
+                log.info("Node {} sent a hearbeat", node.id());
+                nodesDelegate.nodeDetected(node.id(), node.ip(), node.tcpPort());
+            } else if (event.type() == ClusterMembershipEventType.LEAVING_MEMBER) {
+                log.info("Node {} is leaving", node.id());
+                nodesDelegate.nodeRemoved(node.id());
+            } else if (event.type() == ClusterMembershipEventType.UNREACHABLE_MEMBER) {
+                log.info("Node {} is unreachable", node.id());
+                nodesDelegate.nodeVanished(node.id());
+            }
+        }
+    }
+
     private final class InternalClusterMessageHandler implements MessageHandler {
 
         private final ClusterMessageHandler handler;
@@ -142,4 +208,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/common/impl/AntiEntropyAdvertisement.java b/core/store/dist/src/main/java/org/onlab/onos/store/common/impl/AntiEntropyAdvertisement.java
index 5ab3e6f..132f27a 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/common/impl/AntiEntropyAdvertisement.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/common/impl/AntiEntropyAdvertisement.java
@@ -3,7 +3,7 @@
 import java.util.Map;
 
 import org.onlab.onos.cluster.NodeId;
-import org.onlab.onos.net.device.Timestamp;
+import org.onlab.onos.store.Timestamp;
 
 import com.google.common.collect.ImmutableMap;
 
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/common/impl/AntiEntropyReply.java b/core/store/dist/src/main/java/org/onlab/onos/store/common/impl/AntiEntropyReply.java
index 2a0ef60..46a2333 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/common/impl/AntiEntropyReply.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/common/impl/AntiEntropyReply.java
@@ -4,7 +4,7 @@
 import java.util.Set;
 
 import org.onlab.onos.cluster.NodeId;
-import org.onlab.onos.net.device.VersionedValue;
+import org.onlab.onos.store.VersionedValue;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/common/impl/DeviceMastershipBasedTimestamp.java b/core/store/dist/src/main/java/org/onlab/onos/store/common/impl/DeviceMastershipBasedTimestamp.java
index 30b3db6..4bc41ab 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/common/impl/DeviceMastershipBasedTimestamp.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/common/impl/DeviceMastershipBasedTimestamp.java
@@ -4,7 +4,7 @@
 
 import java.util.Objects;
 
-import org.onlab.onos.net.device.Timestamp;
+import org.onlab.onos.store.Timestamp;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.collect.ComparisonChain;
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/DeviceAntiEntropyAdvertisement.java b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/DeviceAntiEntropyAdvertisement.java
index 6bb9f01..c9f232a 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/DeviceAntiEntropyAdvertisement.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/DeviceAntiEntropyAdvertisement.java
@@ -7,8 +7,8 @@
 import org.onlab.onos.cluster.NodeId;
 import org.onlab.onos.net.Device;
 import org.onlab.onos.net.DeviceId;
-import org.onlab.onos.net.device.Timestamp;
-import org.onlab.onos.net.device.VersionedValue;
+import org.onlab.onos.store.Timestamp;
+import org.onlab.onos.store.VersionedValue;
 import org.onlab.onos.store.common.impl.AntiEntropyAdvertisement;
 
 // TODO DeviceID needs to be changed to something like (ProviderID, DeviceID)
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/DeviceAntiEntropyReply.java b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/DeviceAntiEntropyReply.java
index 4bb9dda..34dc873 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/DeviceAntiEntropyReply.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/DeviceAntiEntropyReply.java
@@ -9,8 +9,8 @@
 import org.onlab.onos.cluster.NodeId;
 import org.onlab.onos.net.Device;
 import org.onlab.onos.net.DeviceId;
-import org.onlab.onos.net.device.Timestamp;
-import org.onlab.onos.net.device.VersionedValue;
+import org.onlab.onos.store.Timestamp;
+import org.onlab.onos.store.VersionedValue;
 import org.onlab.onos.store.common.impl.AntiEntropyReply;
 
 import com.google.common.collect.ImmutableMap;
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/DeviceClockManager.java b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/DeviceClockManager.java
index a8d023c..6f4fb96 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/DeviceClockManager.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/DeviceClockManager.java
@@ -11,10 +11,10 @@
 import org.apache.felix.scr.annotations.Deactivate;
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.onos.net.DeviceId;
-import org.onlab.onos.net.device.DeviceClockProviderService;
-import org.onlab.onos.net.device.DeviceClockService;
 import org.onlab.onos.net.device.DeviceMastershipTerm;
-import org.onlab.onos.net.device.Timestamp;
+import org.onlab.onos.store.ClockProviderService;
+import org.onlab.onos.store.ClockService;
+import org.onlab.onos.store.Timestamp;
 import org.onlab.onos.store.common.impl.DeviceMastershipBasedTimestamp;
 import org.slf4j.Logger;
 
@@ -23,7 +23,7 @@
  */
 @Component(immediate = true)
 @Service
-public class DeviceClockManager implements DeviceClockService, DeviceClockProviderService {
+public class DeviceClockManager implements ClockService, ClockProviderService {
 
     private final Logger log = getLogger(getClass());
 
@@ -51,7 +51,7 @@
     }
 
     @Override
-    public void setDeviceMastershipTerm(DeviceId deviceId, DeviceMastershipTerm term) {
+    public void setMastershipTerm(DeviceId deviceId, DeviceMastershipTerm term) {
         deviceMastershipTerms.put(deviceId, term);
     }
 }
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/GossipDeviceStore.java b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/GossipDeviceStore.java
index ebcbb0c..06c70a0 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/GossipDeviceStore.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/GossipDeviceStore.java
@@ -26,16 +26,16 @@
 import org.onlab.onos.net.SparseAnnotations;
 import org.onlab.onos.net.device.DefaultDeviceDescription;
 import org.onlab.onos.net.device.DefaultPortDescription;
-import org.onlab.onos.net.device.DeviceClockService;
 import org.onlab.onos.net.device.DeviceDescription;
 import org.onlab.onos.net.device.DeviceEvent;
 import org.onlab.onos.net.device.DeviceStore;
 import org.onlab.onos.net.device.DeviceStoreDelegate;
 import org.onlab.onos.net.device.PortDescription;
-import org.onlab.onos.net.device.Timestamp;
-import org.onlab.onos.net.device.Timestamped;
 import org.onlab.onos.net.provider.ProviderId;
 import org.onlab.onos.store.AbstractStore;
+import org.onlab.onos.store.ClockService;
+import org.onlab.onos.store.Timestamp;
+import org.onlab.onos.store.Timestamped;
 import org.onlab.onos.store.cluster.messaging.ClusterCommunicationService;
 import org.onlab.onos.store.cluster.messaging.ClusterMessage;
 import org.onlab.onos.store.cluster.messaging.ClusterMessageHandler;
@@ -105,7 +105,7 @@
     private final Set<DeviceId> availableDevices = Sets.newConcurrentHashSet();
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DeviceClockService clockService;
+    protected ClockService clockService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected ClusterCommunicationService clusterCommunicator;
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceEvent.java b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceEvent.java
index 55da310..1deb5d5 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceEvent.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceEvent.java
@@ -2,8 +2,8 @@
 
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.device.DeviceDescription;
-import org.onlab.onos.net.device.Timestamped;
 import org.onlab.onos.net.provider.ProviderId;
+import org.onlab.onos.store.Timestamped;
 
 /**
  * Information published by GossipDeviceStore to notify peers of a device
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceEventSerializer.java b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceEventSerializer.java
index f17a602..63ddda3 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceEventSerializer.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceEventSerializer.java
@@ -2,8 +2,8 @@
 
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.device.DeviceDescription;
-import org.onlab.onos.net.device.Timestamped;
 import org.onlab.onos.net.provider.ProviderId;
+import org.onlab.onos.store.Timestamped;
 
 import com.esotericsoftware.kryo.Kryo;
 import com.esotericsoftware.kryo.Serializer;
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceOfflineEvent.java b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceOfflineEvent.java
index 806a9fb..d8942d6 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceOfflineEvent.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceOfflineEvent.java
@@ -1,7 +1,7 @@
 package org.onlab.onos.store.device.impl;
 
 import org.onlab.onos.net.DeviceId;
-import org.onlab.onos.net.device.Timestamp;
+import org.onlab.onos.store.Timestamp;
 
 /**
  * Information published by GossipDeviceStore to notify peers of a device
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceOfflineEventSerializer.java b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceOfflineEventSerializer.java
index e014cac..7059636 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceOfflineEventSerializer.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceOfflineEventSerializer.java
@@ -1,7 +1,7 @@
 package org.onlab.onos.store.device.impl;
 
 import org.onlab.onos.net.DeviceId;
-import org.onlab.onos.net.device.Timestamp;
+import org.onlab.onos.store.Timestamp;
 
 import com.esotericsoftware.kryo.Kryo;
 import com.esotericsoftware.kryo.Serializer;
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceRemovedEvent.java b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceRemovedEvent.java
index 5800583..6c8b905 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceRemovedEvent.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceRemovedEvent.java
@@ -1,7 +1,7 @@
 package org.onlab.onos.store.device.impl;
 
 import org.onlab.onos.net.DeviceId;
-import org.onlab.onos.net.device.Timestamp;
+import org.onlab.onos.store.Timestamp;
 
 /**
  * Information published by GossipDeviceStore to notify peers of a device
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalPortEvent.java b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalPortEvent.java
index b9acb2c..ad4e380 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalPortEvent.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalPortEvent.java
@@ -4,8 +4,8 @@
 
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.device.PortDescription;
-import org.onlab.onos.net.device.Timestamped;
 import org.onlab.onos.net.provider.ProviderId;
+import org.onlab.onos.store.Timestamped;
 
 /**
  * Information published by GossipDeviceStore to notify peers of a port
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalPortEventSerializer.java b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalPortEventSerializer.java
index a2737b4..ede88f1 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalPortEventSerializer.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalPortEventSerializer.java
@@ -4,8 +4,8 @@
 
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.device.PortDescription;
-import org.onlab.onos.net.device.Timestamped;
 import org.onlab.onos.net.provider.ProviderId;
+import org.onlab.onos.store.Timestamped;
 
 import com.esotericsoftware.kryo.Kryo;
 import com.esotericsoftware.kryo.Serializer;
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalPortStatusEvent.java b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalPortStatusEvent.java
index 07424eb..00f9a9f 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalPortStatusEvent.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalPortStatusEvent.java
@@ -2,8 +2,8 @@
 
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.device.PortDescription;
-import org.onlab.onos.net.device.Timestamped;
 import org.onlab.onos.net.provider.ProviderId;
+import org.onlab.onos.store.Timestamped;
 
 /**
  * Information published by GossipDeviceStore to notify peers of a port
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalPortStatusEventSerializer.java b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalPortStatusEventSerializer.java
index 434787c..82fbb89 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalPortStatusEventSerializer.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalPortStatusEventSerializer.java
@@ -2,8 +2,8 @@
 
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.device.PortDescription;
-import org.onlab.onos.net.device.Timestamped;
 import org.onlab.onos.net.provider.ProviderId;
+import org.onlab.onos.store.Timestamped;
 
 import com.esotericsoftware.kryo.Kryo;
 import com.esotericsoftware.kryo.Serializer;
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/link/impl/OnosDistributedLinkStore.java b/core/store/dist/src/main/java/org/onlab/onos/store/link/impl/OnosDistributedLinkStore.java
index 17fbe10..d00d76b 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/link/impl/OnosDistributedLinkStore.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/link/impl/OnosDistributedLinkStore.java
@@ -23,15 +23,15 @@
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.Link;
 import org.onlab.onos.net.LinkKey;
-import org.onlab.onos.net.device.DeviceClockService;
-import org.onlab.onos.net.device.Timestamp;
-import org.onlab.onos.net.device.VersionedValue;
 import org.onlab.onos.net.link.LinkDescription;
 import org.onlab.onos.net.link.LinkEvent;
 import org.onlab.onos.net.link.LinkStore;
 import org.onlab.onos.net.link.LinkStoreDelegate;
 import org.onlab.onos.net.provider.ProviderId;
 import org.onlab.onos.store.AbstractStore;
+import org.onlab.onos.store.ClockService;
+import org.onlab.onos.store.Timestamp;
+import org.onlab.onos.store.VersionedValue;
 import org.slf4j.Logger;
 
 import com.google.common.collect.HashMultimap;
@@ -71,7 +71,7 @@
     private final Multimap<DeviceId, VersionedValue<Link>> dstLinks = HashMultimap.create();
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DeviceClockService clockService;
+    protected ClockService clockService;
 
     @Activate
     public void activate() {
diff --git a/core/store/dist/src/test/java/org/onlab/onos/store/cluster/impl/ClusterCommunicationManagerTest.java b/core/store/dist/src/test/java/org/onlab/onos/store/cluster/impl/ClusterCommunicationManagerTest.java
index c78f78a..e63fcaa 100644
--- a/core/store/dist/src/test/java/org/onlab/onos/store/cluster/impl/ClusterCommunicationManagerTest.java
+++ b/core/store/dist/src/test/java/org/onlab/onos/store/cluster/impl/ClusterCommunicationManagerTest.java
@@ -2,6 +2,8 @@
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
 import org.onlab.onos.cluster.DefaultControllerNode;
 import org.onlab.onos.cluster.NodeId;
 import org.onlab.onos.store.cluster.messaging.impl.ClusterCommunicationManager;
@@ -9,6 +11,12 @@
 import org.onlab.netty.NettyMessagingService;
 import org.onlab.packet.IpPrefix;
 
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
 /**
  * Tests of the cluster communication manager.
  */
@@ -25,6 +33,9 @@
     private ClusterCommunicationManager ccm1;
     private ClusterCommunicationManager ccm2;
 
+    private TestDelegate cnd1 = new TestDelegate();
+    private TestDelegate cnd2 = new TestDelegate();
+
     private DefaultControllerNode node1 = new DefaultControllerNode(N1, IP, P1);
     private DefaultControllerNode node2 = new DefaultControllerNode(N2, IP, P2);
 
@@ -37,10 +48,15 @@
         messagingService.activate();
 
         ccm1 = new ClusterCommunicationManager();
+//        ccm1.serializationService = messageSerializer;
         ccm1.activate();
 
         ccm2 = new ClusterCommunicationManager();
+//        ccm2.serializationService = messageSerializer;
         ccm2.activate();
+
+        ccm1.initialize(node1, cnd1);
+        ccm2.initialize(node2, cnd2);
     }
 
     @After
@@ -48,4 +64,70 @@
         ccm1.deactivate();
         ccm2.deactivate();
     }
-}
\ No newline at end of file
+
+    @Ignore("FIXME: failing randomly?")
+    @Test
+    public void connect() throws Exception {
+        cnd1.latch = new CountDownLatch(1);
+        cnd2.latch = new CountDownLatch(1);
+
+        ccm1.addNode(node2);
+        validateDelegateEvent(cnd1, Op.DETECTED, node2.id());
+        validateDelegateEvent(cnd2, Op.DETECTED, node1.id());
+    }
+
+    @Test
+    @Ignore
+    public void disconnect() throws Exception {
+        cnd1.latch = new CountDownLatch(1);
+        cnd2.latch = new CountDownLatch(1);
+
+        ccm1.addNode(node2);
+        validateDelegateEvent(cnd1, Op.DETECTED, node2.id());
+        validateDelegateEvent(cnd2, Op.DETECTED, node1.id());
+
+        cnd1.latch = new CountDownLatch(1);
+        cnd2.latch = new CountDownLatch(1);
+        ccm1.deactivate();
+//
+//        validateDelegateEvent(cnd2, Op.VANISHED, node1.id());
+    }
+
+    private void validateDelegateEvent(TestDelegate delegate, Op op, NodeId nodeId)
+            throws InterruptedException {
+        assertTrue("did not connect in time", delegate.latch.await(2500, TimeUnit.MILLISECONDS));
+        assertEquals("incorrect event", op, delegate.op);
+        assertEquals("incorrect event node", nodeId, delegate.nodeId);
+    }
+
+    enum Op { DETECTED, VANISHED, REMOVED };
+
+    private class TestDelegate implements ClusterNodesDelegate {
+
+        Op op;
+        CountDownLatch latch;
+        NodeId nodeId;
+
+        @Override
+        public DefaultControllerNode nodeDetected(NodeId nodeId, IpPrefix ip, int tcpPort) {
+            latch(nodeId, Op.DETECTED);
+            return new DefaultControllerNode(nodeId, ip, tcpPort);
+        }
+
+        @Override
+        public void nodeVanished(NodeId nodeId) {
+            latch(nodeId, Op.VANISHED);
+        }
+
+        @Override
+        public void nodeRemoved(NodeId nodeId) {
+            latch(nodeId, Op.REMOVED);
+        }
+
+        private void latch(NodeId nodeId, Op op) {
+            this.op = op;
+            this.nodeId = nodeId;
+            latch.countDown();
+        }
+    }
+}
diff --git a/core/store/dist/src/test/java/org/onlab/onos/store/common/impl/MastershipBasedTimestampTest.java b/core/store/dist/src/test/java/org/onlab/onos/store/common/impl/MastershipBasedTimestampTest.java
index 154c2f6..2c8ff35 100644
--- a/core/store/dist/src/test/java/org/onlab/onos/store/common/impl/MastershipBasedTimestampTest.java
+++ b/core/store/dist/src/test/java/org/onlab/onos/store/common/impl/MastershipBasedTimestampTest.java
@@ -5,7 +5,7 @@
 import java.nio.ByteBuffer;
 
 import org.junit.Test;
-import org.onlab.onos.net.device.Timestamp;
+import org.onlab.onos.store.Timestamp;
 import org.onlab.util.KryoPool;
 
 import com.google.common.testing.EqualsTester;
diff --git a/core/store/dist/src/test/java/org/onlab/onos/store/common/impl/TimestampedTest.java b/core/store/dist/src/test/java/org/onlab/onos/store/common/impl/TimestampedTest.java
index 9b6c3e6..2a0faa8 100644
--- a/core/store/dist/src/test/java/org/onlab/onos/store/common/impl/TimestampedTest.java
+++ b/core/store/dist/src/test/java/org/onlab/onos/store/common/impl/TimestampedTest.java
@@ -5,8 +5,8 @@
 import java.nio.ByteBuffer;
 
 import org.junit.Test;
-import org.onlab.onos.net.device.Timestamp;
-import org.onlab.onos.net.device.Timestamped;
+import org.onlab.onos.store.Timestamp;
+import org.onlab.onos.store.Timestamped;
 import org.onlab.util.KryoPool;
 
 import com.google.common.testing.EqualsTester;
diff --git a/core/store/dist/src/test/java/org/onlab/onos/store/device/impl/GossipDeviceStoreTest.java b/core/store/dist/src/test/java/org/onlab/onos/store/device/impl/GossipDeviceStoreTest.java
index a683f91..d1060cc 100644
--- a/core/store/dist/src/test/java/org/onlab/onos/store/device/impl/GossipDeviceStoreTest.java
+++ b/core/store/dist/src/test/java/org/onlab/onos/store/device/impl/GossipDeviceStoreTest.java
@@ -35,7 +35,6 @@
 import org.onlab.onos.net.SparseAnnotations;
 import org.onlab.onos.net.device.DefaultDeviceDescription;
 import org.onlab.onos.net.device.DefaultPortDescription;
-import org.onlab.onos.net.device.DeviceClockService;
 import org.onlab.onos.net.device.DeviceDescription;
 import org.onlab.onos.net.device.DeviceEvent;
 import org.onlab.onos.net.device.DeviceStore;
@@ -43,6 +42,7 @@
 import org.onlab.onos.net.device.DeviceMastershipTerm;
 import org.onlab.onos.net.device.PortDescription;
 import org.onlab.onos.net.provider.ProviderId;
+import org.onlab.onos.store.ClockService;
 import org.onlab.onos.store.cluster.messaging.ClusterCommunicationService;
 import org.onlab.onos.store.cluster.messaging.ClusterMessage;
 import org.onlab.onos.store.cluster.messaging.ClusterMessageHandler;
@@ -96,7 +96,7 @@
     private DeviceStore deviceStore;
 
     private DeviceClockManager deviceClockManager;
-    private DeviceClockService clockService;
+    private ClockService clockService;
 
     @BeforeClass
     public static void setUpBeforeClass() throws Exception {
@@ -113,8 +113,8 @@
         deviceClockManager.activate();
         clockService = deviceClockManager;
 
-        deviceClockManager.setDeviceMastershipTerm(DID1, DeviceMastershipTerm.of(MYSELF, 1));
-        deviceClockManager.setDeviceMastershipTerm(DID2, DeviceMastershipTerm.of(MYSELF, 2));
+        deviceClockManager.setMastershipTerm(DID1, DeviceMastershipTerm.of(MYSELF, 1));
+        deviceClockManager.setMastershipTerm(DID2, DeviceMastershipTerm.of(MYSELF, 2));
 
         ClusterCommunicationService clusterCommunicator = new TestClusterCommunicationService();
         ClusterService clusterService = new TestClusterService();
@@ -556,7 +556,7 @@
     private static final class TestGossipDeviceStore extends GossipDeviceStore {
 
         public TestGossipDeviceStore(
-                DeviceClockService clockService,
+                ClockService clockService,
                 ClusterService clusterService,
                 ClusterCommunicationService clusterCommunicator) {
             this.clockService = clockService;
diff --git a/core/store/hz/cluster/src/main/java/org/onlab/onos/store/cluster/impl/DistributedDeviceMastershipStore.java b/core/store/hz/cluster/src/main/java/org/onlab/onos/store/cluster/impl/DistributedDeviceMastershipStore.java
index f9f0381..cdcf84b 100644
--- a/core/store/hz/cluster/src/main/java/org/onlab/onos/store/cluster/impl/DistributedDeviceMastershipStore.java
+++ b/core/store/hz/cluster/src/main/java/org/onlab/onos/store/cluster/impl/DistributedDeviceMastershipStore.java
@@ -14,8 +14,8 @@
 import org.onlab.onos.cluster.ClusterService;
 import org.onlab.onos.cluster.NodeId;
 import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.net.device.DeviceMastershipEvent;
-import org.onlab.onos.net.device.DeviceMastershipRole;
 import org.onlab.onos.net.device.DeviceMastershipStore;
 import org.onlab.onos.net.device.DeviceMastershipStoreDelegate;
 import org.onlab.onos.net.device.DeviceMastershipTerm;
@@ -76,7 +76,7 @@
     }
 
     @Override
-    public DeviceMastershipRole getRole(NodeId nodeId, DeviceId deviceId) {
+    public MastershipRole getRole(NodeId nodeId, DeviceId deviceId) {
         byte[] did = serialize(deviceId);
         byte[] nid = serialize(nodeId);
 
@@ -84,17 +84,17 @@
         if (current == null) {
             if (standbys.containsEntry(did, nid)) {
                 //was previously standby, or set to standby from master
-                return DeviceMastershipRole.STANDBY;
+                return MastershipRole.STANDBY;
             } else {
-                return DeviceMastershipRole.NONE;
+                return MastershipRole.NONE;
             }
         } else {
             if (current.equals(nodeId)) {
                 //*should* be in unusable, not always
-                return DeviceMastershipRole.MASTER;
+                return MastershipRole.MASTER;
             } else {
                 //may be in backups or unusable from earlier retirement
-                return DeviceMastershipRole.STANDBY;
+                return MastershipRole.STANDBY;
             }
         }
     }
@@ -107,7 +107,7 @@
         ILock lock = theInstance.getLock(LOCK);
         lock.lock();
         try {
-            DeviceMastershipRole role = getRole(nodeId, deviceId);
+            MastershipRole role = getRole(nodeId, deviceId);
             switch (role) {
                 case MASTER:
                     //reinforce mastership
@@ -157,7 +157,7 @@
     }
 
     @Override
-    public DeviceMastershipRole requestRole(DeviceId deviceId) {
+    public MastershipRole requestRole(DeviceId deviceId) {
         NodeId local = clusterService.getLocalNode().id();
         byte [] did = serialize(deviceId);
         byte [] lnid = serialize(local);
@@ -165,7 +165,7 @@
         ILock lock = theInstance.getLock(LOCK);
         lock.lock();
         try {
-            DeviceMastershipRole role = getRole(local, deviceId);
+            MastershipRole role = getRole(local, deviceId);
             switch (role) {
                 case MASTER:
                     evict(lnid, did);
@@ -179,7 +179,7 @@
                     masters.put(did, lnid);
                     evict(lnid, did);
                     updateTerm(did);
-                    role = DeviceMastershipRole.MASTER;
+                    role = MastershipRole.MASTER;
                     break;
                 default:
                     log.warn("unknown Mastership Role {}", role);
@@ -210,7 +210,7 @@
         ILock lock = theInstance.getLock(LOCK);
         lock.lock();
         try {
-            DeviceMastershipRole role = getRole(nodeId, deviceId);
+            MastershipRole role = getRole(nodeId, deviceId);
             switch (role) {
                 case MASTER:
                     event = reelect(nodeId, deviceId);
@@ -239,7 +239,7 @@
         ILock lock = theInstance.getLock(LOCK);
         lock.lock();
         try {
-            DeviceMastershipRole role = getRole(nodeId, deviceId);
+            MastershipRole role = getRole(nodeId, deviceId);
             switch (role) {
                 case MASTER:
                     event = reelect(nodeId, deviceId);
diff --git a/core/store/hz/cluster/src/test/java/org/onlab/onos/store/cluster/impl/DistributedDeviceMastershipStoreTest.java b/core/store/hz/cluster/src/test/java/org/onlab/onos/store/cluster/impl/DistributedDeviceMastershipStoreTest.java
index d1b9407..d993250 100644
--- a/core/store/hz/cluster/src/test/java/org/onlab/onos/store/cluster/impl/DistributedDeviceMastershipStoreTest.java
+++ b/core/store/hz/cluster/src/test/java/org/onlab/onos/store/cluster/impl/DistributedDeviceMastershipStoreTest.java
@@ -3,7 +3,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
-import static org.onlab.onos.net.device.DeviceMastershipRole.*;
+import static org.onlab.onos.net.MastershipRole.*;
 
 import java.util.Map;
 import java.util.Set;
diff --git a/core/store/hz/net/src/main/java/org/onlab/onos/store/device/impl/NoOpClockProviderService.java b/core/store/hz/net/src/main/java/org/onlab/onos/store/device/impl/NoOpClockProviderService.java
index 018fca6..729b01e 100644
--- a/core/store/hz/net/src/main/java/org/onlab/onos/store/device/impl/NoOpClockProviderService.java
+++ b/core/store/hz/net/src/main/java/org/onlab/onos/store/device/impl/NoOpClockProviderService.java
@@ -3,18 +3,18 @@
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.onos.net.DeviceId;
-import org.onlab.onos.net.device.DeviceClockProviderService;
 import org.onlab.onos.net.device.DeviceMastershipTerm;
+import org.onlab.onos.store.ClockProviderService;
 
 // FIXME: Code clone in onos-core-trivial, onos-core-hz-net
 /**
- * Dummy implementation of {@link DeviceClockProviderService}.
+ * Dummy implementation of {@link ClockProviderService}.
  */
 @Component(immediate = true)
 @Service
-public class NoOpClockProviderService implements DeviceClockProviderService {
+public class NoOpClockProviderService implements ClockProviderService {
 
     @Override
-    public void setDeviceMastershipTerm(DeviceId deviceId, DeviceMastershipTerm term) {
+    public void setMastershipTerm(DeviceId deviceId, DeviceMastershipTerm term) {
     }
 }
diff --git a/core/store/serializers/src/main/java/org/onlab/onos/store/serializers/KryoPoolUtil.java b/core/store/serializers/src/main/java/org/onlab/onos/store/serializers/KryoPoolUtil.java
index c32c04a..5676cb6 100644
--- a/core/store/serializers/src/main/java/org/onlab/onos/store/serializers/KryoPoolUtil.java
+++ b/core/store/serializers/src/main/java/org/onlab/onos/store/serializers/KryoPoolUtil.java
@@ -18,11 +18,11 @@
 import org.onlab.onos.net.Element;
 import org.onlab.onos.net.Link;
 import org.onlab.onos.net.LinkKey;
+import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.net.Port;
 import org.onlab.onos.net.PortNumber;
 import org.onlab.onos.net.device.DefaultDeviceDescription;
 import org.onlab.onos.net.device.DefaultPortDescription;
-import org.onlab.onos.net.device.DeviceMastershipRole;
 import org.onlab.onos.net.device.DeviceMastershipTerm;
 import org.onlab.onos.net.provider.ProviderId;
 import org.onlab.packet.IpAddress;
@@ -59,7 +59,7 @@
                     DefaultControllerNode.class,
                     DefaultDevice.class,
                     DefaultDeviceDescription.class,
-                    DeviceMastershipRole.class,
+                    MastershipRole.class,
                     Port.class,
                     DefaultPortDescription.class,
                     Element.class,
@@ -75,7 +75,7 @@
             .register(ConnectPoint.class, new ConnectPointSerializer())
             .register(DefaultLink.class, new DefaultLinkSerializer())
             .register(DeviceMastershipTerm.class, new MastershipTermSerializer())
-            .register(DeviceMastershipRole.class, new MastershipRoleSerializer())
+            .register(MastershipRole.class, new MastershipRoleSerializer())
 
             .build();
 
diff --git a/core/store/serializers/src/main/java/org/onlab/onos/store/serializers/MastershipRoleSerializer.java b/core/store/serializers/src/main/java/org/onlab/onos/store/serializers/MastershipRoleSerializer.java
index f94441e..dab5aa8 100644
--- a/core/store/serializers/src/main/java/org/onlab/onos/store/serializers/MastershipRoleSerializer.java
+++ b/core/store/serializers/src/main/java/org/onlab/onos/store/serializers/MastershipRoleSerializer.java
@@ -1,6 +1,6 @@
 package org.onlab.onos.store.serializers;
 
-import org.onlab.onos.net.device.DeviceMastershipRole;
+import org.onlab.onos.net.MastershipRole;
 
 import com.esotericsoftware.kryo.Kryo;
 import com.esotericsoftware.kryo.Serializer;
@@ -8,12 +8,12 @@
 import com.esotericsoftware.kryo.io.Output;
 
 /**
- * Kryo Serializer for {@link org.onlab.onos.net.device.DeviceMastershipRole}.
+ * Kryo Serializer for {@link org.onlab.onos.net.MastershipRole}.
  */
-public class MastershipRoleSerializer extends Serializer<DeviceMastershipRole> {
+public class MastershipRoleSerializer extends Serializer<MastershipRole> {
 
     /**
-     * Creates {@link DeviceMastershipRole} serializer instance.
+     * Creates {@link MastershipRole} serializer instance.
      */
     public MastershipRoleSerializer() {
         // non-null, immutable
@@ -21,13 +21,13 @@
     }
 
     @Override
-    public DeviceMastershipRole read(Kryo kryo, Input input, Class<DeviceMastershipRole> type) {
+    public MastershipRole read(Kryo kryo, Input input, Class<MastershipRole> type) {
         final String role = kryo.readObject(input, String.class);
-        return DeviceMastershipRole.valueOf(role);
+        return MastershipRole.valueOf(role);
     }
 
     @Override
-    public void write(Kryo kryo, Output output, DeviceMastershipRole object) {
+    public void write(Kryo kryo, Output output, MastershipRole object) {
         kryo.writeObject(output, object.toString());
     }
 
diff --git a/core/store/serializers/src/test/java/org/onlab/onos/store/serializers/KryoSerializerTest.java b/core/store/serializers/src/test/java/org/onlab/onos/store/serializers/KryoSerializerTest.java
index 6d5b31d..ab9e012 100644
--- a/core/store/serializers/src/test/java/org/onlab/onos/store/serializers/KryoSerializerTest.java
+++ b/core/store/serializers/src/test/java/org/onlab/onos/store/serializers/KryoSerializerTest.java
@@ -21,9 +21,9 @@
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.Link;
 import org.onlab.onos.net.LinkKey;
+import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.net.PortNumber;
 import org.onlab.onos.net.SparseAnnotations;
-import org.onlab.onos.net.device.DeviceMastershipRole;
 import org.onlab.onos.net.device.DeviceMastershipTerm;
 import org.onlab.onos.net.provider.ProviderId;
 import org.onlab.packet.IpAddress;
@@ -115,7 +115,7 @@
         testSerialized(PIDA);
         testSerialized(new NodeId("bar"));
         testSerialized(DeviceMastershipTerm.of(new NodeId("foo"), 2));
-        for (DeviceMastershipRole role : DeviceMastershipRole.values()) {
+        for (MastershipRole role : MastershipRole.values()) {
             testSerialized(role);
         }
     }
diff --git a/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/NoOpClockProviderService.java b/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/NoOpClockProviderService.java
index afef76d..5f3c2ef 100644
--- a/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/NoOpClockProviderService.java
+++ b/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/NoOpClockProviderService.java
@@ -3,18 +3,18 @@
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.onos.net.DeviceId;
-import org.onlab.onos.net.device.DeviceClockProviderService;
 import org.onlab.onos.net.device.DeviceMastershipTerm;
+import org.onlab.onos.store.ClockProviderService;
 
 //FIXME: Code clone in onos-core-trivial, onos-core-hz-net
 /**
- * Dummy implementation of {@link DeviceClockProviderService}.
+ * Dummy implementation of {@link ClockProviderService}.
  */
 @Component(immediate = true)
 @Service
-public class NoOpClockProviderService implements DeviceClockProviderService {
+public class NoOpClockProviderService implements ClockProviderService {
 
     @Override
-    public void setDeviceMastershipTerm(DeviceId deviceId, DeviceMastershipTerm term) {
+    public void setMastershipTerm(DeviceId deviceId, DeviceMastershipTerm term) {
     }
 }
diff --git a/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/SimpleMastershipStore.java b/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/SimpleMastershipStore.java
index 38ca2ee..7f88edb 100644
--- a/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/SimpleMastershipStore.java
+++ b/core/store/trivial/src/main/java/org/onlab/onos/store/trivial/impl/SimpleMastershipStore.java
@@ -17,8 +17,8 @@
 import org.onlab.onos.cluster.DefaultControllerNode;
 import org.onlab.onos.cluster.NodeId;
 import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.net.device.DeviceMastershipEvent;
-import org.onlab.onos.net.device.DeviceMastershipRole;
 import org.onlab.onos.net.device.DeviceMastershipStore;
 import org.onlab.onos.net.device.DeviceMastershipStoreDelegate;
 import org.onlab.onos.net.device.DeviceMastershipTerm;
@@ -64,7 +64,7 @@
 
     @Override
     public DeviceMastershipEvent setMaster(NodeId nodeId, DeviceId deviceId) {
-        DeviceMastershipRole role = getRole(nodeId, deviceId);
+        MastershipRole role = getRole(nodeId, deviceId);
 
         synchronized (this) {
             switch (role) {
@@ -106,10 +106,10 @@
     }
 
     @Override
-    public DeviceMastershipRole requestRole(DeviceId deviceId) {
+    public MastershipRole requestRole(DeviceId deviceId) {
         //query+possible reelection
         NodeId node = instance.id();
-        DeviceMastershipRole role = getRole(node, deviceId);
+        MastershipRole role = getRole(node, deviceId);
 
         switch (role) {
             case MASTER:
@@ -121,7 +121,7 @@
                     if (rel == null) {
                         masterMap.put(deviceId, node);
                         termMap.put(deviceId, new AtomicInteger());
-                        role = DeviceMastershipRole.MASTER;
+                        role = MastershipRole.MASTER;
                     }
                     backups.add(node);
                 }
@@ -132,7 +132,7 @@
                     masterMap.put(deviceId, node);
                     termMap.put(deviceId, new AtomicInteger());
                     backups.add(node);
-                    role = DeviceMastershipRole.MASTER;
+                    role = MastershipRole.MASTER;
                 }
                 break;
             default:
@@ -142,22 +142,22 @@
     }
 
     @Override
-    public DeviceMastershipRole getRole(NodeId nodeId, DeviceId deviceId) {
+    public MastershipRole getRole(NodeId nodeId, DeviceId deviceId) {
         //just query
         NodeId current = masterMap.get(deviceId);
-        DeviceMastershipRole role;
+        MastershipRole role;
 
         if (current == null) {
             if (backups.contains(nodeId)) {
-                role = DeviceMastershipRole.STANDBY;
+                role = MastershipRole.STANDBY;
             } else {
-                role = DeviceMastershipRole.NONE;
+                role = MastershipRole.NONE;
             }
         } else {
             if (current.equals(nodeId)) {
-                role = DeviceMastershipRole.MASTER;
+                role = MastershipRole.MASTER;
             } else {
-                role = DeviceMastershipRole.STANDBY;
+                role = MastershipRole.STANDBY;
             }
         }
         return role;
@@ -175,7 +175,7 @@
 
     @Override
     public DeviceMastershipEvent setStandby(NodeId nodeId, DeviceId deviceId) {
-        DeviceMastershipRole role = getRole(nodeId, deviceId);
+        MastershipRole role = getRole(nodeId, deviceId);
         synchronized (this) {
             switch (role) {
                 case MASTER:
diff --git a/core/store/trivial/src/test/java/org/onlab/onos/store/trivial/impl/SimpleMastershipStoreTest.java b/core/store/trivial/src/test/java/org/onlab/onos/store/trivial/impl/SimpleMastershipStoreTest.java
index a1cc132..d3430ca 100644
--- a/core/store/trivial/src/test/java/org/onlab/onos/store/trivial/impl/SimpleMastershipStoreTest.java
+++ b/core/store/trivial/src/test/java/org/onlab/onos/store/trivial/impl/SimpleMastershipStoreTest.java
@@ -15,8 +15,8 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
+import static org.onlab.onos.net.MastershipRole.*;
 import static org.onlab.onos.net.device.DeviceMastershipEvent.Type.*;
-import static org.onlab.onos.net.device.DeviceMastershipRole.*;
 
 /**
  * Test for the simple MastershipStore implementation.
diff --git a/providers/openflow/device/src/main/java/org/onlab/onos/provider/of/device/impl/OpenFlowDeviceProvider.java b/providers/openflow/device/src/main/java/org/onlab/onos/provider/of/device/impl/OpenFlowDeviceProvider.java
index 1f20162..8958fb6 100644
--- a/providers/openflow/device/src/main/java/org/onlab/onos/provider/of/device/impl/OpenFlowDeviceProvider.java
+++ b/providers/openflow/device/src/main/java/org/onlab/onos/provider/of/device/impl/OpenFlowDeviceProvider.java
@@ -7,11 +7,11 @@
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.onlab.onos.net.Device;
 import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.net.PortNumber;
 import org.onlab.onos.net.device.DefaultDeviceDescription;
 import org.onlab.onos.net.device.DefaultPortDescription;
 import org.onlab.onos.net.device.DeviceDescription;
-import org.onlab.onos.net.device.DeviceMastershipRole;
 import org.onlab.onos.net.device.DeviceProvider;
 import org.onlab.onos.net.device.DeviceProviderRegistry;
 import org.onlab.onos.net.device.DeviceProviderService;
@@ -91,7 +91,7 @@
     }
 
     @Override
-    public void roleChanged(Device device, DeviceMastershipRole newRole) {
+    public void roleChanged(Device device, MastershipRole newRole) {
         switch (newRole) {
             case MASTER:
                 controller.setRole(dpid(device.id().uri()), RoleState.MASTER);
@@ -144,16 +144,16 @@
 
         @Override
         public void roleAssertFailed(Dpid dpid, RoleState role) {
-            DeviceMastershipRole failed;
+            MastershipRole failed;
             switch (role) {
                 case MASTER:
-                    failed = DeviceMastershipRole.MASTER;
+                    failed = MastershipRole.MASTER;
                     break;
                 case EQUAL:
-                    failed = DeviceMastershipRole.STANDBY;
+                    failed = MastershipRole.STANDBY;
                     break;
                 case SLAVE:
-                    failed = DeviceMastershipRole.NONE;
+                    failed = MastershipRole.NONE;
                     break;
                 default:
                     LOG.warn("unknown role {}", role);
diff --git a/providers/openflow/device/src/test/java/org/onlab/onos/provider/of/device/impl/OpenFlowDeviceProviderTest.java b/providers/openflow/device/src/test/java/org/onlab/onos/provider/of/device/impl/OpenFlowDeviceProviderTest.java
index 564abf2..8196cb8 100644
--- a/providers/openflow/device/src/test/java/org/onlab/onos/provider/of/device/impl/OpenFlowDeviceProviderTest.java
+++ b/providers/openflow/device/src/test/java/org/onlab/onos/provider/of/device/impl/OpenFlowDeviceProviderTest.java
@@ -5,7 +5,7 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.onlab.onos.net.Device.Type.*;
-import static org.onlab.onos.net.device.DeviceMastershipRole.*;
+import static org.onlab.onos.net.MastershipRole.*;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -20,8 +20,8 @@
 import org.onlab.onos.net.DefaultDevice;
 import org.onlab.onos.net.Device;
 import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.net.device.DeviceDescription;
-import org.onlab.onos.net.device.DeviceMastershipRole;
 import org.onlab.onos.net.device.DeviceProvider;
 import org.onlab.onos.net.device.DeviceProviderRegistry;
 import org.onlab.onos.net.device.DeviceProviderService;
@@ -143,7 +143,7 @@
         Set<DeviceId> connected = new HashSet<>();
         Multimap<DeviceId, PortDescription> ports = HashMultimap.create();
         PortDescription descr = null;
-        Map<DeviceMastershipRole, Dpid> roles = new HashMap<>();
+        Map<MastershipRole, Dpid> roles = new HashMap<>();
 
         @Override
         public DeviceProviderService register(DeviceProvider provider) {
@@ -195,7 +195,7 @@
             }
 
             @Override
-            public void unableToAssertRole(DeviceId deviceId, DeviceMastershipRole role) {
+            public void unableToAssertRole(DeviceId deviceId, MastershipRole role) {
                 roles.put(role, Dpid.dpid(deviceId.uri()));
             }