diff --git a/apps/faultmanagement/BUCK b/apps/faultmanagement/BUCK
index 9d59162..375ceff 100644
--- a/apps/faultmanagement/BUCK
+++ b/apps/faultmanagement/BUCK
@@ -8,6 +8,7 @@
     '//cli:onos-cli',
     '//utils/rest:onlab-rest',
     '//lib:javax.ws.rs-api',
+    '//utils/osgi:onlab-osgi',
 ]
 
 TEST_DEPS = [
@@ -16,6 +17,8 @@
     '//lib:jersey-test-framework-grizzly2',
     '//utils/osgi:onlab-osgi-tests',
     '//web/api:onos-rest-tests',
+    '//utils/osgi:onlab-osgi',
+    '//incubator/api:onos-incubator-api-tests',
 ]
 
 java_library(
diff --git a/apps/faultmanagement/fmmgr/pom.xml b/apps/faultmanagement/fmmgr/pom.xml
index 3e1f3bd..3ca2f58 100644
--- a/apps/faultmanagement/fmmgr/pom.xml
+++ b/apps/faultmanagement/fmmgr/pom.xml
@@ -47,8 +47,27 @@
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.compendium</artifactId>
-            <version>5.0.0</version>
-            <type>jar</type>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-incubator-api</artifactId>
+            <version>${project.version}</version>
+            <classifier>tests</classifier>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-osgi</artifactId>
+            <version>${project.version}</version>
+            <classifier>tests</classifier>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-api</artifactId>
+            <version>${project.version}</version>
+            <classifier>tests</classifier>
+            <scope>test</scope>
         </dependency>
     </dependencies>
 </project>
diff --git a/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/PollingAlarmProvider.java b/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/PollingAlarmProvider.java
new file mode 100644
index 0000000..eae9a63
--- /dev/null
+++ b/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/PollingAlarmProvider.java
@@ -0,0 +1,229 @@
+/*
+ * Copyright 2016-present 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 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 org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmConsumer;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmProvider;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmProviderRegistry;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmProviderService;
+import org.onosproject.mastership.MastershipEvent;
+import org.onosproject.mastership.MastershipListener;
+import org.onosproject.mastership.MastershipService;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.device.DeviceEvent;
+import org.onosproject.net.device.DeviceListener;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.provider.AbstractProvider;
+import org.onosproject.net.provider.ProviderId;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+
+import java.util.Dictionary;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import static com.google.common.base.Strings.isNullOrEmpty;
+import static org.onlab.util.Tools.get;
+import static org.onlab.util.Tools.groupedThreads;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Alarm provider capable of polling the environment using the device driver
+ * {@link AlarmConsumer} behaviour.
+ */
+@Component(immediate = true)
+public class PollingAlarmProvider extends AbstractProvider implements AlarmProvider {
+
+    private final Logger log = getLogger(getClass());
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected DeviceService deviceService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected MastershipService mastershipService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected AlarmProviderRegistry providerRegistry;
+
+    protected AlarmProviderService providerService;
+
+    protected ScheduledExecutorService alarmsExecutor;
+
+    private ScheduledFuture<?> scheduledTask;
+
+    private ExecutorService eventHandlingExecutor;
+
+    protected final MastershipListener mastershipListener = new InternalMastershipListener();
+
+    protected final DeviceListener deviceListener = new InternalDeviceListener();
+
+    private static final int CORE_POOL_SIZE = 10;
+
+    private static final int DEFAULT_POLL_FREQUENCY_SECONDS = 60;
+    @Property(name = "alarmPollFrequencySeconds", intValue = DEFAULT_POLL_FREQUENCY_SECONDS,
+            label = "Frequency (in seconds) for polling alarm from devices")
+    protected int alarmPollFrequencySeconds = DEFAULT_POLL_FREQUENCY_SECONDS;
+
+    // TODO implement purging of old alarms.
+    private static final int DEFAULT_CLEAR_FREQUENCY_SECONDS = 500;
+    @Property(name = "clearedAlarmPurgeSeconds", intValue = DEFAULT_CLEAR_FREQUENCY_SECONDS,
+            label = "Frequency (in seconds) for deleting cleared alarms")
+    private int clearedAlarmPurgeFrequencySeconds = DEFAULT_CLEAR_FREQUENCY_SECONDS;
+
+    public PollingAlarmProvider() {
+        super(new ProviderId("default", "org.onosproject.core"));
+    }
+
+    @Activate
+    public void activate(ComponentContext context) {
+        alarmsExecutor = Executors.newScheduledThreadPool(CORE_POOL_SIZE);
+        eventHandlingExecutor =
+                Executors.newFixedThreadPool(CORE_POOL_SIZE,
+                                             groupedThreads("onos/pollingalarmprovider",
+                                                            "device-installer-%d", log));
+
+        providerService = providerRegistry.register(this);
+
+        deviceService.addListener(deviceListener);
+        mastershipService.addListener(mastershipListener);
+
+        if (context == null) {
+            alarmPollFrequencySeconds = DEFAULT_POLL_FREQUENCY_SECONDS;
+            log.info("No component configuration");
+        } else {
+            Dictionary<?, ?> properties = context.getProperties();
+            alarmPollFrequencySeconds = getNewPollFrequency(properties, alarmPollFrequencySeconds);
+        }
+        scheduledTask = schedulePolling();
+        log.info("Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        providerRegistry.unregister(this);
+        mastershipService.removeListener(mastershipListener);
+        deviceService.removeListener(deviceListener);
+        alarmsExecutor.shutdown();
+        providerService = null;
+        log.info("Stopped");
+    }
+
+    @Modified
+    public void modified(ComponentContext context) {
+        if (context == null) {
+            log.info("No component configuration");
+            return;
+        }
+
+        Dictionary<?, ?> properties = context.getProperties();
+        int newPollFrequency = getNewPollFrequency(properties, alarmPollFrequencySeconds);
+        if (newPollFrequency != alarmPollFrequencySeconds) {
+            alarmPollFrequencySeconds = newPollFrequency;
+            //stops the old scheduled task
+            scheduledTask.cancel(true);
+            //schedules new task at the new polling rate
+            scheduledTask = schedulePolling();
+        }
+    }
+
+    private ScheduledFuture schedulePolling() {
+        return alarmsExecutor.scheduleAtFixedRate(this::consumeAlarms,
+                                                  alarmPollFrequencySeconds / 4, alarmPollFrequencySeconds,
+                                                  TimeUnit.SECONDS);
+    }
+
+    private int getNewPollFrequency(Dictionary<?, ?> properties, int pollFrequency) {
+        int newPollFrequency;
+        try {
+            String s = get(properties, "pollFrequency");
+            newPollFrequency = isNullOrEmpty(s) ? pollFrequency : Integer.parseInt(s.trim());
+        } catch (NumberFormatException | ClassCastException e) {
+            newPollFrequency = DEFAULT_POLL_FREQUENCY_SECONDS;
+        }
+        return newPollFrequency;
+    }
+
+    @Override
+    public void triggerProbe(DeviceId deviceId) {
+        if (mastershipService.isLocalMaster(deviceId)) {
+            triggerProbe(deviceService.getDevice(deviceId));
+        }
+    }
+
+    private void triggerProbe(Device device) {
+        alarmsExecutor.submit(() -> consumeAlarms(device));
+    }
+
+    private void consumeAlarms() {
+        deviceService.getAvailableDevices().forEach(device -> {
+            if (mastershipService.isLocalMaster(device.id())) {
+                consumeAlarms(device);
+            }
+        });
+    }
+
+    private void consumeAlarms(Device device) {
+        if (device.is(AlarmConsumer.class)) {
+            providerService.updateAlarmList(device.id(),
+                                            device.as(AlarmConsumer.class).consumeAlarms());
+        } else {
+            log.info("Device {} does not support alarm consumer behaviour", device.id());
+        }
+    }
+
+    private class InternalMastershipListener implements MastershipListener {
+
+        @Override
+        public boolean isRelevant(MastershipEvent event) {
+            return mastershipService.isLocalMaster(event.subject());
+        }
+
+        @Override
+        public void event(MastershipEvent event) {
+            triggerProbe(event.subject());
+        }
+    }
+
+    /**
+     * Internal listener for device service events.
+     */
+    private class InternalDeviceListener implements DeviceListener {
+
+        @Override
+        public boolean isRelevant(DeviceEvent event) {
+            return event.type().equals(DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED)
+                    && deviceService.isAvailable(event.subject().id());
+        }
+
+        @Override
+        public void event(DeviceEvent event) {
+            log.debug("InternalDeviceListener has got event from device-service{} with ", event);
+            eventHandlingExecutor.execute(() -> triggerProbe(event.subject().id()));
+        }
+
+    }
+}
diff --git a/apps/faultmanagement/fmmgr/src/test/java/org/onosproject/faultmanagement/impl/PollingAlarmProviderTest.java b/apps/faultmanagement/fmmgr/src/test/java/org/onosproject/faultmanagement/impl/PollingAlarmProviderTest.java
new file mode 100644
index 0000000..3074dd5
--- /dev/null
+++ b/apps/faultmanagement/fmmgr/src/test/java/org/onosproject/faultmanagement/impl/PollingAlarmProviderTest.java
@@ -0,0 +1,365 @@
+/*
+ * Copyright 2016-present 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.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.osgi.ComponentContextAdapter;
+import org.onlab.packet.ChassisId;
+import org.onosproject.cluster.NodeId;
+import org.onosproject.cluster.RoleInfo;
+import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmConsumer;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmProvider;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmProviderRegistry;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmProviderRegistryAdapter;
+import org.onosproject.incubator.net.faultmanagement.alarm.AlarmProviderService;
+import org.onosproject.incubator.net.faultmanagement.alarm.DefaultAlarm;
+import org.onosproject.mastership.MastershipEvent;
+import org.onosproject.mastership.MastershipListener;
+import org.onosproject.mastership.MastershipService;
+import org.onosproject.mastership.MastershipServiceAdapter;
+import org.onosproject.net.AbstractProjectableModel;
+import org.onosproject.net.Annotations;
+import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.DefaultDevice;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.device.DeviceEvent;
+import org.onosproject.net.device.DeviceListener;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.device.DeviceServiceAdapter;
+import org.onosproject.net.driver.AbstractHandlerBehaviour;
+import org.onosproject.net.driver.Behaviour;
+import org.onosproject.net.driver.Driver;
+import org.onosproject.net.driver.DriverAdapter;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.net.driver.DriverServiceAdapter;
+import org.onosproject.net.provider.ProviderId;
+import org.osgi.service.component.ComponentContext;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import static org.junit.Assert.*;
+import static org.onlab.junit.TestTools.assertAfter;
+
+/**
+ * Test for the polling alarm provider based on the driver subsystem.
+ */
+public class PollingAlarmProviderTest {
+
+    private final DeviceService deviceService = new MockDeviceService();
+
+    private final MastershipService mastershipService = new MockMastershipService();
+
+    private final AlarmProviderRegistry providerRegistry = new MockDeviceProviderRegistry();
+
+    private final AlarmProviderService alarmProviderService = new MockAlarmProviderService();
+
+    private final ComponentContext context = new MockComponentContext();
+
+    private static final DeviceId DEVICE_ID = DeviceId.deviceId("foo:1.1.1.1:1");
+
+    private Device device = new MockDevice(ProviderId.NONE, DEVICE_ID, Device.Type.OTHER,
+                                           "foo.inc", "0", "0", "0", null,
+                                           DefaultAnnotations.builder().build());
+
+    private final NodeId nodeId = NodeId.nodeId("fooNode");
+
+    private final MastershipEvent mastershipEvent =
+            new MastershipEvent(MastershipEvent.Type.MASTER_CHANGED, DEVICE_ID,
+                                new RoleInfo(nodeId, ImmutableList.of()));
+
+    private final DeviceEvent deviceEvent =
+            new DeviceEvent(DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED, device);
+
+
+    private static final DefaultAlarm ALARM = new DefaultAlarm.Builder(
+            DEVICE_ID, "aaa", Alarm.SeverityLevel.CRITICAL, 0).build();
+
+    private final Driver driver = new MockDriver();
+
+    private PollingAlarmProvider provider = new PollingAlarmProvider();
+    private Set<DeviceListener> deviceListeners = new HashSet<>();
+    private Set<MastershipListener> mastershipListeners = new HashSet<>();
+    private HashMap<DeviceId, Collection<Alarm>> alarmStore = new HashMap<>();
+
+    @Before
+    public void setUp() {
+        provider.providerRegistry = providerRegistry;
+        provider.deviceService = deviceService;
+        provider.mastershipService = mastershipService;
+        AbstractProjectableModel.setDriverService(null, new DriverServiceAdapter());
+        provider.activate(context);
+    }
+
+    @Test
+    public void activate() throws Exception {
+        assertFalse("Provider should be registered", providerRegistry.getProviders().contains(provider));
+        assertEquals("Device listener should be added", 1, deviceListeners.size());
+        assertEquals("Incorrect alarm provider service", alarmProviderService, provider.providerService);
+        assertEquals("Mastership listener should be added", 1, mastershipListeners.size());
+        assertEquals("Incorrect polling frequency", 1, provider.alarmPollFrequencySeconds);
+        assertFalse("Executor should be running", provider.alarmsExecutor.isShutdown());
+        provider.activate(null);
+        assertEquals("Incorrect polling frequency, should be default", 60, provider.alarmPollFrequencySeconds);
+    }
+
+    @Test
+    public void deactivate() throws Exception {
+        provider.deactivate();
+        assertEquals("Device listener should be removed", 0, deviceListeners.size());
+        assertEquals("Mastership listener should be removed", 0, mastershipListeners.size());
+        assertFalse("Provider should not be registered", providerRegistry.getProviders().contains(provider));
+        assertTrue(provider.alarmsExecutor.isShutdown());
+        assertNull(provider.providerService);
+    }
+
+    @Test
+    public void modified() throws Exception {
+        provider.modified(null);
+        assertEquals("Incorrect polling frequency", 1, provider.alarmPollFrequencySeconds);
+        provider.activate(null);
+        provider.modified(context);
+        assertEquals("Incorrect polling frequency", 1, provider.alarmPollFrequencySeconds);
+    }
+
+    @Test
+    public void alarmsPresent() throws IOException {
+        assertAfter(1100, () -> {
+            assertTrue("Alarms should be added", alarmStore.containsKey(DEVICE_ID));
+            assertTrue("Alarms should be added", alarmStore.get(DEVICE_ID).contains(ALARM));
+        });
+    }
+
+    @Test
+    public void mastershipListenerEvent() throws Exception {
+        assertTrue("Incorrect relevant event", provider.mastershipListener
+                .isRelevant(mastershipEvent));
+        provider.mastershipListener.event(mastershipEvent);
+        assertAfter(1100, () -> {
+            assertTrue("Alarms should be added", alarmStore.containsKey(DEVICE_ID));
+        });
+    }
+
+    @Test
+    public void deviceListenerEvent() throws Exception {
+        assertTrue("Incorrect relevant event", provider.deviceListener
+                .isRelevant(deviceEvent));
+        provider.deviceListener.event(deviceEvent);
+        assertAfter(1100, () -> {
+            assertTrue("Alarms should be added", alarmStore.containsKey(DEVICE_ID));
+        });
+    }
+
+    //TODO add test for modified context and event handling form device listener.
+
+    private class MockDeviceService extends DeviceServiceAdapter {
+
+        @Override
+        public Device getDevice(DeviceId did) {
+            if (did.equals(DEVICE_ID)) {
+                return device;
+            }
+            return null;
+        }
+
+        @Override
+        public Iterable<Device> getAvailableDevices() {
+            return ImmutableSet.of(device);
+        }
+
+        @Override
+        public boolean isAvailable(DeviceId did) {
+            return did.equals(DEVICE_ID);
+        }
+
+        @Override
+        public void addListener(DeviceListener listener) {
+            deviceListeners.add(listener);
+        }
+
+        @Override
+        public void removeListener(DeviceListener listener) {
+            deviceListeners.remove(listener);
+        }
+    }
+
+    private class MockMastershipService extends MastershipServiceAdapter {
+
+        @Override
+        public boolean isLocalMaster(DeviceId deviceId) {
+            return true;
+        }
+
+        @Override
+        public void addListener(MastershipListener listener) {
+            mastershipListeners.add(listener);
+        }
+
+        @Override
+        public void removeListener(MastershipListener listener) {
+            mastershipListeners.remove(listener);
+        }
+    }
+
+    private class MockDeviceProviderRegistry extends AlarmProviderRegistryAdapter {
+
+        Set<ProviderId> providers = new HashSet<>();
+
+        @Override
+        public AlarmProviderService register(AlarmProvider provider) {
+            return alarmProviderService;
+        }
+
+        @Override
+        public void unregister(AlarmProvider provider) {
+            providers.remove(provider.id());
+        }
+
+        @Override
+        public Set<ProviderId> getProviders() {
+            return providers;
+        }
+
+    }
+
+    private class MockAlarmProviderService implements AlarmProviderService {
+
+        @Override
+        public void updateAlarmList(DeviceId deviceId, Collection<Alarm> alarms) {
+            if (alarmStore.containsKey(deviceId)) {
+                Collection<Alarm> deviceAlarms = alarmStore.get(deviceId);
+                deviceAlarms.addAll(alarms);
+                alarmStore.put(deviceId, deviceAlarms);
+            } else {
+                alarmStore.put(deviceId, alarms);
+            }
+
+        }
+
+        @Override
+        public AlarmProvider provider() {
+            return null;
+        }
+    }
+
+    private class MockComponentContext extends ComponentContextAdapter {
+        @Override
+        public Dictionary getProperties() {
+            return new MockDictionary();
+        }
+    }
+
+    private class MockDictionary extends Dictionary {
+
+        @Override
+        public int size() {
+            return 0;
+        }
+
+        @Override
+        public boolean isEmpty() {
+            return false;
+        }
+
+        @Override
+        public Enumeration keys() {
+            return null;
+        }
+
+        @Override
+        public Enumeration elements() {
+            return null;
+        }
+
+        @Override
+        public Object get(Object key) {
+            if (key.equals("pollFrequency")) {
+                return "1";
+            }
+            return null;
+        }
+
+        @Override
+        public Object put(Object key, Object value) {
+            return null;
+        }
+
+        @Override
+        public Object remove(Object key) {
+            return null;
+        }
+    }
+
+    private class MockDevice extends DefaultDevice {
+        /**
+         * Creates a network element attributed to the specified provider.
+         *
+         * @param providerId   identity of the provider
+         * @param id           device identifier
+         * @param type         device type
+         * @param manufacturer device manufacturer
+         * @param hwVersion    device HW version
+         * @param swVersion    device SW version
+         * @param serialNumber device serial number
+         * @param chassisId    chassis id
+         * @param annotations  optional key/value annotations
+         */
+        public MockDevice(ProviderId providerId, DeviceId id, Type type,
+                          String manufacturer, String hwVersion, String swVersion,
+                          String serialNumber, ChassisId chassisId, Annotations... annotations) {
+            super(providerId, id, type, manufacturer, hwVersion, swVersion, serialNumber,
+                  chassisId, annotations);
+        }
+
+        @Override
+        protected Driver locateDriver() {
+            return driver;
+        }
+
+        @Override
+        public Driver driver() {
+            return driver;
+        }
+    }
+
+    private class MockDriver extends DriverAdapter {
+        @Override
+        public <T extends Behaviour> T createBehaviour(DriverHandler handler, Class<T> behaviourClass) {
+            return (T) new TestAlarmConsumer();
+        }
+    }
+
+    private class TestAlarmConsumer extends AbstractHandlerBehaviour implements AlarmConsumer {
+
+        @Override
+        public List<Alarm> consumeAlarms() {
+            return ImmutableList.of(ALARM);
+        }
+    }
+
+}
