diff --git a/apps/faultmanagement/fmmgr/src/test/java/org/onosproject/faultmanagement/impl/AlarmsManagerTest.java b/apps/faultmanagement/fmmgr/src/test/java/org/onosproject/faultmanagement/impl/AlarmsManagerTest.java
new file mode 100644
index 0000000..586d233
--- /dev/null
+++ b/apps/faultmanagement/fmmgr/src/test/java/org/onosproject/faultmanagement/impl/AlarmsManagerTest.java
@@ -0,0 +1,136 @@
+/*
+ * 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.impl;
+
+import com.google.common.collect.Sets;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import org.junit.Test;
+import static org.junit.Assert.*;
+import org.onlab.util.ItemNotFoundException;
+import org.onosproject.net.DeviceId;
+import static org.hamcrest.Matchers.containsString;
+import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
+import static org.onosproject.incubator.net.faultmanagement.alarm.Alarm.SeverityLevel.*;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmEntityId;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmId;
+import org.onosproject.incubator.net.faultmanagement.alarm.DefaultAlarm;
+
+public class AlarmsManagerTest {
+
+    @Test
+    public void testGettersWhenNoAlarms() {
+        AlarmsManager am = new AlarmsManager();
+        assertTrue("No alarms", am.getAlarms().isEmpty());
+        assertTrue("No active alarms", am.getActiveAlarms().isEmpty());
+        assertTrue("No alarms gives empty map per unknown device", am.getAlarmCounts(DeviceId.NONE).keySet().isEmpty());
+        assertTrue("No alarms gives empty map", am.getAlarmCounts().keySet().isEmpty());
+
+        assertEquals("Zero alarms for that device", 0, am.getAlarms(DeviceId.NONE).size());
+        assertEquals("Zero major alarms", 0, am.getAlarms(Alarm.SeverityLevel.MAJOR).size());
+
+        try {
+            assertEquals("no alarms", 0, am.getAlarm(null));
+        } catch (NullPointerException ex) {
+            assertThat(ex.getMessage(),
+                    containsString("cannot be null"));
+        }
+
+        try {
+            assertEquals("no alarms", 0, am.getAlarm(AlarmId.alarmId(1)));
+        } catch (ItemNotFoundException ex) {
+            assertThat(ex.getMessage(),
+                    containsString("not found"));
+        }
+    }
+
+    @Test
+    public void testAlarmUpdates() {
+        AlarmsManager am = new AlarmsManager();
+        assertTrue("no alarms", am.getAlarms().isEmpty());
+
+        am.updateAlarms(new HashSet<>(), DEVICE_ID);
+        assertTrue("still no alarms", am.getAlarms().isEmpty());
+        Map<Alarm.SeverityLevel, Long> zeroAlarms = new CountsMapBuilder().create();
+        assertEquals(zeroAlarms, am.getAlarmCounts());
+        assertEquals(zeroAlarms, am.getAlarmCounts(DEVICE_ID));
+
+        am.updateAlarms(Sets.newHashSet(ALARM_B, ALARM_A), DEVICE_ID);
+        verifyGettingSetsOfAlarms(am, 2, 2);
+        Map<Alarm.SeverityLevel, Long> critical2 = new CountsMapBuilder().with(CRITICAL, 2L).create();
+        assertEquals(critical2, am.getAlarmCounts());
+        assertEquals(critical2, am.getAlarmCounts(DEVICE_ID));
+
+        am.updateAlarms(Sets.newHashSet(ALARM_A), DEVICE_ID);
+        verifyGettingSetsOfAlarms(am, 2, 1);
+        Map<Alarm.SeverityLevel, Long> critical1cleared1 =
+                new CountsMapBuilder().with(CRITICAL, 1L).with(CLEARED, 1L).create();
+        assertEquals(critical1cleared1, am.getAlarmCounts());
+        assertEquals(critical1cleared1, am.getAlarmCounts(DEVICE_ID));
+
+        // No change map when same alarms sent
+        am.updateAlarms(Sets.newHashSet(ALARM_A), DEVICE_ID);
+        verifyGettingSetsOfAlarms(am, 2, 1);
+        assertEquals(critical1cleared1, am.getAlarmCounts());
+        assertEquals(critical1cleared1, am.getAlarmCounts(DEVICE_ID));
+
+        am.updateAlarms(Sets.newHashSet(ALARM_A, ALARM_A_WITHSRC), DEVICE_ID);
+        verifyGettingSetsOfAlarms(am, 3, 2);
+        Map<Alarm.SeverityLevel, Long> critical2cleared1 =
+                new CountsMapBuilder().with(CRITICAL, 2L).with(CLEARED, 1L).create();
+        assertEquals(critical2cleared1, am.getAlarmCounts());
+        assertEquals(critical2cleared1, am.getAlarmCounts(DEVICE_ID));
+
+        am.updateAlarms(Sets.newHashSet(), DEVICE_ID);
+        verifyGettingSetsOfAlarms(am, 3, 0);
+        assertEquals(new CountsMapBuilder().with(CLEARED, 3L).create(), am.getAlarmCounts(DEVICE_ID));
+
+        assertEquals("No alarms for unknown devices", zeroAlarms, am.getAlarmCounts(DeviceId.NONE));
+        assertEquals("No alarms for unknown devices", zeroAlarms, am.getAlarmCounts(DeviceId.deviceId("junk:junk")));
+
+    }
+
+    private void verifyGettingSetsOfAlarms(AlarmsManager am, int expectedTotal, int expectedActive) {
+        assertEquals("Wrong total", expectedTotal, am.getAlarms().size());
+        assertEquals("Wrong active count", expectedActive, am.getActiveAlarms().size());
+    }
+    private static final DeviceId DEVICE_ID = DeviceId.deviceId("foo:bar");
+    private static final DefaultAlarm ALARM_A = new DefaultAlarm.Builder(
+            DEVICE_ID, "aaa", Alarm.SeverityLevel.CRITICAL, 0).build();
+
+    private static final DefaultAlarm ALARM_A_WITHSRC = new DefaultAlarm.Builder(
+            ALARM_A).forSource(AlarmEntityId.alarmEntityId("port:foo")).build();
+
+    private static final DefaultAlarm ALARM_B = new DefaultAlarm.Builder(
+            DEVICE_ID, "bbb", Alarm.SeverityLevel.CRITICAL, 0).build();
+
+    private static class CountsMapBuilder {
+
+        private final Map<Alarm.SeverityLevel, Long> map = new HashMap<>();
+
+        public CountsMapBuilder with(Alarm.SeverityLevel sev, Long count) {
+            map.put(sev, count);
+            return this;
+        }
+
+        public Map<Alarm.SeverityLevel, Long> create() {
+            return Collections.unmodifiableMap(map);
+        }
+    }
+
+}
