diff --git a/core/store/dist/src/main/java/org/onosproject/store/app/GossipApplicationStore.java b/core/store/dist/src/main/java/org/onosproject/store/app/GossipApplicationStore.java
index 4910ce4..6cfb218 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/app/GossipApplicationStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/app/GossipApplicationStore.java
@@ -43,7 +43,7 @@
 import org.onosproject.store.cluster.messaging.ClusterMessage;
 import org.onosproject.store.cluster.messaging.ClusterMessageHandler;
 import org.onosproject.store.cluster.messaging.MessageSubject;
-import org.onosproject.store.impl.MultiValuedTimestamp;
+import org.onosproject.store.service.MultiValuedTimestamp;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.EventuallyConsistentMap;
 import org.onosproject.store.service.EventuallyConsistentMapEvent;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/ecmap/EventuallyConsistentMapImpl.java b/core/store/dist/src/main/java/org/onosproject/store/ecmap/EventuallyConsistentMapImpl.java
index c46131e..f03215d 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/ecmap/EventuallyConsistentMapImpl.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/ecmap/EventuallyConsistentMapImpl.java
@@ -35,7 +35,7 @@
 import org.onosproject.store.cluster.messaging.MessageSubject;
 import org.onosproject.store.impl.LogicalTimestamp;
 import org.onosproject.store.impl.Timestamped;
-import org.onosproject.store.impl.WallClockTimestamp;
+import org.onosproject.store.service.WallClockTimestamp;
 import org.onosproject.store.serializers.KryoSerializer;
 import org.onosproject.store.service.ClockService;
 import org.onosproject.store.service.EventuallyConsistentMap;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/group/impl/DistributedGroupStore.java b/core/store/dist/src/main/java/org/onosproject/store/group/impl/DistributedGroupStore.java
index 8a31de1..60b72d7 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/group/impl/DistributedGroupStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/group/impl/DistributedGroupStore.java
@@ -62,7 +62,7 @@
 import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
 import org.onosproject.store.cluster.messaging.ClusterMessage;
 import org.onosproject.store.cluster.messaging.ClusterMessageHandler;
-import org.onosproject.store.impl.MultiValuedTimestamp;
+import org.onosproject.store.service.MultiValuedTimestamp;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.ClockService;
 import org.onosproject.store.service.EventuallyConsistentMap;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/host/impl/HostClockManager.java b/core/store/dist/src/main/java/org/onosproject/store/host/impl/HostClockManager.java
index 097af85..f96568b 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/host/impl/HostClockManager.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/host/impl/HostClockManager.java
@@ -24,7 +24,7 @@
 import org.onosproject.net.HostId;
 import org.onosproject.net.host.HostClockService;
 import org.onosproject.store.Timestamp;
