diff --git a/drivers/netconf/src/main/java/org/onosproject/drivers/netconf/TemplateManager.java b/drivers/netconf/src/main/java/org/onosproject/drivers/netconf/TemplateManager.java
index bd969db..0b83ab4 100644
--- a/drivers/netconf/src/main/java/org/onosproject/drivers/netconf/TemplateManager.java
+++ b/drivers/netconf/src/main/java/org/onosproject/drivers/netconf/TemplateManager.java
@@ -119,7 +119,7 @@
                 resource = String.format(pattern, name);
             }
 
-            log.error("LOAD TEMPLATE: '{}' as '{}' from '{}", name, key, resource);
+            log.debug("LOAD TEMPLATE: '{}' as '{}' from '{}", name, key, resource);
 
             try {
                 templates.put(name,
diff --git a/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockCoreService.java b/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockCoreService.java
index d10ca71..45c5646 100644
--- a/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockCoreService.java
+++ b/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockCoreService.java
@@ -15,6 +15,9 @@
  */
 package org.onosproject.drivers.netconf;
 
+import java.util.HashSet;
+import java.util.Set;
+
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.core.DefaultApplicationId;
@@ -22,19 +25,25 @@
 import org.onosproject.core.Version;
 import org.onosproject.net.intent.MockIdGenerator;
 
-import java.util.HashSet;
-import java.util.Set;
-
 public class MockCoreService implements CoreService {
 
     private HashSet<ApplicationId> appIds;
     private Version version;
-    private IdGenerator idGenerator;
+    private int nextAppId = 101;
+
+    public MockCoreService(int baseId, String... apps) {
+        nextAppId = baseId;
+        appIds = new HashSet<ApplicationId>();
+        for (String app : apps) {
+            appIds.add(new DefaultApplicationId(nextAppId, app));
+            nextAppId += 1;
+        }
+        version = Version.version(1, 1, "1", "1");
+    }
 
     public MockCoreService() {
+        this(101, "org.onosproject.drivers.netconf");
         appIds = new HashSet<ApplicationId>();
-        appIds.add(new DefaultApplicationId(101, "org.onosproject.drivers.netconf"));
-        version = Version.version(1, 1, "1", "1");
     }
 
     @Override
@@ -49,7 +58,7 @@
 
     @Override
     public ApplicationId getAppId(Short id) {
-        for (ApplicationId appId:appIds) {
+        for (ApplicationId appId : appIds) {
             if (appId.id() == id.shortValue()) {
                 return appId;
             }
@@ -59,7 +68,7 @@
 
     @Override
     public ApplicationId getAppId(String name) {
-        for (ApplicationId appId:appIds) {
+        for (ApplicationId appId : appIds) {
             if (appId.name().equalsIgnoreCase(name)) {
                 return appId;
             }
@@ -69,8 +78,13 @@
 
     @Override
     public ApplicationId registerApplication(String name) {
-        ApplicationId appId = new DefaultApplicationId(101, name);
-        appIds.add(appId);
+        // Check if the app already exists
+        ApplicationId appId = getAppId(name);
+        if (appId == null) {
+            appId = new DefaultApplicationId(nextAppId, name);
+            nextAppId += 1;
+            appIds.add(appId);
+        }
         return appId;
     }
 
diff --git a/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockDevice.java b/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockDevice.java
new file mode 100644
index 0000000..559297b
--- /dev/null
+++ b/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockDevice.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.netconf;
+
+import org.onlab.packet.ChassisId;
+import org.onosproject.net.Annotations;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.device.DeviceDescription;
+import org.onosproject.net.driver.Behaviour;
+import org.onosproject.net.provider.ProviderId;
+
+public class MockDevice implements Device {
+
+    private final DeviceDescription desc;
+    private final DeviceId id;
+
+    public MockDevice(DeviceId id, DeviceDescription desc) {
+        this.desc = desc;
+        this.id = id;
+    }
+
+    @Override
+    public Annotations annotations() {
+        return desc.annotations();
+    }
+
+    @Override
+    public ProviderId providerId() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public <B extends Behaviour> B as(Class<B> projectionClass) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public <B extends Behaviour> boolean is(Class<B> projectionClass) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public DeviceId id() {
+        return id;
+    }
+
+    @Override
+    public Type type() {
+        return desc.type();
+    }
+
+    @Override
+    public String manufacturer() {
+        return desc.manufacturer();
+    }
+
+    @Override
+    public String hwVersion() {
+        return desc.hwVersion();
+    }
+
+    @Override
+    public String swVersion() {
+        return desc.swVersion();
+    }
+
+    @Override
+    public String serialNumber() {
+        return desc.serialNumber();
+    }
+
+    @Override
+    public ChassisId chassisId() {
+        return desc.chassisId();
+    }
+
+}
diff --git a/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockDeviceService.java b/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockDeviceService.java
new file mode 100644
index 0000000..679b8c9
--- /dev/null
+++ b/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockDeviceService.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.netconf;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.onosproject.net.Device;
+import org.onosproject.net.Device.Type;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.MastershipRole;
+import org.onosproject.net.Port;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.device.DeviceListener;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.device.PortStatistics;
+
+public class MockDeviceService implements DeviceService {
+
+    private List<Device> devices = new ArrayList<Device>();
+
+    public void addDevice(Device device) {
+        if (!devices.contains(device)) {
+            devices.add(device);
+        }
+    }
+
+    @Override
+    public void addListener(DeviceListener listener) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void removeListener(DeviceListener listener) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public int getDeviceCount() {
+        return devices.size();
+    }
+
+    @Override
+    public Iterable<Device> getDevices() {
+        return new ArrayList<Device>(devices);
+    }
+
+    @Override
+    public Iterable<Device> getDevices(Type type) {
+        return devices.stream().filter(d -> d.type() == type).collect(Collectors.toList());
+    }
+
+    @Override
+    public Iterable<Device> getAvailableDevices() {
+        return new ArrayList<Device>(devices);
+    }
+
+    @Override
+    public Iterable<Device> getAvailableDevices(Type type) {
+        return devices.stream().filter(d -> d.type() == type).collect(Collectors.toList());
+    }
+
+    @Override
+    public Device getDevice(DeviceId deviceId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public MastershipRole getRole(DeviceId deviceId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public List<Port> getPorts(DeviceId deviceId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public List<PortStatistics> getPortStatistics(DeviceId deviceId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public List<PortStatistics> getPortDeltaStatistics(DeviceId deviceId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Port getPort(DeviceId deviceId, PortNumber portNumber) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public boolean isAvailable(DeviceId deviceId) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public String localStatus(DeviceId deviceId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public long getLastUpdatedInstant(DeviceId deviceId) {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+}
diff --git a/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockDriverHandler.java b/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockDriverHandler.java
index bfa6d51..d898158 100644
--- a/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockDriverHandler.java
+++ b/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockDriverHandler.java
@@ -15,12 +15,25 @@
  */
 package org.onosproject.drivers.netconf;
 
+import static org.junit.Assert.fail;
+
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathFactory;
+
+import org.apache.commons.io.IOUtils;
 import org.onosproject.core.CoreService;
 import org.onosproject.mastership.MastershipService;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.driver.AbstractDriverLoader;
 import org.onosproject.net.driver.Behaviour;
 import org.onosproject.net.driver.DefaultDriver;
 import org.onosproject.net.driver.DefaultDriverData;
@@ -30,33 +43,78 @@
 import org.onosproject.net.flow.FlowRuleProgrammable;
 import org.onosproject.netconf.NetconfController;
 import org.onosproject.netconf.NetconfException;
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import com.google.common.io.Resources;
 
 public class MockDriverHandler implements DriverHandler {
 
     private DriverData mockDriverData;
-
     private NetconfController ncc;
     private CoreService coreService;
+    private DeviceService deviceService;
     private MastershipService mastershipService;
 
-    public MockDriverHandler() throws NetconfException {
-        Map<Class<? extends Behaviour>, Class<? extends Behaviour>> behaviours =
-                new HashMap<Class<? extends Behaviour>, Class<? extends Behaviour>>();
-        behaviours.put(FlowRuleProgrammable.class, FlowRuleProgrammable.class);
-
+    // Centralize some initialization.
+    private void init(Map<Class<? extends Behaviour>, Class<? extends Behaviour>> behaviours, DeviceId mockDeviceId,
+            CoreService mockCoreService, DeviceService mockDeviceService) throws NetconfException {
         Map<String, String> properties = new HashMap<String, String>();
 
-        Driver mockDriver =
-                new DefaultDriver("mockDriver", null, "ONOSProject", "1.0.0", "1.0.0", behaviours, properties);
-        DeviceId mockDeviceId = DeviceId.deviceId("netconf:1.2.3.4:830");
+        Driver mockDriver = new DefaultDriver("mockDriver", null, "ONOSProject", "1.0.0", "1.0.0", behaviours,
+                properties);
         mockDriverData = new DefaultDriverData(mockDriver, mockDeviceId);
 
-
         ncc = new MockNetconfController();
         ncc.connectDevice(mockDeviceId);
-
-        coreService = new MockCoreService();
+        coreService = mockCoreService;
         mastershipService = new MockMastershipService();
+        deviceService = mockDeviceService;
+    }
+
+    @SuppressWarnings("unchecked")
+    public MockDriverHandler(Class<? extends AbstractDriverLoader> loaderClass, String behaviorSpec,
+            DeviceId mockDeviceId, CoreService mockCoreService, DeviceService mockDeviceService) {
+
+        // Had to split into declaration and initialization to make stylecheck happy
+        // else line was considered too long
+        // and auto format couldn't be tweak to make it correct
+        Map<Class<? extends Behaviour>, Class<? extends Behaviour>> behaviours;
+        behaviours = new HashMap<Class<? extends Behaviour>, Class<? extends Behaviour>>();
+
+        try {
+            String data = Resources.toString(Resources.getResource(loaderClass, behaviorSpec), StandardCharsets.UTF_8);
+            InputStream resp = IOUtils.toInputStream(data, StandardCharsets.UTF_8);
+            DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
+            DocumentBuilder builder = builderFactory.newDocumentBuilder();
+            Document document = builder.parse(resp);
+
+            XPath xp = XPathFactory.newInstance().newXPath();
+            NodeList list = (NodeList) xp.evaluate("//behaviour", document, XPathConstants.NODESET);
+            for (int i = 0; i < list.getLength(); i += 1) {
+                Node node = list.item(i);
+                NamedNodeMap attrs = node.getAttributes();
+                Class<? extends Behaviour> api = (Class<? extends Behaviour>) Class
+                        .forName(attrs.getNamedItem("api").getNodeValue());
+                Class<? extends Behaviour> impl = (Class<? extends Behaviour>) Class
+                        .forName(attrs.getNamedItem("impl").getNodeValue());
+                behaviours.put(api, impl);
+            }
+            init(behaviours, mockDeviceId, mockCoreService, mockDeviceService);
+        } catch (Exception e) {
+            fail(e.toString());
+        }
+    }
+
+    public MockDriverHandler() throws NetconfException {
+        Map<Class<? extends Behaviour>, Class<? extends Behaviour>> behaviours;
+        behaviours = new HashMap<Class<? extends Behaviour>, Class<? extends Behaviour>>();
+        behaviours.put(FlowRuleProgrammable.class, FlowRuleProgrammable.class);
+        DeviceId mockDeviceId = DeviceId.deviceId("netconf:1.2.3.4:830");
+        coreService = new MockCoreService();
+        init(behaviours, mockDeviceId, coreService, null);
     }
 
     @Override
@@ -75,17 +133,17 @@
         return null;
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public <T> T get(Class<T> serviceClass) {
         if (serviceClass.equals(NetconfController.class)) {
             return (T) ncc;
-
         } else if (serviceClass.equals(CoreService.class)) {
             return (T) coreService;
-
         } else if (serviceClass.equals(MastershipService.class)) {
             return (T) mastershipService;
-
+        } else if (serviceClass.equals(DeviceService.class)) {
+            return (T) deviceService;
         }
 
         return null;
diff --git a/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockTemplateRequestDriver.java b/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockTemplateRequestDriver.java
new file mode 100644
index 0000000..5a86e86
--- /dev/null
+++ b/drivers/netconf/src/test/java/org/onosproject/drivers/netconf/MockTemplateRequestDriver.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.netconf;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathFactory;
+
+import org.apache.commons.io.IOUtils;
+import org.onosproject.net.DeviceId;
+import org.onosproject.netconf.NetconfDevice;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.slf4j.Logger;
+import org.w3c.dom.Document;
+
+import com.google.common.io.Resources;
+
+public class MockTemplateRequestDriver implements TemplateRequestDriver {
+    private static final Logger log = getLogger(MockTemplateRequestDriver.class);
+    private static final DeviceId DEFAULT_RESPONSES_ID = DeviceId.deviceId("mock:default:1234");
+
+    private Map<DeviceId, Map<String, String>> responses = new HashMap<DeviceId, Map<String, String>>();
+
+    private Map<NetconfSession, DeviceId> sessionMap = new HashMap<NetconfSession, DeviceId>();
+
+    @Override
+    public Object doRequest(NetconfSession session, String templateName, Map<String, Object> templateContext,
+            String baseXPath, QName returnType) throws NetconfException {
+
+        try {
+            DeviceId deviceId = sessionMap.get(session);
+            Map<String, String> deviceResponses = responses.get(deviceId);
+            String responseTemplate = null;
+            if (deviceResponses != null) {
+                responseTemplate = deviceResponses.get(templateName);
+            }
+            if (responseTemplate == null) {
+                deviceResponses = responses.get(DEFAULT_RESPONSES_ID);
+                if (deviceResponses != null) {
+                    responseTemplate = deviceResponses.get(templateName);
+                }
+            }
+            if (responseTemplate == null) {
+                throw new Exception(
+                        String.format("Reponse template '%s' for device '%s' not found", templateName, deviceId));
+            }
+            InputStream resp = IOUtils.toInputStream(responseTemplate, StandardCharsets.UTF_8);
+            DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
+            DocumentBuilder builder = builderFactory.newDocumentBuilder();
+            Document document = builder.parse(resp);
+            XPath xp = XPathFactory.newInstance().newXPath();
+            return xp.evaluate(baseXPath, document, returnType);
+        } catch (Exception e) {
+            NetconfException ne = new NetconfException(e.getMessage(), e);
+            throw ne;
+        }
+    }
+
+    public void load(Class<? extends Object> reference, String pattern, DeviceId id, String... reponseNames) {
+        for (String name : reponseNames) {
+            String key = name;
+            String resource;
+
+            // If the template name begins with a '/', then assume it is a full path
+            // specification
+            if (name.charAt(0) == '/') {
+                int start = name.lastIndexOf('/') + 1;
+                int end = name.lastIndexOf('.');
+                if (end == -1) {
+                    key = name.substring(start);
+                } else {
+                    key = name.substring(start, end);
+                }
+                resource = name;
+            } else {
+                resource = String.format(pattern, name);
+            }
+
+            log.debug("LOAD RESPONSE TEMPLATE: '{}' as '{}' from '{}'", name, key, resource);
+
+            try {
+                DeviceId use = id;
+                if (use == null) {
+                    use = DEFAULT_RESPONSES_ID;
+                }
+                Map<String, String> deviceResponses = responses.get(use);
+                if (deviceResponses == null) {
+                    deviceResponses = new HashMap<String, String>();
+                    responses.put(use, deviceResponses);
+                }
+                deviceResponses.put(name,
+                        Resources.toString(Resources.getResource(reference, resource), StandardCharsets.UTF_8));
+            } catch (IOException ioe) {
+                log.error("Unable to load NETCONF response template '{}' from '{}'", key, resource, ioe);
+            }
+        }
+    }
+
+    public void setDeviceMap(Map<DeviceId, NetconfDevice> devicesMap) {
+        // sessionMap.clear();
+
+        for (Map.Entry<DeviceId, NetconfDevice> entry : devicesMap.entrySet()) {
+            sessionMap.put(entry.getValue().getSession(), entry.getKey());
+        }
+    }
+}
