Merge remote-tracking branch 'origin/master'
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 3418aa0..032fb05 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);
-        MastershipRole mastershipRole = MastershipRole.valueOf(role.toUpperCase());
+        DeviceMastershipRole mastershipRole = DeviceMastershipRole.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 b540fca..4319e19 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.MastershipRole;
+import org.onlab.onos.net.device.DeviceMastershipRole;
 
 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(MastershipRole.MASTER.toString().toLowerCase());
-        strings.add(MastershipRole.STANDBY.toString().toLowerCase());
-        strings.add(MastershipRole.NONE.toString().toLowerCase());
+        strings.add(DeviceMastershipRole.MASTER.toString().toLowerCase());
+        strings.add(DeviceMastershipRole.STANDBY.toString().toLowerCase());
+        strings.add(DeviceMastershipRole.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/store/ClockProviderService.java b/core/api/src/main/java/org/onlab/onos/net/device/DeviceClockProviderService.java
similarity index 64%
rename from core/api/src/main/java/org/onlab/onos/store/ClockProviderService.java
rename to core/api/src/main/java/org/onlab/onos/net/device/DeviceClockProviderService.java
index fff6d15..6ef480d 100644
--- a/core/api/src/main/java/org/onlab/onos/store/ClockProviderService.java
+++ b/core/api/src/main/java/org/onlab/onos/net/device/DeviceClockProviderService.java
@@ -1,14 +1,13 @@
-package org.onlab.onos.store;
+package org.onlab.onos.net.device;
 
 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 ClockProviderService {
+public interface DeviceClockProviderService {
 
     /**
      * Updates the mastership term for the specified deviceId.
@@ -16,5 +15,5 @@
      * @param deviceId device identifier.
      * @param term mastership term.
      */
-    public void setMastershipTerm(DeviceId deviceId, DeviceMastershipTerm term);
+    public void setDeviceMastershipTerm(DeviceId deviceId, DeviceMastershipTerm term);
 }
diff --git a/core/api/src/main/java/org/onlab/onos/store/ClockService.java b/core/api/src/main/java/org/onlab/onos/net/device/DeviceClockService.java
similarity index 83%
rename from core/api/src/main/java/org/onlab/onos/store/ClockService.java
rename to core/api/src/main/java/org/onlab/onos/net/device/DeviceClockService.java
index 20549e8..b979db2 100644
--- a/core/api/src/main/java/org/onlab/onos/store/ClockService.java
+++ b/core/api/src/main/java/org/onlab/onos/net/device/DeviceClockService.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.store;
+package org.onlab.onos.net.device;
 
 import org.onlab.onos.net.DeviceId;
 
@@ -6,7 +6,7 @@
 /**
  * Interface for a logical clock service that vends per device timestamps.
  */
-public interface ClockService {
+public interface DeviceClockService {
 
     /**
      * Returns a new timestamp for the specified deviceId.
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 78c9c39..3d31f37 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,7 +2,6 @@
 
 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.
@@ -16,6 +15,6 @@
      * @param deviceId device identifier
      * @param role     requested role
      */
-    void setRole(NodeId instance, DeviceId deviceId, MastershipRole role);
+    void setRole(NodeId instance, DeviceId deviceId, DeviceMastershipRole role);
 
 }
diff --git a/core/api/src/main/java/org/onlab/onos/net/MastershipRole.java b/core/api/src/main/java/org/onlab/onos/net/device/DeviceMastershipRole.java
similarity index 89%
rename from core/api/src/main/java/org/onlab/onos/net/MastershipRole.java
rename to core/api/src/main/java/org/onlab/onos/net/device/DeviceMastershipRole.java
index 10d53ad..89bdc59 100644
--- a/core/api/src/main/java/org/onlab/onos/net/MastershipRole.java
+++ b/core/api/src/main/java/org/onlab/onos/net/device/DeviceMastershipRole.java
@@ -1,10 +1,10 @@
-package org.onlab.onos.net;
+package org.onlab.onos.net.device;
 
 /**
  * Representation of a relationship role of a controller instance to a device
  * or a region of network environment.
  */
-public enum MastershipRole {
+public enum DeviceMastershipRole {
 
     /**
      * Represents a relationship where the controller instance is the master
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 a44abfd..18683ea 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,7 +4,6 @@
 
 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
@@ -21,7 +20,7 @@
      * @param deviceId the the identifier of the device
      * @return role of the current node
      */
-    MastershipRole getLocalRole(DeviceId deviceId);
+    DeviceMastershipRole getLocalRole(DeviceId deviceId);
 
     /**
      * Returns the mastership status of the local controller for a given
@@ -30,7 +29,7 @@
      * @param deviceId the the identifier of the device
      * @return the role of this controller instance
      */
-    MastershipRole requestRoleFor(DeviceId deviceId);
+    DeviceMastershipRole 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 ee9b253..9c1b3e6 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,7 +4,6 @@
 
 import org.onlab.onos.cluster.NodeId;
 import org.onlab.onos.net.DeviceId;
-import org.onlab.onos.net.MastershipRole;
 import org.onlab.onos.store.Store;
 
 /**
@@ -21,7 +20,7 @@
      * @param deviceId device identifier
      * @return established or newly negotiated mastership role
      */
-    MastershipRole requestRole(DeviceId deviceId);
+    DeviceMastershipRole requestRole(DeviceId deviceId);
 
     /**
      * Returns the role of a device for a specific controller instance.
@@ -30,7 +29,7 @@
      * @param deviceId the device identifiers
      * @return the role
      */
-    MastershipRole getRole(NodeId nodeId, DeviceId deviceId);
+    DeviceMastershipRole 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 9934b8d..9a51a16 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,7 +1,6 @@
 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;
 
 /**
@@ -30,6 +29,6 @@
      * @param device  affected device
      * @param newRole newly determined mastership role
      */
-    void roleChanged(Device device, MastershipRole newRole);
+    void roleChanged(Device device, DeviceMastershipRole 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 d043eca..168b684 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,7 +1,6 @@
 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;
@@ -53,6 +52,6 @@
      * @param deviceId identity of the device
      * @param role mastership role that was asserted but failed
      */
-    void unableToAssertRole(DeviceId deviceId, MastershipRole role);
+    void unableToAssertRole(DeviceId deviceId, DeviceMastershipRole 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 54b9d72..3a6f89b 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,7 +2,6 @@
 
 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;
 
@@ -43,7 +42,7 @@
      * @return designated mastership role
      */
     //XXX do we want this method here when MastershipService already does?
-    MastershipRole getRole(DeviceId deviceId);
+    DeviceMastershipRole getRole(DeviceId deviceId);
 
 
     /**
diff --git a/core/api/src/main/java/org/onlab/onos/store/Timestamp.java b/core/api/src/main/java/org/onlab/onos/net/device/Timestamp.java
similarity index 90%
rename from core/api/src/main/java/org/onlab/onos/store/Timestamp.java
rename to core/api/src/main/java/org/onlab/onos/net/device/Timestamp.java
index b3caf85..8acf16c 100644
--- a/core/api/src/main/java/org/onlab/onos/store/Timestamp.java
+++ b/core/api/src/main/java/org/onlab/onos/net/device/Timestamp.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.store;
+package org.onlab.onos.net.device;
 
 /**
  * Opaque version structure.
diff --git a/core/api/src/main/java/org/onlab/onos/store/Timestamped.java b/core/api/src/main/java/org/onlab/onos/net/device/Timestamped.java
similarity index 97%
rename from core/api/src/main/java/org/onlab/onos/store/Timestamped.java
rename to core/api/src/main/java/org/onlab/onos/net/device/Timestamped.java
index 9de7b0d..9d3549a 100644
--- a/core/api/src/main/java/org/onlab/onos/store/Timestamped.java
+++ b/core/api/src/main/java/org/onlab/onos/net/device/Timestamped.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.store;
+package org.onlab.onos.net.device;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
diff --git a/core/api/src/main/java/org/onlab/onos/store/VersionedValue.java b/core/api/src/main/java/org/onlab/onos/net/device/VersionedValue.java
similarity index 97%
rename from core/api/src/main/java/org/onlab/onos/store/VersionedValue.java
rename to core/api/src/main/java/org/onlab/onos/net/device/VersionedValue.java
index 70602f6..f0233ef 100644
--- a/core/api/src/main/java/org/onlab/onos/store/VersionedValue.java
+++ b/core/api/src/main/java/org/onlab/onos/net/device/VersionedValue.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.store;
+package org.onlab.onos.net.device;
 
 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 53fafd3..c30ee3e 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 MastershipRole getLocalRole(DeviceId deviceId) {
+    public DeviceMastershipRole getLocalRole(DeviceId deviceId) {
         return null;
     }
 
     @Override
-    public MastershipRole requestRoleFor(DeviceId deviceId) {
+    public DeviceMastershipRole 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 bfb28f6..aef5786 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,7 +2,6 @@
 
 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;
 
@@ -28,7 +27,7 @@
     }
 
     @Override
-    public MastershipRole getRole(DeviceId deviceId) {
+    public DeviceMastershipRole 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 b9c6ae8..7637478 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, MastershipRole role) {
+    public void setRole(NodeId nodeId, DeviceId deviceId, DeviceMastershipRole role) {
         checkNotNull(nodeId, NODE_ID_NULL);
         checkNotNull(deviceId, DEVICE_ID_NULL);
         checkNotNull(role, ROLE_NULL);
 
         DeviceMastershipEvent event = null;
-        if (role.equals(MastershipRole.MASTER)) {
+        if (role.equals(DeviceMastershipRole.MASTER)) {
             event = store.setMaster(nodeId, deviceId);
         } else {
             event = store.setStandby(nodeId, deviceId);
@@ -91,7 +91,7 @@
     }
 
     @Override
-    public MastershipRole getLocalRole(DeviceId deviceId) {
+    public DeviceMastershipRole getLocalRole(DeviceId deviceId) {
         checkNotNull(deviceId, DEVICE_ID_NULL);
         return store.getRole(clusterService.getLocalNode().id(), deviceId);
     }
@@ -108,7 +108,7 @@
     }
 
     @Override
-    public MastershipRole requestRoleFor(DeviceId deviceId) {
+    public DeviceMastershipRole 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 d4b8889..741ebf3 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,13 +18,14 @@
 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;
@@ -39,7 +40,6 @@
 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 ClockProviderService clockProviderService;
+    protected DeviceClockProviderService clockProviderService;
 
     @Activate
     public void activate() {
@@ -117,7 +117,7 @@
     }
 
     @Override
-    public MastershipRole getRole(DeviceId deviceId) {
+    public DeviceMastershipRole 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, MastershipRole newRole) {
-        if (newRole.equals(MastershipRole.NONE)) {
+    private void applyRole(DeviceId deviceId, DeviceMastershipRole newRole) {
+        if (newRole.equals(DeviceMastershipRole.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
-            MastershipRole role = mastershipService.requestRoleFor(deviceId);
+            DeviceMastershipRole role = mastershipService.requestRoleFor(deviceId);
 
-            if (role != MastershipRole.MASTER) {
+            if (role != DeviceMastershipRole.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.setMastershipTerm(deviceId, term);
+            clockProviderService.setDeviceMastershipTerm(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(MastershipRole.MASTER)) {
+            if (!mastershipService.getLocalRole(deviceId).equals(DeviceMastershipRole.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, MastershipRole role) {
+        public void unableToAssertRole(DeviceId deviceId, DeviceMastershipRole role) {
             // FIXME: implement response to this notification
             log.warn("Failed to assert role [{}] onto Device {}", role,
                     deviceId);
-            if (role == MastershipRole.MASTER) {
+            if (role == DeviceMastershipRole.MASTER) {
                 mastershipService.relinquishMastership(deviceId);
             }
         }
@@ -333,16 +333,16 @@
 
                     if (term.master().equals(myNodeId)) {
                         // only set the new term if I am the master
-                        clockProviderService.setMastershipTerm(did, term);
+                        clockProviderService.setDeviceMastershipTerm(did, term);
                     }
-                    applyRole(did, MastershipRole.MASTER);
+                    applyRole(did, DeviceMastershipRole.MASTER);
                 } else {
-                    applyRole(did, MastershipRole.STANDBY);
+                    applyRole(did, DeviceMastershipRole.STANDBY);
                 }
             } else {
                 //device dead to node, give up
                 mastershipService.relinquishMastership(did);
-                applyRole(did, MastershipRole.STANDBY);
+                applyRole(did, DeviceMastershipRole.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 84ca891..d4cabba 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.MastershipRole.*;
+import static org.onlab.onos.net.device.DeviceMastershipRole.*;
 
 /**
  * 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 bc4e353..0dc77e1 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,15 +17,16 @@
 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;
@@ -35,7 +36,6 @@
 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", MastershipRole.MASTER, service.getRole(DID1));
+        assertEquals("incorrect role", DeviceMastershipRole.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", MastershipRole.STANDBY, service.getRole(DID1));
+        assertEquals("incorrect role", DeviceMastershipRole.STANDBY, service.getRole(DID1));
         assertEquals("incorrect device", DID1, provider.deviceReceived.id());
-        assertEquals("incorrect role", MastershipRole.STANDBY, provider.roleReceived);
+        assertEquals("incorrect role", DeviceMastershipRole.STANDBY, provider.roleReceived);
     }
 
     @Test
@@ -246,7 +246,7 @@
 
     private class TestProvider extends AbstractProvider implements DeviceProvider {
         private Device deviceReceived;
-        private MastershipRole roleReceived;
+        private DeviceMastershipRole roleReceived;
 
         public TestProvider() {
             super(PID);
@@ -257,7 +257,7 @@
         }
 
         @Override
-        public void roleChanged(Device device, MastershipRole newRole) {
+        public void roleChanged(Device device, DeviceMastershipRole newRole) {
             deviceReceived = device;
             roleReceived = newRole;
         }
@@ -275,8 +275,8 @@
     private static class TestMastershipService
             extends MastershipServiceAdapter {
         @Override
-        public MastershipRole getLocalRole(DeviceId deviceId) {
-            return MastershipRole.MASTER;
+        public DeviceMastershipRole getLocalRole(DeviceId deviceId) {
+            return DeviceMastershipRole.MASTER;
         }
 
         @Override
@@ -285,8 +285,8 @@
         }
 
         @Override
-        public MastershipRole requestRoleFor(DeviceId deviceId) {
-            return MastershipRole.MASTER;
+        public DeviceMastershipRole requestRoleFor(DeviceId deviceId) {
+            return DeviceMastershipRole.MASTER;
         }
 
         @Override
@@ -336,10 +336,10 @@
     }
 
     private final class TestClockProviderService implements
-            ClockProviderService {
+            DeviceClockProviderService {
 
         @Override
-        public void setMastershipTerm(DeviceId deviceId, DeviceMastershipTerm term) {
+        public void setDeviceMastershipTerm(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 fb579ea..d8b3160 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 MastershipRole getRole(DeviceId deviceId) {
+        public DeviceMastershipRole 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 d8ddfbe..7191a8f 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 MastershipRole getRole(DeviceId deviceId) {
+        public DeviceMastershipRole 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 1d52ba3..927278a 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,6 +1,7 @@
 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;
@@ -9,7 +10,6 @@
 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,6 +22,7 @@
 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;
 
@@ -243,7 +244,7 @@
 
     private class TestProvider extends AbstractProvider implements LinkProvider {
         private Device deviceReceived;
-        private MastershipRole roleReceived;
+        private DeviceMastershipRole 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 74c22f1..aa0dc83 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 b82a835..2ad2666 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.DefaultControllerNode;
+import org.onlab.onos.cluster.ControllerNode;
 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
      */
-    DefaultControllerNode nodeDetected(NodeId nodeId, IpPrefix ip, int tcpPort);
+    ControllerNode 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 5e64a39..9433130 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,9 +1,5 @@
 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;
@@ -18,8 +14,16 @@
 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.impl.ClusterCommunicationManager;
+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.packet.IpPrefix;
+import org.onlab.util.KryoPool;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -27,7 +31,6 @@
 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;
@@ -43,17 +46,33 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private DefaultControllerNode localNode;
-    private final Map<NodeId, DefaultControllerNode> nodes = new ConcurrentHashMap<>();
+    private ControllerNode localNode;
+    private final Map<NodeId, ControllerNode> nodes = new ConcurrentHashMap<>();
     private final Map<NodeId, State> states = new ConcurrentHashMap<>();
-    private final Cache<NodeId, ControllerNode> livenessCache = CacheBuilder.newBuilder()
-            .maximumSize(1000)
-            .expireAfterWrite(ClusterCommunicationManager.HEART_BEAT_INTERVAL_MILLIS * 3, TimeUnit.MILLISECONDS)
-            .removalListener(new LivenessCacheRemovalListener()).build();
+
+    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);
+        }
+    };
 
     @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
@@ -61,10 +80,15 @@
         loadClusterDefinition();
         establishSelfIdentity();
 
-        // Start-up the comm service and prime it with the loaded nodes.
-        clusterCommunicationAdminService.initialize(localNode, nodesDelegate);
-        for (DefaultControllerNode node : nodes.values()) {
-            clusterCommunicationAdminService.addNode(node);
+        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);
         }
         log.info("Started");
     }
@@ -130,22 +154,78 @@
     @Override
     public ControllerNode addNode(NodeId nodeId, IpPrefix ip, int tcpPort) {
         DefaultControllerNode node = new DefaultControllerNode(nodeId, ip, tcpPort);
-        nodes.put(nodeId, node);
-        clusterCommunicationAdminService.addNode(node);
+        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);
+        }
+
         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;
 
-        } else {
-            // Remove the other node.
-            DefaultControllerNode node = nodes.remove(nodeId);
-            if (node != null) {
-                clusterCommunicationAdminService.removeNode(node);
+        }
+        // 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());
             }
         }
     }
