diff --git a/providers/netconf/device/pom.xml b/providers/netconf/device/pom.xml
index 3465bc3..15ad475 100644
--- a/providers/netconf/device/pom.xml
+++ b/providers/netconf/device/pom.xml
@@ -33,129 +33,29 @@
 
     <dependencies>
         <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>ch.ethz.ganymed</groupId>
-            <artifactId>ganymed-ssh2</artifactId>
-            <version>262</version>
-        </dependency>
-        <dependency>
-            <!-- TODO: change this appropriately when the official TailF JNC is available -->
-            <groupId>org.onosproject</groupId>
-            <artifactId>jnc</artifactId>
-            <version>1.0</version>
-        </dependency>
-        <dependency>
-            <groupId>org.jdom</groupId>
-            <artifactId>jdom2</artifactId>
-            <version>2.0.5</version>
-        </dependency>
-        <dependency>
-            <groupId>jaxen</groupId>
-            <artifactId>jaxen</artifactId>
-            <version>1.1.4</version>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.core</artifactId>
-        </dependency>
-        <dependency>
             <groupId>org.onosproject</groupId>
             <artifactId>onlab-junit</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.easymock</groupId>
-            <artifactId>easymock</artifactId>
-            <scope>test</scope>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-netconf-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-netconf-ctl</artifactId>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
     <build>
         <plugins>
             <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <version>2.3</version>
