diff --git a/apps/netconf/BUCK b/apps/netconfsb/BUCK
similarity index 72%
rename from apps/netconf/BUCK
rename to apps/netconfsb/BUCK
index f4cc35c..907e4be 100644
--- a/apps/netconf/BUCK
+++ b/apps/netconfsb/BUCK
@@ -1,10 +1,10 @@
 BUNDLES = [
-  '//apps/netconf/client:onos-apps-netconf-client',
-  '//apps/netconf/storeadapter:onos-apps-netconf-storeadapter',
+  '//apps/netconfsb/client:onos-apps-netconfsb-client',
+  '//apps/netconfsb/storeadapter:onos-apps-netconfsb-storeadapter',
 ]
 
 onos_app (
-  app_name = 'org.onosproject.netconf',
+  app_name = 'org.onosproject.netconfsb',
   title = 'NETCONF Application Module',
   category = 'Utility',
   url = 'http://onosproject.org',
diff --git a/apps/netconf/client/BUCK b/apps/netconfsb/client/BUCK
similarity index 100%
rename from apps/netconf/client/BUCK
rename to apps/netconfsb/client/BUCK
diff --git a/apps/netconf/client/src/main/java/org/onosproject/netconf/client/NetconfTranslator.java b/apps/netconfsb/client/src/main/java/org/onosproject/netconf/client/NetconfTranslator.java
similarity index 100%
rename from apps/netconf/client/src/main/java/org/onosproject/netconf/client/NetconfTranslator.java
rename to apps/netconfsb/client/src/main/java/org/onosproject/netconf/client/NetconfTranslator.java
diff --git a/apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/NetconfTranslatorImpl.java b/apps/netconfsb/client/src/main/java/org/onosproject/netconf/client/impl/NetconfTranslatorImpl.java
similarity index 100%
rename from apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/NetconfTranslatorImpl.java
rename to apps/netconfsb/client/src/main/java/org/onosproject/netconf/client/impl/NetconfTranslatorImpl.java
diff --git a/apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/package-info.java b/apps/netconfsb/client/src/main/java/org/onosproject/netconf/client/impl/package-info.java
similarity index 100%
rename from apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/package-info.java
rename to apps/netconfsb/client/src/main/java/org/onosproject/netconf/client/impl/package-info.java
diff --git a/apps/netconf/client/src/main/java/org/onosproject/netconf/client/package-info.java b/apps/netconfsb/client/src/main/java/org/onosproject/netconf/client/package-info.java
similarity index 100%
rename from apps/netconf/client/src/main/java/org/onosproject/netconf/client/package-info.java
rename to apps/netconfsb/client/src/main/java/org/onosproject/netconf/client/package-info.java
diff --git a/apps/netconf/client/src/test/java/org/onosproject/netconf/client/NetconfTranslatorImplTest.java b/apps/netconfsb/client/src/test/java/org/onosproject/netconf/client/NetconfTranslatorImplTest.java
similarity index 100%
rename from apps/netconf/client/src/test/java/org/onosproject/netconf/client/NetconfTranslatorImplTest.java
rename to apps/netconfsb/client/src/test/java/org/onosproject/netconf/client/NetconfTranslatorImplTest.java
diff --git a/apps/netconf/storeadapter/BUCK b/apps/netconfsb/storeadapter/BUCK
similarity index 69%
rename from apps/netconf/storeadapter/BUCK
rename to apps/netconfsb/storeadapter/BUCK
index 8787855..6444a6c 100644
--- a/apps/netconf/storeadapter/BUCK
+++ b/apps/netconfsb/storeadapter/BUCK
@@ -3,7 +3,10 @@
     '//lib:onos-yang-model',
     '//lib:onos-yang-runtime',
     '//apps/config:onos-apps-config',
-    '//apps/netconf/client:onos-apps-netconf-client'
+    '//protocols/netconf/api:onos-protocols-netconf-api',
+    '//apps/netconfsb/client:onos-apps-netconfsb-client'
+
+
 ]
 
 osgi_jar_with_tests (
@@ -11,12 +14,12 @@
 )
 
 BUNDLES = [
-  '//apps/netconf/client:onos-apps-netconf-client',
-  '//apps/netconf/storeadapter:onos-apps-netconf-storeadapter',
+  '//apps/netconfsb/client:onos-apps-netconfsb-client',
+  '//apps/netconfsb/storeadapter:onos-apps-netconfsb-storeadapter',
 ]
 
 onos_app (
-  app_name = 'org.onosproject.netconf',
+  app_name = 'org.onosproject.netconfsb',
   title = 'NETCONF Application Module',
   category = 'Utility',
   url = 'http://onosproject.org',
diff --git a/apps/netconf/storeadapter/src/main/java/org/onosproject/netconf/storeadapter/NetconfYangListener.java b/apps/netconfsb/storeadapter/src/main/java/org/onosproject/netconf/storeadapter/NetconfActiveComponent.java
similarity index 66%
rename from apps/netconf/storeadapter/src/main/java/org/onosproject/netconf/storeadapter/NetconfYangListener.java
rename to apps/netconfsb/storeadapter/src/main/java/org/onosproject/netconf/storeadapter/NetconfActiveComponent.java
index e3c94c2..8d824f7 100644
--- a/apps/netconf/storeadapter/src/main/java/org/onosproject/netconf/storeadapter/NetconfYangListener.java
+++ b/apps/netconfsb/storeadapter/src/main/java/org/onosproject/netconf/storeadapter/NetconfActiveComponent.java
@@ -32,7 +32,12 @@
 import org.onosproject.net.resource.Resource;
 import org.onosproject.netconf.client.NetconfTranslator;
 import org.onosproject.netconf.client.NetconfTranslator.OperationType;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfController;
+import java.net.URI;
+import java.net.URISyntaxException;
 import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.LeafNode;
 import org.onosproject.yang.model.ResourceId;
 import org.onosproject.yang.runtime.DefaultResourceData;
 import org.slf4j.Logger;
@@ -40,13 +45,14 @@
 
 import java.io.IOException;
 
+
 @Beta
 @Component(immediate = true)
-public class NetconfYangListener implements DynamicConfigListener {
+public class NetconfActiveComponent implements DynamicConfigListener {
 
-    private static final Logger log = LoggerFactory.getLogger(NetconfYangListener.class);
+    private static final Logger log = LoggerFactory.getLogger(NetconfActiveComponent.class);
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DynamicConfigService cfgServcie;
+    protected DynamicConfigService cfgService;
     public static final String DEVNMSPACE = "namespace1";
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -55,35 +61,51 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected MastershipService mastershipService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetconfController controller;
+
     private ResourceId resId = new ResourceId.Builder()
             .addBranchPointSchema("device", DEVNMSPACE )
             .build();
     @Activate
     protected void activate() {
-        cfgServcie.addListener(this);
+        cfgService.addListener(this);
         log.info("Started");
     }
 
     @Deactivate
     protected void deactivate() {
-        cfgServcie.removeListener(this);
+        cfgService.removeListener(this);
         log.info("Stopped");
     }
 
     @Override
     public boolean isRelevant(DynamicConfigEvent event) {
-        if (event.subject().equals(resId) &&
-                mastershipService.isLocalMaster(retrieveDeviceId(event.subject()))) {
-                return true;
-            } else {
+        if (event.subject().equals(resId)) {
+            return true;
+        } else {
             return false;
         }
     }
+
+    public boolean isMaster(DeviceId deviceId) {
+        if (mastershipService.isLocalMaster(deviceId)) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
     @Override
     public void event(DynamicConfigEvent event) {
         Filter filt = new Filter();
-        DataNode node = cfgServcie.readNode(event.subject(), filt);
-        DeviceId deviceId = retrieveDeviceId(event.subject());
+        DataNode node = cfgService.readNode(event.subject(), filt);
+        DeviceId deviceId = getDeviceId(node);
+        if (!isMaster(deviceId)) {
+            log.info("NetConfListener: not master, ignoring config for {}", event.type());
+            return;
+        }
+        initiateConnection(deviceId);
         switch (event.type()) {
             case NODE_ADDED:
             case NODE_UPDATED:
@@ -150,13 +172,46 @@
     }
 
     /**
-     * Takes a resourceId corresponding to the provided event and uses it to
-     * retrieve/generate a deviceId corresponding to the effected device.
-     * @param resourceId the resourceId associated with the event
+     * Retrieves device id from Data node.
+     *
+     * @param node the node associated with the event
      * @return the deviceId of the effected device
      */
-    private DeviceId retrieveDeviceId(ResourceId resourceId) {
-        /*TODO this requires a real implementation instead of a placeholder */
-        return DeviceId.NONE;
+    public DeviceId getDeviceId(DataNode node) {
+        String[] temp;
+        String ip, port;
+        if (node.type() == DataNode.Type.SINGLE_INSTANCE_LEAF_VALUE_NODE) {
+            temp = ((LeafNode) node).asString().split("\\:");
+            if (temp.length != 3) {
+                throw new RuntimeException(new NetconfException("Invalid device id form, cannot apply"));
+            }
+            ip = temp[1];
+            port = temp[2];
+        } else {
+            throw new RuntimeException(new NetconfException("Invalid device id type, cannot apply"));
+        }
+        try {
+            return DeviceId.deviceId(new URI("netconf", ip + ":" + port, (String) null));
+        } catch (URISyntaxException var4) {
+            throw new IllegalArgumentException("Unable to build deviceID for device " + ip + ":" + port, var4);
+        }
+    }
+
+    /**
+     * Inititates a Netconf connection to the device.
+     *
+     * @param deviceId of the added device
+     */
+    private void initiateConnection(DeviceId deviceId) {
+        if (controller.getNetconfDevice(deviceId) == null) {
+            try {
+                //if (this.isReachable(deviceId)) {
+                    this.controller.connectDevice(deviceId);
+                //}
+            } catch (Exception ex) {
+                throw new RuntimeException(new NetconfException("Can\'t " +
+                        "connect to NETCONF device on " + deviceId + ":" + deviceId, ex));
+            }
+        }
     }
 }
\ No newline at end of file
diff --git a/apps/pom.xml b/apps/pom.xml
index ebd1d28..ac7b150 100644
--- a/apps/pom.xml
+++ b/apps/pom.xml
@@ -109,6 +109,16 @@
             <groupId>org.apache.felix</groupId>
             <artifactId>org.apache.felix.scr.annotations</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-config</artifactId>
+            <version>1.10.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-netconf-api</artifactId>
+            <version>1.10.0-SNAPSHOT</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/modules.defs b/modules.defs
index 7810cd5..3c55a8d 100644
--- a/modules.defs
+++ b/modules.defs
@@ -178,7 +178,7 @@
     '//apps/ofagent:onos-apps-ofagent-oar',
     '//apps/mappingmanagement:onos-apps-mappingmanagement-oar',
     '//apps/config:onos-apps-config-oar',
-    '//apps/netconf:onos-apps-netconf-oar',
+    '//apps/netconfsb:onos-apps-netconfsb-oar',
     '//apps/tetopology:onos-apps-tetopology-oar',
     '//apps/tetunnel:onos-apps-tetunnel-oar',
 #    '//apps/tenbi/yangmodel:onos-apps-tenbi-yangmodel-feature',
