diff --git a/drivers/src/main/java/org/onosproject/driver/netconf/NetconfControllerConfig.java b/drivers/src/main/java/org/onosproject/driver/netconf/NetconfControllerConfig.java
new file mode 100644
index 0000000..84043b5
--- /dev/null
+++ b/drivers/src/main/java/org/onosproject/driver/netconf/NetconfControllerConfig.java
@@ -0,0 +1,89 @@
+/*
+ * 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.driver.netconf;
+
+import com.google.common.base.Preconditions;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.behaviour.ControllerConfig;
+import org.onosproject.net.behaviour.ControllerInfo;
+import org.onosproject.net.driver.AbstractHandlerBehaviour;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.netconf.NetconfController;
+import org.onosproject.netconf.NetconfDevice;
+import org.slf4j.Logger;
+
+import java.io.ByteArrayInputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Implementation of controller config which allows to get and set controllers
+ * through the Netconf protocol.
+ */
+public class NetconfControllerConfig extends AbstractHandlerBehaviour
+        implements ControllerConfig {
+
+    private final Logger log = getLogger(NetconfControllerConfig.class);
+
+    @Override
+    public List<ControllerInfo> getControllers() {
+        DriverHandler handler = handler();
+        NetconfController controller = handler.get(NetconfController.class);
+        DeviceId ofDeviceId = handler.data().deviceId();
+        Preconditions.checkNotNull(controller, "Netconf controller is null");
+        List<ControllerInfo> controllers = new ArrayList<>();
+        controllers.addAll(XmlConfigParser.parseStreamControllers(XmlConfigParser.
+                loadXml(new ByteArrayInputStream(controller.
+                        getDevicesMap().get(ofDeviceId).getSession().
+                        getConfig("running").getBytes(StandardCharsets.UTF_8)))));
+        return controllers;
+    }
+
+    @Override
+    public void setControllers(List<ControllerInfo> controllers) {
+        DriverHandler handler = handler();
+        NetconfController controller = handler.get(NetconfController.class);
+        DeviceId deviceId = handler.data().deviceId();
+        Preconditions.checkNotNull(controller, "Netconf controller is null");
+        try {
+            NetconfDevice device = controller.getNetconfDevice(deviceId);
+            log.warn("provider map {}", controller.getDevicesMap());
+            String config = XmlConfigParser.createControllersConfig(
+                    XmlConfigParser.loadXml(getClass().getResourceAsStream("controllers.xml")),
+                    XmlConfigParser.loadXml(
+                            new ByteArrayInputStream(device.getSession()
+                                                             .getConfig("running")
+                                                             .getBytes(
+                                                                     StandardCharsets.UTF_8))),
+                    "running", "merge", "create", controllers
+            );
+            device.getSession().editConfig(config.substring(config.indexOf("-->") + 3));
+        } catch (NullPointerException e) {
+            log.warn("No NETCONF device with requested parameters " + e);
+            throw new NullPointerException("No NETCONF device with requested parameters " + e);
+        }
+
+    }
+
+    //TODO maybe put method getNetconfClientService like in ovsdb if we need it
+
+}
+
+
diff --git a/drivers/src/main/java/org/onosproject/driver/netconf/XmlConfigParser.java b/drivers/src/main/java/org/onosproject/driver/netconf/XmlConfigParser.java
new file mode 100644
index 0000000..55826a2
--- /dev/null
+++ b/drivers/src/main/java/org/onosproject/driver/netconf/XmlConfigParser.java
@@ -0,0 +1,126 @@
+/*
+ * 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.driver.netconf;
+
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.commons.configuration.XMLConfiguration;
+import org.apache.commons.configuration.tree.ConfigurationNode;
+import org.onlab.packet.IpAddress;
+import org.onosproject.net.behaviour.ControllerInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Parser for Netconf XML configurations and replys.
+ */
+final class XmlConfigParser {
+    public static final Logger log = LoggerFactory
+            .getLogger(XmlConfigParser.class);
+
+    private XmlConfigParser() {
+        //not called, preventing any allocation
+    }
+
+
+    protected static HierarchicalConfiguration loadXml(InputStream xmlStream) {
+        XMLConfiguration cfg = new XMLConfiguration();
+        try {
+            cfg.load(xmlStream);
+            return cfg;
+        } catch (ConfigurationException e) {
+            throw new IllegalArgumentException("Cannot load xml from Stream", e);
+        }
+    }
+
+    protected static List<ControllerInfo> parseStreamControllers(HierarchicalConfiguration cfg) {
+        List<ControllerInfo> controllers = new ArrayList<>();
+        List<HierarchicalConfiguration> fields =
+                cfg.configurationsAt("data.capable-switch." +
+                                             "logical-switches." +
+                                             "switch.controllers.controller");
+        for (HierarchicalConfiguration sub : fields) {
+            controllers.add(new ControllerInfo(
+                    IpAddress.valueOf(sub.getString("ip-address")),
+                    Integer.parseInt(sub.getString("port")),
+                    sub.getString("protocol")));
+        }
+        return controllers;
+    }
+
+    protected static String parseSwitchId(HierarchicalConfiguration cfg) {
+        HierarchicalConfiguration field =
+                cfg.configurationAt("data.capable-switch." +
+                                            "logical-switches." +
+                                            "switch");
+        return field.getProperty("id").toString();
+    }
+
+    protected static String parseCapableSwitchId(HierarchicalConfiguration cfg) {
+        HierarchicalConfiguration field =
+                cfg.configurationAt("data.capable-switch");
+        return field.getProperty("id").toString();
+    }
+
+    protected static String createControllersConfig(HierarchicalConfiguration cfg,
+                                                    HierarchicalConfiguration actualCfg,
+                                                    String target, String netconfOperation,
+                                                    String controllerOperation,
+                                                    List<ControllerInfo> controllers) {
+        //cfg.getKeys().forEachRemaining(key -> System.out.println(key));
+        cfg.setProperty("edit-config.target", target);
+        cfg.setProperty("edit-config.default-operation", netconfOperation);
+        cfg.setProperty("edit-config.config.capable-switch.id",
+                        parseCapableSwitchId(actualCfg));
+        cfg.setProperty("edit-config.config.capable-switch." +
+                                "logical-switches.switch.id", parseSwitchId(actualCfg));
+        List<ConfigurationNode> newControllers = new ArrayList<>();
+        for (ControllerInfo ci : controllers) {
+            XMLConfiguration controller = new XMLConfiguration();
+            controller.setRoot(new HierarchicalConfiguration.Node("controller"));
+            String id = ci.type() + ":" + ci.ip() + ":" + ci.port();
+            controller.setProperty("id", id);
+            controller.setProperty("ip-address", ci.ip());
+            controller.setProperty("port", ci.port());
+            controller.setProperty("protocol", ci.type());
+            newControllers.add(controller.getRootNode());
+        }
+        cfg.addNodes("edit-config.config.capable-switch.logical-switches." +
+                             "switch.controllers", newControllers);
+        XMLConfiguration editcfg = (XMLConfiguration) cfg;
+        StringWriter stringWriter = new StringWriter();
+        try {
+            editcfg.save(stringWriter);
+        } catch (ConfigurationException e) {
+            e.printStackTrace();
+        }
+        String s = stringWriter.toString()
+                .replaceAll("<controller>",
+                            "<controller nc:operation=\"" + controllerOperation + "\">");
+        s = s.replace("<target>" + target + "</target>",
+                      "<target><" + target + "/></target>");
+        return s;
+
+    }
+
+    //TODO implement mor methods for parsing configuration when you need them
+}
diff --git a/drivers/src/main/java/org/onosproject/driver/netconf/package-info.java b/drivers/src/main/java/org/onosproject/driver/netconf/package-info.java
new file mode 100644
index 0000000..200312b
--- /dev/null
+++ b/drivers/src/main/java/org/onosproject/driver/netconf/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.
+ */
+
+/**
+ * Implementations of the Netconf driver behaviours.
+ */
+package org.onosproject.driver.netconf;
\ No newline at end of file
diff --git a/drivers/src/main/resources/onos-drivers.xml b/drivers/src/main/resources/onos-drivers.xml
index 5d5d2aa..9810781 100644
--- a/drivers/src/main/resources/onos-drivers.xml
+++ b/drivers/src/main/resources/onos-drivers.xml
@@ -37,6 +37,13 @@
         <behaviour api="org.onosproject.net.behaviour.ExtensionResolver"
                    impl="org.onosproject.driver.extensions.NiciraExtensionInterpreter" />
     </driver>
