diff --git a/core/store/dist/src/main/java/org/onosproject/store/impl/EventuallyConsistentMapImpl.java b/core/store/dist/src/main/java/org/onosproject/store/impl/EventuallyConsistentMapImpl.java
index 450f1c2..2d267c3 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/impl/EventuallyConsistentMapImpl.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/impl/EventuallyConsistentMapImpl.java
@@ -15,9 +15,8 @@
  */
 package org.onosproject.store.impl;
 
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.ImmutableList;
 import org.apache.commons.lang3.RandomUtils;
+import org.apache.commons.lang3.tuple.Pair;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.ControllerNode;
@@ -38,7 +37,6 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArraySet;
@@ -351,7 +349,7 @@
         checkState(!destroyed, mapName + ERROR_DESTROYED);
 
         return items.entrySet().stream()
-                .map(e -> new Entry(e.getKey(), e.getValue().value()))
+                .map(e -> Pair.of(e.getKey(), e.getValue().value()))
                 .collect(Collectors.toSet());
     }
 
@@ -415,49 +413,6 @@
         clusterCommunicator.unicast(message, peer);
     }
 
-    private final class Entry implements Map.Entry<K, V> {
-
-        private final K key;
-        private final V value;
-
-        public Entry(K key, V value) {
-            this.key = key;
-            this.value = value;
-        }
-
-        @Override
-        public K getKey() {
-            return key;
-        }
-
-        @Override
-        public V getValue() {
-            return value;
-        }
-
-        @Override
-        public V setValue(V value) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (!(o instanceof Map.Entry)) {
-                return false;
-            }
-
-            Map.Entry that = (Map.Entry) o;
-
-            return Objects.equals(this.key, that.getKey()) &&
-                    Objects.equals(this.value, that.getValue());
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(key, value);
-        }
-    }
-
     private final class SendAdvertisementTask implements Runnable {
         @Override
         public void run() {
@@ -754,112 +709,4 @@
         }
     }
 
-    static final class InternalPutEvent<K, V> {
-        private final List<PutEntry<K, V>> entries;
-
-        public InternalPutEvent(K key, V value, Timestamp timestamp) {
-            entries = ImmutableList.of(new PutEntry<>(key, value, timestamp));
-        }
-
-        public InternalPutEvent(List<PutEntry<K, V>> entries) {
-            this.entries = checkNotNull(entries);
-        }
-
-        // Needed for serialization.
-        @SuppressWarnings("unused")
-        private InternalPutEvent() {
-            entries = null;
-        }
-
-        public List<PutEntry<K, V>> entries() {
-            return entries;
-        }
-    }
-
-    static final class PutEntry<K, V> {
-        private final K key;
-        private final V value;
-        private final Timestamp timestamp;
-
-        public PutEntry(K key, V value, Timestamp timestamp) {
-            this.key = checkNotNull(key);
-            this.value = checkNotNull(value);
-            this.timestamp = checkNotNull(timestamp);
-        }
-
-        // Needed for serialization.
-        @SuppressWarnings("unused")
-        private PutEntry() {
-            this.key = null;
-            this.value = null;
-            this.timestamp = null;
-        }
-
-        public K key() {
-            return key;
-        }
-
-        public V value() {
-            return value;
-        }
-
-        public Timestamp timestamp() {
-            return timestamp;
-        }
-
-        public String toString() {
-            return MoreObjects.toStringHelper(getClass())
-                    .add("key", key)
-                    .add("value", value)
-                    .add("timestamp", timestamp)
-                    .toString();
-        }
-    }
-
-    static final class InternalRemoveEvent<K> {
-        private final List<RemoveEntry<K>> entries;
-
-        public InternalRemoveEvent(K key, Timestamp timestamp) {
-            entries = ImmutableList.of(new RemoveEntry<>(key, timestamp));
-        }
-
-        public InternalRemoveEvent(List<RemoveEntry<K>> entries) {
-            this.entries = checkNotNull(entries);
-        }
-
-        // Needed for serialization.
-        @SuppressWarnings("unused")
-        private InternalRemoveEvent() {
-            entries = null;
-        }
-
-        public List<RemoveEntry<K>> entries() {
-            return entries;
-        }
-    }
-
-    static final class RemoveEntry<K> {
-        private final K key;
-        private final Timestamp timestamp;
-
-        public RemoveEntry(K key, Timestamp timestamp) {
-            this.key = checkNotNull(key);
-            this.timestamp = checkNotNull(timestamp);
-        }
-
-        // Needed for serialization.
-        @SuppressWarnings("unused")
-        private RemoveEntry() {
-            this.key = null;
-            this.timestamp = null;
-        }
-
-        public K key() {
-            return key;
-        }
-
-        public Timestamp timestamp() {
-            return timestamp;
-        }
-    }
 }
