diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceControllersCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceControllersCommand.java
new file mode 100644
index 0000000..328d470
--- /dev/null
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceControllersCommand.java
@@ -0,0 +1,47 @@
+/*
+ * 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.cli.net;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.behaviour.ControllerConfig;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.net.driver.DriverService;
+
+/**
+ * Sets role of the controller node for the given infrastructure device.
+ */
+@Command(scope = "onos", name = "device-controllers",
+        description = "gets the list of controllers for the given infrastructure device")
+public class DeviceControllersCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "uri", description = "Device ID",
+            required = true, multiValued = false)
+    String uri = null;
+    private DeviceId deviceId;
+
+    @Override
+    protected void execute() {
+        DriverService service = get(DriverService.class);
+        deviceId = DeviceId.deviceId(uri);
+        DriverHandler h = service.createHandler(deviceId);
+        ControllerConfig config = h.behaviour(ControllerConfig.class);
+        config.getControllers().forEach(c -> print(c.target()));
+    }
+
+}
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceSetControllersCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceSetControllersCommand.java
new file mode 100644
index 0000000..c369379
--- /dev/null
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceSetControllersCommand.java
@@ -0,0 +1,69 @@
+/*
+ * 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.cli.net;
+
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.behaviour.ControllerConfig;
+import org.onosproject.net.behaviour.ControllerInfo;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.net.driver.DriverService;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Sets role of the controller node for the given infrastructure device.
+ */
+@Command(scope = "onos", name = "device-setcontrollers",
+        description = "sets the list of controllers for the given infrastructure device")
+public class DeviceSetControllersCommand extends AbstractShellCommand {
+
+    @Argument(index = 0, name = "uri", description = "Device ID",
+            required = true, multiValued = false)
+    String uri = null;
+
+    @Argument(index = 1, name = "controllersListStrings", description = "list of " +
+            "controllers to set for the specified device",
+            required = true, multiValued = true)
+    String[] controllersListStrings = null;
+
+    private DeviceId deviceId;
+    private List<ControllerInfo> newControllers = new ArrayList<>();
+
+    @Override
+    protected void execute() {
+
+        Arrays.asList(controllersListStrings).forEach(
+                cInfoString -> newControllers.add(new ControllerInfo(cInfoString)));
+        DriverService service = get(DriverService.class);
+        deviceId = DeviceId.deviceId(uri);
+        DriverHandler h = service.createHandler(deviceId);
+        ControllerConfig config = h.behaviour(ControllerConfig.class);
+        print("before:");
+        config.getControllers().forEach(c -> print(c.target()));
+
+        config.setControllers(newControllers);
+        print("after:");
+        config.getControllers().forEach(c -> print(c.target()));
+        print("size %d", config.getControllers().size());
+    }
+
+}
diff --git a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index c28824a..e7fe5c4 100644
--- a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -105,6 +105,18 @@
             </completers>
         </command>
         <command>
+            <action class="org.onosproject.cli.net.DeviceControllersCommand"/>
+            <completers>
+                <ref component-id="deviceIdCompleter"/>
+            </completers>
+        </command>
+        <command>
+            <action class="org.onosproject.cli.net.DeviceSetControllersCommand"/>
+            <completers>
+                <ref component-id="deviceIdCompleter"/>
+            </completers>
+        </command>
+        <command>
             <action class="org.onosproject.cli.net.DeviceRemoveCommand"/>
             <completers>
                 <ref component-id="deviceIdCompleter"/>
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/ControllerConfig.java b/core/api/src/main/java/org/onosproject/net/behaviour/ControllerConfig.java
index bb8a788..cd7cb97 100644
--- a/core/api/src/main/java/org/onosproject/net/behaviour/ControllerConfig.java
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/ControllerConfig.java
@@ -15,23 +15,27 @@
  */
 package org.onosproject.net.behaviour;
 
+import org.onosproject.net.driver.HandlerBehaviour;
+
 import java.util.List;
 
 /**
  * Device behaviour to obtain and set controllers at the device.
  */
