diff --git a/core/api/src/main/java/org/onosproject/event/Change.java b/core/api/src/main/java/org/onosproject/event/Change.java
new file mode 100644
index 0000000..b1d2b6f
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/event/Change.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2016 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.event;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+
+/**
+ * Generic representation of an update.
+ *
+ * @param <T> type of value that was updated
+ */
+public class Change<T> {
+
+    private final T oldValue;
+    private final T newValue;
+
+    public Change(T oldValue, T newValue) {
+        this.oldValue = oldValue;
+        this.newValue = newValue;
+    }
+
+    /**
+     * Returns previous value.
+     * @return previous value.
+     */
+    public T oldValue() {
+        return oldValue;
+    }
+
+    /**
+     * Returns new or current value.
+     * @return new value.
+     */
+    public T newValue() {
+        return newValue;
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (other == null || !(other instanceof Change)) {
+            return false;
+        }
+        Change<T> that = (Change<T>) other;
+        return Objects.equal(this.oldValue, that.oldValue) &&
+                Objects.equal(this.newValue, that.newValue);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(oldValue, newValue);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("oldValue", oldValue)
+                .add("newValue", newValue)
+                .toString();
+    }
+}
diff --git a/core/api/src/test/java/org/onosproject/event/ChangeTest.java b/core/api/src/test/java/org/onosproject/event/ChangeTest.java
new file mode 100644
index 0000000..996af93
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/event/ChangeTest.java
@@ -0,0 +1,29 @@
+package org.onosproject.event;
+
+import org.junit.Test;
+
+import com.google.common.testing.EqualsTester;
+
+import static org.junit.Assert.*;
+
+/**
+ * Unit tests for {@link Change}.
+ */
+public class ChangeTest {
+
+    @Test
+    public void getters() {
+        Change<String> change = new Change<>("a", "b");
+        assertEquals("a", change.oldValue());
+        assertEquals("b", change.newValue());
+    }
+
+    @Test
+    public void equality() {
+        new EqualsTester()
+        .addEqualityGroup(new Change<>("foo", "bar"),
+                          new Change<>("foo", "bar"))
+        .addEqualityGroup(new Change<>("bar", "car"))
+        .testEquals();
+    }
+}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseProxy.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseProxy.java
index 1d81f99..ab5f987 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseProxy.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseProxy.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.store.consistent.impl;
 
+import org.onlab.util.Match;
 import org.onosproject.store.service.Transaction;
 import org.onosproject.store.service.Versioned;
 
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseSerializer.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseSerializer.java
index de73414..9af7445 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseSerializer.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseSerializer.java
@@ -19,6 +19,7 @@
 import java.nio.ByteBuffer;
 
 import org.onlab.util.KryoNamespace;
+import org.onlab.util.Match;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.serializers.KryoSerializer;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseState.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseState.java
index 1136428..65ffd92 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseState.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseState.java
@@ -20,6 +20,8 @@
 import net.kuujo.copycat.state.Initializer;
 import net.kuujo.copycat.state.Query;
 import net.kuujo.copycat.state.StateContext;
+
+import org.onlab.util.Match;
 import org.onosproject.store.service.Transaction;
 import org.onosproject.store.service.Versioned;
 
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMap.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMap.java
index 7c2613e..cdbbd28 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMap.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMap.java
@@ -22,6 +22,7 @@
 import com.google.common.collect.Maps;
 
 import org.onlab.util.HexString;
+import org.onlab.util.Match;
 import org.onlab.util.SharedExecutors;
 import org.onlab.util.Tools;
 import org.onosproject.core.ApplicationId;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabase.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabase.java
index 2a50fbd..59b6565 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabase.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabase.java
@@ -17,12 +17,15 @@
 package org.onosproject.store.consistent.impl;
 
 import com.google.common.collect.Sets;
+
 import net.kuujo.copycat.resource.internal.AbstractResource;
 import net.kuujo.copycat.resource.internal.ResourceManager;
 import net.kuujo.copycat.state.StateMachine;
 import net.kuujo.copycat.state.internal.DefaultStateMachine;
 import net.kuujo.copycat.util.concurrent.Futures;
 import net.kuujo.copycat.util.function.TriConsumer;
+
+import org.onlab.util.Match;
 import org.onosproject.store.service.Transaction;
 import org.onosproject.store.service.Versioned;
 
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabaseState.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabaseState.java
index 8943fc8..3bb413c 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabaseState.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDatabaseState.java
@@ -21,8 +21,11 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+
 import net.kuujo.copycat.state.Initializer;
 import net.kuujo.copycat.state.StateContext;
+
+import org.onlab.util.Match;
 import org.onosproject.store.service.DatabaseUpdate;
 import org.onosproject.store.service.Transaction;
 import org.onosproject.store.service.Versioned;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/Match.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/Match.java