diff --git a/core/store/dist/src/main/java/org/onosproject/store/impl/InternalPutEvent.java b/core/store/dist/src/main/java/org/onosproject/store/impl/InternalPutEvent.java
new file mode 100644
index 0000000..02a93ce
--- /dev/null
+++ b/core/store/dist/src/main/java/org/onosproject/store/impl/InternalPutEvent.java
@@ -0,0 +1,65 @@
+/*
+ * 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.collect.ImmutableList;
+import org.onosproject.store.Timestamp;
+
+import java.util.List;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Internal inter-instance event used by EventuallyConsistentMap for PUT events.
+ */
+final class InternalPutEvent<K, V> {
+    private final List<PutEntry<K, V>> entries;
+
+    /**
+     * Creates a put event for a single key.
+     *
+     * @param key key the event concerns
+     * @param value value of the key
+     * @param timestamp timestamp of the event
+     */
+    public InternalPutEvent(K key, V value, Timestamp timestamp) {
+        entries = ImmutableList.of(new PutEntry<>(key, value, timestamp));
+    }
+
+    /**
+     * Creates a put event for multiple keys.
+     *
+     * @param entries list of put entries to send an event for
+     */
+    public InternalPutEvent(List<PutEntry<K, V>> entries) {
+        this.entries = checkNotNull(entries);
+    }
+
+    // Needed for serialization.
+    @SuppressWarnings("unused")
+    private InternalPutEvent() {
+        entries = null;
+    }
+
+    /**
+     * Returns the list of put entries this event concerns.
+     *
+     * @return list of put entries
+     */
+    public List<PutEntry<K, V>> entries() {
+        return entries;
+    }
+}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/impl/InternalRemoveEvent.java b/core/store/dist/src/main/java/org/onosproject/store/impl/InternalRemoveEvent.java
new file mode 100644
index 0000000..720527b
--- /dev/null
+++ b/core/store/dist/src/main/java/org/onosproject/store/impl/InternalRemoveEvent.java
@@ -0,0 +1,65 @@
+/*
+ * 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.collect.ImmutableList;
+import org.onosproject.store.Timestamp;
+
+import java.util.List;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Internal inter-instance event used by EventuallyConsistentMap for REMOVE
+ * events.
+ */
+final class InternalRemoveEvent<K> {
+    private final List<RemoveEntry<K>> entries;
+
+    /**
+     * Creates a remove event for a single key.
+     *
+     * @param key key the event concerns
+     * @param timestamp timestamp of the event
+     */
+    public InternalRemoveEvent(K key, Timestamp timestamp) {
+        entries = ImmutableList.of(new RemoveEntry<>(key, timestamp));
+    }
+
+    /**
+     * Creates a remove event for multiple keys.
+     *
+     * @param entries list of remove entries to send an event for
+     */
+    public InternalRemoveEvent(List<RemoveEntry<K>> entries) {
+        this.entries = checkNotNull(entries);
+    }
+
+    // Needed for serialization.
+    @SuppressWarnings("unused")
+    private InternalRemoveEvent() {
+        entries = null;
+    }
+
+    /**
+     * Returns the list of remove entries this event concerns.
+     *
+     * @return list of remove entries
+     */
+    public List<RemoveEntry<K>> entries() {
+        return entries;
+    }
+}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/impl/PutEntry.java b/core/store/dist/src/main/java/org/onosproject/store/impl/PutEntry.java
new file mode 100644
index 0000000..ae1ddbf
--- /dev/null
+++ b/core/store/dist/src/main/java/org/onosproject/store/impl/PutEntry.java
@@ -0,0 +1,87 @@
+/*
+ * 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 org.onosproject.store.Timestamp;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Describes a single put event in an EventuallyConsistentMap.
+ */
+final class PutEntry<K, V> {
+    private final K key;
+    private final V value;
+    private final Timestamp timestamp;
+
+    /**
+     * Creates a new put entry.
+     *
+     * @param key key of the entry
+     * @param value value of the entry
+     * @param timestamp timestamp of the put event
+     */
+    public PutEntry(K key, V value, Timestamp timestamp) {
+        this.key = checkNotNull(key);
+        this.value = checkNotNull(value);
+        this.timestamp = checkNotNull(timestamp);
+    }
+
+    // Needed for serialization.
+    @SuppressWarnings("unused")
+    private PutEntry() {
+        this.key = null;
+        this.value = null;
+        this.timestamp = null;
+    }
+
+    /**
+     * Returns the key of the entry.
+     *
+     * @return the key
+     */
+    public K key() {
+        return key;
+    }
+
+    /**
+     * Returns the value of the entry.
+     *
+     * @return the value
+     */
+    public V value() {
+        return value;
+    }
+
+    /**
+     * Returns the timestamp of the event.
+     *
+     * @return the timestamp
+     */
+    public Timestamp timestamp() {
+        return timestamp;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("key", key)
+                .add("value", value)
+                .add("timestamp", timestamp)
+                .toString();
+    }
+}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/impl/RemoveEntry.java b/core/store/dist/src/main/java/org/onosproject/store/impl/RemoveEntry.java
new file mode 100644
index 0000000..716237b
--- /dev/null
+++ b/core/store/dist/src/main/java/org/onosproject/store/impl/RemoveEntry.java
@@ -0,0 +1,73 @@
+/*
+ * 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 org.onosproject.store.Timestamp;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Describes a single remove event in an EventuallyConsistentMap.
+ */
+final class RemoveEntry<K> {
+    private final K key;
+    private final Timestamp timestamp;
+
+    /**
+     * Creates a new remove entry.
+     *
+     * @param key key of the entry
+     * @param timestamp timestamp of the remove event
+     */
+    public RemoveEntry(K key, Timestamp timestamp) {
+        this.key = checkNotNull(key);
+        this.timestamp = checkNotNull(timestamp);
+    }
+
+    // Needed for serialization.
+    @SuppressWarnings("unused")
+    private RemoveEntry() {
+        this.key = null;
+        this.timestamp = null;
+    }
+
+    /**
+     * Returns the key of the entry.
+     *
+     * @return the key
+     */
+    public K key() {
+        return key;
+    }
+
+    /**
+     * Returns the timestamp of the event.
+     *
+     * @return the timestamp
+     */
+    public Timestamp timestamp() {
+        return timestamp;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("key", key)
+                .add("timestamp", timestamp)
+                .toString();
+    }
+}
diff --git a/core/store/dist/src/test/java/org/onosproject/store/impl/EventuallyConsistentMapImplTest.java b/core/store/dist/src/test/java/org/onosproject/store/impl/EventuallyConsistentMapImplTest.java
index 5269d39..44e4e21 100644
--- a/core/store/dist/src/test/java/org/onosproject/store/impl/EventuallyConsistentMapImplTest.java
+++ b/core/store/dist/src/test/java/org/onosproject/store/impl/EventuallyConsistentMapImplTest.java
@@ -100,11 +100,11 @@
                     .register(TestTimestamp.class)
                     // Below is the classes that the map internally registers
                     .register(WallClockTimestamp.class)
