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
new file mode 100644
index 0000000..c1208fb
--- /dev/null
+++ b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDevice.java
@@ -0,0 +1,312 @@
+/*
+ * 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 static 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 In Active state of the device */
+        INACTIVE,
+        /* Used to specify In Valid state of the device */
+        INVALID
+    }
+
+    private static final int DEFAULT_SSH_PORT = 22;
+    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 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.
+     */
+    public void init() throws Exception {
+        try {
+            if (sshConnection == null) {
+                sshConnection = new SSHConnection(sshHost, sshPort);
+                sshConnection.authenticateWithPassword(username, password);
+            }
+            // Send hello message to retrieve capabilities.
+        } catch (IOException e) {
+            NetconfDevice.log
+                    .error("Fatal Error while creating connection to the device: "
+                                   + deviceInfo(), e);
+            throw e;
+        } catch (JNCException e) {
+            NetconfDevice.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();
+
+            if (NetconfDevice.log.isDebugEnabled()) {
+                NetconfDevice.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) {
+                    NetconfDevice.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();
+
+                    if (NetconfDevice.log.isDebugEnabled()) {
+                        NetconfDevice.log
+                                .debug("++++++++++++++++++++++++++++++++++Reading Capabilities: "
+                                        + sshConnection.getGanymedConnection()
+                                                .getHostname()
+                                        + "++++++++++++++++++++++++++++++++++");
+
+                        printPrettyXML(xmlResponse);
+                    }
+                    processCapabilities(xmlResponse);
+                }
+            }
+            reachable = true;
+        } catch (IOException e) {
+            NetconfDevice.log
+                    .error("Fatal Error while sending Hello Message to the device: "
+                                   + deviceInfo(), e);
+        } catch (JNCException e) {
+            NetconfDevice.log
+                    .error("Fatal Error while sending Hello Message to the device: "
+                                   + deviceInfo(), e);
+        } finally {
+            if (NetconfDevice.log.isDebugEnabled()) {
+                NetconfDevice.log
+                        .debug("Closing the session after successful execution");
+            }
+            ssh.close();
+        }
+    }
+
+    private void processCapabilities(String xmlResponse) throws JNCException {
+        if (xmlResponse.isEmpty()) {
+            NetconfDevice.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) {
+            NetconfDevice.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);
+            if (NetconfDevice.log.isDebugEnabled()) {
+                NetconfDevice.log.debug(outputString);
+            }
+        } catch (Exception e) {
+            NetconfDevice.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;
+    }
+}
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
new file mode 100644
index 0000000..0b2dcc3
--- /dev/null
+++ b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
@@ -0,0 +1,370 @@
+/*
+ * 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.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.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 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.cluster.ClusterService;
+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.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.slf4j.Logger;
+
+/**
+ * Provider which will try to fetch the details of NETCONF devices from the core
+ * and run a capability discovery on each of the device.
+ */
+@Component(immediate = true)
+public class NetconfDeviceProvider extends AbstractProvider
+        implements DeviceProvider {
+
+    private static final Logger log = getLogger(NetconfDeviceProvider.class);
+
+    private Map<DeviceId, NetconfDevice> netconfDeviceMap = new ConcurrentHashMap<DeviceId, NetconfDevice>();
+
+    private DeviceProviderService providerService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected DeviceProviderRegistry providerRegistry;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected DeviceService deviceService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected ClusterService clusterService;
+
+    private ExecutorService deviceBuilder = Executors
+            .newFixedThreadPool(1,
+                                groupedThreads("onos/netconf", "device-creator"));
+
+    // Delay between events in ms.
+    private static final int EVENTINTERVAL = 5;
+
+    private static final String SCHEME = "netconf";
+
+    @Property(name = "devConfigs", value = "", label = "Instance-specific configurations")
+    private String devConfigs = null;
+
+    @Property(name = "devPasswords", value = "", label = "Instace-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) {
+        NetconfDeviceProvider.log.info("Netconf Device Provider Started");
+        providerService = providerRegistry.register(this);
+        modified(context);
+    }
+
+    @Deactivate
+    public void deactivate(ComponentContext context) {
+        try {
+            for (Entry<DeviceId, NetconfDevice> deviceEntry : netconfDeviceMap
+                    .entrySet()) {
+                deviceBuilder.submit(new DeviceCreator(deviceEntry.getValue(),
+                                                       false));
+            }
+            deviceBuilder.awaitTermination(1000, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException e) {
+            NetconfDeviceProvider.log.error("Device builder did not terminate");
+        }
+        deviceBuilder.shutdownNow();
+        netconfDeviceMap.clear();
+        providerRegistry.unregister(this);
+        providerService = null;
+        NetconfDeviceProvider.log.info("Stopped");
+    }
+
+    @Modified
+    public void modified(ComponentContext context) {
+        if (context == null) {
+            NetconfDeviceProvider.log.info("No configuration file");
+            return;
+        }
+        Dictionary<?, ?> properties = context.getProperties();
+        String deviceCfgValue = get(properties, "devConfigs");
+        NetconfDeviceProvider.log
+                .info("Getting Device configuration from cfg file: "
+                        + deviceCfgValue);
+        if (!isNullOrEmpty(deviceCfgValue)) {
+            addOrRemoveDevicesConfig(deviceCfgValue);
+        } else {
+            NetconfDeviceProvider.log
+                    .info("Device Configuration value receiviced from the property 'devConfigs': "
+                            + deviceCfgValue + ", is not valid");
+        }
+    }
+
+    private void addOrRemoveDevicesConfig(String deviceConfig) {
+        for (String deviceEntry : deviceConfig.split(",")) {
+            NetconfDevice device = processDeviceEntry(deviceEntry);
+            if (device != null) {
+                NetconfDeviceProvider.log.info("Device Detail: " + "username: "
+                        + device.getUsername() + ", host: "
+                        + device.getSshHost() + ", port: "
+                        + device.getSshPort());
+                if (device.isActive()) {
+                    deviceBuilder.submit(new DeviceCreator(device, true));
+                } else {
+                    deviceBuilder.submit(new DeviceCreator(device, false));
+                }
+            }
+        }
+    }
+
+    private NetconfDevice processDeviceEntry(String deviceEntry) {
+        if (deviceEntry == null) {
+            NetconfDeviceProvider.log
+                    .info("No content for Device Entry, so cannot proceed further.");
+            return null;
+        }
+        NetconfDeviceProvider.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) {
+                NetconfDeviceProvider.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) {
+                NetconfDeviceProvider.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.ACTIVE);
+                    } else {
+                        NetconfDeviceProvider.log
+                                .warn("Device State Information can not be empty, so marking the state as INVALID");
+                        device.setDeviceState(DeviceState.INVALID);
+                    }
+                } else {
+                    NetconfDeviceProvider.log
+                            .warn("The device entry do not specify state information, so marking the state as INVALID");
+                    device.setDeviceState(DeviceState.INVALID);
+                }
+            }
+        } catch (ArrayIndexOutOfBoundsException aie) {
+            NetconfDeviceProvider.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) {
+            NetconfDeviceProvider.log
+                    .error("Error while parsing config information for the device entry: "
+                                   + deviceEntry, e);
+        }
+        return device;
+    }
+
+    @Override
+    public void triggerProbe(DeviceId deviceId) {
+        // TODO Auto-generated method stub
+    }
+
+    @Override
+    public void roleChanged(DeviceId deviceId, MastershipRole newRole) {
+
+    }
+
+    @Override
+    public boolean isReachable(DeviceId deviceId) {
+        NetconfDevice netconfDevice = netconfDeviceMap.get(deviceId);
+        if (netconfDevice == null) {
+            NetconfDeviceProvider.log
+                    .warn("BAD REQUEST: the requested device id: "
+                            + deviceId.toString()
+                            + "  is not associated to any NETCONF Device");
+            return false;
+        }
+        return netconfDevice.isReachable();
+    }
+
+    /**
+     * 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 NetconfDevice device;
+        private boolean createFlag;
+
+        public DeviceCreator(NetconfDevice device, boolean createFlag) {
+            this.device = device;
+            this.createFlag = createFlag;
+        }
+
+        @Override
+        public void run() {
+            if (createFlag && (device.getDeviceState() == DeviceState.ACTIVE)) {
+                NetconfDeviceProvider.log
+                        .info("Trying to create Device Info on ONOS core");
+                advertiseDevices();
+            } else {
+                NetconfDeviceProvider.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.isReachable()) {
+                log.error("BAD Request: 'Currently device is not discovered, so cannot remove/disconnect the device: "
+                        + device.deviceInfo() + "'");
+                return;
+            }
+            try {
+                DeviceId did = getDeviceId();
+                providerService.deviceDisconnected(did);
+                device.disconnect();
+                delay(EVENTINTERVAL);
+            } catch (URISyntaxException uriSyntaxExcpetion) {
+                NetconfDeviceProvider.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() {
+            try {
+                if (device == null) {
+                    NetconfDeviceProvider.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);
+                if (NetconfDeviceProvider.log.isDebugEnabled()) {
+                    NetconfDeviceProvider.log.debug("Persisting Device"
+                            + did.uri().toString());
+                }
+
+                netconfDeviceMap.put(did, device);
+                providerService.deviceConnected(did, desc);
+                if (NetconfDeviceProvider.log.isDebugEnabled()) {
+                    NetconfDeviceProvider.log
+                            .debug("Done with Device Info Creation on ONOS core. Device Info: "
+                                    + device.deviceInfo()
+                                    + " "
+                                    + did.uri().toString());
+                }
+                delay(EVENTINTERVAL);
+            } catch (URISyntaxException e) {
+                NetconfDeviceProvider.log
+                        .error("Syntax Error while creating URI for the device: "
+                                       + device.deviceInfo()
+                                       + " couldn't persist the device onto the store",
+                               e);
+            } catch (Exception e) {
+                NetconfDeviceProvider.log
+                        .error("Error while initializing session for the device: "
+                                       + device.deviceInfo(), e);
+            }
+        }
+
+        /**
+         * 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;
+        }
+    }
+}
diff --git a/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/package-info.java b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/package-info.java
new file mode 100644
index 0000000..583aeaa
--- /dev/null
+++ b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+/**
+ * Provider that uses Netconf capability request as a means of infrastructure device discovery.
+ */
+package org.onosproject.provider.netconf.device.impl;
\ No newline at end of file
