CHANGE 1:
Patch to show API for Alarms in Fault Management.
AlarmsWebResource.java & Alarm.java show what the external REST API for alarms would look like.
See more info at https://wiki.onosproject.org/display/ONOS/Fault+Management
Everything else is very early and work-in-progress/mostly just stubbed out, and not ready for review but all advice welcome.

CHANGE 2:
[ONOS-3203] Update re. comments on FM API draft.
Comments were from Thomas Vachuska regarding https://gerrit.onosproject.org/#/c/6180/
Change-Id: If8d330d1b18b503e89849587e2d4388bf67becc0
diff --git a/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/AlarmsManager.java b/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/AlarmsManager.java
new file mode 100644
index 0000000..74fe707
--- /dev/null
+++ b/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/AlarmsManager.java
@@ -0,0 +1,222 @@
+/*
+ * 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 static com.google.common.base.Strings.isNullOrEmpty;
+import java.util.Dictionary;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Modified;
+import org.apache.felix.scr.annotations.Property;
+import static org.onlab.util.Tools.nullIsNotFound;
+
+import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmEntityId;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmEvent;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmId;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmListener;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmService;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DeviceId;
+import org.slf4j.Logger;
+import static org.slf4j.LoggerFactory.getLogger;
+import org.apache.felix.scr.annotations.Service;
+import static org.onlab.util.Tools.get;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.IdGenerator;
+import org.onosproject.core.CoreService;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onlab.util.ItemNotFoundException;
+import org.onosproject.incubator.net.faultmanagement.alarm.DefaultAlarm;
+import org.osgi.service.component.ComponentContext;
+
+/**
+ * Implementation of the Alarm service.
+ */
+@Component(immediate = true)
+@Service
+public class AlarmsManager implements AlarmService {
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CoreService coreService;
+    private final Logger log = getLogger(getClass());
+    private ApplicationId appId;
+    private IdGenerator idGenerator;
+
+
+    @Property(name = "fmDevices", value = "127.0.0.1", label = "Instance-specific configurations")
+    private String devConfigs;
+
+    private final Map<AlarmId, Alarm> alarms = new ConcurrentHashMap<>();
+
+
+    private final AtomicLong alarmIdGenerator = new AtomicLong(0);
+
+    @Override
+    public Alarm update(final Alarm replacement) {
+
+        final Alarm found = alarms.get(replacement.id());
+        if (found == null) {
+            throw new ItemNotFoundException("Alarm with id " + replacement.id() + " found");
+        }
+        final Alarm updated = new DefaultAlarm.Builder(found).
+                withAcknowledged(replacement.acknowledged()).
+                withAssignedUser(replacement.assignedUser()).build();
+        alarms.put(replacement.id(), updated);
+        return updated;
+    }
+
+    @Override
+    public int getActiveAlarmCount(final DeviceId deviceId) {
+        //TODO
+        throw new UnsupportedOperationException(NOT_SUPPORTED_YET);
+    }
+    private static final String NOT_SUPPORTED_YET = "Not supported yet.";
+
+    @Override
+    public Alarm getAlarm(final AlarmId alarmId) {
+        return nullIsNotFound(
+                alarms.get(alarmId),
+                "Alarm is not found");
+    }
+
+    @Override
+    public Set<Alarm> getAlarms() {
+        //TODO
+        throw new UnsupportedOperationException(NOT_SUPPORTED_YET);
+    }
+
+    @Override
+    public Set<Alarm> getActiveAlarms() {
+        // Enpty set if no values
+        return alarms.isEmpty() ? new HashSet<>() : new HashSet<>(alarms.values());
+
+    }
+
+    private static DefaultAlarm generateFake(final DeviceId deviceId, final AlarmId alarmId) {
+
+        return new DefaultAlarm.Builder(
+                alarmId, deviceId, "NE is not reachable", Alarm.SeverityLevel.MAJOR, System.currentTimeMillis()).
+                withTimeUpdated(System.currentTimeMillis()).
+                withServiceAffecting(true)
+                .withAcknowledged(true).
+                withManuallyClearable(true)
+                .withAssignedUser("user1").build();
+    }
+
+    @Override
+    public Set<Alarm> getAlarms(final Alarm.SeverityLevel severity) {
+        //TODO
+        throw new UnsupportedOperationException(NOT_SUPPORTED_YET);
+    }
+
+    @Override
+    public Set<Alarm> getAlarms(final DeviceId deviceId) {
+        //TODO
+        throw new UnsupportedOperationException(NOT_SUPPORTED_YET);
+    }
+
+    @Override
+    public Set<Alarm> getAlarms(final DeviceId deviceId, final AlarmEntityId source) {
+        //TODO
+        throw new UnsupportedOperationException(NOT_SUPPORTED_YET);
+    }
+
+    @Override
+    public Set<Alarm> getAlarmsForLink(final ConnectPoint src, final ConnectPoint dst) {
+        //TODO
+        throw new UnsupportedOperationException(NOT_SUPPORTED_YET);
+    }
+
+    @Override
+    public Set<Alarm> getAlarmsForFlow(final DeviceId deviceId, final long flowId) {
+        //TODO
+        throw new UnsupportedOperationException(NOT_SUPPORTED_YET);
+    }
+
+    private void discoverAlarmsForDevice(final DeviceId deviceId) {
+        final AlarmId alarmId = new AlarmId(alarmIdGenerator.incrementAndGet());
+
+        // TODO In a new thread invoke SNMP Provider with DeviceId and device type and when done update our of alarms
+        //
+        alarms.put(alarmId, generateFake(deviceId, alarmId));
+
+    }
+
+    private class InternalAlarmListener implements AlarmListener {
+
+        @Override
+        public void event(final AlarmEvent event) {
+            // TODO
+            throw new UnsupportedOperationException(NOT_SUPPORTED_YET);
+        }
+    }
+
+    @Activate
+    public void activate(final ComponentContext context) {
+        log.info("Activate ...");
+        appId = coreService.registerApplication("org.onos.faultmanagement.alarms");
+        idGenerator = coreService.getIdGenerator("alarm-ids");
+        log.info("Started with appId={} idGenerator={}", appId, idGenerator);
+
+        final boolean result = modified(context);
+        log.info("modified result = {}", result);
+
+    }
+
+    @Deactivate
+    public void deactivate(final ComponentContext context) {
+        log.info("Deactivate ...");
+        //     cfgService.unregisterProperties(getClass(), false);
+
+        log.info("Stopped");
+    }
+
+    @Modified
+    public boolean modified(final ComponentContext context) {
+        log.info("context={}", context);
+        if (context == null) {
+            log.info("No configuration file");
+            return false;
+        }
+        final Dictionary<?, ?> properties = context.getProperties();
+        final String ipaddresses = get(properties, "fmDevices");
+        log.info("Settings: devConfigs={}", ipaddresses);
+        if (!isNullOrEmpty(ipaddresses)) {
+            discover(ipaddresses);
+
+        }
+        return true;
+    }
+
+    private void discover(final String ipaddresses) {
+        for (String deviceEntry : ipaddresses.split(",")) {
+            final DeviceId deviceId = DeviceId.deviceId(deviceEntry);
+            if (deviceId != null) {
+                log.info("Device {} needs to have its alarms refreshed!", deviceId);
+                discoverAlarmsForDevice(deviceId);
+            }
+        }
+    }
+
+}