-                    .register(EventuallyConsistentMapImpl.PutEntry.class)
-                    .register(EventuallyConsistentMapImpl.RemoveEntry.class)
+                    .register(PutEntry.class)
+                    .register(RemoveEntry.class)
                     .register(ArrayList.class)
-                    .register(EventuallyConsistentMapImpl.InternalPutEvent.class)
-                    .register(EventuallyConsistentMapImpl.InternalRemoveEvent.class)
+                    .register(InternalPutEvent.class)
+                    .register(InternalRemoveEvent.class)
                     .register(AntiEntropyAdvertisement.class)
                     .register(HashMap.class)
                     .build();
@@ -586,9 +586,8 @@
     }
 
     private ClusterMessage generatePutMessage(String key, String value, Timestamp timestamp) {
-        EventuallyConsistentMapImpl.InternalPutEvent<String, String> event =
-                new EventuallyConsistentMapImpl.InternalPutEvent<>(
-                        key, value, timestamp);
+        InternalPutEvent<String, String> event =
+                new InternalPutEvent<>(key, value, timestamp);
 
         return new ClusterMessage(
                 clusterService.getLocalNode().id(), PUT_MESSAGE_SUBJECT,
@@ -596,21 +595,18 @@
     }
 
     private ClusterMessage generatePutMessage(String key1, String value1, String key2, String value2) {
-        ArrayList<EventuallyConsistentMapImpl.PutEntry<String, String>> list = new ArrayList<>();
+        ArrayList<PutEntry<String, String>> list = new ArrayList<>();
 
         Timestamp timestamp1 = clockService.peek(1);
         Timestamp timestamp2 = clockService.peek(2);
 
-        EventuallyConsistentMapImpl.PutEntry<String, String> pe1
-                = new EventuallyConsistentMapImpl.PutEntry<>(key1, value1, timestamp1);
-        EventuallyConsistentMapImpl.PutEntry<String, String> pe2
-                = new EventuallyConsistentMapImpl.PutEntry<>(key2, value2, timestamp2);
+        PutEntry<String, String> pe1 = new PutEntry<>(key1, value1, timestamp1);
+        PutEntry<String, String> pe2 = new PutEntry<>(key2, value2, timestamp2);
 
         list.add(pe1);
         list.add(pe2);
 
-        EventuallyConsistentMapImpl.InternalPutEvent<String, String> event
-                = new EventuallyConsistentMapImpl.InternalPutEvent<>(list);
+        InternalPutEvent<String, String> event = new InternalPutEvent<>(list);
 
         return new ClusterMessage(
                 clusterService.getLocalNode().id(), PUT_MESSAGE_SUBJECT,
@@ -618,9 +614,7 @@
     }
 
     private ClusterMessage generateRemoveMessage(String key, Timestamp timestamp) {
-        EventuallyConsistentMapImpl.InternalRemoveEvent<String> event =
-                new EventuallyConsistentMapImpl.InternalRemoveEvent<>(
-                        key, timestamp);
+        InternalRemoveEvent<String> event = new InternalRemoveEvent<>(key, timestamp);
 
         return new ClusterMessage(
                 clusterService.getLocalNode().id(), REMOVE_MESSAGE_SUBJECT,
@@ -628,21 +622,18 @@
     }
 
     private ClusterMessage generateRemoveMessage(String key1, String key2) {
-        ArrayList<EventuallyConsistentMapImpl.RemoveEntry<String>> list = new ArrayList<>();
+        ArrayList<RemoveEntry<String>> list = new ArrayList<>();
 
         Timestamp timestamp1 = clockService.peek(1);
         Timestamp timestamp2 = clockService.peek(2);
 
-        EventuallyConsistentMapImpl.RemoveEntry<String> re1
-                = new EventuallyConsistentMapImpl.RemoveEntry<>(key1, timestamp1);
-        EventuallyConsistentMapImpl.RemoveEntry<String> re2
-                = new EventuallyConsistentMapImpl.RemoveEntry<>(key2, timestamp2);
+        RemoveEntry<String> re1 = new RemoveEntry<>(key1, timestamp1);
+        RemoveEntry<String> re2 = new RemoveEntry<>(key2, timestamp2);
 
         list.add(re1);
         list.add(re2);
 
-        EventuallyConsistentMapImpl.InternalRemoveEvent<String> event
-                = new EventuallyConsistentMapImpl.InternalRemoveEvent<>(list);
+        InternalRemoveEvent<String> event = new InternalRemoveEvent<>(list);
 
         return new ClusterMessage(
                 clusterService.getLocalNode().id(), REMOVE_MESSAGE_SUBJECT,
