diff --git a/netconf/api/src/main/java/org/onosproject/netconf/Foo.java b/netconf/api/src/main/java/org/onosproject/netconf/Foo.java
deleted file mode 100644
index ff688f4..0000000
--- a/netconf/api/src/main/java/org/onosproject/netconf/Foo.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.onosproject.netconf;
-
-/**
- * Created by tom on 10/19/15.
- */
-public class Foo {
-}
diff --git a/netconf/api/src/main/java/org/onosproject/netconf/NetconfController.java b/netconf/api/src/main/java/org/onosproject/netconf/NetconfController.java
new file mode 100644
index 0000000..6411c01
--- /dev/null
+++ b/netconf/api/src/main/java/org/onosproject/netconf/NetconfController.java
@@ -0,0 +1,84 @@
+/*
+ * 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.netconf;
+
+import org.onlab.packet.IpAddress;
+import org.onosproject.net.DeviceId;
+
+import java.util.Map;
+
+/**
+ * Abstraction of an NETCONF controller. Serves as a one stop shop for obtaining
+ * NetconfDevice and (un)register listeners on NETCONF device events.
+ */
+public interface NetconfController {
+
+    /**
+     * Adds Device Event Listener.
+     *
+     * @param listener node listener
+     */
+    void addDeviceListener(NetconfDeviceListener listener);
+
+    /**
+     * Removes Device Listener.
+     *
+     * @param listener node listener
+     */
+    void removeDeviceListener(NetconfDeviceListener listener);
+
+    /**
+     * Tries to connect to a specific NETCONF device, if the connection is succesful
+     * it creates and adds the device to the ONOS core as a NetconfDevice.
+     *
+     * @param deviceInfo info about the device to add
+     * @return NetconfDevice Netconf device
+     */
+    NetconfDevice connectDevice(NetconfDeviceInfo deviceInfo);
+
+    /**
+     * Removes a Netconf device.
+     *
+     * @param deviceInfo info about the device to remove
+     */
+    void removeDevice(NetconfDeviceInfo deviceInfo);
+
+    /**
+     * Gets all the nodes information.
+     *
+     * @return map of devices
+     */
+    Map<DeviceId, NetconfDevice> getDevicesMap();
+
+    /**
+     * Gets a Netconf Device by node identifier.
+     *
+     * @param deviceInfo node identifier
+     * @return NetconfDevice Netconf device
+     */
+    NetconfDevice getNetconfDevice(DeviceId deviceInfo);
+
+    /**
+     * Gets a Netconf Device by node identifier.
+     *
+     * @param ip   device ip
+     * @param port device port
+     * @return NetconfDevice Netconf device
+     */
+    NetconfDevice getNetconfDevice(IpAddress ip, int port);
+
+}
diff --git a/netconf/api/src/main/java/org/onosproject/netconf/NetconfDevice.java b/netconf/api/src/main/java/org/onosproject/netconf/NetconfDevice.java
new file mode 100644
index 0000000..1974782
--- /dev/null
+++ b/netconf/api/src/main/java/org/onosproject/netconf/NetconfDevice.java
@@ -0,0 +1,51 @@
+/*
+ * 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.netconf;
+
+/**
+ * Interface representing a NETCONF device.
+ */
+public interface NetconfDevice {
+
+
+    /**
+     * Returns whether a device is a NETCONF device with a capabilities list
+     * and is accessible.
+     *
+     * @return true if device is accessible, false otherwise
+     */
+    boolean isActive();
+
+    /**
+     * Returns a NETCONF session context for this device.
+     *
+     * @return netconf session
+     */
+    NetconfSession getSession();
+
+    /**
+     * Ensures that all sessions are closed.
+     * A device cannot be used after disconnect is called.
+     */
+    void disconnect();
+
+    /**
+     * return all the info associated with this device.
+     * @return NetconfDeviceInfo
+     */
+    NetconfDeviceInfo getDeviceInfo();
+}
\ No newline at end of file
diff --git a/netconf/api/src/main/java/org/onosproject/netconf/NetconfDeviceInfo.java b/netconf/api/src/main/java/org/onosproject/netconf/NetconfDeviceInfo.java
new file mode 100644
index 0000000..cb0e240
--- /dev/null
+++ b/netconf/api/src/main/java/org/onosproject/netconf/NetconfDeviceInfo.java
@@ -0,0 +1,173 @@
+/*
+ * 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.netconf;
+
+import com.google.common.base.Preconditions;
+import org.onlab.packet.IpAddress;
+import org.onosproject.net.DeviceId;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Objects;
+
+/**
+ * Represents a Netconf device information.
+ */
+public class NetconfDeviceInfo {
+
+    public static final Logger log = LoggerFactory
+            .getLogger(NetconfDeviceInfo.class);
+
+    private String name;
+    private String password;
+    private IpAddress ipAddress;
+    private int port;
+    private File keyFile;
+
+
+    /**
+     * Information for contacting the controller.
+     *
+     * @param name      the connection type
+     * @param password  the password for the device
+     * @param ipAddress the ip address
+     * @param port      the tcp port
+     */
+    public NetconfDeviceInfo(String name, String password, IpAddress ipAddress,
+                             int port) {
+        Preconditions.checkArgument(!name.equals(""), "Empty device name");
+        Preconditions.checkNotNull(port > 0, "Negative port");
+        Preconditions.checkNotNull(ipAddress, "Null ip address");
+        this.name = name;
+        this.password = password;
+        this.ipAddress = ipAddress;
+        this.port = port;
+    }
+
+    /**
+     * Information for contacting the controller.
+     *
+     * @param name      the connection type
+     * @param password  the password for the device
+     * @param ipAddress the ip address
+     * @param port      the tcp port
+     * @param keyString the string cointaing the key.
+     */
+    public NetconfDeviceInfo(String name, String password, IpAddress ipAddress,
+                             int port, String keyString) {
+        Preconditions.checkArgument(!name.equals(""), "Empty device name");
+        Preconditions.checkNotNull(port > 0, "Negative port");
+        Preconditions.checkNotNull(ipAddress, "Null ip address");
+        this.name = name;
+        this.password = password;
+        this.ipAddress = ipAddress;
+        this.port = port;
+        this.keyFile = new File(keyString);
+    }
+
+    /**
+     * Exposes the name of the controller.
+     *
+     * @return String name
+     */
+    public String name() {
+        return name;
+    }
+
+    /**
+     * Exposes the password of the controller.
+     *
+     * @return String password
+     */
+    public String password() {
+        return password;
+    }
+
+    /**
+     * Exposes the ip address of the controller.
+     *
+     * @return IpAddress ip address
+     */
+    public IpAddress ip() {
+        return ipAddress;
+    }
+
+    /**
+     * Exposes the port of the controller.
+     *
+     * @return int port address
+     */
+    public int port() {
+        return port;
+    }
+
+    /**
+     * Exposes the keyFile of the controller.
+     *
+     * @return int port address
+     */
+    public File getKeyFile() {
+        return keyFile;
+    }
+
+    /**
+     * Return the info about the device in a string.
+     * String format: "netconf:name@ip:port"
+     *
+     * @return String device info
+     */
+    public String toString() {
+        return "netconf:" + name + "@" + ipAddress + ":" + port;
+    }
+
+    /**
+     * Return the DeviceId about the device containing the URI.
+     *
+     * @return DeviceId
+     */
+    public DeviceId getDeviceId() {
+
+        try {
+            return DeviceId.deviceId(new URI(this.toString()));
+        } catch (URISyntaxException e) {
+            log.debug("Unable to build deviceID for device {} ", this, e);
+        }
+        return null;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(ipAddress, port, name);
+    }
+
+    @Override
+    public boolean equals(Object toBeCompared) {
+        if (toBeCompared instanceof NetconfDeviceInfo) {
+            NetconfDeviceInfo netconfDeviceInfo = (NetconfDeviceInfo) toBeCompared;
+            if (netconfDeviceInfo.name().equals(name)
+                    && netconfDeviceInfo.ip().equals(ipAddress)
+                    && netconfDeviceInfo.port() == port
+                    && netconfDeviceInfo.password().equals(password)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/netconf/api/src/main/java/org/onosproject/netconf/NetconfDeviceListener.java b/netconf/api/src/main/java/org/onosproject/netconf/NetconfDeviceListener.java
new file mode 100644
index 0000000..9c46d4f
--- /dev/null
+++ b/netconf/api/src/main/java/org/onosproject/netconf/NetconfDeviceListener.java
@@ -0,0 +1,37 @@
+/*
+ * 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.netconf;
+
+/**
+ * Allows for providers interested in node events to be notified.
+ */
+public interface NetconfDeviceListener {
+
+    /**
+     * Notifies that the node was added.
+     *
+     * @param nodeId the node where the event occurred
+     */
+    void deviceAdded(NetconfDeviceInfo nodeId);
+
+    /**
+     * Notifies that the node was removed.
+     *
+     * @param nodeId the node where the event occurred
+     */
+    void deviceRemoved(NetconfDeviceInfo nodeId);
+}
diff --git a/netconf/api/src/main/java/org/onosproject/netconf/NetconfSession.java b/netconf/api/src/main/java/org/onosproject/netconf/NetconfSession.java
new file mode 100644
index 0000000..73c435f
--- /dev/null
+++ b/netconf/api/src/main/java/org/onosproject/netconf/NetconfSession.java
@@ -0,0 +1,129 @@
+/*
+ * 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.netconf;
+
+import java.util.List;
+
+/**
+ * NETCONF session object that allows NETCONF operations on top with the physical
+ * device on top of an SSH connection.
+ */
+// TODO change return type of methdos to <Capability, XMLdoc, string or yang obj>
+public interface NetconfSession {
+
+    /**
+     * Retrives the requested configuration, different from get-config.
+     * @param request the XML containing the request to the server.
+     * @return device running configuration
+     */
+    String get(String request);
+
+    /**
+     * Executes an RPC to the server.
+     * @param request the XML containing the RPC for the server.
+     * @return Server response or ERROR
+     */
+    String doRPC(String request);
+
+    /**
+     * Retrives the specified configuration.
+     *
+     * @param targetConfiguration the type of configuration to retrieve.
+     * @return specified configuration.
+     */
+    String getConfig(String targetConfiguration);
+
+    /**
+     * Retrives part of the specivied configuration based on the filterSchema.
+     *
+     * @param targetConfiguration       the type of configuration to retrieve.
+     * @param configurationFilterSchema XML schema to filter the configuration
+     *                                  elements we are interested in
+     * @return device running configuration.
+     */
+    String getConfig(String targetConfiguration, String configurationFilterSchema);
+
+    /**
+     * Retrives part of the specified configuration based on the filterSchema.
+     *
+     * @param newConfiguration configuration to set
+     * @return true if the configuration was edited correctly
+     */
+
+    boolean editConfig(String newConfiguration);
+
+    /**
+     * Copies the new configuration, an Url or a complete configuration xml tree
+     * to the target configuration.
+     * The target configuration can't be the running one
+     *
+     * @param targetConfiguration the type of configuration to retrieve.
+     * @param newConfiguration    configuration to set
+     * @return true if the configuration was copied correctly
+     */
+    boolean copyConfig(String targetConfiguration, String newConfiguration);
+
+    /**
+     * Deletes part of the specified configuration based on the filterSchema.
+     *
+     * @param targetConfiguration the name of the configuration to delete
+     * @return true if the configuration was copied correctly
+     */
+    boolean deleteConfig(String targetConfiguration);
+
+    /**
+     * Locks the candidate configuration.
+     *
+     * @return true if successful.
+     */
+    boolean lock();
+
+    /**
+     * Unlocks the candidate configuration.
+     *
+     * @return true if successful.
+     */
+    boolean unlock();
+
+    /**
+     * Closes the Netconf session with the device.
+     * the first time it tries gracefully, then kills it forcefully
+     * @return true if closed
+     */
+    boolean close();
+
+    /**
+     * Gets the session ID of the Netconf session.
+     *
+     * @return Session ID as a string.
+     */
+    String getSessionId();
+
+    /**
+     * Gets the capabilities of the Netconf server associated to this session.
+     *
+     * @return Network capabilities as a string.
+     */
+    String getServerCapabilities();
+
+    /**
+     * Sets the device capabilities.
+     * @param capabilities list of capabilities the device has.
+     */
+    void setDeviceCapabilities(List<String> capabilities);
+
+}