-public interface ControllerConfig {
+public interface ControllerConfig extends HandlerBehaviour {
 
     //TODO: add other controller parameters as needed.
 
     /**
      * Obtain the list of controller which are currently configured.
+     *
      * @return a list for controller descriptions
      */
     List<ControllerInfo> getControllers();
 
     /**
      * Set a list of controllers on a device.
+     *
      * @param controllers a list of controller descriptions
      */
     void setControllers(List<ControllerInfo> controllers);
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/ControllerInfo.java b/core/api/src/main/java/org/onosproject/net/behaviour/ControllerInfo.java
index 9ff808a..ded3b3a 100644
--- a/core/api/src/main/java/org/onosproject/net/behaviour/ControllerInfo.java
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/ControllerInfo.java
@@ -15,24 +15,112 @@
  */
 package org.onosproject.net.behaviour;
 
+import com.google.common.base.Preconditions;
 import org.onlab.packet.IpAddress;
 
+import java.util.Objects;
+
 /**
  * Represents information for a device to connect to a controller.
  */
 public class ControllerInfo {
 
-    public final IpAddress ip;
-    public final int tcpPort;
+    private IpAddress ip = IpAddress.valueOf("0.0.0.0");
+    private int port = 6653;
+    private String type = "error";
 
     /**
      * Information for contacting the controller.
      *
-     * @param ip the ip address
-     * @param tcpPort the tcp port
+     * @param ip   the ip address
+     * @param port the tcp port
      */
-    public ControllerInfo(IpAddress ip, int tcpPort) {
+    public ControllerInfo(IpAddress ip, int port, String type) {
         this.ip = ip;
-        this.tcpPort = tcpPort;
+        this.port = port;
+        this.type = type;
+    }
+
+    /**
+     * Information for contacting the controller, if some information
+     * is not contained in the target string because it's optional
+     * it's leaved as in the field declaration (default values).
+     *
+     * @param target column returned from ovsdb query
+     */
+    public ControllerInfo(String target) {
+        String[] data = target.split(":");
+        this.type = data[0];
+        Preconditions.checkArgument(!data[0].contains("unix"),
+                                    "Unable to create controller info " +
+                                            "from {} because it's based " +
+                                            "on unix sockets", target);
+        if (data[0].startsWith("p")) {
+            if (data.length >= 2) {
+                this.port = Integer.parseInt(data[1]);
+            }
+            if (data.length == 3) {
+                this.ip = IpAddress.valueOf(data[2]);
+            }
+        } else {
+            this.ip = IpAddress.valueOf(data[1]);
+            if (data.length == 3) {
+                this.port = Integer.parseInt(data[2]);
+            }
+        }
+    }
+
+    /**
+     * Exposes the ip address of the controller.
+     *
+     * @return IpAddress ip address
+     */
+    public IpAddress ip() {
+        return ip;
+    }
+
+    /**
+     * Exposes the tcp port of the controller.
+     *
+     * @return int tcp port
+     */
+    public int port() {
+        return port;
+    }
+
+    /**
+     * Exposes the type of the controller connection.
+     *
+     * @return String type
+     */
+    public String type() {
+        return type;
+    }
+
+    public String target() {
+        if (type.startsWith("p")) {
+            return type + ":" + port + ":" + ip;
+        } else {
+            return type + ":" + ip + ":" + port;
+        }
+    }
+
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(ip, port, type);
+    }
+
+    @Override
+    public boolean equals(Object toBeCompared) {
+        if (toBeCompared instanceof ControllerInfo) {
+            ControllerInfo controllerInfo = (ControllerInfo) toBeCompared;
+            if (controllerInfo.type().equals(this.type)
+                    && controllerInfo.ip().equals(this.ip())
+                    && controllerInfo.port() == this.port) {
+                return true;
+            }
+        }
+        return false;
     }
 }
diff --git a/core/api/src/test/java/org/onosproject/net/behaviour/ControllerInfoTest.java b/core/api/src/test/java/org/onosproject/net/behaviour/ControllerInfoTest.java
new file mode 100644
index 0000000..ece7f19
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/behaviour/ControllerInfoTest.java
@@ -0,0 +1,112 @@
+/*
+ * 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.net.behaviour;
+
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.onlab.packet.IpAddress;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+/**
+ * Test for ControllerInfo class.
+ */
+public class ControllerInfoTest {
+    @Rule
+    public ExpectedException thrown = ExpectedException.none();
+
+    @Test
+    public void tcpSslFormat() {
+        String target = "tcp:192.168.1.1:6653";
+        ControllerInfo controllerInfo = new ControllerInfo(target);
+        assertEquals("wrong type", controllerInfo.type(), "tcp");
+        assertEquals("wrong ip", controllerInfo.ip(), IpAddress.valueOf("192.168.1.1"));
+        assertEquals("wrong port", controllerInfo.port(), 6653);
+
+    }
+
+    @Test
+    public void ptcpPsslFormat() {
+        String target = "ptcp:6653:192.168.1.1";
+        ControllerInfo controllerInfo = new ControllerInfo(target);
+        assertEquals("wrong type", controllerInfo.type(), "ptcp");
+        assertEquals("wrong ip", controllerInfo.ip(), IpAddress.valueOf("192.168.1.1"));
+        assertEquals("wrong port", controllerInfo.port(), 6653);
+
+    }
+
+    @Test
+    public void unixFormat() {
+        String target = "unix:file";
+        thrown.expect(IllegalArgumentException.class);
+        ControllerInfo controllerInfo = new ControllerInfo(target);
+        assertTrue("wrong type", controllerInfo.type().contains("unix"));
+        assertNull("wrong ip", controllerInfo.ip());
+        assertEquals("wrong port", controllerInfo.port(), -1);
+
+    }
+
+    @Test
+    public void defaultValues() {
+        String target = "tcp:192.168.1.1";
+        ControllerInfo controllerInfo = new ControllerInfo(target);
+        assertEquals("wrong type", controllerInfo.type(), "tcp");
+        assertEquals("wrong ip", controllerInfo.ip(), IpAddress.valueOf("192.168.1.1"));
+        assertEquals("wrong port", controllerInfo.port(), 6653);
+        String target1 = "ptcp:5000:";
+        ControllerInfo controllerInfo2 = new ControllerInfo(target1);
+        assertEquals("wrong type", controllerInfo2.type(), "ptcp");
+        assertEquals("wrong ip", controllerInfo2.ip(), IpAddress.valueOf("0.0.0.0"));
+        assertEquals("wrong port", controllerInfo2.port(), 5000);
+        String target2 = "ptcp:";
+        ControllerInfo controllerInfo3 = new ControllerInfo(target2);
+        assertEquals("wrong type", controllerInfo3.type(), "ptcp");
+        assertEquals("wrong ip", controllerInfo3.ip(), IpAddress.valueOf("0.0.0.0"));
+        assertEquals("wrong port", controllerInfo3.port(), 6653);
+    }
+
+
+    @Test
+    public void testEquals() {
+        String target1 = "ptcp:6653:192.168.1.1";
+        ControllerInfo controllerInfo1 = new ControllerInfo(target1);
+        String target2 = "ptcp:6653:192.168.1.1";
+        ControllerInfo controllerInfo2 = new ControllerInfo(target2);
+        assertTrue("wrong equals method", controllerInfo1.equals(controllerInfo2));
+    }
+
+    @Test
+    public void testListEquals() {
+        String target1 = "ptcp:6653:192.168.1.1";
+        ControllerInfo controllerInfo1 = new ControllerInfo(target1);
+        String target2 = "ptcp:6653:192.168.1.1";
+        ControllerInfo controllerInfo2 = new ControllerInfo(target2);
+        String target3 = "tcp:192.168.1.1:6653";
+        ControllerInfo controllerInfo3 = new ControllerInfo(target3);
+        String target4 = "tcp:192.168.1.1:6653";
+        ControllerInfo controllerInfo4 = new ControllerInfo(target4);
+        List<ControllerInfo> list1 = new ArrayList<>(Arrays.asList(controllerInfo1, controllerInfo3));
+        List<ControllerInfo> list2 = new ArrayList<>(Arrays.asList(controllerInfo2, controllerInfo4));
+        assertTrue("wrong equals list method", list1.equals(list2));
+    }
+}
diff --git a/drivers/pom.xml b/drivers/pom.xml
index 749a68c..56a39a8 100644
--- a/drivers/pom.xml
+++ b/drivers/pom.xml
@@ -55,8 +55,8 @@
          <dependency>
             <groupId>org.onosproject</groupId>
             <artifactId>onos-core-serializers</artifactId>
-            <version>1.4.0-SNAPSHOT</version>
-        </dependency>
+             <version>${project.version}</version>
+         </dependency>
         <dependency>
             <groupId>org.onosproject</groupId>
             <artifactId>onos-ovsdb-api</artifactId>
@@ -72,6 +72,25 @@
             <groupId>org.apache.felix</groupId>
             <artifactId>org.apache.felix.scr.annotations</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-api</artifactId>
+            <version>${project.version}</version>
+            <classifier>tests</classifier>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-ovsdb-api</artifactId>
+            <version>${project.version}</version>
+            <classifier>tests</classifier>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/drivers/src/main/java/org/onosproject/driver/ovsdb/OvsdbControllerConfig.java b/drivers/src/main/java/org/onosproject/driver/ovsdb/OvsdbControllerConfig.java
new file mode 100644
index 0000000..a00d3db
--- /dev/null
+++ b/drivers/src/main/java/org/onosproject/driver/ovsdb/OvsdbControllerConfig.java
@@ -0,0 +1,102 @@
+/*
+ * 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.ovsdb;
+
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.TpPort;
+import org.onosproject.net.AnnotationKeys;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.behaviour.ControllerConfig;
+import org.onosproject.net.behaviour.ControllerInfo;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.driver.AbstractHandlerBehaviour;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.ovsdb.controller.OvsdbBridge;
+import org.onosproject.ovsdb.controller.OvsdbClientService;
+import org.onosproject.ovsdb.controller.OvsdbController;
+import org.onosproject.ovsdb.controller.OvsdbNodeId;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static com.google.common.base.Preconditions.checkState;
+import static org.onlab.util.Tools.delay;
+
+/**
+ * Implementation of controller config which allows to get and set controllers.
+ */
+public class OvsdbControllerConfig extends AbstractHandlerBehaviour implements ControllerConfig {
+    @Override
+    public List<ControllerInfo> getControllers() {
+        DriverHandler handler = handler();
+        OvsdbClientService clientService = getOvsdbClientService(handler);
+        Set<ControllerInfo> controllers = clientService.getControllers(
+                handler().data().deviceId());
+        return new ArrayList<>(controllers);
+    }
+
+    @Override
+    public void setControllers(List<ControllerInfo> controllers) {
+        DriverHandler handler = handler();
+        OvsdbClientService clientService = getOvsdbClientService(handler);
+        if (!clientService.getControllers(handler().data().deviceId())
+                .equals(controllers)) {
+            clientService.setControllersWithDeviceId(handler().
+                    data().deviceId(), controllers);
+        }
+    }
+
+    // Used for getting OvsdbClientService.
+    private OvsdbClientService getOvsdbClientService(DriverHandler handler) {
+        OvsdbController ovsController = handler.get(OvsdbController.class);
+        DeviceService deviceService = handler.get(DeviceService.class);
+        DeviceId ofDeviceId = handler.data().deviceId();
+        String[] mgmtAddress = deviceService.getDevice(ofDeviceId)
+                .annotations().value(AnnotationKeys.MANAGEMENT_ADDRESS).split(":");
+        String targetIp = mgmtAddress[0];
+        TpPort targetPort = null;
+        if (mgmtAddress.length > 1) {
+            targetPort = TpPort.tpPort(Integer.parseInt(mgmtAddress[1]));
+        }
+
+        List<OvsdbNodeId> nodeIds = ovsController.getNodeIds().stream()
+                .filter(nodeId -> nodeId.getIpAddress().equals(targetIp))
+                .collect(Collectors.toList());
+        if (nodeIds.size() == 0) {
+            //TODO decide what port?
+            ovsController.connect(IpAddress.valueOf(targetIp),
+                                  targetPort == null ? TpPort.tpPort(6640) : targetPort);
+            delay(1000); //FIXME... connect is async
+        }
+        List<OvsdbClientService> clientServices = ovsController.getNodeIds().stream()
+                .filter(nodeId -> nodeId.getIpAddress().equals(targetIp))
+                .map(ovsController::getOvsdbClient)
+                .filter(cs -> cs.getBridges().stream().anyMatch(b -> dpidMatches(b, ofDeviceId)))
+                .collect(Collectors.toList());
+        checkState(clientServices.size() > 0, "No clientServices found");
+        //FIXME add connection to management address if null --> done ?
+        return clientServices.size() > 0 ? clientServices.get(0) : null;
+    }
+
+    private static boolean dpidMatches(OvsdbBridge bridge, DeviceId deviceId) {
+        String bridgeDpid = "of:" + bridge.datapathId().value();
+        String ofDpid = deviceId.toString();
+        return bridgeDpid.equals(ofDpid);
+    }
+}
\ 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 aea743f..5059d4b 100644
--- a/drivers/src/main/resources/onos-drivers.xml
+++ b/drivers/src/main/resources/onos-drivers.xml
@@ -30,6 +30,8 @@
             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.ovsdb.OvsdbControllerConfig"/>
     </driver>
     <driver name="ovs-corsa" extends="ovs"
             manufacturer="Corsa" hwVersion="emulation" swVersion="0.0.0">
diff --git a/drivers/src/test/java/org/onosproject/driver/ovsdb/OvsdbControllerConfigTest.java b/drivers/src/test/java/org/onosproject/driver/ovsdb/OvsdbControllerConfigTest.java
new file mode 100644
index 0000000..4a91efc
--- /dev/null
+++ b/drivers/src/test/java/org/onosproject/driver/ovsdb/OvsdbControllerConfigTest.java
@@ -0,0 +1,95 @@
+/*
+ * 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.ovsdb;
+
+import com.google.common.collect.ImmutableMap;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.behaviour.ControllerConfig;
+import org.onosproject.net.device.DeviceServiceAdapter;
+import org.onosproject.net.driver.DefaultDriver;
+import org.onosproject.net.driver.DefaultDriverData;
+import org.onosproject.net.driver.DefaultDriverHandler;
+import org.onosproject.ovsdb.controller.driver.OvsdbClientServiceAdapter;
+import org.onosproject.ovsdb.controller.driver.OvsdbControllerAdapter;
+
+/**
+ * Created by Andrea on 10/7/15.
+ */
+public class OvsdbControllerConfigTest {
+
+
+    private static final DeviceId DEVICE_ID = DeviceId.deviceId("foo");
+
+    private DefaultDriver ddc;
+    private DefaultDriverData data;
+    private DefaultDriverHandler handler;
+
+    private TestDeviceService deviceService = new TestDeviceService();
+    private TestOvsdbController controller = new TestOvsdbController();
+    private TestOvsdbClient client = new TestOvsdbClient();
+
+    private OvsdbControllerConfig controllerConfig;
+
+
+    @Before
+    public void setUp() {
+        controllerConfig = new OvsdbControllerConfig();
+
+        ddc = new DefaultDriver("foo.bar", null, "Circus", "lux", "1.2a",
+                                ImmutableMap.of(ControllerConfig.class,
+                                                OvsdbControllerConfig.class),
+                                ImmutableMap.of("foo", "bar"));
+        data = new DefaultDriverData(ddc, DEVICE_ID);
+        handler = new DefaultDriverHandler(data);
+        //handler.controllerConfig.setHandler(handler);
+        //TODO setTestService directory on handler
+        //TODO setup ovsdb fake controller with fake ovsdbclient
+        //TODO setup fake device service
+    }
+
+    @Test
+    public void testGetControllers() throws Exception {
+//        DriverService driverService = new Driv
+//        AbstractBehaviour ab = new AbstractBehaviour();
+//        DriverHandler handler = handler();
+//        List<ControllerInfo> controllersList =
+//              controllerConfig.getControllers(DeviceId.deviceId("0000000000000018"));
+//        log.info("controllers " + controllersList);
+
+    }
+
+    @Test
+    public void testSetControllers() throws Exception {
+
+    }
+
+
+    private class TestDeviceService extends DeviceServiceAdapter {
+
+    }
+
+    private class TestOvsdbController extends OvsdbControllerAdapter {
+
+
+    }
+
+    private class TestOvsdbClient extends OvsdbClientServiceAdapter {
+
+    }
+}
\ No newline at end of file
diff --git a/ovsdb/api/pom.xml b/ovsdb/api/pom.xml
index 7089216..c264ae9 100644
--- a/ovsdb/api/pom.xml
+++ b/ovsdb/api/pom.xml
@@ -48,6 +48,10 @@
         </dependency>
         <dependency>
             <groupId>org.onosproject</groupId>
+            <artifactId>onos-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
             <artifactId>onos-ovsdb-rfc</artifactId>
             <version>${project.version}</version>
         </dependency>
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java
index c5f2092..833f5fe 100644
--- a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbClientService.java
@@ -15,19 +15,20 @@
  */
 package org.onosproject.ovsdb.controller;
 
-import java.util.List;
-import java.util.Set;
-
+import com.google.common.util.concurrent.ListenableFuture;
 import org.onlab.packet.IpAddress;
-
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.behaviour.ControllerInfo;
 import org.onosproject.ovsdb.rfc.jsonrpc.OvsdbRPC;
 import org.onosproject.ovsdb.rfc.message.OperationResult;
 import org.onosproject.ovsdb.rfc.message.TableUpdates;
 import org.onosproject.ovsdb.rfc.notation.Row;
+import org.onosproject.ovsdb.rfc.notation.UUID;
 import org.onosproject.ovsdb.rfc.operations.Operation;
 import org.onosproject.ovsdb.rfc.schema.DatabaseSchema;
 
-import com.google.common.util.concurrent.ListenableFuture;
+import java.util.List;
+import java.util.Set;
 
 /**
  * Represents to provider facing side of a node.
@@ -85,10 +86,33 @@
     Set<OvsdbBridge> getBridges();
 
     /**
+     * Gets controllers of the node.
+     *
+     * @return set of controllers; empty if no controller is find
+     */
+    Set<ControllerInfo> getControllers(DeviceId openflowDeviceId);
+
+    /**
+     * sets the controllers of the node to the ones passed in the list.
+     *
+     * @param bridgeUuid  UUid for the bridge we are settings the controls on
+     * @param controllers of controllers; empty if no controller is find
+     */
+    void setControllersWithUUID(UUID bridgeUuid, List<ControllerInfo> controllers);
+
+    /**
+     * sets the controllers of the node to the ones passed in the list.
+     *
+     * @param deviceId  deviceId for the bridge we are settings the controls on
+     * @param controllers of controllers; empty if no controller is find
+     */
+    void setControllersWithDeviceId(DeviceId deviceId, List<ControllerInfo> controllers);
+
+    /**
      * Creates a port.
      *
      * @param bridgeName bridge name
-     * @param portName port name
+     * @param portName   port name
      */
     void createPort(String bridgeName, String portName);
 
@@ -96,7 +120,7 @@
      * Drops a port.
      *
      * @param bridgeName bridge name
-     * @param portName port name
+     * @param portName   port name
      */
     void dropPort(String bridgeName, String portName);
 
@@ -125,7 +149,7 @@
     /**
      * Gets the Port uuid.
      *
-     * @param portName port name
+     * @param portName   port name
      * @param bridgeUuid bridge uuid
      * @return port uuid, empty if no uuid is find
      */
@@ -143,7 +167,7 @@
     /**
      * Gets the Controller uuid.
      *
-     * @param controllerName controller name
+     * @param controllerName   controller name
      * @param controllerTarget controller target
      * @return controller uuid, empty if no uuid is find
      */
@@ -169,7 +193,7 @@
      * Gets the ovsdb table updates.
      *
      * @param dbName database name
-     * @param id random uuid
+     * @param id     random uuid
      * @return table updates
      */
     ListenableFuture<TableUpdates> monitorTables(String dbName, String id);
@@ -177,7 +201,7 @@
     /**
      * Gets the ovsdb config operation result.
      *
-     * @param dbName database name
+     * @param dbName     database name
      * @param operations the list of operations
      * @return operation results
      */
@@ -187,7 +211,7 @@
     /**
      * Gets the ovsdb database schema from local.
      *
-     * @param  dbName database name
+     * @param dbName database name
      * @return database schema
      */
     DatabaseSchema getDatabaseSchema(String dbName);
@@ -195,9 +219,9 @@
     /**
      * Gets the ovsdb row from the local ovsdb store.
      *
-     * @param dbName database name
+     * @param dbName    database name
      * @param tableName table name
-     * @param uuid row uuid
+     * @param uuid      row uuid
      * @return row ovsdb row
      */
     Row getRow(String dbName, String tableName, String uuid);
@@ -205,19 +229,19 @@
     /**
      * Removes the ovsdb row from the local ovsdb store.
      *
-     * @param dbName database name
+     * @param dbName    database name
      * @param tableName table name
-     * @param uuid row uuid
+     * @param uuid      row uuid
      */
     void removeRow(String dbName, String tableName, String uuid);
 
     /**
      * Updates the local ovsdb store.
      *
-     * @param dbName database name
+     * @param dbName    database name
      * @param tableName table name
-     * @param uuid row uuid
-     * @param row ovsdb row
+     * @param uuid      row uuid
+     * @param row       ovsdb row
      */
     void updateOvsdbStore(String dbName, String tableName, String uuid, Row row);
 
diff --git a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java
index 1b41be9..5dc4cb1 100644
--- a/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java
+++ b/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/driver/DefaultOvsdbClient.java
@@ -15,19 +15,18 @@
  */
 package org.onosproject.ovsdb.controller.driver;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.base.Function;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
 import io.netty.channel.Channel;
-
-import java.net.InetSocketAddress;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.ExecutionException;
-
 import org.onlab.packet.IpAddress;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.behaviour.ControllerInfo;
 import org.onosproject.ovsdb.controller.OvsdbBridge;
 import org.onosproject.ovsdb.controller.OvsdbBridgeName;
 import org.onosproject.ovsdb.controller.OvsdbClientService;
@@ -71,14 +70,17 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.fasterxml.jackson.databind.JsonNode;
-import com.google.common.base.Function;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.SettableFuture;
+import java.net.InetSocketAddress;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
 
 /**
  * An representation of an ovsdb client.
@@ -168,9 +170,8 @@
     /**
      * Gets the ovsdb row store.
      *
-     * @param dbName the ovsdb database name
+     * @param dbName    the ovsdb database name
      * @param tableName the ovsdb table name
-     *
      * @return ovsRowStore, empty if row store is find
      */
     private OvsdbRowStore getRowStore(String dbName, String tableName) {
@@ -184,9 +185,9 @@
     /**
      * Gets the ovsdb row.
      *
-     * @param dbName the ovsdb database name
+     * @param dbName    the ovsdb database name
      * @param tableName the ovsdb table name
-     * @param uuid the key of the row
+     * @param uuid      the key of the row
      * @return row, empty if row is find
      */
     @Override
@@ -394,7 +395,7 @@
         port.setName(portName);
         if (portUuid == null) {
             insertConfig(OvsdbConstant.PORT, "_uuid", OvsdbConstant.BRIDGE,
-                      "ports", bridgeUuid, port.getRow());
+                         "ports", bridgeUuid, port.getRow());
         } else {
             updateConfig(OvsdbConstant.PORT, "_uuid", portUuid, port.getRow());
         }
@@ -414,7 +415,7 @@
         if (portUuid != null) {
             log.info("Port {} delete", portName);
             deleteConfig(OvsdbConstant.PORT, "_uuid", portUuid,
-                      OvsdbConstant.BRIDGE, "ports");
+                         OvsdbConstant.BRIDGE, "ports");
         }
     }
 