-import org.onosproject.store.impl.WallClockTimestamp;
+import org.onosproject.store.service.WallClockTimestamp;
 import org.slf4j.Logger;
 
 /**
diff --git a/core/store/dist/src/main/java/org/onosproject/store/impl/MultiValuedTimestamp.java b/core/store/dist/src/main/java/org/onosproject/store/impl/MultiValuedTimestamp.java
deleted file mode 100644
index f460dbd..0000000
--- a/core/store/dist/src/main/java/org/onosproject/store/impl/MultiValuedTimestamp.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.store.impl;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.ComparisonChain;
-import org.onosproject.store.Timestamp;
-
-import java.util.Objects;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * A logical timestamp that derives its value from two input values. The first
- * value always takes precedence over the second value when comparing timestamps.
- */
-public class MultiValuedTimestamp<T extends Comparable<T>, U extends Comparable<U>>
-        implements Timestamp {
-
-    private final T value1;
-    private final U value2;
-
-    /**
-     * Creates a new timestamp based on two values. The first value has higher
-     * precedence than the second when comparing timestamps.
-     *
-     * @param value1 first value
-     * @param value2 second value
-     */
-    public MultiValuedTimestamp(T value1, U value2) {
-        this.value1 = checkNotNull(value1);
-        this.value2 = checkNotNull(value2);
-    }
-
-    @Override
-    public int compareTo(Timestamp o) {
-        checkArgument(o instanceof MultiValuedTimestamp,
-                      "Must be MultiValuedTimestamp", o);
-        MultiValuedTimestamp that = (MultiValuedTimestamp) o;
-
-        return ComparisonChain.start()
-                .compare(this.value1, that.value1)
-                .compare(this.value2, that.value2)
-                .result();
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(value1, value2);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof MultiValuedTimestamp)) {
-            return false;
-        }
-        MultiValuedTimestamp that = (MultiValuedTimestamp) obj;
-        return Objects.equals(this.value1, that.value1) &&
-                Objects.equals(this.value2, that.value2);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("value1", value1)
-                .add("value2", value2)
-                .toString();
-    }
-
-    /**
-     * Returns the first value.
-     *
-     * @return first value
-     */
-    public T value1() {
-        return value1;
-    }
-
-    /**
-     * Returns the second value.
-     *
-     * @return second value
-     */
-    public U value2() {
-        return value2;
-    }
-
-    // Default constructor for serialization
-    @SuppressWarnings("unused")
-    private MultiValuedTimestamp() {
-        this.value1 = null;
-        this.value2 = null;
-    }
-}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/impl/WallClockTimestamp.java b/core/store/dist/src/main/java/org/onosproject/store/impl/WallClockTimestamp.java
deleted file mode 100644
index e7efb29..0000000
--- a/core/store/dist/src/main/java/org/onosproject/store/impl/WallClockTimestamp.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright 2014 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.store.impl;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import java.util.Objects;
-
-import org.onosproject.store.Timestamp;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.ComparisonChain;
-
-/**
- * A Timestamp that derives its value from the prevailing
- * wallclock time on the controller where it is generated.
- */
-public class WallClockTimestamp implements Timestamp {
-
-    private final long unixTimestamp;
-
-    public WallClockTimestamp() {
-        unixTimestamp = System.currentTimeMillis();
-    }
-
-    public WallClockTimestamp(long timestamp) {
-        unixTimestamp = timestamp;
-    }
-
-    @Override
-    public int compareTo(Timestamp o) {
-        checkArgument(o instanceof WallClockTimestamp,
-                "Must be WallClockTimestamp", o);
-        WallClockTimestamp that = (WallClockTimestamp) o;
-
-        return ComparisonChain.start()
-                .compare(this.unixTimestamp, that.unixTimestamp)
-                .result();
-    }
-    @Override
-    public int hashCode() {
-        return Objects.hash(unixTimestamp);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof WallClockTimestamp)) {
-            return false;
-        }
-        WallClockTimestamp that = (WallClockTimestamp) obj;
-        return Objects.equals(this.unixTimestamp, that.unixTimestamp);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                    .add("unixTimestamp", unixTimestamp)
-                    .toString();
-    }
-
-    /**
-     * Returns the unixTimestamp.
-     *
-     * @return unix timestamp
-     */
-    public long unixTimestamp() {
-        return unixTimestamp;
-    }
-}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/impl/WallclockClockManager.java b/core/store/dist/src/main/java/org/onosproject/store/impl/WallclockClockManager.java
deleted file mode 100644
index fd25ebf..0000000
--- a/core/store/dist/src/main/java/org/onosproject/store/impl/WallclockClockManager.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.store.impl;
-
-import org.onosproject.store.Timestamp;
-import org.onosproject.store.service.ClockService;
-
-/**
- * A clock service which hands out wallclock-based timestamps.
- */
-public class WallclockClockManager<T, U> implements ClockService<T, U> {
-    @Override
-    public Timestamp getTimestamp(T object1, U object2) {
-        return new WallClockTimestamp();
-    }
-}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java
index 7de2d17..9412dac 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java
@@ -36,8 +36,8 @@
 import org.onosproject.net.intent.Key;
 import org.onosproject.net.intent.PartitionService;
 import org.onosproject.store.AbstractStore;
-import org.onosproject.store.impl.MultiValuedTimestamp;
-import org.onosproject.store.impl.WallClockTimestamp;
+import org.onosproject.store.service.MultiValuedTimestamp;
+import org.onosproject.store.service.WallClockTimestamp;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.EventuallyConsistentMap;
 import org.onosproject.store.service.EventuallyConsistentMapEvent;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentClockManager.java b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentClockManager.java
index 7dea4df..a0d7d2f 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentClockManager.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentClockManager.java
@@ -22,7 +22,7 @@
 import org.onosproject.net.intent.IntentClockService;
 import org.onosproject.net.intent.IntentId;
 import org.onosproject.store.Timestamp;
-import org.onosproject.store.impl.WallClockTimestamp;
+import org.onosproject.store.service.WallClockTimestamp;
 import org.slf4j.Logger;
 
 import static org.slf4j.LoggerFactory.getLogger;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentDataClockManager.java b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentDataClockManager.java
index 1c4ffbf..d828988 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentDataClockManager.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentDataClockManager.java
@@ -18,7 +18,7 @@
 import org.onosproject.net.intent.IntentData;
 import org.onosproject.store.Timestamp;
 import org.onosproject.store.service.ClockService;
-import org.onosproject.store.impl.MultiValuedTimestamp;
+import org.onosproject.store.service.MultiValuedTimestamp;
 
 /**
  * ClockService that uses IntentData versions as timestamps.
diff --git a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentDataLogicalClockManager.java b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentDataLogicalClockManager.java
index 9d21223..8d78138 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentDataLogicalClockManager.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/IntentDataLogicalClockManager.java
@@ -18,7 +18,7 @@
 import org.onosproject.net.intent.IntentData;
 import org.onosproject.store.Timestamp;
 import org.onosproject.store.service.ClockService;
-import org.onosproject.store.impl.MultiValuedTimestamp;
+import org.onosproject.store.service.MultiValuedTimestamp;
 
 import java.util.concurrent.atomic.AtomicLong;
 
diff --git a/core/store/dist/src/main/java/org/onosproject/store/serializers/impl/DistributedStoreSerializers.java b/core/store/dist/src/main/java/org/onosproject/store/serializers/impl/DistributedStoreSerializers.java
index 6748154..d717a31 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/serializers/impl/DistributedStoreSerializers.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/serializers/impl/DistributedStoreSerializers.java
@@ -17,7 +17,7 @@
 
 import org.onosproject.store.impl.MastershipBasedTimestamp;
 import org.onosproject.store.impl.Timestamped;
-import org.onosproject.store.impl.WallClockTimestamp;
+import org.onosproject.store.service.WallClockTimestamp;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onlab.util.KryoNamespace;
 
