[ONOS-3943] SNMP protocol and provider refactoring according to ONOS architecture

Change-Id: Ie87ee6c181c9550ffac602397f2ee74a691bbdfa
diff --git a/drivers/bti/BUCK b/drivers/bti/BUCK
new file mode 100644
index 0000000..a9a69f3
--- /dev/null
+++ b/drivers/bti/BUCK
@@ -0,0 +1,19 @@
+SRC = 'src/main/java/org/onosproject/**/'
+
+CURRENT_NAME = 'onos-drivers-bti'
+CURRENT_TARGET = ':' + CURRENT_NAME
+
+COMPILE_DEPS = [
+    '//lib:CORE_DEPS',
+    '//protocols/netconf/api:onos-snmp-api',
+    '//incubator/api:onos-incubator-api'
+]
+
+java_library(
+    name = CURRENT_NAME,
+    srcs = glob([SRC + '/*.java']),
+    deps = COMPILE_DEPS,
+    visibility = ['PUBLIC'],
+    resources_root = 'src/main/resources',
+    resources = glob(['src/main/resources/**']),
+)
diff --git a/drivers/bti/features.xml b/drivers/bti/features.xml
new file mode 100644
index 0000000..25f1595
--- /dev/null
+++ b/drivers/bti/features.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+
+<!--
+  ~ Copyright 2016 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.
+  -->
+<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
+    <feature name="${project.artifactId}" version="${project.version}"
+             description="${project.description}">
+        <feature>onos-api</feature>
+
+        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
+
+        <bundle>mvn:${project.groupId}/onos-snmp-api/${project.version}</bundle>
+
+        <bundle>mvn:${project.groupId}/onos-incubator-api/${project.version}</bundle>
+
+    </feature>
+</features>
diff --git a/drivers/bti/pom.xml b/drivers/bti/pom.xml
new file mode 100644
index 0000000..42502c3
--- /dev/null
+++ b/drivers/bti/pom.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2016 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>onos-drivers-general</artifactId>
+        <groupId>org.onosproject</groupId>
+        <version>1.6.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>onos-drivers-bti</artifactId>
+    <packaging>bundle</packaging>
+
+    <properties>
+        <onos.app.name>org.onosproject.drivers.bti</onos.app.name>
+        <onos.app.origin>ON.Lab</onos.app.origin>
+        <onos.app.category>Drivers</onos.app.category>
+        <onos.app.title>Bti Device Drivers</onos.app.title>
+        <onos.app.url>http://onosproject.org</onos.app.url>
+        <onos.app.requires>
+            org.onosproject.snmp
+        </onos.app.requires>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-snmp-api</artifactId>
+            <version>1.6.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-incubator-api</artifactId>
+            <version>1.6.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/drivers/bti/src/main/java/org/onosproject/drivers/bti/Bti7000DeviceDescriptor.java b/drivers/bti/src/main/java/org/onosproject/drivers/bti/Bti7000DeviceDescriptor.java
new file mode 100644
index 0000000..15242a4
--- /dev/null
+++ b/drivers/bti/src/main/java/org/onosproject/drivers/bti/Bti7000DeviceDescriptor.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2016 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.drivers.bti;
+
+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.mib_2.System;
+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.ISnmpConfiguration;
+import com.btisystems.pronx.ems.core.snmp.ISnmpSession;
+import com.btisystems.pronx.ems.core.snmp.V2cSnmpConfiguration;
+import com.google.common.collect.ImmutableList;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.SparseAnnotations;
+import org.onosproject.net.device.DefaultDeviceDescription;
+import org.onosproject.net.device.DeviceDescription;
+import org.onosproject.net.device.DeviceDescriptionDiscovery;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.device.PortDescription;
+import org.onosproject.net.driver.AbstractHandlerBehaviour;
+import org.onosproject.snmp.SnmpController;
+import org.onosproject.snmp.SnmpDevice;
+import org.slf4j.Logger;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Bti 7000 SNMP device description behaviour. Provides device description and port information.
+ */
+public class Bti7000DeviceDescriptor extends AbstractHandlerBehaviour implements DeviceDescriptionDiscovery {
+
+    private final Logger log = getLogger(getClass());
+    protected static final IClassRegistry CLASS_REGISTRY =
+            new ClassRegistry(_OidRegistry.oidRegistry, I_Device.class);
+    private static final String UNKNOWN = "unknown";
+
+    @Override
+    public DeviceDescription discoverDeviceDetails() {
+        SnmpController controller = checkNotNull(handler().get(SnmpController.class));
+        DeviceId deviceId = handler().data().deviceId();
+        SnmpDevice snmpDevice = controller.getDevice(deviceId);
+        DeviceService deviceService = checkNotNull(handler().get(DeviceService.class));
+        Device device = deviceService.getDevice(deviceId);
+        DeviceDescription desc = null;
+        String ipAddress = snmpDevice.getSnmpHost();
+        int port = snmpDevice.getSnmpPort();
+
+        ISnmpConfiguration config = new V2cSnmpConfiguration();
+        config.setPort(port);
+
+        try (ISnmpSession session = controller.getSession(deviceId)) {
+            // Each session will be auto-closed.
+            String deviceOid = session.identifyDevice();
+            desc = populateDescription(session, device);
+
+        } catch (IOException | RuntimeException ex) {
+            log.error("Failed to walk device.", ex.getMessage());
+            log.debug("Detailed problem was ", ex);
+        }
+        return desc;
+    }
+
+    @Override
+    public List<PortDescription> discoverPortDetails() {
+        //TODO implement
+        return ImmutableList.of();
+    }
+
+    private DeviceDescription populateDescription(ISnmpSession session, Device device) {
+        NetworkDevice networkDevice = new NetworkDevice(CLASS_REGISTRY,
+                                                        session.getAddress().getHostAddress());
+        try {
+            session.walkDevice(networkDevice, Collections.singletonList(CLASS_REGISTRY.getClassToOidMap().get(
+                    System.class)));
+
+            com.btisystems.mibbler.mibs.bti7000.bti7000_13_2_0.mib_2.System systemTree =
+                    (com.btisystems.mibbler.mibs.bti7000.bti7000_13_2_0.mib_2.System)
+                            networkDevice.getRootObject().getEntity(CLASS_REGISTRY.getClassToOidMap().get(
+                                    com.btisystems.mibbler.mibs.bti7000.bti7000_13_2_0.mib_2.System.class));
+            if (systemTree != null) {
+                String[] systemComponents = systemTree.getSysDescr().split(";");
+                return new DefaultDeviceDescription(device.id().uri(), device.type(),
+                                                    systemComponents[0], systemComponents[2],
+                                                    systemComponents[3], UNKNOWN, device.chassisId(),
+                                                    (SparseAnnotations) device.annotations());
+            }
+        } catch (IOException ex) {
+            throw new IllegalArgumentException("Error reading details for device." + session.getAddress(), ex);
+        }
+        return null;
+    }
+}
diff --git a/drivers/bti/src/main/java/org/onosproject/drivers/bti/BtiDriversLoader.java b/drivers/bti/src/main/java/org/onosproject/drivers/bti/BtiDriversLoader.java
new file mode 100644
index 0000000..60b9275
--- /dev/null
+++ b/drivers/bti/src/main/java/org/onosproject/drivers/bti/BtiDriversLoader.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2016 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.drivers.bti;
+
+import org.apache.felix.scr.annotations.Component;
+import org.onosproject.net.driver.AbstractDriverLoader;
+
+/**
+ * Loader for BTI device drivers.
+ */
+@Component(immediate = true)
+public class BtiDriversLoader extends AbstractDriverLoader {
+
+    public BtiDriversLoader() {
+        super("/bti-drivers.xml");
+    }
+}
diff --git a/drivers/bti/src/main/java/org/onosproject/drivers/bti/NetSnmpDeviceDescriptor.java b/drivers/bti/src/main/java/org/onosproject/drivers/bti/NetSnmpDeviceDescriptor.java
new file mode 100644
index 0000000..ab0b659
--- /dev/null
+++ b/drivers/bti/src/main/java/org/onosproject/drivers/bti/NetSnmpDeviceDescriptor.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2016 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.drivers.bti;
+
+import com.btisystems.mibbler.mibs.netsnmp.netsnmp.I_Device;
+import com.btisystems.mibbler.mibs.netsnmp.netsnmp._OidRegistry;
+import com.btisystems.mibbler.mibs.netsnmp.netsnmp.mib_2.System;
+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.ISnmpConfiguration;
+import com.btisystems.pronx.ems.core.snmp.ISnmpSession;
+import com.btisystems.pronx.ems.core.snmp.V2cSnmpConfiguration;
+import com.google.common.collect.ImmutableList;
+import org.apache.commons.lang.StringUtils;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.SparseAnnotations;
+import org.onosproject.net.device.DefaultDeviceDescription;
+import org.onosproject.net.device.DeviceDescription;
+import org.onosproject.net.device.DeviceDescriptionDiscovery;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.device.PortDescription;
+import org.onosproject.net.driver.AbstractHandlerBehaviour;
+import org.onosproject.snmp.SnmpController;
+import org.onosproject.snmp.SnmpDevice;
+import org.slf4j.Logger;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Net SNMP device description behaviour. Provides device description and port information.
+ */
+public class NetSnmpDeviceDescriptor extends AbstractHandlerBehaviour implements DeviceDescriptionDiscovery {
+    private final Logger log = getLogger(getClass());
+    protected static final IClassRegistry CLASS_REGISTRY =
+            new ClassRegistry(_OidRegistry.oidRegistry, I_Device.class);
+    private static final String UNKNOWN = "unknown";
+
+
+    //TODO evaluate a common abstract class for all Snmp description discovery
+    @Override
+    public DeviceDescription discoverDeviceDetails() {
+        SnmpController controller = checkNotNull(handler().get(SnmpController.class));
+        DeviceId deviceId = handler().data().deviceId();
+        SnmpDevice snmpDevice = controller.getDevice(deviceId);
+        DeviceService deviceService = checkNotNull(handler().get(DeviceService.class));
+        Device device = deviceService.getDevice(deviceId);
+        DeviceDescription desc = null;
+        String ipAddress = snmpDevice.getSnmpHost();
+        int port = snmpDevice.getSnmpPort();
+
+        ISnmpConfiguration config = new V2cSnmpConfiguration();
+        config.setPort(port);
+
+        try (ISnmpSession session = controller.getSession(deviceId)) {
+            // Each session will be auto-closed.
+            String deviceOid = session.identifyDevice();
+            //TODO obtain desctiption
+            desc = populateDescription(session, device);
+
+        } catch (IOException | RuntimeException ex) {
+            log.error("Failed to walk device.", ex.getMessage());
+            log.debug("Detailed problem was ", ex);
+        }
+
+        return desc;
+    }
+
+    @Override
+    public List<PortDescription> discoverPortDetails() {
+        //TODO implement
+        return ImmutableList.of();
+    }
+
+    private DeviceDescription populateDescription(ISnmpSession session, Device device) {
+        NetworkDevice networkDevice = new NetworkDevice(CLASS_REGISTRY,
+                                                        session.getAddress().getHostAddress());
+        try {
+            session.walkDevice(networkDevice, Collections.singletonList(CLASS_REGISTRY.getClassToOidMap().get(
+                    System.class)));
+
+            com.btisystems.mibbler.mibs.netsnmp.netsnmp.mib_2.System systemTree =
+                    (com.btisystems.mibbler.mibs.netsnmp.netsnmp.mib_2.System)
+                            networkDevice.getRootObject().getEntity(CLASS_REGISTRY.getClassToOidMap().get(
+                                    com.btisystems.mibbler.mibs.netsnmp.netsnmp.mib_2.System.class));
+            if (systemTree != null) {
+                // TODO SNMP sys-contacts may be verbose; ONOS-GUI doesn't abbreviate fields neatly;
+                // so cut it here until supported in prop displayer
+                String manufacturer = StringUtils.abbreviate(systemTree.getSysContact(), 20);
+                return new DefaultDeviceDescription(device.id().uri(), device.type(),
+                                                    manufacturer, UNKNOWN, UNKNOWN, UNKNOWN,
+                                                    device.chassisId(), (SparseAnnotations) device.annotations());
+            }
+        } catch (IOException ex) {
+            throw new IllegalArgumentException("Error reading details for device." + session.getAddress(), ex);
+        }
+        return null;
+    }
+}
diff --git a/drivers/bti/src/main/java/org/onosproject/drivers/bti/package-info.java b/drivers/bti/src/main/java/org/onosproject/drivers/bti/package-info.java
new file mode 100644
index 0000000..9e6dc6e
--- /dev/null
+++ b/drivers/bti/src/main/java/org/onosproject/drivers/bti/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016 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 for BTI device drivers.
+ */
+package org.onosproject.drivers.bti;
\ No newline at end of file
diff --git a/drivers/bti/src/main/resources/bti-drivers.xml b/drivers/bti/src/main/resources/bti-drivers.xml
new file mode 100644
index 0000000..dc0012b
--- /dev/null
+++ b/drivers/bti/src/main/resources/bti-drivers.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  ~ Copyright 2016 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.
+  -->
+<drivers>
+    <driver name="bti7000" manufacturer="bti" hwVersion="1.0.0" swVersion="1.0.0">
+        <behaviour api="org.onosproject.net.device.DeviceDescriptionDiscovery"
+                   impl="org.onosproject.drivers.bti.Bti7000DeviceDescriptor"/>
+    </driver>
+    <driver name="NetSnmp" manufacturer="bti" hwVersion="1.0.0" swVersion="1.0.0">
+        <behaviour api="org.onosproject.net.device.DeviceDescriptionDiscovery"
+                   impl="org.onosproject.drivers.bti.NetSnmpDeviceDescriptor"/>
+    </driver>
+</drivers>
+
diff --git a/drivers/lumentum/features.xml b/drivers/lumentum/features.xml
index 17413d9..44abebd 100644
--- a/drivers/lumentum/features.xml
+++ b/drivers/lumentum/features.xml
@@ -20,8 +20,6 @@
         <feature>onos-api</feature>
         <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
 