-                <configuration>
-                    <filters>
-                        <filter>
-                            <artifact>com.tailf:JNC</artifact>
-                            <includes>
-                                <include>com/tailf/jnc/**</include>
-                            </includes>
-                        </filter>
-                        <filter>
-                            <artifact>ch.ethz.ganymed:ganymed-ssh2</artifact>
-                            <includes>
-                                <include>ch/ethz/ssh2/**</include>
-                            </includes>
-                        </filter>
-                        <filter>
-                            <artifact>org.jdom:jdom2</artifact>
-                            <includes>
-                                <include>org/jdom2/**</include>
-                            </includes>
-                        </filter>
-                    </filters>
-                </configuration>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-scr-plugin</artifactId>
             </plugin>
             <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <instructions>
-                        <Export-Package>
-                            com.tailf.jnc,
-                            ch.ethz.ssh2,
-                            ch.ethz.ssh2.auth,
-                            ch.ethz.ssh2.channel,
-                            ch.ethz.ssh2.crypto,
-                            ch.ethz.ssh2.crypto.cipher,
-                            ch.ethz.ssh2.crypto.dh,
-                            ch.ethz.ssh2.crypto.digest,
-                            ch.ethz.ssh2.log,
-                            ch.ethz.ssh2.packets,
-                            ch.ethz.ssh2.server,
-                            ch.ethz.ssh2.sftp,
-                            ch.ethz.ssh2.signature,
-                            ch.ethz.ssh2.transport,
-                            ch.ethz.ssh2.util,
-                            org.jdom2,
-                            org.jdom2.input,
-                            org.jdom2.output,
-                            org.jdom2.adapters,
-                            org.jdom2.filter,
-                            org.jdom2.internal,
-                            org.jdom2.located,
-                            org.jdom2.transform,
-                            org.jdom2.util,
-                            org.jdom2.xpath,
-                            org.jdom2.input.sax,
-                            org.jdom2.input.stax,
-                            org.jdom2.output.support,
-                            org.jdom2.xpath.jaxen,
-                            org.jdom2.xpath.util
-                        </Export-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-            <plugin>
                 <groupId>org.onosproject</groupId>
                 <artifactId>onos-maven-plugin</artifactId>
             </plugin>
diff --git a/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDevice.java b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDevice.java
deleted file mode 100644
index b3d26b0..0000000
--- a/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDevice.java
+++ /dev/null
@@ -1,304 +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.netconf.device.impl;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.Tools.delay;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.input.SAXBuilder;
-import org.jdom2.output.Format;
-import org.jdom2.output.XMLOutputter;
-import org.slf4j.Logger;
-
-import com.tailf.jnc.Capabilities;
-import com.tailf.jnc.JNCException;
-import com.tailf.jnc.SSHConnection;
-import com.tailf.jnc.SSHSession;
-
-/**
- * This is a logical representation of actual NETCONF device, carrying all the
- * necessary information to connect and execute NETCONF operations.
- */
-public class NetconfDevice {
-    private final Logger log = getLogger(NetconfDevice.class);
-
-    /**
-     * The Device State is used to determine whether the device is active or
-     * inactive. This state infomation will help Device Creator to add or delete
-     * the device from the core.
-     */
-    public static 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
-    }
-
-    private static final int DEFAULT_SSH_PORT = 22;
-    private static final int DEFAULT_CON_TIMEOUT = 0;
-    private static final String XML_CAPABILITY_KEY = "capability";
-    private static final int EVENTINTERVAL = 2000;
-    private static final int CONNECTION_CHECK_INTERVAL = 3;
-    private static final String INPUT_HELLO_XML_MSG = new StringBuilder(
-                                                                        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
-            .append("<hello xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">")
-            .append("<capabilities><capability>urn:ietf:params:netconf:base:1.0</capability>")
-            .append("</capabilities></hello>").toString();
-
-    private String sshHost;
-    private int sshPort = DEFAULT_SSH_PORT;
-    private int connectTimeout = DEFAULT_CON_TIMEOUT;
-    private String username;
-    private String password;
-    private boolean reachable = false;
-
-    private List<String> capabilities = new ArrayList<String>();
-    private SSHConnection sshConnection = null;
-
-    private DeviceState deviceState = DeviceState.INVALID;
-
-    protected NetconfDevice(String sshHost, int sshPort, String username,
-                            String password) {
-        this.username = checkNotNull(username,
-                                     "Netconf Username Cannot be null");
-        this.sshHost = checkNotNull(sshHost, "Netconf Device IP cannot be null");
-        this.sshPort = checkNotNull(sshPort,
-                                    "Netconf Device SSH port cannot be null");
-        this.password = password;
-    }
-
-    /**
-     * This will try to connect to NETCONF device and find all the capabilities.
-     *
-     * @throws Exception if unable to connect to the device
-     */
-    // FIXME: this should not be a generic Exception; perhaps wrap in some RuntimeException
-    public void init() throws Exception {
-        try {
-            if (sshConnection == null) {
-                sshConnection = new SSHConnection(sshHost, sshPort, connectTimeout);
-                sshConnection.authenticateWithPassword(username, password);
-            }
-            // Send hello message to retrieve capabilities.
-        } catch (IOException e) {
-            log.error("Fatal Error while creating connection to the device: "
-                    + deviceInfo(), e);
-            throw e;
-        } catch (JNCException e) {
-            log.error("Failed to connect to the device: " + deviceInfo(), e);
-            throw e;
-        }
-
-        hello();
-    }
-
-    private void hello() {
-        SSHSession ssh = null;
-        try {
-            ssh = new SSHSession(sshConnection);
-            String helloRequestXML = INPUT_HELLO_XML_MSG.trim();
-
-            log.debug("++++++++++++++++++++++++++++++++++Sending Hello: "
-                    + sshConnection.getGanymedConnection().getHostname()
-                    + "++++++++++++++++++++++++++++++++++");
-            printPrettyXML(helloRequestXML);
-            ssh.print(helloRequestXML);
-            // ssh.print(endCharSeq);
-            ssh.flush();
-            String xmlResponse = null;
-            int i = CONNECTION_CHECK_INTERVAL;
-            while (!ssh.ready() && i > 0) {
-                delay(EVENTINTERVAL);
-                i--;
-            }
-
-            if (ssh.ready()) {
-                StringBuffer readOne = ssh.readOne();
-                if (readOne == null) {
-                    log.error("The Hello Contains No Capabilites");
-                    throw new JNCException(
-                                           JNCException.SESSION_ERROR,
-                                           "server does not support NETCONF base capability: "
-                                                   + Capabilities.NETCONF_BASE_CAPABILITY);
-                } else {
-                    xmlResponse = readOne.toString().trim();
-
-                    log.debug("++++++++++++++++++++++++++++++++++Reading Capabilities: "
-                            + sshConnection.getGanymedConnection()
-                                    .getHostname()
-                            + "++++++++++++++++++++++++++++++++++");
-
-                    printPrettyXML(xmlResponse);
-                    processCapabilities(xmlResponse);
-                }
-            }
-            reachable = true;
-        } catch (IOException e) {
-            log.error("Fatal Error while sending Hello Message to the device: "
-                    + deviceInfo(), e);
-        } catch (JNCException e) {
-            log.error("Fatal Error while sending Hello Message to the device: "
-                    + deviceInfo(), e);
-        } finally {
-            log.debug("Closing the session after successful execution");
-            if (ssh != null) {
-                ssh.close();
-            }
-        }
-    }
-
-    private void processCapabilities(String xmlResponse) throws JNCException {
-        if (xmlResponse.isEmpty()) {
-            log.error("The capability response cannot be empty");
-            throw new JNCException(
-                                   JNCException.SESSION_ERROR,
-                                   "server does not support NETCONF base capability: "
-                                           + Capabilities.NETCONF_BASE_CAPABILITY);
-        }
-        try {
-            Document doc = new SAXBuilder()
-                    .build(new StringReader(xmlResponse));
-            Element rootElement = doc.getRootElement();
-            processCapabilities(rootElement);
-        } catch (Exception e) {
-            log.error("ERROR while parsing the XML " + xmlResponse);
-        }
-    }
-
-    private void processCapabilities(Element rootElement) {
-        List<Element> children = rootElement.getChildren();
-        if (children.isEmpty()) {
-            return;
-        }
-        for (Element child : children) {
-
-            if (child.getName().equals(XML_CAPABILITY_KEY)) {
-                capabilities.add(child.getValue());
-            }
-            if (!child.getChildren().isEmpty()) {
-                processCapabilities(child);
-            }
-        }
-    }
-
-    private void printPrettyXML(String xmlstring) {
-        try {
-            Document doc = new SAXBuilder().build(new StringReader(xmlstring));
-            XMLOutputter xmOut = new XMLOutputter(Format.getPrettyFormat());
-            String outputString = xmOut.outputString(doc);
-            log.debug(outputString);
-        } catch (Exception e) {
-            log.error("ERROR while parsing the XML " + xmlstring, e);
-
-        }
-    }
-
-    /**
-     * This would return host IP and host Port, used by this particular Netconf
-     * Device.
-     * @return Device Information.
-     */
-    public String deviceInfo() {
-        return new StringBuilder("host: ").append(sshHost).append(". port: ")
-                .append(sshPort).toString();
-    }
-
-    /**
-     * This will terminate the device connection.
-     */
-    public void disconnect() {
-        sshConnection.close();
-        reachable = false;
-    }
-
-    /**
-     * This will list down all the capabilities supported on the device.
-     * @return Capability list.
-     */
-    public List<String> getCapabilities() {
-        return capabilities;
-    }
-
-    /**
-     * 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 Netconf Device IP
-     */
-    public String getSshHost() {
-        return sshHost;
-    }
-
-    /**
-     * This will return the SSH Port used connect the device.
-     * @return SSH Port number
-     */
-    public int getSshPort() {
-        return sshPort;
-    }
-
-    /**
-     * The usename used to connect Netconf Device.
-     * @return Device Username
-     */
-    public String getUsername() {
-        return username;
-    }
-
-    /**
-     * 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 ? true : false;
-    }
-
-    public void setConnectTimeout(int connectTimeout) {
-        this.connectTimeout = connectTimeout;
-    }
-}
diff --git a/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
index f9194a7..d12c647 100644
--- a/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
+++ b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
@@ -13,39 +13,28 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package org.onosproject.provider.netconf.device.impl;
 
-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.slf4j.LoggerFactory.getLogger;
-
-import java.io.IOException;
-import java.net.SocketTimeoutException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Dictionary;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
+import com.google.common.base.Preconditions;
 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.DefaultAnnotations;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.MastershipRole;
+import org.onosproject.net.SparseAnnotations;
+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.DeviceProvider;
@@ -54,305 +43,180 @@
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
-import org.onosproject.provider.netconf.device.impl.NetconfDevice.DeviceState;
-import org.osgi.service.component.ComponentContext;
+import org.onosproject.netconf.NetconfController;
+import org.onosproject.netconf.NetconfDevice;
+import org.onosproject.netconf.NetconfDeviceInfo;
+import org.onosproject.netconf.NetconfDeviceListener;
 import org.slf4j.Logger;
 
+import java.util.Map;
+
+import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
+import static org.slf4j.LoggerFactory.getLogger;
+
 /**
- * Provider which will try to fetch the details of NETCONF devices from the core
- * and run a capability discovery on each of the device.
+ * Provider which uses an NETCONF controller to detect device.
  */
 @Component(immediate = true)
 public class NetconfDeviceProvider extends AbstractProvider
         implements DeviceProvider {
-
-    private final Logger log = getLogger(NetconfDeviceProvider.class);
-
-    protected Map<DeviceId, NetconfDevice> netconfDeviceMap = new ConcurrentHashMap<DeviceId, NetconfDevice>();
-
-    private DeviceProviderService providerService;
+    private final Logger log = getLogger(getClass());
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected DeviceProviderRegistry providerRegistry;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected DeviceService deviceService;
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetconfController controller; //where is initiated ?
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected ClusterService clusterService;
+    protected NetworkConfigRegistry cfgService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected ComponentConfigService cfgService;
+    protected CoreService coreService;
 
-    private ExecutorService deviceBuilder = Executors
-            .newFixedThreadPool(1, groupedThreads("onos/netconf", "device-creator"));
 
-    // Delay between events in ms.
-    private static final int EVENTINTERVAL = 5;
+    private DeviceProviderService providerService;
+    private NetconfDeviceListener innerNodeListener = new InnerNetconfDeviceListener();
+    protected static final String ISNOTNULL = "NetconfDeviceInfo is not null";
+    private static final String UNKNOWN = "unknown";
 
-    private static final String SCHEME = "netconf";
+    private final ConfigFactory factory =
+            new ConfigFactory<ApplicationId, NetconfProviderConfig>(APP_SUBJECT_FACTORY,
+                                                                    NetconfProviderConfig.class,
+                                                                    "devices",
+                                                                    true) {
+                @Override
+                public NetconfProviderConfig createConfig() {
+                    return new NetconfProviderConfig();
+                }
+            };
+    private final NetworkConfigListener cfgLister = new InternalNetworkConfigListener();
+    private ApplicationId appId;
 
-    @Property(name = "devConfigs", value = "", label = "Instance-specific configurations")
-    private String devConfigs = null;
-
-    @Property(name = "devPasswords", value = "", label = "Instance-specific password")
-    private String devPasswords = null;
-
-    /**
-     * Creates a provider with the supplier identifier.
-     */
-    public NetconfDeviceProvider() {
-        super(new ProviderId("netconf", "org.onosproject.provider.netconf"));
-    }
 
     @Activate
-    public void activate(ComponentContext context) {
-        cfgService.registerProperties(getClass());
+    public void activate() {
         providerService = providerRegistry.register(this);
-        modified(context);
+        cfgService.registerConfigFactory(factory);
+        cfgService.addListener(cfgLister);
+        controller.addDeviceListener(innerNodeListener);
+        connectExistingDevices();
         log.info("Started");
     }
 
+
     @Deactivate
-    public void deactivate(ComponentContext context) {
-        cfgService.unregisterProperties(getClass(), false);
-        try {
-            for (Entry<DeviceId, NetconfDevice> deviceEntry : netconfDeviceMap
-                    .entrySet()) {
-                deviceBuilder.submit(new DeviceCreator(deviceEntry.getValue(),
-                                                       false));
-            }
-            deviceBuilder.awaitTermination(1000, TimeUnit.MILLISECONDS);
-        } catch (InterruptedException e) {
-            log.error("Device builder did not terminate");
-        }
-        deviceBuilder.shutdownNow();
-        netconfDeviceMap.clear();
+    public void deactivate() {
         providerRegistry.unregister(this);
         providerService = null;
+        cfgService.unregisterConfigFactory(factory);
         log.info("Stopped");
     }
 
-    @Modified
-    public void modified(ComponentContext context) {
-        if (context == null) {
-            log.info("No configuration file");
-            return;
-        }
-        Dictionary<?, ?> properties = context.getProperties();
-        String deviceCfgValue = get(properties, "devConfigs");
-        log.info("Settings: devConfigs={}", deviceCfgValue);
-        if (!isNullOrEmpty(deviceCfgValue)) {
-            addOrRemoveDevicesConfig(deviceCfgValue);
-        }
-    }
-
-    private void addOrRemoveDevicesConfig(String deviceConfig) {
-        for (String deviceEntry : deviceConfig.split(",")) {
-            NetconfDevice device = processDeviceEntry(deviceEntry);
-            if (device != null) {
-                log.info("Device Detail: username: {}, host={}, port={}, state={}",
-                        device.getUsername(), device.getSshHost(),
-                         device.getSshPort(), device.getDeviceState().name());
-                if (device.isActive()) {
-                    deviceBuilder.submit(new DeviceCreator(device, true));
-                } else {
-                    deviceBuilder.submit(new DeviceCreator(device, false));
-                }
-            }
-        }
-    }
-
-    private NetconfDevice processDeviceEntry(String deviceEntry) {
-        if (deviceEntry == null) {
-            log.info("No content for Device Entry, so cannot proceed further.");
-            return null;
-        }
-        log.info("Trying to convert Device Entry String: " + deviceEntry
-                + " to a Netconf Device Object");
-        NetconfDevice 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;
-            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;
-            }
-            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 NetconfDevice(hostIp, hostPort, username, 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;
+    public NetconfDeviceProvider() {
+        super(new ProviderId("netconf", "org.onosproject.netconf.provider.device"));
     }
 
     @Override
     public void triggerProbe(DeviceId deviceId) {
-        // TODO Auto-generated method stub
+        // TODO: This will be implemented later.
+        log.info("Triggering probe on device {}", deviceId);
     }
 
     @Override
     public void roleChanged(DeviceId deviceId, MastershipRole newRole) {
-
+        // TODO: This will be implemented later.
     }
 
     @Override
     public boolean isReachable(DeviceId deviceId) {
-        NetconfDevice netconfDevice = netconfDeviceMap.get(deviceId);
+        Map<DeviceId, NetconfDevice> devices = controller.getDevicesMap();
+
+        NetconfDevice netconfDevice = null;
+        for (DeviceId key : devices.keySet()) {
+            if (key.equals(deviceId)) {
+                netconfDevice = controller.getDevicesMap().get(key);
+            }
+        }
         if (netconfDevice == null) {
             log.warn("BAD REQUEST: the requested device id: "
-                    + deviceId.toString()
-                    + "  is not associated to any NETCONF Device");
+                             + deviceId.toString()
+                             + "  is not associated to any NETCONF Device");
             return false;
         }
-        return netconfDevice.isReachable();
+        return netconfDevice.isActive();
     }
 
-    /**
-     * This class is intended to add or remove Configured Netconf Devices.
-     * Functionality relies on 'createFlag' and 'NetconfDevice' content. The
-     * functionality runs as a thread and dependening on the 'createFlag' value
-     * it will create or remove Device entry from the core.
-     */
-    private class DeviceCreator implements Runnable {
+    private class InnerNetconfDeviceListener implements NetconfDeviceListener {
 
-        private NetconfDevice device;
-        private boolean createFlag;
+        @Override
+        public void deviceAdded(NetconfDeviceInfo nodeId) {
+            Preconditions.checkNotNull(nodeId, ISNOTNULL);
+            DeviceId deviceId = nodeId.getDeviceId();
+            //TODO filter for not netconf devices
+            //Netconf configuration object
+            ChassisId cid = new ChassisId();
+            String ipAddress = nodeId.ip().toString();
+            SparseAnnotations annotations = DefaultAnnotations.builder()
+                    .set("ipaddress", ipAddress).build();
+            DeviceDescription deviceDescription = new DefaultDeviceDescription(
+                    deviceId.uri(),
+                    Device.Type.SWITCH,
+                    UNKNOWN, UNKNOWN,
+                    UNKNOWN, UNKNOWN,
+                    cid,
+                    annotations);
+            providerService.deviceConnected(deviceId, deviceDescription);
 
-        public DeviceCreator(NetconfDevice device, boolean createFlag) {
-            this.device = device;
-            this.createFlag = createFlag;
         }
 
         @Override
-        public void run() {
-            if (createFlag) {
-                log.info("Trying to create Device Info on ONOS core");
-                advertiseDevices();
-            } else {
-                log.info("Trying to remove Device Info on ONOS core");
-                removeDevices();
-            }
-        }
+        public void deviceRemoved(NetconfDeviceInfo nodeId) {
+            Preconditions.checkNotNull(nodeId, ISNOTNULL);
+            DeviceId deviceId = nodeId.getDeviceId();
+            providerService.deviceDisconnected(deviceId);
 
-        /**
-         * For each Netconf Device, remove the entry from the device store.
-         */
-        private void removeDevices() {
-            if (device == null) {
-                log.warn("The Request Netconf Device is null, cannot proceed further");
-                return;
-            }
+        }
+    }
+
+    private void connectExistingDevices() {
+        //TODO consolidate
+        appId = coreService.registerApplication("org.onosproject.netconf");
+        connectDevices();
+    }
+
+    private void connectDevices() {
+        NetconfProviderConfig cfg = cfgService.getConfig(appId, NetconfProviderConfig.class);
+        if (cfg != null) {
+            log.info("cfg {}", cfg);
             try {
-                DeviceId did = getDeviceId();
-                if (!netconfDeviceMap.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();
-                netconfDeviceMap.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);
+                cfg.getDevicesAddresses().stream().forEach(addr -> controller
+                        .connectDevice(new NetconfDeviceInfo(addr.name(),
+                                                             addr.password(),
+                                                             addr.ip(),
+                                                             addr.port())));
+            } catch (ConfigException e) {
+                log.error("Cannot read config error " + e);
             }
         }
+    }
 
-        /**
-         * Initialize Netconf Device object, and notify core saying device
-         * connected.
-         */
-        private void advertiseDevices() {
-            try {
-                if (device == null) {
-                    log.warn("The Request Netconf Device is null, cannot proceed further");
-                    return;
-                }
-                device.init();
-                DeviceId did = getDeviceId();
-                ChassisId cid = new ChassisId();
-                DeviceDescription desc = new DefaultDeviceDescription(
-                                                                      did.uri(),
-                                                                      Device.Type.OTHER,
-                                                                      "", "",
-                                                                      "", "",
-                                                                      cid);
-                log.info("Persisting Device" + did.uri().toString());
+    private class InternalNetworkConfigListener implements NetworkConfigListener {
 
-                netconfDeviceMap.put(did, device);
-                providerService.deviceConnected(did, desc);
-                log.info("Done with Device Info Creation on ONOS core. Device Info: "
-                        + device.deviceInfo() + " " + did.uri().toString());
-                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 (SocketTimeoutException e) {
-                log.error("Error while setting connection for the device: "
-                        + device.deviceInfo(), e);
-            } catch (IOException e) {
-                log.error("Error while setting connection for the device: "
-                        + device.deviceInfo(), e);
-            } catch (Exception e) {
-                log.error("Error while initializing session for the device: "
-                        + (device != null ? device.deviceInfo() : null), e);
-            }
+
+        @Override
+        public void event(NetworkConfigEvent event) {
+            connectDevices();
         }
 
-        /**
-         * This will build a device id for the device.
-         */
-        private DeviceId getDeviceId() throws URISyntaxException {
-            String additionalSSP = new StringBuilder(device.getUsername())
-                    .append("@").append(device.getSshHost()).append(":")
-                    .append(device.getSshPort()).toString();
-            DeviceId did = DeviceId.deviceId(new URI(SCHEME, additionalSSP,
-                                                     null));
-            return did;
+        @Override
+        public boolean isRelevant(NetworkConfigEvent event) {
+            //TODO refactor
+            return event.configClass().equals(NetconfProviderConfig.class) &&
+                    (event.type() == NetworkConfigEvent.Type.CONFIG_ADDED ||
+                            event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED);
         }
     }
 }
diff --git a/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfProviderConfig.java b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfProviderConfig.java
new file mode 100644
index 0000000..7ae116e
--- /dev/null
+++ b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfProviderConfig.java
@@ -0,0 +1,93 @@
+/*
+ * 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.netconf.device.impl;
+
+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 for Netconf provider.
+ */
+@Beta
+public class NetconfProviderConfig 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 = "name";
+    private static final String PASSWORD = "password";
+
+    public Set<NetconfDeviceAddress> getDevicesAddresses() throws ConfigException {
+        Set<NetconfDeviceAddress> devicesAddresses = 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();
+                devicesAddresses.add(new NetconfDeviceAddress(ipAddr, port, name, password));
+
+            }
+        } catch (IllegalArgumentException e) {
+            throw new ConfigException(CONFIG_VALUE_ERROR, e);
+        }
+
+        return devicesAddresses;
+    }
+
+    public class NetconfDeviceAddress {
+        private final IpAddress ip;
+        private final int port;
+        private final String name;
+        private final String password;
+
+        public NetconfDeviceAddress(IpAddress ip, int port, String name, String password) {
+            this.ip = ip;
+            this.port = port;
+            this.name = name;
+            this.password = password;
+        }
+
+        public IpAddress ip() {
+            return ip;
+        }
+
+        public int port() {
+            return port;
+        }
+
+        public String name() {
+            return name;
+        }
+
+        public String password() {
+            return password;
+        }
+    }
+
+
+}
diff --git a/providers/netconf/device/src/test/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProviderTest.java b/providers/netconf/device/src/test/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProviderTest.java
deleted file mode 100644
index e56c595..0000000
--- a/providers/netconf/device/src/test/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProviderTest.java
+++ /dev/null
@@ -1,421 +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.netconf.device.impl;
-
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.junit.Assert.assertFalse;
-import static org.onlab.util.Tools.delay;
-import static org.onosproject.provider.netconf.device.impl.NetconfDeviceProviderTestConstant.*;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Collection;
-import java.util.Dictionary;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.easymock.EasyMock;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.onlab.packet.ChassisId;
-import org.onosproject.cfg.ComponentConfigService;
-import org.onosproject.net.Device;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.MastershipRole;
-import org.onosproject.net.device.DefaultDeviceDescription;
-import org.onosproject.net.device.DeviceDescription;
-import org.onosproject.net.device.DeviceProvider;
-import org.onosproject.net.device.DeviceProviderRegistry;
-import org.onosproject.net.device.DeviceProviderService;
-import org.onosproject.net.device.PortDescription;
-import org.onosproject.net.device.PortStatistics;
-import org.onosproject.net.provider.ProviderId;
-import org.osgi.service.component.ComponentContext;
-import org.slf4j.Logger;
-
-import com.tailf.jnc.JNCException;
-
-/**
- * Test Case to Validate Netconf Device Provider.
- */
-public class NetconfDeviceProviderTest {
-    TestDeviceCreator create;
-
-    private final Logger log = getLogger(NetconfDeviceProviderTest.class);
-
-    private Map<DeviceId, NetconfDevice> netconfDeviceMap = new ConcurrentHashMap<DeviceId, NetconfDevice>();
-
-    private DeviceProviderService providerService;
-
-    private static final DeviceId DID1 = DeviceId.deviceId(DEVICE_ID);
-
-    private final NetconfDeviceProvider provider = new NetconfDeviceProvider();
-    private final TestDeviceRegistry registry = new TestDeviceRegistry();
-
-    private ComponentConfigService mockCfgService;
-
-    @Before
-    public void setUp() {
-        mockCfgService = EasyMock.createMock(ComponentConfigService.class);
-        provider.cfgService = mockCfgService;
-        provider.providerRegistry = registry;
-    }
-
-    @SuppressWarnings("unchecked")
-    private Dictionary<String, String> getDictionaryMockWithoutValues(ComponentContext componentContext) {
-        Dictionary<String, String> dictionary = EasyMock
-                .createMock(Dictionary.class);
-        expect(dictionary.get(DEV_CONFIG)).andReturn(NULL);
-        replay(dictionary);
-        expect(componentContext.getProperties()).andReturn(dictionary);
-        return dictionary;
-    }
-
-    @SuppressWarnings("unchecked")
-    private Dictionary<String, String> getDictionaryMockWithDeviceEntryNull(ComponentContext componentContext) {
-        Dictionary<String, String> dictionary = EasyMock
-                .createMock(Dictionary.class);
-        expect(dictionary.get(DEV_CONFIG)).andReturn(NULL_NULL);
-        replay(dictionary);
-        expect(componentContext.getProperties()).andReturn(dictionary);
-        return dictionary;
-    }
-
-    @SuppressWarnings("unchecked")
-    private Dictionary<String, String> getDictionaryMockDeviceEntryNumberFomatEx(ComponentContext componentContext) {
-        Dictionary<String, String> dictionary = EasyMock
-                .createMock(Dictionary.class);
-        expect(dictionary.get(DEV_CONFIG))
-                .andReturn(CONFIG_WITH_INVALID_ENTRY_NUMBER)
-                .andThrow(new NumberFormatException());
-        replay(dictionary);
-        expect(componentContext.getProperties()).andReturn(dictionary);
-        return dictionary;
-    }
-
-    @SuppressWarnings("unchecked")
-    private Dictionary<String, String> getDictionaryMockWithoutUsernameAndPassword(ComponentContext componentContext) {
-        Dictionary<String, String> dictionary = EasyMock
-                .createMock(Dictionary.class);
-        expect(dictionary.get(DEV_CONFIG)).andReturn(CONFIG_WITH_NULL_ENTRY);
-        replay(dictionary);
-        expect(componentContext.getProperties()).andReturn(dictionary);
-        return dictionary;
-    }
-
-    @SuppressWarnings("unchecked")
-    private Dictionary<String, String> getDictionaryMockWithDifferentDeviceState(ComponentContext componentContext) {
-        Dictionary<String, String> dictionary = EasyMock
-                .createMock(Dictionary.class);
-        expect(dictionary.get(DEV_CONFIG))
-                .andReturn(CONFIG_WITH_DIFFERENT_DEVICE_STATE);
-        replay(dictionary);
-        expect(componentContext.getProperties()).andReturn(dictionary);
-        return dictionary;
-    }
-
-    @SuppressWarnings("unchecked")
-    private Dictionary<String, String> getDictionaryMockDeviceWithArrayOutOFBoundEx(ComponentContext componentContext) {
-        Dictionary<String, String> dictionary = EasyMock
-                .createMock(Dictionary.class);
-        expect(dictionary.get(DEV_CONFIG))
-                .andReturn(CONFIG_WITH_ARRAY_OUT_OF_BOUNDEX)
-                .andThrow(new ArrayIndexOutOfBoundsException());
-        replay(dictionary);
-        expect(componentContext.getProperties()).andReturn(dictionary);
-        return dictionary;
-    }
-
-    @SuppressWarnings("unchecked")
-    private Dictionary<String, String> getDictionaryMockDeviceEntryForDeactivate(ComponentContext componentContext) {
-        Dictionary<String, String> dictionary = EasyMock
-                .createMock(Dictionary.class);
-        expect(dictionary.get(DEV_CONFIG))
-                .andReturn(CONFIG_ENTRY_FOR_DEACTIVATE)
-                .andThrow(new ArrayIndexOutOfBoundsException());
-        replay(dictionary);
-        expect(componentContext.getProperties()).andReturn(dictionary);
-        return dictionary;
-    }
-
-    @Ignore
-    @Test(expected = IOException.class)
-    public void testSSHAuthentication() throws IOException, JNCException {
-        TestDeviceCreator objForTestDev = new TestDeviceCreator(
-                                                                new NetconfDevice(
-                                                                                  DEVICE_IP,
-                                                                                  DEVICE_PORT,
-                                                                                  DEVICE_USERNAME,
-                                                                                  DEVICE_PASSWORD),
-                                                                true);
-        objForTestDev.run();
-    }
-
-    @After
-    public void tearDown() {
-        provider.providerRegistry = null;
-        provider.cfgService = null;
-    }
-
-    // To check if deviceCfgValue is empty or null
-    @Test
-    public void testActiveWithcomponentContextIsNull() {
-
-        ComponentContext componentContext = EasyMock
-                .createMock(ComponentContext.class);
-        getDictionaryMockWithoutValues(componentContext);
-        replay(componentContext);
-        provider.activate(componentContext);
-    }
-
-    // To check deviceEntry and device is null
-    @Test
-    public void testActiveWithDeviceEntryIsNull() {
-
-        ComponentContext componentContext = EasyMock
-                .createMock(ComponentContext.class);
-        getDictionaryMockWithDeviceEntryNull(componentContext);
-        replay(componentContext);
-        provider.activate(componentContext);
-    }
-
-    @Test
-    public void testActiveWithDeviceEntryWithoutUsernameAndPassword() {
-
-        ComponentContext componentContext = EasyMock
-                .createMock(ComponentContext.class);
-        getDictionaryMockWithoutUsernameAndPassword(componentContext);
-        replay(componentContext);
-        provider.activate(componentContext);
-    }
-
-    @Test
-    public void testActiveWithDeviceEntryWithNumberFomatEx() {
-
-        ComponentContext componentContext = EasyMock
-                .createMock(ComponentContext.class);
-        getDictionaryMockDeviceEntryNumberFomatEx(componentContext);
-        replay(componentContext);
-        provider.activate(componentContext);
-    }
-
-    @Test
-    public void testActiveWithDeviceEntryWithDifferentDeviceState() {
-
-        ComponentContext componentContext = EasyMock
-                .createMock(ComponentContext.class);
-        getDictionaryMockWithDifferentDeviceState(componentContext);
-        replay(componentContext);
-        provider.activate(componentContext);
-    }
-
-    @Test
-    public void testActiveWithDeviceEntryWithArrayOutOFBoundEx() {
-
-        ComponentContext componentContext = EasyMock
-                .createMock(ComponentContext.class);
-        getDictionaryMockDeviceWithArrayOutOFBoundEx(componentContext);
-        replay(componentContext);
-        provider.activate(componentContext);
-    }
-
-    @Test
-    public void isReachableWithInvalidDeviceId() {
-        assertFalse("Initially the Device ID Should not be reachable",
-                    provider.isReachable(DID1));
-        NetconfDevice device = new NetconfDevice(NULL, ZERO, NULL, NULL);
-        provider.netconfDeviceMap.put(DID1, device);
-        assertFalse("Particular Device ID cannot be Reachable",
-                    provider.isReachable(DID1));
-    }
-
-    @Test
-    public void testDeactivate() {
-
-        ComponentContext componentContext = EasyMock
-                .createMock(ComponentContext.class);
-        getDictionaryMockDeviceEntryForDeactivate(componentContext);
-        replay(componentContext);
-        testActiveWithDeviceEntryWithDifferentDeviceState();
-        provider.deactivate(componentContext);
-    }
-
-    private class TestDeviceCreator {
-
-        private NetconfDevice device;
-        private boolean createFlag;
-
-        public TestDeviceCreator(NetconfDevice device, boolean createFlag) {
-            this.device = device;
-            this.createFlag = createFlag;
-        }
-
-        public void run() throws JNCException, IOException {
-            if (createFlag) {
-                log.info("Trying to create Device Info on ONOS core");
-                advertiseDevices();
-            } else {
-                log.info("Trying to remove Device Info on ONOS core");
-                removeDevices();
-            }
-        }
-
-        /**
-         * For each Netconf Device, remove the entry from the device store.
-         */
-        private void removeDevices() {
-            if (device == null) {
-                log.warn("The Request Netconf Device is null, cannot proceed further");
-                return;
-            }
-            try {
-                DeviceId did = getDeviceId();
-                if (!netconfDeviceMap.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();
-                netconfDeviceMap.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);
-            }
-        }
-
-        /**
-         * Initialize Netconf Device object, and notify core saying device
-         * connected.
-         */
-        private void advertiseDevices() throws JNCException, IOException {
-            try {
-                if (device == null) {
-                    log.warn("The Request Netconf Device is null, cannot proceed further");
-                    return;
-                }
-                device.init();
-                DeviceId did = getDeviceId();
-                ChassisId cid = new ChassisId();
-                DeviceDescription desc = new DefaultDeviceDescription(
-                                                                      did.uri(),
-                                                                      Device.Type.OTHER,
-                                                                      NULL,
-                                                                      NULL,
-                                                                      NULL,
-                                                                      NULL, cid);
-                log.info("Persisting Device" + did.uri().toString());
-
-                netconfDeviceMap.put(did, device);
-                providerService.deviceConnected(did, desc);
-                log.info("Done with Device Info Creation on ONOS core. Device Info: "
-                        + device.deviceInfo() + " " + did.uri().toString());
-                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 (JNCException e) {
-                throw e;
-            } catch (IOException e) {
-                throw e;
-            } catch (Exception e) {
-                log.error("Error while initializing session for the device: "
-                        + device.deviceInfo(), e);
-            }
-        }
-
-        private DeviceId getDeviceId() throws URISyntaxException {
-            String additionalSSP = new StringBuilder(device.getUsername())
-                    .append(AT_THE_RATE).append(device.getSshHost())
-                    .append(COLON).append(device.getSshPort()).toString();
-            DeviceId did = DeviceId.deviceId(new URI(SCHEME_NETCONF,
-                                                     additionalSSP, null));
-            return did;
-        }
-    }
-
-    private class TestDeviceRegistry implements DeviceProviderRegistry {
-
-        @Override
-        public DeviceProviderService register(DeviceProvider provider) {
-            return new TestProviderService();
-        }
-
-        @Override
-        public void unregister(DeviceProvider provider) {
-        }
-
-        @Override
-        public Set<ProviderId> getProviders() {
-            return null;
-        }
-
-        private class TestProviderService implements DeviceProviderService {
-
-            @Override
-            public DeviceProvider provider() {
-                return null;
-            }
-
-            @Override
-            public void deviceConnected(DeviceId deviceId,
-                                        DeviceDescription deviceDescription) {
-            }
-
-            @Override
-            public void deviceDisconnected(DeviceId deviceId) {
-
-            }
-
-            @Override
-            public void updatePorts(DeviceId deviceId,
-                                    List<PortDescription> portDescriptions) {
-
-            }
-
-            @Override
-            public void portStatusChanged(DeviceId deviceId,
-                                          PortDescription portDescription) {
-
-            }
-
-            @Override
-            public void receivedRoleReply(DeviceId deviceId,
-                                          MastershipRole requested,
-                                          MastershipRole response) {
-
-            }
-
-            @Override
-            public void updatePortStatistics(DeviceId deviceId,
-                                             Collection<PortStatistics> portStatistics) {
-
-            }
-        }
-    }
-}
diff --git a/providers/netconf/device/src/test/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProviderTestConstant.java b/providers/netconf/device/src/test/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProviderTestConstant.java
deleted file mode 100644
index 1d848e2..0000000
--- a/providers/netconf/device/src/test/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProviderTestConstant.java
+++ /dev/null
@@ -1,46 +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.netconf.device.impl;
-
-public final class NetconfDeviceProviderTestConstant {
-
-    private NetconfDeviceProviderTestConstant() {
-    }
-
-    public static final int ZERO = 0;
-    public static final int EVENTINTERVAL = 5;
-    public static final String DEV_CONFIG = "devConfigs";
-    public static final String CONFIG_WITH_INVALID_ENTRY_NUMBER = "cisco:cisco"
-            + "@10.18.11.14:cisco:active";
-    public static final String CONFIG_WITH_NULL_ENTRY = "null:null@null:0:active";
-    public static final String CONFIG_WITH_DIFFERENT_DEVICE_STATE = "cisco:cisco@10.18.11.14:22:active,"
-            + "cisco:cisco@10.18.11.18:22:inactive,cisco:cisco@10.18.11.14:22:invalid,"
-            + "cisco:cisco@10.18.11.14:22:null";
-    public static final String CONFIG_WITH_ARRAY_OUT_OF_BOUNDEX = "@10.18.11.14:22:active";
-    public static final String CONFIG_ENTRY_FOR_DEACTIVATE = "netconf:cisco"
-            + "@10.18.11.14:22:active";
-    public static final String DEVICE_IP = "10.18.14.19";
-    public static final int DEVICE_PORT = 22;
-    public static final String DEVICE_USERNAME = "cisco";
-    public static final String DEVICE_PASSWORD = "cisco";
-    public static final String AT_THE_RATE = "@";
-    public static final String COLON = ":";
-    public static final String NULL = "";
-    public static final String NULL_NULL = "null,null";
-    public static final String SCHEME_NETCONF = "netconf";
-    public static final String DEVICE_ID = "of:0000000000000001";
-
-}