@@ -153,13 +233,12 @@
     // Entity to handle back calls from the connection manager.
     private class InnerNodesDelegate implements ClusterNodesDelegate {
         @Override
-        public DefaultControllerNode nodeDetected(NodeId nodeId, IpPrefix ip, int tcpPort) {
-            DefaultControllerNode node = nodes.get(nodeId);
+        public ControllerNode nodeDetected(NodeId nodeId, IpPrefix ip, int tcpPort) {
+            ControllerNode node = nodes.get(nodeId);
             if (node == null) {
                 node = (DefaultControllerNode) addNode(nodeId, ip, tcpPort);
             }
             states.put(nodeId, State.ACTIVE);
-            livenessCache.put(nodeId, node);
             return node;
         }
 
@@ -173,14 +252,4 @@
             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 c72fae8..0e6b1b8 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,8 +4,6 @@
 
 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;
@@ -16,10 +14,6 @@
 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;
@@ -38,7 +32,7 @@
 @Component(immediate = true)
 @Service
 public class ClusterCommunicationManager
-        implements ClusterCommunicationService, ClusterCommunicationAdminService {
+        implements ClusterCommunicationService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -47,10 +41,6 @@
     @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;
 
@@ -60,7 +50,6 @@
             serializerPool = KryoPool.newBuilder()
                     .register(KryoPoolUtil.API)
                     .register(ClusterMessage.class, new ClusterMessageSerializer())
-                    .register(ClusterMembershipEvent.class)
                     .register(byte[].class)
                     .register(MessageSubject.class, new MessageSubjectSerializer())
                     .build()
@@ -134,61 +123,6 @@
         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;
@@ -208,4 +142,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 132f27a..5ab3e6f 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.store.Timestamp;
+import org.onlab.onos.net.device.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 46a2333..2a0ef60 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.store.VersionedValue;
+import org.onlab.onos.net.device.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 4bc41ab..30b3db6 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.store.Timestamp;
+import org.onlab.onos.net.device.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 c9f232a..6bb9f01 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.store.Timestamp;
-import org.onlab.onos.store.VersionedValue;
+import org.onlab.onos.net.device.Timestamp;
+import org.onlab.onos.net.device.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 34dc873..4bb9dda 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.store.Timestamp;
-import org.onlab.onos.store.VersionedValue;
+import org.onlab.onos.net.device.Timestamp;
+import org.onlab.onos.net.device.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 6f4fb96..a8d023c 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.store.ClockProviderService;
-import org.onlab.onos.store.ClockService;
-import org.onlab.onos.store.Timestamp;
+import org.onlab.onos.net.device.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 ClockService, ClockProviderService {
+public class DeviceClockManager implements DeviceClockService, DeviceClockProviderService {
 
     private final Logger log = getLogger(getClass());
 
@@ -51,7 +51,7 @@
     }
 
     @Override
-    public void setMastershipTerm(DeviceId deviceId, DeviceMastershipTerm term) {
+    public void setDeviceMastershipTerm(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 06c70a0..ebcbb0c 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 ClockService clockService;
+    protected DeviceClockService 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 1deb5d5..55da310 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 63ddda3..f17a602 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 d8942d6..806a9fb 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.store.Timestamp;
+import org.onlab.onos.net.device.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 7059636..e014cac 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.store.Timestamp;
+import org.onlab.onos.net.device.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 6c8b905..5800583 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.store.Timestamp;
+import org.onlab.onos.net.device.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 ad4e380..b9acb2c 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 ede88f1..a2737b4 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 00f9a9f..07424eb 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 82fbb89..434787c 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 d00d76b..17fbe10 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 ClockService clockService;
+    protected DeviceClockService 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 e63fcaa..c78f78a 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,8 +2,6 @@
 
 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;
@@ -11,12 +9,6 @@
 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.
  */
@@ -33,9 +25,6 @@
     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);
 
@@ -48,15 +37,10 @@
         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
@@ -64,70 +48,4 @@
         ccm1.deactivate();
         ccm2.deactivate();
     }
-
-    @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();
-        }
-    }
-}
+}
\ No newline at end of file
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 2c8ff35..154c2f6 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.store.Timestamp;
+import org.onlab.onos.net.device.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 2a0faa8..9b6c3e6 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.store.Timestamp;
-import org.onlab.onos.store.Timestamped;
+import org.onlab.onos.net.device.Timestamp;
+import org.onlab.onos.net.device.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 d1060cc..a683f91 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,6 +35,7 @@
 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;
