diff --git a/core/common/src/test/java/org/onosproject/codec/impl/MetricJsonMatcher.java b/core/common/src/test/java/org/onosproject/codec/impl/MetricJsonMatcher.java
new file mode 100644
index 0000000..9212809
--- /dev/null
+++ b/core/common/src/test/java/org/onosproject/codec/impl/MetricJsonMatcher.java
@@ -0,0 +1,168 @@
+/*
+ * 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.codec.impl;
+
+import com.codahale.metrics.Counter;
+import com.codahale.metrics.Meter;
+import com.codahale.metrics.Metric;
+import com.codahale.metrics.Timer;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeDiagnosingMatcher;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Hamcrest matcher for metrics.
+ */
+public final class MetricJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
+
+    private final Metric metric;
+
+    private MetricJsonMatcher(Metric metric) {
+        this.metric = metric;
+    }
+
+    @Override
+    protected boolean matchesSafely(JsonNode jsonMetric, Description description) {
+
+        // check counter
+        if (metric instanceof Counter) {
+            Counter counter = (Counter) metric;
+            long jsonCounter = jsonMetric.get("counter").asLong();
+            long counterVal = counter.getCount();
+            if (jsonCounter != counterVal) {
+                description.appendText("counter was " + jsonCounter);
+                return false;
+            }
+        }
+
+        // check meter
+        if (metric instanceof Meter) {
+            Meter meter = (Meter) metric;
+
+            long jsonCounter = jsonMetric.get("counter").asLong();
+            long counterVal = meter.getCount();
+            if (jsonCounter != counterVal) {
+                description.appendText("counter was " + jsonCounter);
+                return false;
+            }
+
+            double jsonOneMinRate = jsonMetric.get("1_min_rate").asDouble();
+            double oneMinRate = meter.getOneMinuteRate();
+            if (jsonOneMinRate != oneMinRate) {
+                description.appendText("one minute rate was " + jsonOneMinRate);
+                return false;
+            }
+
+            double jsonFiveMinRate = jsonMetric.get("5_min_rate").asDouble();
+            double fiveMinRate = meter.getFiveMinuteRate();
+            if (jsonFiveMinRate != fiveMinRate) {
+                description.appendText("five minute rate was " + jsonFiveMinRate);
+                return false;
+            }
+
+            double jsonFiftMinRate = jsonMetric.get("15_min_rate").asDouble();
+            double fiftMinRate = meter.getFifteenMinuteRate();
+            if (jsonFiftMinRate != fiftMinRate) {
+                description.appendText("fifteen minute rate was " + jsonFiftMinRate);
+                return false;
+            }
+        }
+
+        // check timer
+        if (metric instanceof Timer) {
+            Timer timer = (Timer) metric;
+
+            long jsonCounter = jsonMetric.get("counter").asLong();
+            long counterVal = timer.getCount();
+            if (jsonCounter != counterVal) {
+                description.appendText("counter was " + jsonCounter);
+                return false;
+            }
+
+            double jsonOneMinRate = jsonMetric.get("1_min_rate").asDouble();
+            double oneMinRate = timer.getOneMinuteRate();
+            if (jsonOneMinRate != oneMinRate) {
+                description.appendText("one minute rate was " + jsonOneMinRate);
+                return false;
+            }
+
+            double jsonFiveMinRate = jsonMetric.get("5_min_rate").asDouble();
+            double fiveMinRate = timer.getFiveMinuteRate();
+            if (jsonFiveMinRate != fiveMinRate) {
+                description.appendText("five minute rate was " + jsonFiveMinRate);
+                return false;
+            }
+
+            double jsonFiftMinRate = jsonMetric.get("15_min_rate").asDouble();
+            double fiftMinRate = timer.getFifteenMinuteRate();
+            if (jsonFiftMinRate != fiftMinRate) {
+                description.appendText("fifteen minute rate was " + jsonFiftMinRate);
+                return false;
+            }
+
+            double jsonMean = jsonMetric.get("mean").asDouble();
+            double mean = nanoToMs(timer.getSnapshot().getMean());
+            if (jsonMean != mean) {
+                description.appendText("mean was " + jsonMean);
+                return false;
+            }
+
+            double jsonMin = jsonMetric.get("min").asDouble();
+            double min = nanoToMs(timer.getSnapshot().getMin());
+            if (jsonMin != min) {
+                description.appendText("json min was " + jsonMin);
+                return false;
+            }
+
+            double jsonMax = jsonMetric.get("max").asDouble();
+            double max = nanoToMs(timer.getSnapshot().getMax());
+            if (jsonMax != max) {
+                description.appendText("max was " + jsonMax);
+                return false;
+            }
+
+            double jsonStdDev = jsonMetric.get("stddev").asDouble();
+            double stdDev = nanoToMs(timer.getSnapshot().getStdDev());
+            if (jsonStdDev != stdDev) {
+                description.appendText("stddev was " + jsonStdDev);
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    @Override
+    public void describeTo(Description description) {
+        description.appendText(metric.toString());
+    }
+
+    /**
+     * Factory to allocate a metric matcher.
+     *
+     * @param metric metric object we are looking for
+     * @return matcher
+     */
+    public static MetricJsonMatcher matchesMetric(Metric metric) {
+        return new MetricJsonMatcher(metric);
+    }
+
+    private double nanoToMs(double nano) {
+        return TimeUnit.MILLISECONDS.convert((long) nano, TimeUnit.NANOSECONDS);
+    }
+}
\ No newline at end of file
