diff --git a/apps/netconf/storeadapter/BUCK b/apps/netconf/storeadapter/BUCK
index b58c1d8..8787855 100644
--- a/apps/netconf/storeadapter/BUCK
+++ b/apps/netconf/storeadapter/BUCK
@@ -3,6 +3,7 @@
     '//lib:onos-yang-model',
     '//lib:onos-yang-runtime',
     '//apps/config:onos-apps-config',
+    '//apps/netconf/client:onos-apps-netconf-client'
 ]
 
 osgi_jar_with_tests (
diff --git a/apps/netconf/storeadapter/src/main/java/org/onosproject/netconf/storeadapter/NetConfListener.java b/apps/netconf/storeadapter/src/main/java/org/onosproject/netconf/storeadapter/NetConfListener.java
deleted file mode 100644
index a268c35..0000000
--- a/apps/netconf/storeadapter/src/main/java/org/onosproject/netconf/storeadapter/NetConfListener.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.netconf.storeadapter;
-
-import com.google.common.annotations.Beta;
-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.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.onosproject.config.DynamicConfigEvent;
-import org.onosproject.config.DynamicConfigListener;
-import org.onosproject.config.DynamicConfigService;
-import org.onosproject.config.Filter;
-import org.onosproject.yang.model.DataNode;
-import org.onosproject.yang.model.ResourceId;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Beta
-@Component(immediate = true)
-public class NetConfListener implements DynamicConfigListener {
-
-    private static final Logger log = LoggerFactory.getLogger(NetConfListener.class);
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DynamicConfigService cfgServcie;
-    public static final String DEVNMSPACE = "namespace1";
-
-    private ResourceId resId = new ResourceId.Builder()
-            .addBranchPointSchema("device", DEVNMSPACE )
-            .build();
-    @Activate
-    protected void activate() {
-        cfgServcie.addListener(this);
-        log.info("NetConfListener Started");
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        cfgServcie.removeListener(this);
-        log.info("NetConfListener Stopped");
-    }
-
-    public boolean isRelevant(DynamicConfigEvent event) {
-        if (event.subject().equals(resId)) {
-            log.info("isRelevant {} = {}", resId, event.subject());
-                return true;
-            } else {
-            log.info("isRelevant {} != {}", resId, event.subject());
-            return false;
-        }
-    }
-
-    public void event(DynamicConfigEvent event) {
-        if (!isRelevant(event)) {
-            log.info("event is not relevanyt!!!! {} != {}", resId, event.subject());
-            return;
-        }
-        switch (event.type()) {
-            case NODE_ADDED:
-                log.info("NetConfListener: RXD NODE_ADDED event");
-                Filter filt = new Filter();
-                DataNode node = cfgServcie.readNode(event.subject(), filt);
-                //call netconf passive
-                break;
-            case NODE_UPDATED:
-                log.info("NetConfListener: RXD NODE_UPDATED event");
-                break;
-            case NODE_REPLACED:
-                log.info("NetConfListener: RXD NODE_REPLACED event");
-                break;
-            case NODE_DELETED:
-                log.info("NetConfListener: RXD NODE_DELETED event");
-                break;
-            case UNKNOWN_OPRN:
-            default:
-                log.warn("NetConfListener: unknown event: {}", event.type());
-                break;
-        }
-    }
-}
\ No newline at end of file
diff --git a/apps/netconf/storeadapter/src/main/java/org/onosproject/netconf/storeadapter/NetconfYangListener.java b/apps/netconf/storeadapter/src/main/java/org/onosproject/netconf/storeadapter/NetconfYangListener.java
new file mode 100644
index 0000000..e3c94c2
--- /dev/null
+++ b/apps/netconf/storeadapter/src/main/java/org/onosproject/netconf/storeadapter/NetconfYangListener.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.netconf.storeadapter;
+
+import com.google.common.annotations.Beta;
+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.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onosproject.config.DynamicConfigEvent;
+import org.onosproject.config.DynamicConfigListener;
+import org.onosproject.config.DynamicConfigService;
+import org.onosproject.config.Filter;
+import org.onosproject.mastership.MastershipService;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.resource.Resource;
+import org.onosproject.netconf.client.NetconfTranslator;
+import org.onosproject.netconf.client.NetconfTranslator.OperationType;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.DefaultResourceData;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+
+@Beta
+@Component(immediate = true)
+public class NetconfYangListener implements DynamicConfigListener {
+
+    private static final Logger log = LoggerFactory.getLogger(NetconfYangListener.class);
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected DynamicConfigService cfgServcie;
+    public static final String DEVNMSPACE = "namespace1";
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetconfTranslator netconfTranslator;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected MastershipService mastershipService;
+
+    private ResourceId resId = new ResourceId.Builder()
+            .addBranchPointSchema("device", DEVNMSPACE )
+            .build();
+    @Activate
+    protected void activate() {
+        cfgServcie.addListener(this);
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        cfgServcie.removeListener(this);
+        log.info("Stopped");
+    }
+
+    @Override
+    public boolean isRelevant(DynamicConfigEvent event) {
+        if (event.subject().equals(resId) &&
+                mastershipService.isLocalMaster(retrieveDeviceId(event.subject()))) {
+                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());
+        switch (event.type()) {
+            case NODE_ADDED:
+            case NODE_UPDATED:
+            case NODE_REPLACED:
+                configUpdate(node, deviceId, event.subject());
+                break;
+            case NODE_DELETED:
+                configDelete(node, deviceId, event.subject());
+                break;
+            case UNKNOWN_OPRN:
+            default:
+                log.warn("NetConfListener: unknown event: {}", event.type());
+                break;
+        }
+    }
+
+    /**
+     * Performs the delete operation corresponding to the passed event.
+     * @param node a relevant dataNode
+     * @param deviceId the deviceId of the device to be updated
+     * @param resourceId the resourceId of the root of the subtree to be edited
+     * @return true if the update succeeds false otherwise
+     */
+    private boolean configDelete(DataNode node, DeviceId deviceId, ResourceId resourceId) {
+        return parseAndEdit(node, deviceId, resourceId, OperationType.DELETE);
+    }
+
+    /**
+     * Performs the update operation corresponding to the passed event.
+     * @param node a relevant dataNode
+     * @param deviceId the deviceId of the device to be updated
+     * @param resourceId the resourceId of the root of the subtree to be edited
+     * @return true if the update succeeds false otherwise
+     */
+    private boolean configUpdate(DataNode node, DeviceId deviceId, ResourceId resourceId) {
+        return parseAndEdit(node, deviceId, resourceId, OperationType.REPLACE);
+    }
+
+    /**
+     * Parses the incoming event and pushes configuration to the effected
+     * device.
+     * @param node the dataNode effecting a particular device of which this node
+     *              is master
+     * @param deviceId the deviceId of the device to be modified
+     * @param resourceId the resourceId of the root of the subtree to be edited
+     * @param operationType the type of editing to be performed
+     * @return true if the operation succeeds, false otherwise
+     */
+    private boolean parseAndEdit(DataNode node, DeviceId deviceId,
+                                 ResourceId resourceId,
+                                 NetconfTranslator.OperationType operationType) {
+        try {
+            return netconfTranslator.editDeviceConfig(
+                    deviceId,
+                    DefaultResourceData.builder()
+                            .addDataNode(node)
+                            .resourceId(resourceId)
+                            .build(),
+                    operationType);
+        } catch (IOException e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 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
+     * @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;
+    }
+}
\ No newline at end of file