@@ -42,7 +43,6 @@
 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 ClockService clockService;
+    private DeviceClockService clockService;
 
     @BeforeClass
     public static void setUpBeforeClass() throws Exception {
@@ -113,8 +113,8 @@
         deviceClockManager.activate();
         clockService = deviceClockManager;
 
-        deviceClockManager.setMastershipTerm(DID1, DeviceMastershipTerm.of(MYSELF, 1));
-        deviceClockManager.setMastershipTerm(DID2, DeviceMastershipTerm.of(MYSELF, 2));
+        deviceClockManager.setDeviceMastershipTerm(DID1, DeviceMastershipTerm.of(MYSELF, 1));
+        deviceClockManager.setDeviceMastershipTerm(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(
-                ClockService clockService,
+                DeviceClockService clockService,
                 ClusterService clusterService,
                 ClusterCommunicationService clusterCommunicator) {
             this.clockService = clockService;
diff --git a/core/store/hz/cluster/src/main/java/org/onlab/onos/store/cluster/impl/DistributedMastershipStore.java b/core/store/hz/cluster/src/main/java/org/onlab/onos/store/cluster/impl/DistributedDeviceMastershipStore.java
similarity index 93%
rename from core/store/hz/cluster/src/main/java/org/onlab/onos/store/cluster/impl/DistributedMastershipStore.java
rename to core/store/hz/cluster/src/main/java/org/onlab/onos/store/cluster/impl/DistributedDeviceMastershipStore.java
index 97e6c1e..f9f0381 100644
--- a/core/store/hz/cluster/src/main/java/org/onlab/onos/store/cluster/impl/DistributedMastershipStore.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;
@@ -32,7 +32,7 @@
  */
 @Component(immediate = true)
 @Service
-public class DistributedMastershipStore
+public class DistributedDeviceMastershipStore
 extends AbstractHazelcastStore<DeviceMastershipEvent, DeviceMastershipStoreDelegate>
 implements DeviceMastershipStore {
 
@@ -76,7 +76,7 @@
     }
 
     @Override
-    public MastershipRole getRole(NodeId nodeId, DeviceId deviceId) {
+    public DeviceMastershipRole 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 MastershipRole.STANDBY;
+                return DeviceMastershipRole.STANDBY;
             } else {
-                return MastershipRole.NONE;
+                return DeviceMastershipRole.NONE;
             }
         } else {
             if (current.equals(nodeId)) {
                 //*should* be in unusable, not always
-                return MastershipRole.MASTER;
+                return DeviceMastershipRole.MASTER;
             } else {
                 //may be in backups or unusable from earlier retirement
-                return MastershipRole.STANDBY;
+                return DeviceMastershipRole.STANDBY;
             }
         }
     }
@@ -107,7 +107,7 @@
         ILock lock = theInstance.getLock(LOCK);
         lock.lock();
         try {
-            MastershipRole role = getRole(nodeId, deviceId);
+            DeviceMastershipRole role = getRole(nodeId, deviceId);
             switch (role) {
                 case MASTER:
                     //reinforce mastership
@@ -157,7 +157,7 @@
     }
 
     @Override
-    public MastershipRole requestRole(DeviceId deviceId) {
+    public DeviceMastershipRole 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 {
-            MastershipRole role = getRole(local, deviceId);
+            DeviceMastershipRole 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 = MastershipRole.MASTER;
+                    role = DeviceMastershipRole.MASTER;
                     break;
                 default:
                     log.warn("unknown Mastership Role {}", role);
@@ -210,7 +210,7 @@
         ILock lock = theInstance.getLock(LOCK);
         lock.lock();
         try {
-            MastershipRole role = getRole(nodeId, deviceId);
+            DeviceMastershipRole role = getRole(nodeId, deviceId);
             switch (role) {
                 case MASTER:
                     event = reelect(nodeId, deviceId);
@@ -239,7 +239,7 @@
         ILock lock = theInstance.getLock(LOCK);
         lock.lock();
         try {
-            MastershipRole role = getRole(nodeId, deviceId);
+            DeviceMastershipRole 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/DistributedMastershipStoreTest.java b/core/store/hz/cluster/src/test/java/org/onlab/onos/store/cluster/impl/DistributedDeviceMastershipStoreTest.java
similarity index 95%
rename from core/store/hz/cluster/src/test/java/org/onlab/onos/store/cluster/impl/DistributedMastershipStoreTest.java
rename to core/store/hz/cluster/src/test/java/org/onlab/onos/store/cluster/impl/DistributedDeviceMastershipStoreTest.java
index 85ee01a..d1b9407 100644
--- a/core/store/hz/cluster/src/test/java/org/onlab/onos/store/cluster/impl/DistributedMastershipStoreTest.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.MastershipRole.*;
+import static org.onlab.onos.net.device.DeviceMastershipRole.*;
 
 import java.util.Map;
 import java.util.Set;
@@ -40,7 +40,7 @@
 /**
  * Test of the Hazelcast-based distributed MastershipStore implementation.
  */
-public class DistributedMastershipStoreTest {
+public class DistributedDeviceMastershipStoreTest {
 
     private static final DeviceId DID1 = DeviceId.deviceId("of:01");
     private static final DeviceId DID2 = DeviceId.deviceId("of:02");
@@ -54,8 +54,8 @@
     private static final ControllerNode CN1 = new DefaultControllerNode(N1, IP);
     private static final ControllerNode CN2 = new DefaultControllerNode(N2, IP);
 
-    private DistributedMastershipStore dms;
-    private TestDistributedMastershipStore testStore;
+    private DistributedDeviceMastershipStore dms;
+    private TestDistributedDeviceMastershipStore testStore;
     private KryoSerializer serializationMgr;
     private StoreManager storeMgr;
 
@@ -77,11 +77,11 @@
 
         serializationMgr = new KryoSerializer();
 
-        dms = new TestDistributedMastershipStore(storeMgr, serializationMgr);
+        dms = new TestDistributedDeviceMastershipStore(storeMgr, serializationMgr);
         dms.clusterService = new TestClusterService();
         dms.activate();
 
-        testStore = (TestDistributedMastershipStore) dms;
+        testStore = (TestDistributedDeviceMastershipStore) dms;
     }
 
     @After
@@ -227,9 +227,9 @@
         assertTrue("Add event fired", addLatch.await(1, TimeUnit.SECONDS));
     }
 
-    private class TestDistributedMastershipStore extends
-            DistributedMastershipStore {
-        public TestDistributedMastershipStore(StoreService storeService,
+    private class TestDistributedDeviceMastershipStore extends
+            DistributedDeviceMastershipStore {
+        public TestDistributedDeviceMastershipStore(StoreService storeService,
                 KryoSerializer kryoSerialization) {
             this.storeService = storeService;
             this.serializer = kryoSerialization;
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 729b01e..018fca6 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 ClockProviderService}.
+ * Dummy implementation of {@link DeviceClockProviderService}.
  */
 @Component(immediate = true)
 @Service
-public class NoOpClockProviderService implements ClockProviderService {
+public class NoOpClockProviderService implements DeviceClockProviderService {
 
     @Override
-    public void setMastershipTerm(DeviceId deviceId, DeviceMastershipTerm term) {
+    public void setDeviceMastershipTerm(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 5676cb6..c32c04a 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,
-                    MastershipRole.class,
+                    DeviceMastershipRole.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(MastershipRole.class, new MastershipRoleSerializer())
+            .register(DeviceMastershipRole.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 dab5aa8..f94441e 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.MastershipRole;
+import org.onlab.onos.net.device.DeviceMastershipRole;
 
 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.MastershipRole}.
+ * Kryo Serializer for {@link org.onlab.onos.net.device.DeviceMastershipRole}.
  */
-public class MastershipRoleSerializer extends Serializer<MastershipRole> {
+public class MastershipRoleSerializer extends Serializer<DeviceMastershipRole> {
 
     /**
-     * Creates {@link MastershipRole} serializer instance.
+     * Creates {@link DeviceMastershipRole} serializer instance.
      */
     public MastershipRoleSerializer() {
         // non-null, immutable
@@ -21,13 +21,13 @@
     }
 
     @Override
-    public MastershipRole read(Kryo kryo, Input input, Class<MastershipRole> type) {
+    public DeviceMastershipRole read(Kryo kryo, Input input, Class<DeviceMastershipRole> type) {
         final String role = kryo.readObject(input, String.class);
-        return MastershipRole.valueOf(role);
+        return DeviceMastershipRole.valueOf(role);
     }
 
     @Override
-    public void write(Kryo kryo, Output output, MastershipRole object) {
+    public void write(Kryo kryo, Output output, DeviceMastershipRole 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 ab9e012..6d5b31d 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 (MastershipRole role : MastershipRole.values()) {
+        for (DeviceMastershipRole role : DeviceMastershipRole.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 5f3c2ef..afef76d 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 ClockProviderService}.
+ * Dummy implementation of {@link DeviceClockProviderService}.
  */
 @Component(immediate = true)
 @Service
-public class NoOpClockProviderService implements ClockProviderService {
+public class NoOpClockProviderService implements DeviceClockProviderService {
 
     @Override
-    public void setMastershipTerm(DeviceId deviceId, DeviceMastershipTerm term) {
+    public void setDeviceMastershipTerm(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 7f88edb..38ca2ee 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) {
-        MastershipRole role = getRole(nodeId, deviceId);
+        DeviceMastershipRole role = getRole(nodeId, deviceId);
 
         synchronized (this) {
             switch (role) {
@@ -106,10 +106,10 @@
     }
 
     @Override
-    public MastershipRole requestRole(DeviceId deviceId) {
+    public DeviceMastershipRole requestRole(DeviceId deviceId) {
         //query+possible reelection
         NodeId node = instance.id();
-        MastershipRole role = getRole(node, deviceId);
+        DeviceMastershipRole 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 = MastershipRole.MASTER;
+                        role = DeviceMastershipRole.MASTER;
                     }
                     backups.add(node);
                 }
@@ -132,7 +132,7 @@
                     masterMap.put(deviceId, node);
                     termMap.put(deviceId, new AtomicInteger());
                     backups.add(node);
-                    role = MastershipRole.MASTER;
+                    role = DeviceMastershipRole.MASTER;
                 }
                 break;
             default:
@@ -142,22 +142,22 @@
     }
 
     @Override
-    public MastershipRole getRole(NodeId nodeId, DeviceId deviceId) {
+    public DeviceMastershipRole getRole(NodeId nodeId, DeviceId deviceId) {
         //just query
         NodeId current = masterMap.get(deviceId);
-        MastershipRole role;
+        DeviceMastershipRole role;
 
         if (current == null) {
             if (backups.contains(nodeId)) {
-                role = MastershipRole.STANDBY;
+                role = DeviceMastershipRole.STANDBY;
             } else {
-                role = MastershipRole.NONE;
+                role = DeviceMastershipRole.NONE;
             }
         } else {
             if (current.equals(nodeId)) {
-                role = MastershipRole.MASTER;
+                role = DeviceMastershipRole.MASTER;
             } else {
-                role = MastershipRole.STANDBY;
+                role = DeviceMastershipRole.STANDBY;
             }
         }
         return role;
@@ -175,7 +175,7 @@
 
     @Override
     public DeviceMastershipEvent setStandby(NodeId nodeId, DeviceId deviceId) {
-        MastershipRole role = getRole(nodeId, deviceId);
+        DeviceMastershipRole 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 d3430ca..a1cc132 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 8958fb6..1f20162 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, MastershipRole newRole) {
+    public void roleChanged(Device device, DeviceMastershipRole 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) {
-            MastershipRole failed;
+            DeviceMastershipRole failed;
             switch (role) {
                 case MASTER:
-                    failed = MastershipRole.MASTER;
+                    failed = DeviceMastershipRole.MASTER;
                     break;
                 case EQUAL:
-                    failed = MastershipRole.STANDBY;
+                    failed = DeviceMastershipRole.STANDBY;
                     break;
                 case SLAVE:
-                    failed = MastershipRole.NONE;
+                    failed = DeviceMastershipRole.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 8196cb8..564abf2 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.MastershipRole.*;
+import static org.onlab.onos.net.device.DeviceMastershipRole.*;
 
 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<MastershipRole, Dpid> roles = new HashMap<>();
+        Map<DeviceMastershipRole, Dpid> roles = new HashMap<>();
 
         @Override
         public DeviceProviderService register(DeviceProvider provider) {
@@ -195,7 +195,7 @@
             }
 
             @Override
-            public void unableToAssertRole(DeviceId deviceId, MastershipRole role) {
+            public void unableToAssertRole(DeviceId deviceId, DeviceMastershipRole role) {
                 roles.put(role, Dpid.dpid(deviceId.uri()));
             }
 
diff --git a/tools/dev/bash_profile b/tools/dev/bash_profile
index a17ae2a..b4fbc4d 100644
--- a/tools/dev/bash_profile
+++ b/tools/dev/bash_profile
@@ -6,7 +6,7 @@
 export ONOS_ROOT=${ONOS_ROOT:-~/onos-next}
 
 # Setup some environmental context for developers
-export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
+export JAVA_HOME=${JAVA_HOME:-$(/usr/libexec/java_home -v 1.7)}
 export MAVEN=${MAVEN:-~/Applications/apache-maven-3.2.2}
 export KARAF=${KARAF:-~/Applications/apache-karaf-3.0.1}
 export KARAF_LOG=$KARAF/data/log/karaf.log