-        <bundle>mvn:${project.groupId}/onos-restsb-api/${project.version}</bundle>
-
         <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.snmp4j/2.3.4_1</bundle>
 
     </feature>
diff --git a/drivers/lumentum/pom.xml b/drivers/lumentum/pom.xml
index 1046b81..33f29fa 100644
--- a/drivers/lumentum/pom.xml
+++ b/drivers/lumentum/pom.xml
@@ -35,6 +35,9 @@
         <onos.app.category>Drivers</onos.app.category>
         <onos.app.title>Lumentum Device Drivers</onos.app.title>
         <onos.app.url>http://onosproject.org</onos.app.url>
+        <onos.app.requires>
+            org.onosproject.snmp
+        </onos.app.requires>
     </properties>
 
     <dependencies>
diff --git a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/PortDiscoveryLumentumRoadm.java b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumRoadmDeviceDescription.java
similarity index 76%
rename from drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/PortDiscoveryLumentumRoadm.java
rename to drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumRoadmDeviceDescription.java
index 9d250c0..4a53502 100644
--- a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/PortDiscoveryLumentumRoadm.java
+++ b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumRoadmDeviceDescription.java
@@ -19,9 +19,14 @@
 import com.google.common.collect.Lists;
 import org.onosproject.net.AnnotationKeys;
 import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.SparseAnnotations;
-import org.onosproject.net.behaviour.PortDiscovery;
+import org.onosproject.net.device.DefaultDeviceDescription;
+import org.onosproject.net.device.DeviceDescription;
+import org.onosproject.net.device.DeviceDescriptionDiscovery;
+import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.device.OmsPortDescription;
 import org.onosproject.net.device.PortDescription;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
@@ -34,22 +39,37 @@
 import java.util.Collections;
 import java.util.List;
 
+import static com.google.common.base.Preconditions.checkNotNull;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
- * Discovers the ports of a Lumentum SDN ROADM device using SNMP.
+ * Device description behaviour for Lumentum Snmp devices.
  */