@@ -455,8 +456,8 @@
 
             bridge.setName(bridgeName);
             bridgeUuid = insertConfig(OvsdbConstant.BRIDGE, "_uuid",
-                                   OvsdbConstant.DATABASENAME, "bridges",
-                                   ovsUuid, bridge.getRow());
+                                      OvsdbConstant.DATABASENAME, "bridges",
+                                      ovsUuid, bridge.getRow());
 
             if (bridgeUuid != null) {
                 Port port = (Port) TableGenerator.createTable(dbSchema,
@@ -466,7 +467,7 @@
                     port.setName(bridgeName);
 
                     insertConfig(OvsdbConstant.PORT, "_uuid", "Bridge", "ports", bridgeUuid,
-                              port.getRow());
+                                 port.getRow());
                 }
             }
 
@@ -475,7 +476,7 @@
             updateConfig(OvsdbConstant.BRIDGE, "_uuid", bridgeUuid, bridge.getRow());
         }
 
-        setController(bridgeUuid);
+        setControllerAuto(bridgeUuid);
         log.info("Create bridge success");
     }
 
@@ -484,10 +485,10 @@
      *
      * @param bridgeUuid bridge uuid
      */
-    private void setController(String bridgeUuid) {
+    private void setControllerAuto(String bridgeUuid) {
         String controllerUuid = null;
         String iPAddress = IpAddress.valueOf(((InetSocketAddress) channel
-                                                     .localAddress())
+                .localAddress())
                                                      .getAddress()
                                                      .getHostAddress())
                 .toString();
@@ -495,18 +496,118 @@
         String target = "tcp:" + iPAddress + ":" + OvsdbConstant.OFPORT;
         log.debug("controller IP {}: port {}", iPAddress, OvsdbConstant.OFPORT);
 
+        setController(bridgeUuid, target);
+
+    }
+
+    /**
+     * Sets the Controllers.
+     *
+     * @param bridgeUuid bridge uuid
+     */
+    @Override
+    public void setControllersWithUUID(UUID bridgeUuid, List<ControllerInfo> controllers) {
+
         DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
+        if (dbSchema == null) {
+            log.debug("There is no schema");
+            return;
+        }
+        List<Controller> oldControllers = getControllers(bridgeUuid);
+        if (oldControllers == null) {
+            log.warn("There are no controllers");
+            return;
+        }
+
+        Set<UUID> newControllerUuids = new HashSet<>();
+
+        Set<ControllerInfo> newControllers = new HashSet<>(controllers);
+        List<Controller> removeControllers = new ArrayList<>();
+        oldControllers.forEach(controller -> {
+            ControllerInfo controllerInfo = new ControllerInfo((String) controller.getTargetColumn().data());
+            if (newControllers.contains(controllerInfo)) {
+                newControllers.remove(controllerInfo);
+                newControllerUuids.add(controller.getRow().uuid());
+            } else {
+                removeControllers.add(controller);
+            }
+        });
+        OvsdbRowStore controllerRowStore = getRowStore(OvsdbConstant.DATABASENAME,
+                                                       OvsdbConstant.CONTROLLER);
+        if (controllerRowStore == null) {
+            log.debug("There is no controller table");
+            return;
+        }
+
+//        removeControllers.forEach(c -> controllerRowStore.deleteRow(c.getRow().uuid().value()));
+        removeControllers.forEach(c -> deleteConfig(OvsdbConstant.CONTROLLER, "_uuid", c.getRow().uuid().value(),
+                                                    OvsdbConstant.BRIDGE, "controller"));
+
+        newControllers.stream().map(c -> {
+            Controller controller = (Controller) TableGenerator
+                    .createTable(dbSchema, OvsdbTable.CONTROLLER);
+            controller.setTarget(c.target());
+            return controller;
+        }).forEach(c -> {
+//            UUID uuid = c.getRow().uuid();
+//            controllerRowStore.insertRow(uuid.value(), c.getRow());
+//            newControllerUuids.add(uuid);
+
+            String uuid = insertConfig(OvsdbConstant.CONTROLLER, "_uuid",
+                                       OvsdbConstant.BRIDGE, "controller", bridgeUuid.value(),
+                                       c.getRow());
+            log.warn("insertConfig uuid {}", uuid);
+            log.warn("row uuid {}", c.getRow().uuid());
+            //log.warn("rowStore uuid {}", controllerRowStore.getRowStore());
+            newControllerUuids.add(UUID.uuid(uuid));
+
+        });
+
+        OvsdbRowStore rowStore = getRowStore(OvsdbConstant.DATABASENAME,
+                                             OvsdbConstant.BRIDGE);
+        if (rowStore == null) {
+            log.debug("There is no bridge table");
+            return;
+        }
+
+        Row bridgeRow = rowStore.getRow(bridgeUuid.value());
+        Bridge bridge = (Bridge) TableGenerator.getTable(dbSchema, bridgeRow, OvsdbTable.BRIDGE);
+        bridge.setController(OvsdbSet.ovsdbSet(newControllerUuids));
+        updateConfig(OvsdbConstant.BRIDGE, "_uuid", bridgeUuid.value(), bridge.getRow());
+
+        //rowStore.insertRow(bridgeUuid.value(), bridge.getRow()); //TODO do we need to do this?
+    }
+
+    /**
+     * Sets the Controllers.
+     *
+     * @param deviceId bridge uuid
+     */
+    @Override
+    public void setControllersWithDeviceId(DeviceId deviceId, List<ControllerInfo> controllers) {
+        setControllersWithUUID(getBridgeUUID(deviceId), controllers);
+    }
+
+    private void setController(String bridgeUuid, String target) {
+        String controllerUuid;
+        DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
+
+        // 1. get the bridge row
+        // 2. delete different controllers and save the same controller.
+        // 3. add new controllers
+        // 4. update bridge row
+
+
+        controllerUuid = getControllerUuid(OvsdbConstant.CONTROLLER, target);
+
         Controller controller = (Controller) TableGenerator
                 .createTable(dbSchema, OvsdbTable.CONTROLLER);
-
         if (controller != null) {
-            controller.setTarget(target);
-            controllerUuid = getControllerUuid(OvsdbConstant.CONTROLLER, target);
             if (controllerUuid == null) {
 
                 insertConfig(OvsdbConstant.CONTROLLER, "_uuid",
-                          OvsdbConstant.BRIDGE, "controller", bridgeUuid,
-                          controller.getRow());
+                             OvsdbConstant.BRIDGE, "controller", bridgeUuid,
+                             controller.getRow());
 
             } else {
 
@@ -514,12 +615,11 @@
                         .createTable(dbSchema, OvsdbTable.BRIDGE);
                 Set<UUID> controllerUuids = new HashSet<>();
                 controllerUuids.add(UUID.uuid(controllerUuid));
-                bridge.setController(controllerUuids);
+                bridge.setController(OvsdbSet.ovsdbSet(controllerUuids));
                 updateConfig(OvsdbConstant.CONTROLLER, "_uuid", bridgeUuid, bridge.getRow());
 
             }
         }
