diff --git a/apps/faultmanagement/fmweb/src/test/java/org/onosproject/faultmanagement/web/AlarmJsonMatcher.java b/apps/faultmanagement/fmweb/src/test/java/org/onosproject/faultmanagement/web/AlarmJsonMatcher.java
new file mode 100644
index 0000000..14bb45f
--- /dev/null
+++ b/apps/faultmanagement/fmweb/src/test/java/org/onosproject/faultmanagement/web/AlarmJsonMatcher.java
@@ -0,0 +1,135 @@
+/*
+ * 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.faultmanagement.web;
+
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeDiagnosingMatcher;
+import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+/**
+ * Hamcrest matcher for alarms.
+ */
+public final class AlarmJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
+
+    private final Alarm alarm;
+
+    private AlarmJsonMatcher(final Alarm alarm) {
+        this.alarm = alarm;
+    }
+
+    @Override
+    public boolean matchesSafely(final JsonNode jsonAlarm, final Description description) {
+        final String jsonAlarmId = jsonAlarm.get("id").asText();
+        final String alarmId = Long.toString(alarm.id().fingerprint());
+        if (!jsonAlarmId.equals(alarmId)) {
+            description.appendText("alarm id was " + jsonAlarmId);
+            return false;
+        }
+
+        final String jsonDeviceId = jsonAlarm.get("deviceId").asText();
+        final String alarmDeviceId = alarm.deviceId().toString();
+        if (!jsonDeviceId.equals(alarmDeviceId)) {
+            description.appendText("DeviceId was " + jsonDeviceId);
+            return false;
+        }
+
+
+        final String jsonDescription = jsonAlarm.get("description").asText();
+        final String alarmDesc = alarm.description();
+        if (!jsonDescription.equals(alarmDesc)) {
+            description.appendText("description was " + jsonDescription);
+            return false;
+        }
+
+        final long jsonTimeRaised = jsonAlarm.get("timeRaised").asLong();
+        final long timeRaised = alarm.timeRaised();
+        if (timeRaised != jsonTimeRaised) {
+            description.appendText("timeRaised was " + jsonTimeRaised);
+            return false;
+        }
+
+
+        final long jsonTimeUpdated = jsonAlarm.get("timeUpdated").asLong();
+        final long timeUpdated = alarm.timeUpdated();
+        if (timeUpdated != jsonTimeUpdated) {
+            description.appendText("timeUpdated was " + jsonTimeUpdated);
+            return false;
+        }
+
+        final JsonNode jsonTimeClearedNode = jsonAlarm.get("timeCleared");
+
+        if (alarm.timeCleared() != null) {
+            final Long jsonTimeCleared = jsonTimeClearedNode.longValue();
+            final Long timeCleared = alarm.timeCleared();
+
+            if (!timeCleared.equals(jsonTimeCleared)) {
+                description.appendText("Time Cleared was " + jsonTimeCleared);
+                return false;
+            }
+        } else {
+            //  No clear time not specified, JSON representation must be empty
+            if (!jsonTimeClearedNode.isNull()) {
+                description.appendText("Time Cleared should be null");
+                return false;
+            }
+        }
+
+        final String jsonSeverity = jsonAlarm.get("severity").asText();
+        final String severity = alarm.severity().toString();
+        if (!severity.equals(jsonSeverity)) {
+            description.appendText("severity was " + jsonSeverity);
+            return false;
+        }
+
+        final JsonNode jsonAlarmNode = jsonAlarm.get("source");
+
+        if (alarm.source() != null) {
+            final String jsonSource = jsonAlarmNode.textValue();
+            final String source = alarm.source().toString();
+
+            if (!source.equals(jsonSource)) {
+                description.appendText("source was " + jsonSource);
+                return false;
+            }
+        } else {
+            //  source not specified, JSON representation must be empty
+            if (!jsonAlarmNode.isNull()) {
+                description.appendText("source should be null");
+                return false;
+            }
+        }
+
+        // In progress
+        return true;
+    }
+
+    @Override
+    public void describeTo(final Description description) {
+        description.appendText(alarm.toString());
+    }
+
+    /**
+     * Factory to allocate a alarm matcher.
+     *
+     * @param alarm alarm object we are looking for
+     * @return matcher
+     */
+    public static AlarmJsonMatcher matchesAlarm(final Alarm alarm) {
+        return new AlarmJsonMatcher(alarm);
+    }
+}
