diff --git a/providers/snmp/alarm/BUCK b/providers/snmp/alarm/BUCK
deleted file mode 100644
index 7217309..0000000
--- a/providers/snmp/alarm/BUCK
+++ /dev/null
@@ -1,36 +0,0 @@
-SRC = 'src/main/java/org/onosproject/**/'
-TEST = 'src/test/java/org/onosproject/**/'
-
-CURRENT_NAME = 'onos-snmp-provider-alarm'
-CURRENT_TARGET = ':' + CURRENT_NAME
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.servicemix.bundles.snmp4j',
-    '//lib:snmp-core',
-    '//lib:bti7000',
-    '//lib:mibs-net-snmp',
-    '//lib:mibs-rfc',
-    '//incubator/api:onos-incubator-api',
-    '//protocols/snmp/api:onos-snmp-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-]
-
-osgi_jar(
-    name = CURRENT_NAME,
-    srcs = glob([SRC + '/*.java']),
-    deps = COMPILE_DEPS,
-    visibility = ['PUBLIC'],
-)
-
-java_test(
-    name = 'tests',
-    srcs = glob([TEST + '/*.java']),
-    deps = COMPILE_DEPS +
-           TEST_DEPS +
-           [CURRENT_TARGET],
-    source_under_test = [CURRENT_TARGET],
-)
diff --git a/providers/snmp/alarm/src/main/java/org/onosproject/provider/snmp/alarm/impl/Bti7000SnmpAlarmProvider.java b/providers/snmp/alarm/src/main/java/org/onosproject/provider/snmp/alarm/impl/Bti7000SnmpAlarmProvider.java
deleted file mode 100644
index e444134..0000000
--- a/providers/snmp/alarm/src/main/java/org/onosproject/provider/snmp/alarm/impl/Bti7000SnmpAlarmProvider.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright 2015-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.provider.snmp.alarm.impl;
-
-import com.btisystems.mibbler.mibs.bti7000.bti7000_13_2_0.I_Device;
-import com.btisystems.mibbler.mibs.bti7000.bti7000_13_2_0._OidRegistry;
-import com.btisystems.mibbler.mibs.bti7000.bti7000_13_2_0.btisystems.btiproducts.bti7000.objects.conditions.ActAlarmTable;
-import com.btisystems.mibbler.mibs.bti7000.interfaces.btisystems.btiproducts.bti7000.objects.conditions.IActAlarmTable;
-import com.btisystems.pronx.ems.core.model.ClassRegistry;
-import com.btisystems.pronx.ems.core.model.IClassRegistry;
-import com.btisystems.pronx.ems.core.model.NetworkDevice;
-import com.btisystems.pronx.ems.core.snmp.ISnmpSession;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.TimeZone;
-import org.apache.commons.lang.StringUtils;
-import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
-import org.onosproject.incubator.net.faultmanagement.alarm.AlarmEntityId;
-import org.onosproject.incubator.net.faultmanagement.alarm.DefaultAlarm;
-import org.onosproject.net.DeviceId;
-import org.slf4j.Logger;
-import static org.slf4j.LoggerFactory.getLogger;
-import org.snmp4j.smi.OID;
-import org.snmp4j.smi.OctetString;
-
-/**
- * BTI 7000 specific implementation to provide a list of current alarms.
- * @deprecated 1.5.0 Falcon, not compliant with ONOS SB and driver architecture.
- */
-@Deprecated
-public class Bti7000SnmpAlarmProvider implements SnmpDeviceAlarmProvider {
-    private final Logger log = getLogger(getClass());
-    protected static final IClassRegistry CLASS_REGISTRY = new ClassRegistry(_OidRegistry.oidRegistry, I_Device.class);
-
-    static final int ALARM_SEVERITY_MINOR = 2;
-    static final int ALARM_SEVERITY_MAJOR = 3;
-    static final int ALARM_SEVERITY_CRITICAL = 4;
-
-    @Override
-    public Collection<Alarm> getAlarms(ISnmpSession session, DeviceId deviceID) {
-        log.info("Getting alarms for BTI 7000 device at {}", deviceID);
-        Set<Alarm> alarms = new HashSet<>();
-        NetworkDevice networkDevice = new NetworkDevice(CLASS_REGISTRY,
-                session.getAddress().getHostAddress());
-
-        try {
-            session.walkDevice(networkDevice, Arrays.asList(
-                    new OID[]{CLASS_REGISTRY.getClassToOidMap().get(ActAlarmTable.class)}));
-
-            IActAlarmTable deviceAlarms = (IActAlarmTable) networkDevice.getRootObject()
-                .getEntity(CLASS_REGISTRY.getClassToOidMap().get(ActAlarmTable.class));
-        if ((deviceAlarms != null) && (deviceAlarms.getActAlarmEntry() != null)
-                && (!deviceAlarms.getActAlarmEntry().isEmpty())) {
-
-            deviceAlarms.getActAlarmEntry().values().stream().forEach((alarm) -> {
-                DefaultAlarm.Builder alarmBuilder = new DefaultAlarm.Builder(
-                        deviceID, alarm.getActAlarmDescription(),
-                        mapAlarmSeverity(alarm.getActAlarmSeverity()),
-                        getLocalDateAndTime(alarm.getActAlarmDateAndTime(), null, null).getTime())
-                        .forSource(AlarmEntityId.alarmEntityId("other:" + alarm.getActAlarmInstanceIdx()));
-                alarms.add(alarmBuilder.build());
-            });
-
-        }
-        log.info("Conditions retrieved: {}", deviceAlarms);
-
-        } catch (IOException ex) {
-            log.error("Error reading alarms for device {}.", deviceID, ex);
-        }
-
-        return alarms;
-    }
-
-    private Alarm.SeverityLevel mapAlarmSeverity(int intAlarmSeverity) {
-        Alarm.SeverityLevel mappedSeverity;
-        switch (intAlarmSeverity) {
-            case ALARM_SEVERITY_MINOR:
-                mappedSeverity = Alarm.SeverityLevel.MINOR;
-                break;
-            case ALARM_SEVERITY_MAJOR:
-                mappedSeverity = Alarm.SeverityLevel.MAJOR;
-                break;
-            case ALARM_SEVERITY_CRITICAL:
-                mappedSeverity = Alarm.SeverityLevel.CRITICAL;
-                break;
-            default:
-                mappedSeverity = Alarm.SeverityLevel.MINOR;
-                log.warn("Unexpected alarm severity: {}", intAlarmSeverity);
-        }
-        return mappedSeverity;
-    }
-    /**
-     * Converts an SNMP string representation into a {@link Date} object,
-     * and applies time zone conversion to provide the time on the local machine, ie PSM server.
-     *
-     * @param actAlarmDateAndTime MIB-II DateAndTime formatted. May optionally contain
-     * a timezone offset in 3 extra bytes
-     * @param sysInfoTimeZone Must be supplied if actAlarmDateAndTime is just local time (with no timezone)
-     * @param swVersion Must be supplied if actAlarmDateAndTime is just local time (with no timezone)
-     * @return adjusted {@link Date} or a simple conversion if other fields are null.
-     */
-    public static Date getLocalDateAndTime(String actAlarmDateAndTime, String sysInfoTimeZone,
-            String swVersion) {
-        if (StringUtils.isBlank(actAlarmDateAndTime)) {
-            return null;
-        }
-
-        GregorianCalendar decodedDateAndTimeCal = btiMakeCalendar(OctetString.fromHexString(actAlarmDateAndTime));
-        if ((sysInfoTimeZone == null) || (swVersion == null)) {
-            return decodedDateAndTimeCal.getTime();
-        }
-
-        TimeZone javaTimeZone = getTimeZone();
-        decodedDateAndTimeCal.setTimeZone(javaTimeZone);
-
-        GregorianCalendar localTime = new GregorianCalendar();
-        localTime.setTimeInMillis(decodedDateAndTimeCal.getTimeInMillis());
-
-        return localTime.getTime();
-    }
-
-    /**
-     * This method is similar to SNMP4J approach with some fixes for the 11-bytes version (ie the one with timezone
-     * offset).
-     *
-     * For original makeCalendar refer @see http://www.snmp4j.org/agent/doc/org/snmp4j/agent/mo/snmp/DateAndTime.html
-     *
-     * Creates a <code>GregorianCalendar</code> from a properly formatted SNMP4J DateAndTime <code>OctetString</code>.
-     *
-     * @param dateAndTimeValue an OctetString conforming to the DateAndTime TC.
-     * @return the corresponding <code>GregorianCalendar</code> instance.
-     *
-     */
-    public static GregorianCalendar btiMakeCalendar(OctetString dateAndTimeValue) {
-        int year = (dateAndTimeValue.get(0) & 0xFF) * 256
-                + (dateAndTimeValue.get(1) & 0xFF);
-        int month = (dateAndTimeValue.get(2) & 0xFF);
-        int date = (dateAndTimeValue.get(3) & 0xFF);
-        int hour = (dateAndTimeValue.get(4) & 0xFF);
-        int minute = (dateAndTimeValue.get(5) & 0xFF);
-        int second = (dateAndTimeValue.get(6) & 0xFF);
-        int deci = (dateAndTimeValue.get(7) & 0xFF);
-        GregorianCalendar gc =
-                new GregorianCalendar(year, month - 1, date, hour, minute, second);
-        gc.set(Calendar.MILLISECOND, deci * 100);
-
-        if (dateAndTimeValue.length() == 11) {
-            char directionOfOffset = (char) dateAndTimeValue.get(8);
-            int hoursOffset = directionOfOffset == '+'
-                    ? dateAndTimeValue.get(9) : -dateAndTimeValue.get(9);
-            org.joda.time.DateTimeZone offset =
-                    org.joda.time.DateTimeZone.forOffsetHoursMinutes(hoursOffset, dateAndTimeValue.get(10));
-            org.joda.time.DateTime dt =
-                    new org.joda.time.DateTime(year, month, date, hour, minute, second, offset);
-            return dt.toGregorianCalendar();
-        }
-        return gc;
-    }
-
-    private static TimeZone getTimeZone() {
-        return Calendar.getInstance().getTimeZone();
-    }
-}
diff --git a/providers/snmp/alarm/src/main/java/org/onosproject/provider/snmp/alarm/impl/package-info.java b/providers/snmp/alarm/src/main/java/org/onosproject/provider/snmp/alarm/impl/package-info.java
deleted file mode 100644
index bbad1e7..0000000
--- a/providers/snmp/alarm/src/main/java/org/onosproject/provider/snmp/alarm/impl/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-<<<<<<< HEAD
- * Copyright 2015-present Open Networking Laboratory
-=======
- * Copyright 2015-present Open Networking Laboratory
->>>>>>> master
- *
- * 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.
- */
-
-/**
- * Provider that will support SNMP alarm discoveries.
- */
-package org.onosproject.provider.snmp.alarm.impl;
diff --git a/providers/snmp/app/app.xml b/providers/snmp/app/app.xml
index a680546..dbd5388 100644
--- a/providers/snmp/app/app.xml
+++ b/providers/snmp/app/app.xml
@@ -20,7 +20,6 @@
      features="${project.artifactId}">
     <description>${project.description}</description>
     <artifact>mvn:${project.groupId}/onos-snmp-provider-device/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-snmp-provider-alarm/${project.version}</artifact>
 
     <artifact>mvn:${project.groupId}/onos-snmp-api/${project.version}</artifact>
     <artifact>mvn:${project.groupId}/onos-snmp-ctl/${project.version}</artifact>