+    <driver name="ovs-netconf" extends="default"
+            manufacturer="Nicira, Inc\." hwVersion="Open vSwitch" swVersion="2\..*">
+        <behaviour api="org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver"
+                   impl="org.onosproject.driver.handshaker.NiciraSwitchHandshaker"/>
+        <behaviour api="org.onosproject.net.behaviour.ControllerConfig"
+                   impl="org.onosproject.driver.netconf.NetconfControllerConfig"/>
+    </driver>
     <driver name="ovs-corsa" extends="ovs"
             manufacturer="Corsa" hwVersion="emulation" swVersion="0.0.0">
         <behaviour api="org.onosproject.net.behaviour.Pipeliner"
diff --git a/drivers/src/main/resources/org/onosproject/driver/netconf/controllers.xml b/drivers/src/main/resources/org/onosproject/driver/netconf/controllers.xml
new file mode 100644
index 0000000..21e4dd1
--- /dev/null
+++ b/drivers/src/main/resources/org/onosproject/driver/netconf/controllers.xml
@@ -0,0 +1,36 @@
+<!--
+  ~ 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.
+  -->
+
+<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+    <edit-config>
+        <target>
+        </target>
+        <default-operation>
+        </default-operation>
+        <config>
+            <capable-switch xmlns="urn:onf:config:yang">
+                <id></id>
+                <logical-switches>
+                    <switch>
+                        <id></id>
+                        <controllers>
+                        </controllers>
+                    </switch>
+                </logical-switches>
+            </capable-switch>
+        </config>
+    </edit-config>
+</rpc>
\ No newline at end of file
diff --git a/drivers/src/test/java/org/onosproject/driver/netconf/XmlConfigParserTest.java b/drivers/src/test/java/org/onosproject/driver/netconf/XmlConfigParserTest.java
new file mode 100644
index 0000000..d8b695c
--- /dev/null
+++ b/drivers/src/test/java/org/onosproject/driver/netconf/XmlConfigParserTest.java
@@ -0,0 +1,80 @@
+/*
+ * 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.driver.netconf;
+
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onosproject.net.behaviour.ControllerInfo;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.assertTrue;
+import static org.onosproject.driver.netconf.XmlConfigParser.*;
+
+//import static org.junit.Assert.*;
+
+/**
+ * Test the XML document Parsing for netconf configuration.
+ */
+public class XmlConfigParserTest {
+
+
+    @Test
+    public void basics() throws IOException {
+        InputStream stream = getClass().getResourceAsStream("testConfig.xml");
+        List<ControllerInfo> controllers = parseStreamControllers(loadXml(stream));
+        assertTrue(controllers.get(0).equals(new ControllerInfo(
+                IpAddress.valueOf("10.128.12.1"), 6653, "tcp")));
+        assertTrue(controllers.get(1).equals(new ControllerInfo(
+                IpAddress.valueOf("10.128.12.2"), 6654, "tcp")));
+
+    }
+
+    @Test
+    public void switchId() {
+        InputStream stream = getClass().getResourceAsStream("testConfig.xml");
+        String switchId = parseSwitchId(loadXml(stream));
+        assertTrue(switchId.equals("ofc-bridge"));
+    }
+
+    @Test
+    public void capableSwitchId() {
+        InputStream stream = getClass().getResourceAsStream("testConfig.xml");
+        String capableSwitchId = parseCapableSwitchId(loadXml(stream));
+        assertTrue(capableSwitchId.equals("openvswitch"));
+    }
+
+    @Test
+    public void controllersConfig() {
+        InputStream streamOrig = getClass().getResourceAsStream("testConfig.xml");
+        InputStream streamCFG = XmlConfigParser.class
+                .getResourceAsStream("controllers.xml");
+        String config = createControllersConfig(loadXml(streamCFG),
+                                                loadXml(streamOrig), "running", "merge",
+                                                "create", new ArrayList<>(Arrays.asList(
+                        new ControllerInfo(IpAddress.valueOf("192.168.1.1"),
+                                           5000, "tcp"))));
+        assertTrue(config.contains("192.168.1.1"));
+        assertTrue(config.contains("tcp"));
+        assertTrue(config.contains("5000"));
+
+    }
+}
\ No newline at end of file
diff --git a/drivers/src/test/resources/org/onosproject/driver/netconf/testConfig.xml b/drivers/src/test/resources/org/onosproject/driver/netconf/testConfig.xml
new file mode 100644
index 0000000..88d1a3a
--- /dev/null
+++ b/drivers/src/test/resources/org/onosproject/driver/netconf/testConfig.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="7">
+    <data>
+        <capable-switch xmlns="urn:onf:config:yang">
+            <id>openvswitch</id>
+            <resources>
+                <port>
+                    <name>ofc-bridge</name>
+                    <requested-number>666</requested-number>
+                    <configuration>
+                        <admin-state>down</admin-state>
+                        <no-receive>false</no-receive>
+                        <no-forward>false</no-forward>
+                        <no-packet-in>false</no-packet-in>
+                    </configuration>
+                </port>
+            </resources>
+            <logical-switches>
+                <switch>
+                    <id>ofc-bridge</id>
+                    <datapath-id>00:01:02:03:04:05:06:07</datapath-id>
+                    <lost-connection-behavior>failSecureMode</lost-connection-behavior>
+                    <controllers>
+                        <controller>
+                            <id>(null)</id>
+                            <ip-address>10.128.12.1</ip-address>
+                            <port>6653</port>
+                            <protocol>tcp</protocol>
+                        </controller>
+                        <controller>
+                            <id>(null)</id>
+                            <ip-address>10.128.12.2</ip-address>
+                            <port>6654</port>
+                            <protocol>tcp</protocol>
+                        </controller>
+                    </controllers>
+                    <resources>
+                        <port>ofc-bridge</port>
+                    </resources>
+                </switch>
+            </logical-switches>
+        </capable-switch>
+    </data>
+</rpc-reply>
\ No newline at end of file