deleted file mode 100644
index 5f707d6..0000000
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/Match.java
+++ /dev/null
@@ -1,129 +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.consistent.impl;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-
-import java.util.Arrays;
-import java.util.Objects;
-import java.util.function.Function;
-
-/**
- * Utility class for checking matching values.
- *
- * @param <T> type of value
- */
-public final class Match<T> {
-
-    private final boolean matchAny;
-    private final T value;
-
-    /**
-     * Returns a Match that matches any value.
-     * @param <T> match type
-     * @return new instance
-     */
-    public static <T> Match<T> any() {
-        return new Match<>();
-    }
-
-    /**
-     * Returns a Match that matches null values.
-     * @param <T> match type
-     * @return new instance
-     */
-    public static <T> Match<T> ifNull() {
-        return ifValue(null);
-    }
-
-    /**
-     * Returns a Match that matches only specified value.
-     * @param value value to match
-     * @param <T> match type
-     * @return new instance
-     */
-    public static <T> Match<T> ifValue(T value) {
-        return new Match<>(value);
-    }
-
-    private Match() {
-        matchAny = true;
-        value = null;
-    }
-
-    private Match(T value) {
-        matchAny = false;
-        this.value = value;
-    }
-
-    /**
-     * Maps this instance to a Match of another type.
-     * @param mapper transformation function
-     * @param <V> new match type
-     * @return new instance
-     */
-    public <V> Match<V> map(Function<T, V> mapper) {
-        if (matchAny) {
-            return any();
-        } else if (value == null) {
-            return ifNull();
-        } else {
-            return ifValue(mapper.apply(value));
-        }
-    }
-
-    /**
-     * Checks if this instance matches specified value.
-     * @param other other value
-     * @return true if matches; false otherwise
-     */
-    public boolean matches(T other) {
-        if (matchAny) {
-            return true;
-        } else if (other == null) {
-            return value == null;
-        } else {
-            if (value instanceof byte[]) {
-                return Arrays.equals((byte[]) value, (byte[]) other);
-            }
-            return Objects.equals(value, other);
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(matchAny, value);
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public boolean equals(Object other) {
-        if (!(other instanceof Match)) {
-            return false;
-        }
-        Match<T> that = (Match<T>) other;
-        return Objects.equals(this.matchAny, that.matchAny) &&
-               Objects.equals(this.value, that.value);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this)
-                .add("matchAny", matchAny)
-                .add("value", value)
-                .toString();
-    }
-}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/PartitionedDatabase.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/PartitionedDatabase.java
index f741b36..a78a44a 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/PartitionedDatabase.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/PartitionedDatabase.java
@@ -20,9 +20,12 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
+
 import net.kuujo.copycat.Task;
 import net.kuujo.copycat.cluster.Cluster;
 import net.kuujo.copycat.resource.ResourceState;
+
+import org.onlab.util.Match;
 import org.onosproject.store.service.DatabaseUpdate;
 import org.onosproject.store.service.Transaction;
 import org.onosproject.store.service.Versioned;
diff --git a/core/store/dist/src/test/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMapTest.java b/core/store/dist/src/test/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMapTest.java
index 5fc8113..8076ba5 100644
--- a/core/store/dist/src/test/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMapTest.java
+++ b/core/store/dist/src/test/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMapTest.java
@@ -32,6 +32,7 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.onlab.util.Match;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.DefaultApplicationId;
 import org.onosproject.store.service.Serializer;
diff --git a/core/store/dist/src/test/java/org/onosproject/store/consistent/impl/MatchTest.java b/core/store/dist/src/test/java/org/onosproject/store/consistent/impl/MatchTest.java
deleted file mode 100644
index 952393a..0000000
--- a/core/store/dist/src/test/java/org/onosproject/store/consistent/impl/MatchTest.java
+++ /dev/null
@@ -1,67 +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.consistent.impl;
-
-import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.assertFalse;
-import static junit.framework.TestCase.assertTrue;
-
-import org.junit.Test;
-
-import com.google.common.base.Objects;
-
-/**
- * Unit tests for Match.
- */
-public class MatchTest {
-
-    @Test
-    public void testMatches() {
-        Match<String> m1 = Match.any();
-        assertTrue(m1.matches(null));
-        assertTrue(m1.matches("foo"));
-        assertTrue(m1.matches("bar"));
-
-        Match<String> m2 = Match.ifNull();
-        assertTrue(m2.matches(null));
-        assertFalse(m2.matches("foo"));
-
-        Match<String> m3 = Match.ifValue("foo");
-        assertFalse(m3.matches(null));
-        assertFalse(m3.matches("bar"));
-        assertTrue(m3.matches("foo"));
-    }
-
-    @Test
-    public void testEquals() {
-        Match<String> m1 = Match.any();
-        Match<String> m2 = Match.any();
-        Match<String> m3 = Match.ifNull();
-        Match<String> m4 = Match.ifValue("bar");
-        assertEquals(m1, m2);
-        assertFalse(Objects.equal(m1, m3));
-        assertFalse(Objects.equal(m3, m4));
-    }
-
-    @Test
-    public void testMap() {
-        Match<String> m1 = Match.ifNull();
-        assertEquals(m1.map(s -> "bar"), Match.ifNull());
-        Match<String> m2 = Match.ifValue("foo");
-        Match<String> m3 = m2.map(s -> "bar");
-        assertTrue(m3.matches("bar"));
-    }
-}