diff --git a/providers/snmp/app/features.xml b/providers/snmp/app/features.xml
index 20245a9..7398624 100644
--- a/providers/snmp/app/features.xml
+++ b/providers/snmp/app/features.xml
@@ -22,7 +22,6 @@
         <bundle>mvn:${project.groupId}/onos-snmp-api/${project.version}</bundle>
         <bundle>mvn:${project.groupId}/onos-snmp-ctl/${project.version}</bundle>
         <bundle>mvn:${project.groupId}/onos-snmp-provider-device/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-snmp-provider-alarm/${project.version}</bundle>
 
         <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.snmp4j/2.3.4_1</bundle>
         <bundle>mvn:com.btisystems/snmp-core/1.3-SNAPSHOT</bundle>
diff --git a/providers/snmp/app/pom.xml b/providers/snmp/app/pom.xml
index 5598c49..fc90e08 100644
--- a/providers/snmp/app/pom.xml
+++ b/providers/snmp/app/pom.xml
@@ -37,11 +37,6 @@
             <artifactId>onos-snmp-provider-device</artifactId>
             <version>${project.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-snmp-provider-alarm</artifactId>
-            <version>${project.version}</version>
-        </dependency>
     </dependencies>
 
 </project>
diff --git a/providers/snmp/device/pom.xml b/providers/snmp/device/pom.xml
index 86d077c..9e69cd0 100644
--- a/providers/snmp/device/pom.xml
+++ b/providers/snmp/device/pom.xml
@@ -77,12 +77,12 @@
         <dependency>
             <groupId>org.onosproject</groupId>
             <artifactId>onos-core-net</artifactId>
-            <version>1.6.0-SNAPSHOT</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.onosproject</groupId>
             <artifactId>onos-api</artifactId>
-            <version>1.6.0-SNAPSHOT</version>
+            <version>${project.version}</version>
             <classifier>tests</classifier>
             <scope>test</scope>
         </dependency>
@@ -96,4 +96,3 @@
         </plugins>
     </build>
 </project>
-   
diff --git a/providers/snmp/device/src/main/test/org/onosproject/provider/snmp/device/impl/SnmpDeviceProviderTest.java b/providers/snmp/device/src/main/test/org/onosproject/provider/snmp/device/impl/SnmpDeviceProviderTest.java
index b49b80e..ac7e2e0 100644
--- a/providers/snmp/device/src/main/test/org/onosproject/provider/snmp/device/impl/SnmpDeviceProviderTest.java
+++ b/providers/snmp/device/src/main/test/org/onosproject/provider/snmp/device/impl/SnmpDeviceProviderTest.java
@@ -48,7 +48,6 @@
 import org.onosproject.net.device.DeviceServiceAdapter;
 import org.onosproject.net.device.DeviceStore;
 import org.onosproject.net.device.DeviceStoreAdapter;
-import org.onosproject.net.driver.DriverService;
 import org.onosproject.net.driver.DriverServiceAdapter;
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.snmp.SnmpController;
diff --git a/providers/snmp/pom.xml b/providers/snmp/pom.xml
index 1fc946d..c1038e7 100644
--- a/providers/snmp/pom.xml
+++ b/providers/snmp/pom.xml
@@ -34,7 +34,6 @@
     <modules>
         <module>device</module>
         <module>app</module>
-        <module>alarm</module>
     </modules>
 
     <repositories>