-
     }
 
     @Override
@@ -530,7 +630,7 @@
             return;
         }
         deleteConfig(OvsdbConstant.BRIDGE, "_uuid", bridgeUUID,
-                  OvsdbConstant.DATABASENAME, "bridges");
+                     OvsdbConstant.DATABASENAME, "bridges");
     }
 
     @Override
@@ -554,7 +654,7 @@
 
         if (portUuid == null) {
             portUuid = insertConfig(OvsdbConstant.PORT, "_uuid", OvsdbConstant.BRIDGE,
-                      "ports", bridgeUuid, port.getRow());
+                                    "ports", bridgeUuid, port.getRow());
         } else {
             updateConfig(OvsdbConstant.PORT, "_uuid", portUuid, port.getRow());
         }
@@ -595,7 +695,7 @@
                 options.put("remote_ip", dstIp.toString());
                 tunInterface.setOptions(options);
                 updateConfig(OvsdbConstant.INTERFACE, "_uuid", interfaceUuid,
-                          tunInterface.getRow());
+                             tunInterface.getRow());
                 log.info("Tunnel added success", tunInterface);
 
             }
@@ -619,7 +719,7 @@
         if (portUUID != null) {
             log.info("Delete tunnel");
             deleteConfig(OvsdbConstant.PORT, "_uuid", portUUID,
-                      OvsdbConstant.BRIDGE, "ports");
+                         OvsdbConstant.BRIDGE, "ports");
         }
 
         return;