-public class PortDiscoveryLumentumRoadm extends AbstractHandlerBehaviour
-        implements PortDiscovery {
+public class LumentumRoadmDeviceDescription extends AbstractHandlerBehaviour implements DeviceDescriptionDiscovery  {
 
-    private final Logger log = getLogger(PortDiscoveryLumentumRoadm.class);
+    private final Logger log = getLogger(getClass());
 
     private static final String CTRL_PORT_STATE = ".1.3.6.1.4.1.46184.1.4.1.1.3.";
 
     private LumentumSnmpDevice snmp;
 
     @Override
-    public List<PortDescription> getPorts() {
+    public DeviceDescription discoverDeviceDetails() {
+        //TODO get device description
+        DeviceService deviceService = checkNotNull(handler().get(DeviceService.class));
+        DeviceId deviceId = handler().data().deviceId();
+        Device device = deviceService.getDevice(deviceId);
+        return new DefaultDeviceDescription(device.id().uri(), Device.Type.ROADM,
+                                            "Lumentum", "SDN ROADM", "1.0", "v1",
+                                            device.chassisId(), (SparseAnnotations) device.annotations());
+    }
+
+    @Override
+    public List<PortDescription> discoverPortDetails() {
+        return this.getPorts();
+    }
+
+    private List<PortDescription> getPorts() {
         try {
             snmp = new LumentumSnmpDevice(handler().data().deviceId());
         } catch (IOException e) {
@@ -119,5 +139,3 @@
         return ports;
     }
 }
-
-
diff --git a/drivers/lumentum/src/main/resources/lumentum-drivers.xml b/drivers/lumentum/src/main/resources/lumentum-drivers.xml
index 0465fe0..a041bee 100644
--- a/drivers/lumentum/src/main/resources/lumentum-drivers.xml
+++ b/drivers/lumentum/src/main/resources/lumentum-drivers.xml
@@ -16,8 +16,8 @@
   -->
 <drivers>
     <driver name="lumentum" manufacturer="Lumentum" hwVersion="SDN ROADM" swVersion="1.0">
-        <behaviour api="org.onosproject.net.behaviour.PortDiscovery"
-                   impl="org.onosproject.drivers.lumentum.PortDiscoveryLumentumRoadm"/>
+        <behaviour api="org.onosproject.net.device.DeviceDescriptionDiscovery"
+                   impl="org.onosproject.drivers.lumentum.LumentumRoadmDeviceDescription"/>
         <behaviour api="org.onosproject.net.behaviour.LambdaQuery"
                    impl="org.onosproject.drivers.lumentum.LambdaQueryLumentumRoadm"/>
         <behaviour api="org.onosproject.net.flow.FlowRuleProgrammable"
diff --git a/drivers/pom.xml b/drivers/pom.xml
index cdfdb49..1fb64a7 100644
--- a/drivers/pom.xml
+++ b/drivers/pom.xml
@@ -40,6 +40,7 @@
         <module>ovsdb</module>
         <module>utilities</module>
         <module>lumentum</module>
+        <module>bti</module>
     </modules>
 
     <!--<properties>
diff --git a/protocols/pom.xml b/protocols/pom.xml
index 12fbc29..85fe571 100644
--- a/protocols/pom.xml
+++ b/protocols/pom.xml
@@ -40,6 +40,7 @@
         <module>rest</module>
         <module>ospf</module>
         <module>isis</module>
+        <module>snmp</module>
     </modules>
 
     <dependencies>
diff --git a/protocols/snmp/api/BUCK b/protocols/snmp/api/BUCK
new file mode 100644
index 0000000..d2e504b
--- /dev/null
+++ b/protocols/snmp/api/BUCK
@@ -0,0 +1,21 @@
+SRC = 'src/main/java/org/onosproject/**/'
+
+CURRENT_NAME = 'onos-snmp-api'
+CURRENT_TARGET = ':' + CURRENT_NAME
+
+COMPILE_DEPS = [
+    '//lib:CORE_DEPS',
+    '//incubator/api:onos-incubator-api',
+    '//lib:org.apache.servicemix.bundles.snmp4j',
+    '//lib:snmp-core',
+    '//lib:bti7000',
+    '//lib:mibs-net-snmp',
+    '//lib:mibs-rfc',
+]
+
+java_library(
+    name = CURRENT_NAME,
+    srcs = glob([SRC + '/*.java']),
+    deps = COMPILE_DEPS,
+    visibility = ['PUBLIC'],
+)
diff --git a/protocols/snmp/api/pom.xml b/protocols/snmp/api/pom.xml
new file mode 100644
index 0000000..cb3dbdb
--- /dev/null
+++ b/protocols/snmp/api/pom.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2016 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>onos-snmp-protocol</artifactId>
+        <groupId>org.onosproject</groupId>
+        <version>1.6.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>onos-snmp-api</artifactId>
+    <packaging>bundle</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-incubator-api</artifactId>
+            <version>1.6.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/protocols/snmp/api/src/main/java/org/onosproject/snmp/SnmpController.java b/protocols/snmp/api/src/main/java/org/onosproject/snmp/SnmpController.java
new file mode 100644
index 0000000..d730107
--- /dev/null
+++ b/protocols/snmp/api/src/main/java/org/onosproject/snmp/SnmpController.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2016 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.snmp;
+
+import com.btisystems.pronx.ems.core.snmp.ISnmpSession;
+import org.onosproject.incubator.net.faultmanagement.alarm.DefaultAlarm;
+import org.onosproject.net.DeviceId;
+
+import java.io.IOException;
+import java.util.Collection;
+
+/**
+ * Snmp Controller.
+ */
+public interface SnmpController {
+
+    /**
+     * Return all the devices that this controller has notion of.
+     * @return Set of all Snmp devices
+     */
+    Collection<SnmpDevice> getDevices();
+
+    /**
+     * Gets a device for a specific deviceId.
+     * @param deviceId device id of the device
+     * @return SnmpDevice for given deviceId
+     */
+    SnmpDevice getDevice(DeviceId deviceId);
+
+    /**
+     * Removes a specific device.
+     * @param deviceId device id of the device to be removed
+     */
+    void removeDevice(DeviceId deviceId);
+
+    /**
+     * Add a device with a specific DeviceId.
+     * @param deviceId deviceId of the device
+     * @param device device to add to this controller
+     */
+    void addDevice(DeviceId deviceId, SnmpDevice device);
+
+    /**
+     * Gets an Instance of ISnmpSession for a specific device.
+     *
+     * @param deviceId device to retrieve the session for.
+     * @return ISnmp session.
+     * @throws IOException if the session can't be established.
+     */
+    ISnmpSession getSession(DeviceId deviceId) throws IOException;
+
+    /**
+     * Creates an error alarm if the interaction with the device failed.
+     *
+     * @param deviceId the device with a failed interaction
+     * @return default alarm error
+     */
+    DefaultAlarm buildWalkFailedAlarm(DeviceId deviceId);
+}
diff --git a/protocols/snmp/api/src/main/java/org/onosproject/snmp/SnmpDevice.java b/protocols/snmp/api/src/main/java/org/onosproject/snmp/SnmpDevice.java
new file mode 100644
index 0000000..f8876c3
--- /dev/null
+++ b/protocols/snmp/api/src/main/java/org/onosproject/snmp/SnmpDevice.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2016 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.snmp;
+
+import org.onosproject.net.DeviceId;
+
+/**
+ * Abstraction a default Snmp Device.
+ */
+public interface SnmpDevice {
+
+    /**
+     * Returns host IP and host Port, used by this particular SNMP Device.
+     *
+     * @return Device Information.
+     */
+    String deviceInfo();
+
+    /**
+     * Terminates the device connection.
+     */
+    void disconnect();
+
+    /**
+     * Retrieves the device state.
+     *
+     * @return true if connected
+     */
+    boolean isReachable();
+
+    /**
+     * Returns the IP used connect ssh on the device.
+     *
+     * @return SNMP Device IP
+     */
+    String getSnmpHost();
+
+    /**
+     * Returns the SSH Port used connect the device.
+     *
+     * @return SSH Port number
+     */
+    int getSnmpPort();
+
+    /**
+     * Retrieves the username of the device.
+     *
+     * @return username
+     */
+    String getUsername();
+
+    /**
+     * Retrieves the community (password) of the device.
+     *
+     * @return password
+     */
+    String getCommunity();
+
+    /**
+     * Return the SNMP device deviceID.
+     *
+     * @return DeviceId
+     */
+    DeviceId deviceId();
+}
diff --git a/protocols/snmp/api/src/main/java/org/onosproject/snmp/package-info.java b/protocols/snmp/api/src/main/java/org/onosproject/snmp/package-info.java
new file mode 100644
index 0000000..5a4afb2
--- /dev/null
+++ b/protocols/snmp/api/src/main/java/org/onosproject/snmp/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016 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 for SNMP apis interfaces.
+ */
+package org.onosproject.snmp;
diff --git a/protocols/snmp/ctl/BUCK b/protocols/snmp/ctl/BUCK
new file mode 100644
index 0000000..0c83b08
--- /dev/null
+++ b/protocols/snmp/ctl/BUCK
@@ -0,0 +1,35 @@
+SRC = 'src/main/java/org/onosproject/**/'
+TEST = 'src/test/java/org/onosproject/**/'
+CURRENT_NAME = 'onos-snmp-ctl'
+CURRENT_TARGET = ':' + CURRENT_NAME
+
+COMPILE_DEPS = [
+    '//lib:CORE_DEPS',
+    '//incubator/api:onos-incubator-api',
+    '//protocols/snmp/api:onos-snmp-api',
+    '//lib:org.apache.servicemix.bundles.snmp4j',
+    '//lib:snmp-core',
+    '//lib:bti7000',
+    '//lib:mibs-net-snmp',
+    '//lib:mibs-rfc',
+]
+
+TEST_DEPS = [
+    '//lib:TEST',
+]
+
+java_library(
+    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/protocols/snmp/ctl/pom.xml b/protocols/snmp/ctl/pom.xml
new file mode 100644
index 0000000..fb213d1
--- /dev/null
+++ b/protocols/snmp/ctl/pom.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2016 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>onos-snmp-protocol</artifactId>
+        <groupId>org.onosproject</groupId>
+        <version>1.6.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>onos-snmp-ctl</artifactId>
+    <packaging>bundle</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-snmp-api</artifactId>
+            <version>1.6.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.scr.annotations</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-incubator-api</artifactId>
+            <version>1.6.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/protocols/snmp/ctl/src/main/java/org/onosproject/snmp/ctl/DefaultSnmpController.java b/protocols/snmp/ctl/src/main/java/org/onosproject/snmp/ctl/DefaultSnmpController.java
new file mode 100644
index 0000000..35556cd
--- /dev/null
+++ b/protocols/snmp/ctl/src/main/java/org/onosproject/snmp/ctl/DefaultSnmpController.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2016 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.snmp.ctl;
+
+import com.btisystems.pronx.ems.core.snmp.DefaultSnmpConfigurationFactory;
+import com.btisystems.pronx.ems.core.snmp.ISnmpConfiguration;
+import com.btisystems.pronx.ems.core.snmp.ISnmpSession;
+import com.btisystems.pronx.ems.core.snmp.ISnmpSessionFactory;
+import com.btisystems.pronx.ems.core.snmp.SnmpSessionFactory;
+import com.btisystems.pronx.ems.core.snmp.V2cSnmpConfiguration;
+import com.google.common.base.Preconditions;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Service;
+import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
+import org.onosproject.incubator.net.faultmanagement.alarm.DefaultAlarm;
+import org.onosproject.net.DeviceId;
+import org.onosproject.snmp.SnmpController;
+import org.onosproject.snmp.SnmpDevice;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Component;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Default implementation of the SNMP sub-controller.
+ */
+@Component(immediate = true)
+@Service
+public class DefaultSnmpController implements SnmpController {
+
+    private final Logger log = LoggerFactory
+            .getLogger(getClass());
+
+    private ISnmpSessionFactory sessionFactory;
+
+    private final Map<DeviceId, ISnmpSession> sessionMap = new HashMap<>();
+    protected Map<DeviceId, SnmpDevice> snmpDeviceMap = new ConcurrentHashMap<>();
+
+    @Activate
+    public void activate(ComponentContext context) {
+        sessionFactory = new SnmpSessionFactory(
+                new DefaultSnmpConfigurationFactory(new V2cSnmpConfiguration()));
+        log.info("Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        snmpDeviceMap.clear();
+        log.info("Stopped");
+    }
+
+    @Override
+    public ISnmpSession getSession(DeviceId deviceId) throws IOException {
+        if (!sessionMap.containsKey(deviceId)) {
+            SnmpDevice device = snmpDeviceMap.get(deviceId);
+            String ipAddress = null;
+            int port = -1;
+            if (device != null) {
+                ipAddress = device.getSnmpHost();
+                port = device.getSnmpPort();
+            } else {
+                String[] deviceComponents = deviceId.toString().split(":");
+                if (deviceComponents.length > 1) {
+                    ipAddress = deviceComponents[1];
+                    port = Integer.parseInt(deviceComponents[2]);
+
+                } else {
+                    log.error("Cannot obtain correct information from device id", deviceId);
+                }
+            }
+            Preconditions.checkNotNull(ipAddress, "ip address is empty, cannot start session");
+            Preconditions.checkArgument(port != -1, "port is incorrect, cannot start session");
+
+            ISnmpConfiguration config = new V2cSnmpConfiguration();
+            config.setPort(port);
+            sessionMap.put(deviceId, sessionFactory.createSession(config, ipAddress));
+        }
+        return sessionMap.get(deviceId);
+    }
+
+    @Override
+    public Collection<SnmpDevice> getDevices() {
+        return snmpDeviceMap.values();
+    }
+
+    @Override
+    public SnmpDevice getDevice(DeviceId did) {
+        return snmpDeviceMap.get(did);
+    }
+
+    @Override
+    public void removeDevice(DeviceId did) {
+        snmpDeviceMap.remove(did);
+    }
+
+    @Override
+    public void addDevice(DeviceId did, SnmpDevice device) {
+        snmpDeviceMap.put(did, device);
+    }
+
+    @Override
+    public DefaultAlarm buildWalkFailedAlarm(DeviceId deviceId) {
+        return new DefaultAlarm.Builder(
+                deviceId, "SNMP alarm retrieval failed",
+                Alarm.SeverityLevel.CRITICAL,
+                System.currentTimeMillis()).build();
+    }
+}
diff --git a/protocols/snmp/ctl/src/main/java/org/onosproject/snmp/ctl/DefaultSnmpDevice.java b/protocols/snmp/ctl/src/main/java/org/onosproject/snmp/ctl/DefaultSnmpDevice.java
new file mode 100644
index 0000000..a76e86b
--- /dev/null
+++ b/protocols/snmp/ctl/src/main/java/org/onosproject/snmp/ctl/DefaultSnmpDevice.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2016 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.snmp.ctl;
+
+import org.onosproject.net.DeviceId;
+import org.onosproject.snmp.SnmpDevice;
+import org.slf4j.Logger;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * This is a logical representation of actual SNMP device, carrying all the necessary information to connect and execute
+ * SNMP operations.
+ */
+public class DefaultSnmpDevice implements SnmpDevice {
+
+    private final Logger log = getLogger(DefaultSnmpDevice.class);
+
+
+    private static final int DEFAULT_SNMP_PORT = 161;
+
+    private static final String SCHEME = "snmp";
+
+    private final String snmpHost;
+    private final DeviceId deviceId;
+    private int snmpPort = DEFAULT_SNMP_PORT;
+    private final String username;
+    //Community is a conventional name for password in SNMP.
+    private final String community;
+    private boolean reachable = false;
+
+
+    public DefaultSnmpDevice(String snmpHost, int snmpPort, String username, String community) {
+
+        this.snmpHost = checkNotNull(snmpHost, "SNMP Device IP cannot be null");
+        this.snmpPort = checkNotNull(snmpPort, "SNMP Device port cannot be null");
+        this.username = username;
+        this.community = community;
+        this.deviceId = createDeviceId();
+        reachable = true;
+    }
+
+    @Override
+    public String deviceInfo() {
+        return new StringBuilder("host: ").append(snmpHost).append(". port: ")
+                .append(snmpPort).toString();
+    }
+
+    @Override
+    public void disconnect() {
+        log.info("disconnect");
+        reachable = false;
+    }
+
+    @Override
+    public boolean isReachable() {
+        return reachable;
+    }
+
+    @Override
+    public String getSnmpHost() {
+        return snmpHost;
+    }
+
+
+    @Override
+    public int getSnmpPort() {
+        return snmpPort;
+    }
+
+    @Override
+    public String getUsername() {
+        return username;
+    }
+
+    @Override
+    public String getCommunity() {
+        return community;
+    }
+
+    @Override
+    public DeviceId deviceId() {
+        return deviceId;
+    }
+
+    private DeviceId createDeviceId() {
+        String additionalSsp = new StringBuilder(
+                snmpHost).append(":")
+                .append(snmpPort).toString();
+        try {
+            return DeviceId.deviceId(new URI(SCHEME, additionalSsp,
+                                             null));
+        } catch (URISyntaxException e) {
+            log.error("Syntax Error while creating URI for the device: "
+                              + additionalSsp
+                              + " couldn't persist the device onto the store", e);
+            throw new IllegalArgumentException("Can't create device ID from " + additionalSsp, e);
+        }
+    }
+}
diff --git a/protocols/snmp/ctl/src/main/java/org/onosproject/snmp/ctl/package-info.java b/protocols/snmp/ctl/src/main/java/org/onosproject/snmp/ctl/package-info.java
new file mode 100644
index 0000000..455a73c
--- /dev/null
+++ b/protocols/snmp/ctl/src/main/java/org/onosproject/snmp/ctl/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016 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 for implementation fo SNMP elements.
+ */
+package org.onosproject.snmp.ctl;
diff --git a/protocols/snmp/pom.xml b/protocols/snmp/pom.xml
new file mode 100644
index 0000000..6173d61
--- /dev/null
+++ b/protocols/snmp/pom.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2016 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>onos-protocols</artifactId>
+        <groupId>org.onosproject</groupId>
+        <version>1.6.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>onos-snmp-protocol</artifactId>
+    <packaging>pom</packaging>
+    <modules>
+        <module>api</module>
+        <module>ctl</module>
+    </modules>
+    <dependencies>
+        <dependency>
+            <groupId>com.btisystems</groupId>
+            <artifactId>snmp-core</artifactId>
+            <version>1.3-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.btisystems.mibbler.mibs</groupId>
+            <artifactId>bti7000</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.btisystems.mibbler.mibs</groupId>
+            <artifactId>net-snmp</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-api</artifactId>
+            <version>1.6.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/providers/snmp/alarm/BUCK b/providers/snmp/alarm/BUCK
index 6695f13..63f0826 100644
--- a/providers/snmp/alarm/BUCK
+++ b/providers/snmp/alarm/BUCK
@@ -11,9 +11,8 @@
     '//lib:bti7000',
     '//lib:mibs-net-snmp',
     '//lib:mibs-rfc',
-    '//protocols/ovsdb/api:onos-ovsdb-api',
-    '//protocols/ovsdb/rfc:onos-ovsdb-rfc',
     '//incubator/api:onos-incubator-api',
+    '//protocols/snmp/api:onos-snmp-api',
 ]
 
 TEST_DEPS = [
diff --git a/providers/snmp/app/app.xml b/providers/snmp/app/app.xml
index 625021d..d77b4b2 100644
--- a/providers/snmp/app/app.xml
+++ b/providers/snmp/app/app.xml
@@ -21,4 +21,12 @@
     <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>
+
+    <artifact>mvn:com.btisystems/snmp-core/1.3-SNAPSHOT</artifact>
+    <artifact>mvn:com.btisystems.mibbler.mibs/bti7000/1.0-SNAPSHOT</artifact>
+    <artifact>mvn:com.btisystems.mibbler.mibs/net-snmp/1.0-SNAPSHOT</artifact>
+
 </app>
diff --git a/providers/snmp/app/features.xml b/providers/snmp/app/features.xml
index b8ab857..6b51e3d 100644
--- a/providers/snmp/app/features.xml
+++ b/providers/snmp/app/features.xml
@@ -19,9 +19,12 @@
              description="${project.description}">
         <feature>onos-api</feature>
         <bundle>mvn:io.netty/netty/3.9.2.Final</bundle>
-        <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.snmp4j/2.3.4_1</bundle>
+        <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>
         <bundle>mvn:com.btisystems.mibbler.mibs/bti7000/1.0-SNAPSHOT</bundle>
         <bundle>mvn:com.btisystems.mibbler.mibs/net-snmp/1.0-SNAPSHOT</bundle>
diff --git a/providers/snmp/device/BUCK b/providers/snmp/device/BUCK
index 1f05085..749a7e2 100644
--- a/providers/snmp/device/BUCK
+++ b/providers/snmp/device/BUCK
@@ -11,9 +11,9 @@
     '//lib:bti7000',
     '//lib:mibs-net-snmp',
     '//lib:mibs-rfc',
-    '//protocols/ovsdb/api:onos-ovsdb-api',
-    '//protocols/ovsdb/rfc:onos-ovsdb-rfc',
     '//incubator/api:onos-incubator-api',
+    '//protocols/snmp/api:onos-snmp-api',
+    '//protocols/snmp/ctl:onos-snmp-ctl',
 ]
 
 TEST_DEPS = [
diff --git a/providers/snmp/device/pom.xml b/providers/snmp/device/pom.xml
index c7e043e..bde52f6 100644
--- a/providers/snmp/device/pom.xml
+++ b/providers/snmp/device/pom.xml
@@ -36,20 +36,50 @@
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.compendium</artifactId>
         </dependency>
-        <!--        <dependency>
-            <groupId>javax.ws.rs</groupId>
-            <artifactId>javax.ws.rs-api</artifactId>
-            <version>2.0.1</version>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-snmp-api</artifactId>
+            <version>1.6.0-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.onosproject</groupId>
-            <artifactId>onos-incubator-api</artifactId>
+            <artifactId>onos-snmp-ctl</artifactId>
+            <version>1.6.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.snmp4j</artifactId>
+            <version>2.3.4_1</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>log4j</artifactId>
+                    <groupId>log4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>com.btisystems</groupId>
+            <artifactId>snmp-core</artifactId>
+            <version>1.3-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.btisystems.mibbler.mibs</groupId>
+            <artifactId>bti7000</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.btisystems.mibbler.mibs</groupId>
+            <artifactId>net-snmp</artifactId>
+            <version>1.0-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.onosproject</groupId>
-            <artifactId>onos-core-serializers</artifactId>
-            <version>${project.version}</version>
-        </dependency>-->
+            <artifactId>onos-core-net</artifactId>
+            <version>1.6.0-SNAPSHOT</version>
+        </dependency>
     </dependencies>
         <build>
             <plugins>
diff --git a/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/Bti7000DeviceDescriptionProvider.java b/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/Bti7000DeviceDescriptionProvider.java
deleted file mode 100644
index 8726673..0000000
--- a/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/Bti7000DeviceDescriptionProvider.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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.device.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.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 org.onosproject.net.device.DefaultDeviceDescription;
-import org.onosproject.net.device.DeviceDescription;
-import org.slf4j.Logger;
-import org.snmp4j.smi.OID;
-
-import java.io.IOException;
-import java.util.Arrays;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * A vendor-specific implementation supporting BTI Systems BTI-7000 equipment.
- * @deprecated 1.5.0 Falcon, not compliant with ONOS SB and driver architecture.
- */
-@Deprecated
-public class Bti7000DeviceDescriptionProvider implements SnmpDeviceDescriptionProvider {
-    private final Logger log = getLogger(getClass());
-    protected static final IClassRegistry CLASS_REGISTRY =
-            new ClassRegistry(_OidRegistry.oidRegistry, I_Device.class);
-    private static final String UNKNOWN = "unknown";
-
-    @Override
-    public DeviceDescription populateDescription(ISnmpSession session, DeviceDescription description) {
-        NetworkDevice networkDevice = new NetworkDevice(CLASS_REGISTRY,
-                session.getAddress().getHostAddress());
-        try {
-            session.walkDevice(networkDevice, Arrays.asList(new OID[]{
-                CLASS_REGISTRY.getClassToOidMap().get(
-                com.btisystems.mibbler.mibs.bti7000.bti7000_13_2_0.mib_2.System.class)}));
-
-            com.btisystems.mibbler.mibs.bti7000.bti7000_13_2_0.mib_2.System systemTree =
-                    (com.btisystems.mibbler.mibs.bti7000.bti7000_13_2_0.mib_2.System)
-                    networkDevice.getRootObject().getEntity(CLASS_REGISTRY.getClassToOidMap().get(
-                                    com.btisystems.mibbler.mibs.bti7000.bti7000_13_2_0.mib_2.System.class));
-            if (systemTree != null) {
-                String[] systemComponents = systemTree.getSysDescr().split(";");
-                return new DefaultDeviceDescription(description.deviceUri(), description.type(),
-                        systemComponents[0], systemComponents[2], systemComponents[3],
-                        UNKNOWN, description.chassisId(), description.annotations());
-            }
-        } catch (IOException ex) {
-            log.error("Error reading details for device {}.", session.getAddress(), ex);
-        }
-        return description;
-    }
-
-}
diff --git a/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/DeviceState.java b/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/DeviceState.java
deleted file mode 100644
index e358927..0000000
--- a/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/DeviceState.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.provider.snmp.device.impl;
-    /**
-     * The Device State is used to determine whether the device is active or inactive. This state information will help
-     * Device Creator to add or delete the device from the core.
-     */
-    public  enum DeviceState {
-        /* Used to specify Active state of the device */
-
-        ACTIVE,
-        /* Used to specify inactive state of the device */
-        INACTIVE,
-        /* Used to specify invalid state of the device */
-        INVALID
-    }
diff --git a/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/LumentumDeviceDescriptionProvider.java b/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/LumentumDeviceDescriptionProvider.java
deleted file mode 100644
index 70286b6..0000000
--- a/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/LumentumDeviceDescriptionProvider.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2016 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.device.impl;
-
-import com.btisystems.pronx.ems.core.snmp.ISnmpSession;
-import org.onosproject.net.Device;
-import org.onosproject.net.device.DefaultDeviceDescription;
-import org.onosproject.net.device.DeviceDescription;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Device description provider for Lumentum SDN ROADMs.
- * @deprecated 1.5.0 Falcon, not compliant with ONOS SB and driver architecture.
- */
-@Deprecated
-public class LumentumDeviceDescriptionProvider implements SnmpDeviceDescriptionProvider {
-
-    private static final Logger log = LoggerFactory.getLogger(LumentumDeviceDescriptionProvider.class);
-
-    @Override
-    public DeviceDescription populateDescription(ISnmpSession session, DeviceDescription description) {
-        return new DefaultDeviceDescription(description.deviceUri(), Device.Type.ROADM,
-                "Lumentum", "SDN ROADM", "1.0", "v1", description.chassisId(), description.annotations());
-    }
-}
diff --git a/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/NetSnmpDeviceDescriptionProvider.java b/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/NetSnmpDeviceDescriptionProvider.java
deleted file mode 100644
index a84a43c..0000000
--- a/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/NetSnmpDeviceDescriptionProvider.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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.device.impl;
-
-import com.btisystems.mibbler.mibs.netsnmp.netsnmp.I_Device;
-import com.btisystems.mibbler.mibs.netsnmp.netsnmp._OidRegistry;
-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 org.apache.commons.lang.StringUtils;
-import org.onosproject.net.device.DefaultDeviceDescription;
-import org.onosproject.net.device.DeviceDescription;
-import org.slf4j.Logger;
-import org.snmp4j.smi.OID;
-
-import java.io.IOException;
-import java.util.Arrays;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * A agent-specific implementation supporting NET-SNMP agents.
- * @deprecated 1.5.0 Falcon, not compliant with ONOS SB and driver architecture.
- */
-@Deprecated
-public class NetSnmpDeviceDescriptionProvider implements SnmpDeviceDescriptionProvider {
-    private final Logger log = getLogger(getClass());
-    protected static final IClassRegistry CLASS_REGISTRY =
-            new ClassRegistry(_OidRegistry.oidRegistry, I_Device.class);
-    private static final String UNKNOWN = "unknown";
-
-    @Override
-    public DeviceDescription populateDescription(ISnmpSession session, DeviceDescription description) {
-        NetworkDevice networkDevice = new NetworkDevice(CLASS_REGISTRY,
-                session.getAddress().getHostAddress());
-        try {
-            session.walkDevice(networkDevice, Arrays.asList(new OID[]{
-                CLASS_REGISTRY.getClassToOidMap().get(
-                com.btisystems.mibbler.mibs.netsnmp.netsnmp.mib_2.System.class)}));
-
-            com.btisystems.mibbler.mibs.netsnmp.netsnmp.mib_2.System systemTree =
-                    (com.btisystems.mibbler.mibs.netsnmp.netsnmp.mib_2.System)
-                    networkDevice.getRootObject().getEntity(CLASS_REGISTRY.getClassToOidMap().get(
-                                    com.btisystems.mibbler.mibs.netsnmp.netsnmp.mib_2.System.class));
-            if (systemTree != null) {
-                // TODO SNMP sys-contacts may be verbose; ONOS-GUI doesn't abbreviate fields neatly;
-                // so cut it here until supported in prop displayer
-                String manufacturer = StringUtils.abbreviate(systemTree.getSysContact(), 20);
-                return new DefaultDeviceDescription(description.deviceUri(), description.type(), manufacturer,
-                        UNKNOWN, UNKNOWN, UNKNOWN, description.chassisId(), description.annotations());
-            }
-        } catch (IOException ex) {
-            log.error("Error reading details for device {}.", session.getAddress(), ex);
-        }
-        return description;
-    }
-
-}
diff --git a/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDevice.java b/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDevice.java
deleted file mode 100644
index 8b385dc..0000000
--- a/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDevice.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * 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.provider.snmp.device.impl;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.slf4j.LoggerFactory.getLogger;
-
-
-import org.slf4j.Logger;
-
-/**
- * This is a logical representation of actual SNMP device, carrying all the necessary information to connect and execute
- * SNMP operations.
- */
-public class SnmpDevice {
-
-    private final Logger log = getLogger(SnmpDevice.class);
-
-
-    private static final int DEFAULT_SNMP_PORT = 161;
-
-    private final String snmpHost;
-    private int snmpPort = DEFAULT_SNMP_PORT;
-    private final String community;
-    private boolean reachable = false;
-
-    private DeviceState deviceState = DeviceState.INVALID;
-
-    protected SnmpDevice(String snmpHost, int snmpPort, String community) {
-
-        this.snmpHost = checkNotNull(snmpHost, "SNMP Device IP cannot be null");
-        this.snmpPort = checkNotNull(snmpPort, "SNMP Device snmp port cannot be null");
-        this.community = community;
-    }
-
-    /**
-     * This will try to connect to SNMP device.
-     *
-     */
-    public void init() {
-
-        reachable = true;
-    }
-
-    /**
-     * This would return host IP and host Port, used by this particular SNMP Device.
-     *
-     * @return Device Information.
-     */
-    public String deviceInfo() {
-        return new StringBuilder("host: ").append(snmpHost).append(". port: ")
-                .append(snmpPort).toString();
-    }
-
-    /**
-     * This will terminate the device connection.
-     */
-    public void disconnect() {
-        log.info("disconnect");
-        reachable = false;
-    }
-
-    /**
-     * This api is intended to know whether the device is connected or not.
-     *
-     * @return true if connected
-     */
-    public boolean isReachable() {
-        return reachable;
-    }
-
-    /**
-     * This will return the IP used connect ssh on the device.
-     *
-     * @return SNMP Device IP
-     */
-    public String getSnmpHost() {
-        return snmpHost;
-    }
-
-    /**
-     * This will return the SSH Port used connect the device.
-     *
-     * @return SSH Port number
-     */
-    public int getSnmpPort() {
-        return snmpPort;
-    }
-
-    public String getCommunity() {
-        return community;
-    }
-
-    /**
-     * Retrieve current state of the device.
-     *
-     * @return Current Device State
-     */
-    public DeviceState getDeviceState() {
-        return deviceState;
-    }
-
-    /**
-     * This is set the state information for the device.
-     *
-     * @param deviceState Next Device State
-     */
-    public void setDeviceState(DeviceState deviceState) {
-        this.deviceState = deviceState;
-    }
-
-    /**
-     * Check whether the device is in Active state.
-     *
-     * @return true if the device is Active
-     */
-    public boolean isActive() {
-        return deviceState == DeviceState.ACTIVE;
-    }
-
-}
diff --git a/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDeviceDescriptionProvider.java b/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDeviceDescriptionProvider.java
deleted file mode 100644
index 4b8fb34..0000000
--- a/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDeviceDescriptionProvider.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.device.impl;
-
-import com.btisystems.pronx.ems.core.snmp.ISnmpSession;
-import org.onosproject.net.device.DeviceDescription;
-
-/**
- * Abstraction of an entity which updates a device description with information retrieved via SNMP.
- * @deprecated 1.5.0 Falcon, not compliant with ONOS SB and driver architecture.
- */
-@Deprecated
-public interface SnmpDeviceDescriptionProvider {
-
-    /**
-     * Generated an updated device description.
-     * @deprecated 1.5.0 Falcon
-     * @param session SNMP session
-     * @param description old device description
-     * @return new updated description
-     */
-    @Deprecated
-    DeviceDescription populateDescription(ISnmpSession session, DeviceDescription description);
-}
diff --git a/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDeviceProvider.java b/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDeviceProvider.java
index c32296c..4cd809b 100644
--- a/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDeviceProvider.java
+++ b/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDeviceProvider.java
@@ -15,23 +15,16 @@
  */
 package org.onosproject.provider.snmp.device.impl;
 
-import com.btisystems.pronx.ems.core.snmp.DefaultSnmpConfigurationFactory;
-import com.btisystems.pronx.ems.core.snmp.ISnmpConfiguration;
-import com.btisystems.pronx.ems.core.snmp.ISnmpConfigurationFactory;
-import com.btisystems.pronx.ems.core.snmp.ISnmpSession;
-import com.btisystems.pronx.ems.core.snmp.ISnmpSessionFactory;
-import com.btisystems.pronx.ems.core.snmp.SnmpSessionFactory;
-import com.btisystems.pronx.ems.core.snmp.V2cSnmpConfiguration;
 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.onlab.packet.ChassisId;
-import org.onosproject.cfg.ComponentConfigService;
-import org.onosproject.cluster.ClusterService;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.incubator.net.config.basics.ConfigException;
 import org.onosproject.net.AnnotationKeys;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.Device;
@@ -39,33 +32,32 @@
 import org.onosproject.net.MastershipRole;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.SparseAnnotations;
-import org.onosproject.net.behaviour.PortDiscovery;
+import org.onosproject.net.config.ConfigFactory;
+import org.onosproject.net.config.NetworkConfigEvent;
+import org.onosproject.net.config.NetworkConfigListener;
+import org.onosproject.net.config.NetworkConfigRegistry;
 import org.onosproject.net.device.DefaultDeviceDescription;
 import org.onosproject.net.device.DeviceDescription;
+import org.onosproject.net.device.DeviceDescriptionDiscovery;
 import org.onosproject.net.device.DeviceProvider;
 import org.onosproject.net.device.DeviceProviderRegistry;
 import org.onosproject.net.device.DeviceProviderService;
 import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.device.DeviceStore;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
+import org.onosproject.snmp.SnmpController;
+import org.onosproject.snmp.SnmpDevice;
+import org.onosproject.snmp.ctl.DefaultSnmpDevice;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Dictionary;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 
-import static com.google.common.base.Strings.isNullOrEmpty;
-import static org.onlab.util.Tools.delay;
-import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -79,81 +71,81 @@
     private final Logger log = getLogger(SnmpDeviceProvider.class);
 
     private static final String UNKNOWN = "unknown";
-
-    protected Map<DeviceId, SnmpDevice> snmpDeviceMap = new ConcurrentHashMap<>();
+    private static final String APP_NAME = "org.onosproject.snmp";
+    private static final String SCHEME = "snmp";
 
     private DeviceProviderService providerService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected SnmpController controller;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected DeviceProviderRegistry providerRegistry;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected DeviceService deviceService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected ClusterService clusterService;
+    protected DeviceStore deviceStore;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected ComponentConfigService cfgService;
+    protected CoreService coreService;
 
-    private final ExecutorService deviceBuilder = Executors
-            .newFixedThreadPool(1, groupedThreads("onos/snmp", "device-creator", log));
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetworkConfigRegistry netCfgService;
 
-    // Delay between events in ms.
-    private static final int EVENTINTERVAL = 5;
+    private final ExecutorService deviceBuilderExecutor = Executors
+            .newFixedThreadPool(5, groupedThreads("onos/snmp", "device-creator", log));
 
-    private static final String SCHEME = "snmp";
+    private final NetworkConfigListener cfgLister = new InternalNetworkConfigListener();
 
-    @Property(name = "devConfigs", value = "", label = "Instance-specific configurations")
-    private String devConfigs = null;
+    private ApplicationId appId;
 
-    @Property(name = "devPasswords", value = "", label = "Instance-specific password")
-    private String devPasswords = null;
+    private final ConfigFactory factory =
+            new ConfigFactory<ApplicationId, SnmpProviderConfig>(APP_SUBJECT_FACTORY,
+                                                                 SnmpProviderConfig.class,
+                                                                 "devices",
+                                                                 true) {
+                @Override
+                public SnmpProviderConfig createConfig() {
+                    return new SnmpProviderConfig();
+                }
+            };
 
-    //TODO Could be replaced with a service lookup, and bundles per device variant.
-    Map<String, SnmpDeviceDescriptionProvider> providers = new HashMap<>();
-
-    private final ISnmpSessionFactory sessionFactory;
 
     /**
      * Creates a provider with the supplier identifier.
      */
     public SnmpDeviceProvider() {
         super(new ProviderId("snmp", "org.onosproject.provider.device"));
-        sessionFactory = new SnmpSessionFactory(
-                new DefaultSnmpConfigurationFactory(new V2cSnmpConfiguration()));
-        //TODO refactor, no hardcoding in provider, device information should be in drivers
-        providers.put("1.3.6.1.4.1.18070.2.2", new Bti7000DeviceDescriptionProvider());
-        providers.put("1.3.6.1.4.1.20408", new NetSnmpDeviceDescriptionProvider());
-        providers.put("1.3.6.1.4.562.73.6", new LumentumDeviceDescriptionProvider());
+        //FIXME multiple type of SNMP sessions
     }
 
     @Activate
     public void activate(ComponentContext context) {
-        log.info("activating for snmp devices ...");
-        cfgService.registerProperties(getClass());
+
         providerService = providerRegistry.register(this);
+        appId = coreService.registerApplication(APP_NAME);
+        netCfgService.registerConfigFactory(factory);
+        netCfgService.addListener(cfgLister);
         modified(context);
-        log.info("activated ok");
+        log.info("Started");
     }
 
     @Deactivate
     public void deactivate(ComponentContext context) {
 
-        log.info("deactivating for snmp devices ...");
-
-        cfgService.unregisterProperties(getClass(), false);
         try {
-            snmpDeviceMap
-                    .entrySet().stream().forEach((deviceEntry) -> {
-                        deviceBuilder.execute(new DeviceCreator(deviceEntry.getValue(), false));
-                    });
-            deviceBuilder.awaitTermination(1000, TimeUnit.MILLISECONDS);
+            controller.getDevices().stream().forEach(device -> {
+                deviceBuilderExecutor.execute(new DeviceFactory(device, false));
+            });
+            deviceBuilderExecutor.awaitTermination(1000, TimeUnit.MILLISECONDS);
         } catch (InterruptedException e) {
             log.error("Device builder did not terminate");
         }
-        deviceBuilder.shutdownNow();
-        snmpDeviceMap.clear();
+        deviceBuilderExecutor.shutdownNow();
+        netCfgService.unregisterConfigFactory(factory);
+        netCfgService.removeListener(cfgLister);
         providerRegistry.unregister(this);
         providerService = null;
         log.info("Stopped");
@@ -161,100 +153,36 @@
 
     @Modified
     public void modified(ComponentContext context) {
-        log.info("modified ...");
-
-        if (context == null) {
-            log.info("No configuration file");
-            return;
-        }
-        Dictionary<?, ?> properties = context.getProperties();
-
-        log.info("properties={}", context.getProperties());
-
-        String deviceCfgValue = get(properties, "devConfigs");
-        log.info("Settings: devConfigs={}", deviceCfgValue);
-        if (!isNullOrEmpty(deviceCfgValue)) {
-            addOrRemoveDevicesConfig(deviceCfgValue);
-        }
-        log.info("... modified");
-
+        log.info("Modified");
     }
 
-    private void addOrRemoveDevicesConfig(String deviceConfig) {
-        for (String deviceEntry : deviceConfig.split(",")) {
-            SnmpDevice device = processDeviceEntry(deviceEntry);
-            if (device != null) {
-                log.info("Device Detail:host={}, port={}, state={}",
-                        new Object[]{device.getSnmpHost(),
-                            device.getSnmpPort(),
-                            device.getDeviceState().name()}
-                );
-                if (device.isActive()) {
-                    deviceBuilder.execute(new DeviceCreator(device, true));
-                } else {
-                    deviceBuilder.execute(new DeviceCreator(device, false));
-                }
-            }
-        }
-    }
-
-    private SnmpDevice processDeviceEntry(String deviceEntry) {
-        if (deviceEntry == null) {
-            log.info("No content for Device Entry, so cannot proceed further.");
-            return null;
-        }
-        log.info("Trying to convert {} to a SNMP Device Object", deviceEntry);
-        SnmpDevice device = null;
-        try {
-            String userInfo = deviceEntry.substring(0, deviceEntry
-                    .lastIndexOf('@'));
-            String hostInfo = deviceEntry.substring(deviceEntry
-                    .lastIndexOf('@') + 1);
-            String[] infoSplit = userInfo.split(":");
-            String username = infoSplit[0];
-            String password = infoSplit[1];
-            infoSplit = hostInfo.split(":");
-            String hostIp = infoSplit[0];
-            Integer hostPort;
+    private void addOrRemoveDevicesConfig() {
+        SnmpProviderConfig cfg = netCfgService.getConfig(appId, SnmpProviderConfig.class);
+        if (cfg != null) {
             try {
-                hostPort = Integer.parseInt(infoSplit[1]);
-            } catch (NumberFormatException nfe) {
-                log.error("Bad Configuration Data: Failed to parse host port number string: "
-                        + infoSplit[1]);
-                throw nfe;
+                cfg.getDevicesInfo().stream().forEach(info -> {
+                    SnmpDevice device = new DefaultSnmpDevice(info.ip().toString(),
+                                                              info.port(), info.username(), info.password());
+                    buildDevice(device);
+                });
+            } catch (ConfigException e) {
+                log.error("Cannot read config error " + e);
             }
-            String deviceState = infoSplit[2];
-            if (isNullOrEmpty(username) || isNullOrEmpty(password)
-                    || isNullOrEmpty(hostIp) || hostPort == 0) {
-                log.warn("Bad Configuration Data: both user and device information parts of Configuration "
-                        + deviceEntry + " should be non-nullable");
-            } else {
-                device = new SnmpDevice(hostIp, hostPort, password);
-                if (!isNullOrEmpty(deviceState)) {
-                    if (deviceState.toUpperCase().equals(DeviceState.ACTIVE.name())) {
-                        device.setDeviceState(DeviceState.ACTIVE);
-                    } else if (deviceState.toUpperCase()
-                            .equals(DeviceState.INACTIVE.name())) {
-                        device.setDeviceState(DeviceState.INACTIVE);
-                    } else {
-                        log.warn("Device State Information can not be empty, so marking the state as INVALID");
-                        device.setDeviceState(DeviceState.INVALID);
-                    }
-                } else {
-                    log.warn("The device entry do not specify state information, so marking the state as INVALID");
-                    device.setDeviceState(DeviceState.INVALID);
-                }
-            }
-        } catch (ArrayIndexOutOfBoundsException aie) {
-            log.error("Error while reading config infromation from the config file: "
-                    + "The user, host and device state infomation should be "
-                    + "in the order 'userInfo@hostInfo:deviceState'"
-                    + deviceEntry, aie);
-        } catch (Exception e) {
-            log.error("Error while parsing config information for the device entry: "
-                    + deviceEntry, e);
         }
-        return device;
+    }
+
+    private void buildDevice(SnmpDevice device) {
+        if (device != null) {
+            log.debug("Device Detail:host={}, port={}, state={}",
+                      device.getSnmpHost(),
+                      device.getSnmpPort(),
+                      device.isReachable());
+            if (device.isReachable()) {
+                deviceBuilderExecutor.execute(new DeviceFactory(device, true));
+            } else {
+                deviceBuilderExecutor.execute(new DeviceFactory(device, false));
+            }
+        }
     }
 
     @Override
@@ -265,16 +193,16 @@
 
     @Override
     public void roleChanged(DeviceId deviceId, MastershipRole newRole) {
-
+        // TODO Implement Masterhsip Service
     }
 
     @Override
     public boolean isReachable(DeviceId deviceId) {
-        SnmpDevice snmpDevice = snmpDeviceMap.get(deviceId);
+        SnmpDevice snmpDevice = controller.getDevice(deviceId);
         if (snmpDevice == null) {
             log.warn("BAD REQUEST: the requested device id: "
-                    + deviceId.toString()
-                    + "  is not associated to any SNMP Device");
+                             + deviceId.toString()
+                             + "  is not associated to any SNMP Device");
             return false;
         }
         return snmpDevice.isReachable();
@@ -285,12 +213,13 @@
      * 'SnmpDevice' content. The functionality runs as a thread and depending on the 'createFlag' value it will create
      * or remove Device entry from the core.
      */
-    private class DeviceCreator implements Runnable {
+    //FIXME consider rework.
+    private class DeviceFactory implements Runnable {
 
         private SnmpDevice device;
         private boolean createFlag;
 
-        public DeviceCreator(SnmpDevice device, boolean createFlag) {
+        public DeviceFactory(SnmpDevice device, boolean createFlag) {
             this.device = device;
             this.createFlag = createFlag;
         }
@@ -298,10 +227,10 @@
         @Override
         public void run() {
             if (createFlag) {
-                log.info("Trying to create Device Info on ONOS core");
+                log.debug("Trying to create Device Info on ONOS core");
                 advertiseDevices();
             } else {
-                log.info("Trying to remove Device Info on ONOS core");
+                log.debug("Trying to remove Device Info on ONOS core");
                 removeDevices();
             }
         }
@@ -314,24 +243,16 @@
                 log.warn("The Request SNMP Device is null, cannot proceed further");
                 return;
             }
-            try {
-                DeviceId did = getDeviceId();
-                if (!snmpDeviceMap.containsKey(did)) {
-                    log.error("BAD Request: 'Currently device is not discovered, "
-                            + "so cannot remove/disconnect the device: "
-                            + device.deviceInfo() + "'");
-                    return;
-                }
-                providerService.deviceDisconnected(did);
-                device.disconnect();
-                snmpDeviceMap.remove(did);
-                delay(EVENTINTERVAL);
-            } catch (URISyntaxException uriSyntaxExcpetion) {
-                log.error("Syntax Error while creating URI for the device: "
-                        + device.deviceInfo()
-                        + " couldn't remove the device from the store",
-                        uriSyntaxExcpetion);
+            DeviceId did = device.deviceId();
+            if (controller.getDevice(did) == null) {
+                log.error("BAD Request: 'Currently device is not discovered, "
+                                  + "so cannot remove/disconnect the device: "
+                                  + device.deviceInfo() + "'");
+                return;
             }
+            providerService.deviceDisconnected(did);
+            device.disconnect();
+            controller.removeDevice(did);
         }
 
         /**
@@ -343,8 +264,7 @@
                     log.warn("The Request SNMP Device is null, cannot proceed further");
                     return;
                 }
-                device.init();
-                DeviceId did = getDeviceId();
+                DeviceId did = device.deviceId();
                 ChassisId cid = new ChassisId();
 
                 SparseAnnotations annotations = DefaultAnnotations.builder()
@@ -354,79 +274,46 @@
                 DeviceDescription desc = new DefaultDeviceDescription(
                         did.uri(), Device.Type.OTHER, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, cid, annotations);
 
-                desc = populateDescriptionFromDevice(did, desc);
+                log.debug("Persisting Device " + did.uri().toString());
 
-                log.info("Persisting Device " + did.uri().toString());
-
-                snmpDeviceMap.put(did, device);
+                controller.addDevice(did, device);
                 providerService.deviceConnected(did, desc);
-                log.info("Done with Device Info Creation on ONOS core. Device Info: "
-                        + device.deviceInfo() + " " + did.uri().toString());
-
-                // Do port discovery if driver supports it
+                log.info("Added device to ONOS core. Device Info: "
+                                 + device.deviceInfo() + " " + did.uri().toString());
+                //FIXME this description will be populated only if driver is pushed from outside
+                // becuase otherwise default driver is used
                 Device d = deviceService.getDevice(did);
-                if (d.is(PortDiscovery.class)) {
-                    PortDiscovery portConfig = d.as(PortDiscovery.class);
-                    if (portConfig != null) {
-                        providerService.updatePorts(did, portConfig.getPorts());
-                    }
+                if (d.is(DeviceDescriptionDiscovery.class)) {
+                    DeviceDescriptionDiscovery descriptionDiscovery = d.as(DeviceDescriptionDiscovery.class);
+                    DeviceDescription description = descriptionDiscovery.discoverDeviceDetails();
+                    deviceStore.createOrUpdateDevice(
+                            new ProviderId("snmp", "org.onosproject.provider.device"),
+                            did, description);
+                    providerService.updatePorts(did, descriptionDiscovery.discoverPortDetails());
                 } else {
-                    log.warn("No port discovery behaviour for device {}", did);
+                    log.warn("No populate description and ports behaviour for device {}", did);
                 }
-
-                delay(EVENTINTERVAL);
-            } catch (URISyntaxException e) {
-                log.error("Syntax Error while creating URI for the device: "
-                        + device.deviceInfo()
-                        + " couldn't persist the device onto the store", e);
             } catch (Exception e) {
                 log.error("Error while initializing session for the device: "
-                        + (device != null ? device.deviceInfo() : null), e);
+                                  + (device != null ? device.deviceInfo() : null), e);
             }
         }
-        /**
-         * @deprecated 1.5.0 Falcon, not compliant with ONOS SB and driver architecture.
-         */
-        @Deprecated
-        private DeviceDescription populateDescriptionFromDevice(DeviceId did, DeviceDescription desc) {
-            String[] deviceComponents = did.toString().split(":");
-            if (deviceComponents.length > 1) {
-                String ipAddress = deviceComponents[1];
-                String port = deviceComponents[2];
-
-                ISnmpConfiguration config = new V2cSnmpConfiguration();
-                config.setPort(Integer.parseInt(port));
-
-                try (ISnmpSession session = sessionFactory.createSession(config, ipAddress)) {
-                    // Each session will be auto-closed.
-                    String deviceOid = session.identifyDevice();
-
-                    if (providers.containsKey(deviceOid)) {
-                        desc = providers.get(deviceOid).populateDescription(session, desc);
-                    }
-
-                } catch (IOException | RuntimeException ex) {
-                    log.error("Failed to walk device.", ex.getMessage());
-                    log.debug("Detailed problem was ", ex);
-                }
-            }
-            return desc;
-        }
-
-        /**
-         * This will build a device id for the device.
-         */
-        private DeviceId getDeviceId() throws URISyntaxException {
-            String additionalSsp = new StringBuilder(
-                    device.getSnmpHost()).append(":")
-                    .append(device.getSnmpPort()).toString();
-            return DeviceId.deviceId(new URI(SCHEME, additionalSsp,
-                    null));
-        }
     }
 
-    protected ISnmpSessionFactory getSessionFactory(ISnmpConfigurationFactory configurationFactory) {
-        return new SnmpSessionFactory(configurationFactory);
+    private class InternalNetworkConfigListener implements NetworkConfigListener {
+
+
+        @Override
+        public void event(NetworkConfigEvent event) {
+            addOrRemoveDevicesConfig();
+        }
+
+        @Override
+        public boolean isRelevant(NetworkConfigEvent event) {
+            return event.configClass().equals(SnmpProviderConfig.class) &&
+                    (event.type() == NetworkConfigEvent.Type.CONFIG_ADDED ||
+                            event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED);
+        }
     }
 
     @Override
diff --git a/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpProviderConfig.java b/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpProviderConfig.java
new file mode 100644
index 0000000..14bc6f8
--- /dev/null
+++ b/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpProviderConfig.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2016 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.device.impl;
+
+/*
+ * 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.
+ */
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.annotations.Beta;
+import com.google.common.collect.Sets;
+import org.onlab.packet.IpAddress;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.incubator.net.config.basics.ConfigException;
+import org.onosproject.net.config.Config;
+
+import java.util.Set;
+
+/**
+ * Configuration decoder for SNMP provider.
+ */
+@Beta
+public class SnmpProviderConfig extends Config<ApplicationId> {
+
+    public static final String CONFIG_VALUE_ERROR = "Error parsing config value";
+    private static final String IP = "ip";
+    private static final int DEFAULT_TCP_PORT = 830;
+    private static final String PORT = "port";
+    private static final String NAME = "username";
+    private static final String PASSWORD = "password";
+
+    /**
+     * Retrieves a set of SnmpDeviceInfo containing all the device
+     * configuration pertaining to the SNMP device provider.
+     * @return set of device configurations.
+     *
+     * @throws ConfigException if configuration can't be read
+     */
+    public Set<SnmpDeviceInfo> getDevicesInfo() throws ConfigException {
+        Set<SnmpDeviceInfo> deviceInfos = Sets.newHashSet();
+
+        try {
+            for (JsonNode node : array) {
+                String ip = node.path(IP).asText();
+                IpAddress ipAddr = ip.isEmpty() ? null : IpAddress.valueOf(ip);
+                int port = node.path(PORT).asInt(DEFAULT_TCP_PORT);
+                String name = node.path(NAME).asText();
+                String password = node.path(PASSWORD).asText();
+                deviceInfos.add(new SnmpDeviceInfo(ipAddr, port, name, password));
+
+            }
+        } catch (IllegalArgumentException e) {
+            throw new ConfigException(CONFIG_VALUE_ERROR, e);
+        }
+
+        return deviceInfos;
+    }
+
+    /**
+     * Contains information about a SNMP device retrieved form the net-cfg subsystem.
+     */
+    public class SnmpDeviceInfo {
+        private final IpAddress ip;
+        private final int port;
+        private final String username;
+        private final String password;
+
+        /**
+         * Build an information object containing the given device specifics.
+         * @param ip ip
+         * @param port port
+         * @param username username
+         * @param password password (a.k.a community in SNMP)
+         */
+        public SnmpDeviceInfo(IpAddress ip, int port, String username, String password) {
+            this.ip = ip;
+            this.port = port;
+            this.username = username;
+            this.password = password;
+        }
+
+        /**
+         * Returns IpAddress of the device.
+         * @return ip
+         */
+        public IpAddress ip() {
+            return ip;
+        }
+
+        /**
+         * Returns port of the device.
+         * @return port
+         */
+        public int port() {
+            return port;
+        }
+
+        /**
+         * Returns username of the device.
+         * @return username
+         */
+        public String username() {
+            return username;
+        }
+
+        /**
+         * Returns password of the device.
+         * @return password
+         */
+        public String password() {
+            return password;
+        }
+    }
+
+}
+
diff --git a/providers/snmp/pom.xml b/providers/snmp/pom.xml
index 4f7b06b..4d2218b 100644
--- a/providers/snmp/pom.xml
+++ b/providers/snmp/pom.xml
@@ -36,38 +36,7 @@
         <module>app</module>
         <module>alarm</module>
     </modules>
-    
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.servicemix.bundles</groupId>
-            <artifactId>org.apache.servicemix.bundles.snmp4j</artifactId>
-            <version>2.3.4_1</version>
-            <exclusions>
-                <exclusion>
-                    <artifactId>log4j</artifactId>
-                    <groupId>log4j</groupId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        
-        <dependency>
-            <groupId>com.btisystems</groupId>
-            <artifactId>snmp-core</artifactId>
-            <version>1.3-SNAPSHOT</version>
-        </dependency>
-        
-        <dependency>
-            <groupId>com.btisystems.mibbler.mibs</groupId>
-            <artifactId>bti7000</artifactId>
-            <version>1.0-SNAPSHOT</version>
-        </dependency>
-                
-        <dependency>
-            <groupId>com.btisystems.mibbler.mibs</groupId>
-            <artifactId>net-snmp</artifactId>
-            <version>1.0-SNAPSHOT</version>
-        </dependency>
-    </dependencies>
+
     <repositories>
         <repository>
             <!-- TODO move over to release snmp-core when it becomes available. ONOS-3646 -->