@@ -628,16 +728,15 @@
     /**
      * Delete transact config.
      *
-     * @param childTableName child table name
-     * @param childColumnName child column name
-     * @param childUuid child row uuid
-     * @param parentTableName parent table name
+     * @param childTableName   child table name
+     * @param childColumnName  child column name
+     * @param childUuid        child row uuid
+     * @param parentTableName  parent table name
      * @param parentColumnName parent column
-     *
      */
     private void deleteConfig(String childTableName, String childColumnName,
-                           String childUuid, String parentTableName,
-                           String parentColumnName) {
+                              String childUuid, String parentTableName,
+                              String parentColumnName) {
         DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
         TableSchema childTableSchema = dbSchema.getTableSchema(childTableName);
 
@@ -672,14 +771,13 @@
     /**
      * Update transact config.
      *
-     * @param tableName table name
+     * @param tableName  table name
      * @param columnName column name
-     * @param uuid uuid
-     * @param row the config data
-     *
+     * @param uuid       uuid
+     * @param row        the config data
      */
     private void updateConfig(String tableName, String columnName, String uuid,
-                           Row row) {
+                              Row row) {
         DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
         TableSchema tableSchema = dbSchema.getTableSchema(tableName);
 
@@ -698,18 +796,17 @@
     /**
      * Insert transact config.
      *
-     * @param childTableName child table name
-     * @param childColumnName child column name
-     * @param parentTableName parent table name
+     * @param childTableName   child table name
+     * @param childColumnName  child column name
+     * @param parentTableName  parent table name
      * @param parentColumnName parent column
-     * @param parentUuid parent uuid
-     * @param row the config data
-     *
+     * @param parentUuid       parent uuid
+     * @param row              the config data
      * @return uuid, empty if no uuid is find
      */
     private String insertConfig(String childTableName, String childColumnName,
-                             String parentTableName, String parentColumnName,
-                             String parentUuid, Row row) {
+                                String parentTableName, String parentColumnName,
+                                String parentUuid, Row row) {
         DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
         TableSchema tableSchema = dbSchema.getTableSchema(childTableName);
 
@@ -741,7 +838,7 @@
         if (childTableName.equalsIgnoreCase(OvsdbConstant.PORT)) {
             log.info("Handle port insert");
             Insert intfInsert = handlePortInsertTable(OvsdbConstant.INTERFACE,
-                                                    row);
+                                                      row);
 
             if (intfInsert != null) {
                 operations.add(intfInsert);
@@ -772,8 +869,7 @@
      * Handles port insert.
      *
      * @param tableName ovsdb table interface
-     * @param portRow row of port
-     *
+     * @param portRow   row of port
      * @return insert, empty if null
      */
     private Insert handlePortInsertTable(String tableName, Row portRow) {
@@ -801,8 +897,7 @@
      * Gets tunnel name.
      *
      * @param tunnelType
-     * @param dstIp the remote ip address
-     *
+     * @param dstIp      the remote ip address
      * @return tunnel name
      */
     private String getTunnelName(String tunnelType, IpAddress dstIp) {
@@ -877,21 +972,17 @@
         }
         DatabaseSchema dbSchema = schema.get(dbName);
         if (dbSchema != null) {
-            Function<List<JsonNode>, List<OperationResult>> rowFunction =
-                    new Function<List<JsonNode>, List<OperationResult>>() {
-                @Override
-                public List<OperationResult> apply(List<JsonNode> input) {
-                    log.info("Get ovsdb operation result");
-                    List<OperationResult> result = FromJsonUtil
-                            .jsonNodeToOperationResult(input, operations);
+            Function<List<JsonNode>, List<OperationResult>> rowFunction = (input -> {
+                log.info("Get ovsdb operation result");
+                List<OperationResult> result = FromJsonUtil
+                        .jsonNodeToOperationResult(input, operations);
 
-                    if (result == null) {
-                        log.debug("The operation result is null");
-                        return null;
-                    }
-                    return result;
+                if (result == null) {
+                    log.debug("The operation result is null");
+                    return null;
                 }
-            };
+                return result;
+            });
             return Futures.transform(transact(dbSchema, operations),
                                      rowFunction);
         }
@@ -972,7 +1063,7 @@
 
     }
 
-    @SuppressWarnings({ "rawtypes", "unchecked" })
+    @SuppressWarnings({"rawtypes", "unchecked"})
     @Override
     public void processResult(JsonNode response) {
         log.debug("Handle result");
@@ -1042,6 +1133,105 @@
     }
 
     @Override
+    public Set<ControllerInfo> getControllers(DeviceId openflowDeviceId) {
+        UUID bridgeUuid = getBridgeUUID(openflowDeviceId);
+        if (bridgeUuid == null) {
+            log.warn("bad bridge Uuid");
+            return null;
+        }
+        List<Controller> controllers = getControllers(bridgeUuid);
+        if (controllers == null) {
+            log.warn("bad list of controllers");
+            return null;
+        }
+        return controllers.stream().
+                map(controller -> new ControllerInfo(
+                        (String) controller.getTargetColumn()
+                                .data())).collect(Collectors.toSet());
+    }
+
+    private List<Controller> getControllers(UUID bridgeUuid) {
+        DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
+        if (dbSchema == null) {
+            return null;
+        }
+        OvsdbRowStore rowStore = getRowStore(OvsdbConstant.DATABASENAME,
+                                             OvsdbConstant.BRIDGE);
+        if (rowStore == null) {
+            log.debug("There is no bridge table");
+            return null;
+        }
+
+        Row bridgeRow = rowStore.getRow(bridgeUuid.value());
+        Bridge bridge = (Bridge) TableGenerator.
+                getTable(dbSchema, bridgeRow, OvsdbTable.BRIDGE);
+
+        //FIXME remove log
+        log.warn("type of controller column", bridge.getControllerColumn()
+                .data().getClass());
+        Set<UUID> controllerUuids = (Set<UUID>) ((OvsdbSet) bridge
+                .getControllerColumn().data()).set();
+//        Set<String> controllerUuidStrings = (Set<String>) bridge.getControllerColumn().data();
+
+        OvsdbRowStore controllerRowStore = getRowStore(OvsdbConstant.DATABASENAME,
+                                                       OvsdbConstant.CONTROLLER);
+        if (controllerRowStore == null) {
+            log.debug("There is no controller table");
+            return null;
+        }
+
+        List<Controller> ovsdbControllers = new ArrayList<>();
+        ConcurrentMap<String, Row> controllerTableRows = controllerRowStore.getRowStore();
+        controllerTableRows.forEach((key, row) -> {
+            if (!controllerUuids.contains(UUID.uuid(key))) {
+                return;
+            }
+            Controller controller = (Controller) TableGenerator
+                    .getTable(dbSchema, row, OvsdbTable.CONTROLLER);
+            ovsdbControllers.add(controller);
+        });
+        return ovsdbControllers;
+    }
+
+
+    private UUID getBridgeUUID(DeviceId openflowDeviceId) {
+        DatabaseSchema dbSchema = schema.get(OvsdbConstant.DATABASENAME);
+        if (dbSchema == null) {
+            return null;
+        }
+        OvsdbRowStore rowStore = getRowStore(OvsdbConstant.DATABASENAME,
+                                             OvsdbConstant.BRIDGE);
+        if (rowStore == null) {
+            log.debug("There is no bridge table");
+            return null;
+        }
+
+        ConcurrentMap<String, Row> bridgeTableRows = rowStore.getRowStore();
+        final AtomicReference<UUID> uuid = new AtomicReference<>();
+        for (Map.Entry<String, Row> entry : bridgeTableRows.entrySet()) {
+            Bridge b = (Bridge) TableGenerator.getTable(dbSchema,
+                                                        entry.getValue(),
+                                                        OvsdbTable.BRIDGE);
+            if (matchesDpid(b, openflowDeviceId)) {
+                uuid.set(UUID.uuid(entry.getKey()));
+                break;
+            }
+        }
+        if (uuid.get() == null) {
+            log.debug("There is no bridge for {}", openflowDeviceId);
+        }
+        return uuid.get();
+
+    }
+
+    private static boolean matchesDpid(Bridge b, DeviceId deviceId) {
+        String ofDpid = deviceId.toString().replace("of:", "");
+        Set ofDeviceIds = ((OvsdbSet) b.getDatapathIdColumn().data()).set();
+        //TODO Set<String>
+        return ofDeviceIds.contains(ofDpid);
+    }
+
+    @Override
     public Set<OvsdbPort> getPorts() {
         Set<OvsdbPort> ovsdbPorts = new HashSet<OvsdbPort>();
         OvsdbTableStore tableStore = getTableStore(OvsdbConstant.DATABASENAME);
diff --git a/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbClientServiceAdapter.java b/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbClientServiceAdapter.java
new file mode 100644
index 0000000..71fee4f
--- /dev/null
+++ b/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbClientServiceAdapter.java
@@ -0,0 +1,208 @@
+/*
+ * 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.ovsdb.controller.driver;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.util.concurrent.ListenableFuture;
+import org.onlab.packet.IpAddress;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.behaviour.ControllerInfo;
+import org.onosproject.ovsdb.controller.OvsdbBridge;
+import org.onosproject.ovsdb.controller.OvsdbClientService;
+import org.onosproject.ovsdb.controller.OvsdbNodeId;
+import org.onosproject.ovsdb.controller.OvsdbPort;
+import org.onosproject.ovsdb.controller.OvsdbTunnel;
+import org.onosproject.ovsdb.rfc.message.OperationResult;
+import org.onosproject.ovsdb.rfc.message.TableUpdates;
+import org.onosproject.ovsdb.rfc.notation.Row;
+import org.onosproject.ovsdb.rfc.notation.UUID;
+import org.onosproject.ovsdb.rfc.operations.Operation;
+import org.onosproject.ovsdb.rfc.schema.DatabaseSchema;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Test Adapter for OvsdbClientService.
+ */
+public class OvsdbClientServiceAdapter implements OvsdbClientService {
+
+    @Override
+    public OvsdbNodeId nodeId() {
+        return null;
+    }
+
+    @Override
+    public void createTunnel(IpAddress srcIp, IpAddress dstIp) {
+
+    }
+
+    @Override
+    public void dropTunnel(IpAddress srcIp, IpAddress dstIp) {
+
+    }
+
+    @Override
+    public Set<OvsdbTunnel> getTunnels() {
+        return null;
+    }
+
+    @Override
+    public void createBridge(String bridgeName) {
+
+    }
+
+    @Override
+    public void dropBridge(String bridgeName) {
+
+    }
+
+    @Override
+    public Set<OvsdbBridge> getBridges() {
+        return null;
+    }
+
+    @Override
+    public Set<ControllerInfo> getControllers(DeviceId openflowDeviceId) {
+        return null;
+    }
+
+    @Override
+    public void setControllersWithUUID(UUID bridgeUuid, List<ControllerInfo> controllers) {
+
+    }
+
+    @Override
+    public void setControllersWithDeviceId(DeviceId deviceId, List<ControllerInfo> controllers) {
+
+    }
+
+    @Override
+    public void createPort(String bridgeName, String portName) {
+
+    }
+
+    @Override
+    public void dropPort(String bridgeName, String portName) {
+
+    }
+
+    @Override
+    public Set<OvsdbPort> getPorts() {
+        return null;
+    }
+
+    @Override
+    public boolean isConnected() {
+        return false;
+    }
+
+    @Override
+    public String getBridgeUuid(String bridgeName) {
+        return null;
+    }
+
+    @Override
+    public String getPortUuid(String portName, String bridgeUuid) {
+        return null;
+    }
+
+    @Override
+    public String getInterfaceUuid(String portUuid, String portName) {
+        return null;
+    }
+
+    @Override
+    public String getControllerUuid(String controllerName, String controllerTarget) {
+        return null;
+    }
+
+    @Override
+    public String getOvsUuid(String dbName) {
+        return null;
+    }
+
+    @Override
+    public ListenableFuture<DatabaseSchema> getOvsdbSchema(String dbName) {
+        return null;
+    }
+
+    @Override
+    public ListenableFuture<TableUpdates> monitorTables(String dbName, String id) {
+        return null;
+    }
+
+    @Override
+    public ListenableFuture<List<OperationResult>> transactConfig(String dbName, List<Operation> operations) {
+        return null;
+    }
+
+    @Override
+    public DatabaseSchema getDatabaseSchema(String dbName) {
+        return null;
+    }
+
+    @Override
+    public Row getRow(String dbName, String tableName, String uuid) {
+        return null;
+    }
+
+    @Override
+    public void removeRow(String dbName, String tableName, String uuid) {
+
+    }
+
+    @Override
+    public void updateOvsdbStore(String dbName, String tableName, String uuid, Row row) {
+
+    }
+
+    @Override
+    public Set<OvsdbPort> getLocalPorts(Iterable<String> ifaceids) {
+        return null;
+    }
+
+    @Override
+    public void disconnect() {
+
+    }
+
+    @Override
+    public ListenableFuture<JsonNode> getSchema(List<String> dbnames) {
+        return null;
+    }
+
+    @Override
+    public ListenableFuture<List<String>> echo() {
+        return null;
+    }
+
+    @Override
+    public ListenableFuture<JsonNode> monitor(DatabaseSchema dbSchema, String monitorId) {
+        return null;
+    }
+
+    @Override
+    public ListenableFuture<List<String>> listDbs() {
+        return null;
+    }
+
+    @Override
+    public ListenableFuture<List<JsonNode>> transact(DatabaseSchema dbSchema, List<Operation> operations) {
+        return null;
+    }
+}
diff --git a/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbControllerAdapter.java b/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbControllerAdapter.java
new file mode 100644
index 0000000..902113a
--- /dev/null
+++ b/ovsdb/api/src/test/java/org/onosproject/ovsdb/controller/driver/OvsdbControllerAdapter.java
@@ -0,0 +1,75 @@
+/*
+ * 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.ovsdb.controller.driver;
+
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.TpPort;
+import org.onosproject.ovsdb.controller.OvsdbClientService;
+import org.onosproject.ovsdb.controller.OvsdbController;
+import org.onosproject.ovsdb.controller.OvsdbEventListener;
+import org.onosproject.ovsdb.controller.OvsdbNodeId;
+import org.onosproject.ovsdb.controller.OvsdbNodeListener;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Test Adapter for OvsdbController.
+ */
+public class OvsdbControllerAdapter implements OvsdbController {
+    protected ConcurrentHashMap<OvsdbNodeId, OvsdbClientServiceAdapter> ovsdbClients =
+            new ConcurrentHashMap<OvsdbNodeId, OvsdbClientServiceAdapter>();
+
+    @Override
+    public void addNodeListener(OvsdbNodeListener listener) {
+
+    }
+
+    @Override
+    public void removeNodeListener(OvsdbNodeListener listener) {
+
+    }
+
+    @Override
+    public void addOvsdbEventListener(OvsdbEventListener listener) {
+
+    }
+
+    @Override
+    public void removeOvsdbEventListener(OvsdbEventListener listener) {
+
+    }
+
+    @Override
+    public List<OvsdbNodeId> getNodeIds() {
+        long port = 6653;
+        return new ArrayList<OvsdbNodeId>(Arrays.asList(
+                new OvsdbNodeId(IpAddress.valueOf("127.0.0.1"), port)));
+    }
+
+    @Override
+    public OvsdbClientService getOvsdbClient(OvsdbNodeId nodeId) {
+        return ovsdbClients.get(nodeId);
+    }
+
+    @Override
+    public void connect(IpAddress ip, TpPort port) {
+
+    }
+}
diff --git a/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java b/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java
index beeaa9c..c2cbbf8 100644
--- a/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java
+++ b/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java
@@ -15,18 +15,8 @@
  */
 package org.onosproject.ovsdb.controller.impl;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.math.BigInteger;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CopyOnWriteArraySet;
-import java.util.concurrent.ExecutionException;
-
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.ImmutableList;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -68,7 +58,17 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.fasterxml.jackson.databind.JsonNode;
+import java.math.BigInteger;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.ExecutionException;
+
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * The implementation of OvsdbController.
@@ -134,8 +134,7 @@
 
     @Override
     public List<OvsdbNodeId> getNodeIds() {
-        // TODO Auto-generated method stub
-        return null;
+        return ImmutableList.copyOf(ovsdbClients.keySet());
     }
 
     @Override
@@ -210,8 +209,8 @@
      * Processes table updates.
      *
      * @param clientService OvsdbClientService instance
-     * @param updates TableUpdates instance
-     * @param dbName ovsdb database name
+     * @param updates       TableUpdates instance
+     * @param dbName        ovsdb database name
      */
     private void processTableUpdates(OvsdbClientService clientService,
                                      TableUpdates updates, String dbName)
@@ -242,8 +241,8 @@
                         Row row = clientService.getRow(OvsdbConstant.DATABASENAME, tableName, uuid.value());
                         dispatchInterfaceEvent(clientService,
                                                row,
-                                          OvsdbEvent.Type.PORT_REMOVED,
-                                          dbSchema);
+                                               OvsdbEvent.Type.PORT_REMOVED,
+                                               dbSchema);
                     }
                     clientService.removeRow(dbName, tableName, uuid.value());
                 }
@@ -255,10 +254,10 @@
      * Dispatches event to the north.
      *
      * @param clientService OvsdbClientService instance
-     * @param newRow a new row
-     * @param oldRow an old row
-     * @param eventType type of event
-     * @param dbSchema ovsdb database schema
+     * @param newRow        a new row
+     * @param oldRow        an old row
+     * @param eventType     type of event
+     * @param dbSchema      ovsdb database schema
      */
     private void dispatchInterfaceEvent(OvsdbClientService clientService,
                                         Row row,
@@ -283,13 +282,13 @@
         }
 
         EventSubject eventSubject = new DefaultEventSubject(MacAddress.valueOf(
-                                                                               macAndIfaceId[0]),
+                macAndIfaceId[0]),
                                                             new HashSet<IpAddress>(),
                                                             new OvsdbPortName(intf
-                                                                    .getName()),
+                                                                                      .getName()),
                                                             new OvsdbPortNumber(localPort),
                                                             new OvsdbDatapathId(Long
-                                                                    .toString(dpid)),
+                                                                                        .toString(dpid)),
                                                             new OvsdbPortType(portType),
                                                             new OvsdbIfaceId(macAndIfaceId[1]));
         for (OvsdbEventListener listener : ovsdbEventListener) {
@@ -315,7 +314,7 @@
 
         String attachedMac = externalIds.get(OvsdbConstant.EXTERNAL_ID_VM_MAC);
         if (attachedMac == null) {
-            log.warn("The attachedMac is null");
+            log.debug("The attachedMac is null"); //FIXME why always null?
             return null;
         }
         String ifaceid = externalIds
@@ -324,7 +323,7 @@
             log.warn("The ifaceid is null");
             return null;
         }
-        return new String[] {attachedMac, ifaceid};
+        return new String[]{attachedMac, ifaceid};
     }
 
     /**
@@ -349,7 +348,7 @@
      * Gets datapathid from table bridge.
      *
      * @param clientService OvsdbClientService instance
-     * @param dbSchema ovsdb database schema
+     * @param dbSchema      ovsdb database schema
      * @return datapathid the bridge datapathid
      */
     private long getDataPathid(OvsdbClientService clientService,
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Row.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Row.java
index 3326922..0060960 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Row.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/notation/Row.java
@@ -15,20 +15,21 @@
  */
 package org.onosproject.ovsdb.rfc.notation;
 
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
+import com.google.common.collect.Maps;
 
 import java.util.Collection;
 import java.util.Map;
 import java.util.Objects;
 
-import com.google.common.collect.Maps;
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Row is the basic element of the OpenVswitch's table.
  */
 public final class Row {
     private String tableName;
+    private UUID uuid;
     private Map<String, Column> columns;
 
     /**
@@ -40,9 +41,11 @@
 
     /**
      * Row constructor.
+     *
      * @param tableName table name
      */
-    public Row(String tableName) {
+    @Deprecated
+    private Row(String tableName) {
         checkNotNull(tableName, "tableName cannot be null");
         this.tableName = tableName;
         this.columns = Maps.newHashMap();
@@ -50,18 +53,22 @@
 
     /**
      * Row constructor.
+     *
      * @param tableName table name
-     * @param columns Map of Column entity
+     * @param columns   Map of Column entity
      */
-    public Row(String tableName, Map<String, Column> columns) {
+    public Row(String tableName, UUID uuid, Map<String, Column> columns) {
         checkNotNull(tableName, "table name cannot be null");
+        checkNotNull(uuid, "uuid cannot be null");
         checkNotNull(columns, "columns cannot be null");
         this.tableName = tableName;
+        this.uuid = uuid;
         this.columns = columns;
     }
 
     /**
      * Returns tableName.
+     *
      * @return tableName
      */
     public String tableName() {
@@ -70,6 +77,7 @@
 
     /**
      * Set tableName value.
+     *
      * @param tableName table name
      */
     public void setTableName(String tableName) {
@@ -77,7 +85,26 @@
     }
 
     /**
+     * Returns uuid.
+     *
+     * @return uuid
+     */
+    public UUID uuid() {
+        return uuid;
+    }
+
+    /**
+     * Sets uuid value.
+     *
+     * @param uuid new uuid
+     */
+    public void setUuid(UUID uuid) {
+        this.uuid = uuid;
+    }
+
+    /**
      * Returns Column by ColumnSchema.
+     *
      * @param columnName column name
      * @return Column
      */
@@ -87,6 +114,7 @@
 
     /**
      * Returns Collection of Column.
+     *
      * @return Collection of Column
      */
     public Collection<Column> getColumns() {
@@ -95,8 +123,9 @@
 
     /**
      * add Column.
+     *
      * @param columnName column name
-     * @param data Column entity
+     * @param data       Column entity
      */
     public void addColumn(String columnName, Column data) {
         this.columns.put(columnName, data);
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Bridge.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Bridge.java
index bd589f0..0b5ffef 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Bridge.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/Bridge.java
@@ -15,16 +15,17 @@
  */
 package org.onosproject.ovsdb.rfc.table;
 
-import java.util.Map;
-import java.util.Set;
-
 import org.onosproject.ovsdb.rfc.notation.Column;
+import org.onosproject.ovsdb.rfc.notation.OvsdbSet;
 import org.onosproject.ovsdb.rfc.notation.Row;
 import org.onosproject.ovsdb.rfc.notation.UUID;
 import org.onosproject.ovsdb.rfc.schema.DatabaseSchema;
 import org.onosproject.ovsdb.rfc.tableservice.AbstractOvsdbTableService;
 import org.onosproject.ovsdb.rfc.tableservice.ColumnDescription;
 
+import java.util.Map;
+import java.util.Set;
+
 /**
  * This class provides operations of Bridge Table.
  */
@@ -351,7 +352,7 @@
      * of attributes.
      * @param controller the column data which column name is "controller"
      */
-    public void setController(Set<UUID> controller) {
+    public void setController(OvsdbSet controller) {
         ColumnDescription columndesc = new ColumnDescription(
                                                              BridgeColumn.CONTROLLER
                                                                      .columnName(),
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/TableGenerator.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/TableGenerator.java
index c1ae7c7..f5bd860 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/TableGenerator.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/table/TableGenerator.java
@@ -37,6 +37,7 @@
      * @param tableName table name
      * @return Object table entity
      */
+    //FIXME change the name, it creates a row object, such as a controller.
     public static Object createTable(DatabaseSchema dbSchema,
                                      OvsdbTable tableName) {
         Row row = new Row();
diff --git a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/FromJsonUtil.java b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/FromJsonUtil.java
index 9744fb4..1dcf48f 100644
--- a/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/FromJsonUtil.java
+++ b/ovsdb/rfc/src/main/java/org/onosproject/ovsdb/rfc/utils/FromJsonUtil.java
@@ -15,12 +15,11 @@
  */
 package org.onosproject.ovsdb.rfc.utils;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import org.onosproject.ovsdb.rfc.exception.AbnormalJsonNodeException;
 import org.onosproject.ovsdb.rfc.exception.UnsupportedException;
 import org.onosproject.ovsdb.rfc.jsonrpc.Callback;
@@ -41,11 +40,11 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 
 /**
  * JsonNode utility class. convert JsonNode into Object.
@@ -247,7 +246,7 @@
         validateJsonNode(rowsNode, "rows");
         ArrayList<Row> rows = Lists.newArrayList();
         for (JsonNode rowNode : rowsNode.get("rows")) {
-            rows.add(createRow(tableSchema, rowNode));
+            rows.add(createRow(tableSchema, null, rowNode)); //FIXME null will throw exception
         }
         return rows;
     }
@@ -285,8 +284,8 @@
             UUID uuid = UUID.uuid(uuidStr);
             JsonNode newR = oldNewRow.getValue().get("new");
             JsonNode oldR = oldNewRow.getValue().get("old");
-            Row newRow = newR != null ? createRow(tableSchema, newR) : null;
-            Row oldRow = oldR != null ? createRow(tableSchema, oldR) : null;
+            Row newRow = newR != null ? createRow(tableSchema, uuid, newR) : null;
+            Row oldRow = oldR != null ? createRow(tableSchema, uuid, oldR) : null;
             RowUpdate rowUpdate = new RowUpdate(uuid, oldRow, newRow);
             rows.put(uuid, rowUpdate);
         }
@@ -299,7 +298,7 @@
      * @param rowNode JsonNode
      * @return Row
      */
-    private static Row createRow(TableSchema tableSchema, JsonNode rowNode) {
+    private static Row createRow(TableSchema tableSchema, UUID uuid, JsonNode rowNode) {
         if (tableSchema == null) {
             return null;
         }
@@ -314,7 +313,7 @@
                 columns.put(columnName, new Column(columnName, obj));
             }
         }
-        return new Row(tableSchema.name(), columns);
+        return new Row(tableSchema.name(), uuid, columns);
     }
 
 }
diff --git a/tools/test/cells/andrea b/tools/test/cells/andrea
index 0d93b18..1f9f22f 100644
--- a/tools/test/cells/andrea
+++ b/tools/test/cells/andrea
@@ -8,4 +8,4 @@
 
 export OCT=$OC1
 export ONOS_USE_SSH=true
-export ONOS_APPS=drivers,openflow,proxyarp,mobility
+export ONOS_APPS=drivers,openflow,proxyarp,ovsdb
