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 833f5fe..f2ff070 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
@@ -93,18 +93,24 @@
     Set<ControllerInfo> getControllers(DeviceId openflowDeviceId);
 
     /**
-     * sets the controllers of the node to the ones passed in the list.
+     * Sets the Controllers for the specified bridge.
+     * <p/>
+     * This method will replace the existing controller list with the new controller
+     * list.
      *
-     * @param bridgeUuid  UUid for the bridge we are settings the controls on
-     * @param controllers of controllers; empty if no controller is find
+     * @param bridgeUuid bridge uuid
+     * @param controllers list of controllers
      */
     void setControllersWithUUID(UUID bridgeUuid, List<ControllerInfo> controllers);
 
     /**
-     * sets the controllers of the node to the ones passed in the list.
+     * Sets the Controllers for the specified device.
+     * <p/>
+     * This method will replace the existing controller list with the new controller
+     * list.
      *
-     * @param deviceId  deviceId for the bridge we are settings the controls on
-     * @param controllers of controllers; empty if no controller is find
+     * @param deviceId device id (likely Openflow device)
+     * @param controllers list of controllers
      */
     void setControllersWithDeviceId(DeviceId deviceId, List<ControllerInfo> controllers);
 
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 690b5c1..3a84d00 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
@@ -17,6 +17,7 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.base.Function;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
@@ -481,30 +482,21 @@
     }
 
     /**
-     * Sets the Controller.
+     * Sets the bridge's controller automatically.
+     * <p/>
+     * The connection is a TCP connection to the local ONOS instance's IP
+     * and the default OpenFlow port.
      *
      * @param bridgeUuid bridge uuid
      */
     private void setControllerAuto(String bridgeUuid) {
-        String controllerUuid = null;
-        String iPAddress = IpAddress.valueOf(((InetSocketAddress) channel
-                .localAddress())
-                                                     .getAddress()
-                                                     .getHostAddress())
-                .toString();
-
-        String target = "tcp:" + iPAddress + ":" + OvsdbConstant.OFPORT;
-        log.debug("controller IP {}: port {}", iPAddress, OvsdbConstant.OFPORT);
-
-        setController(bridgeUuid, target);
-
+        IpAddress ipAddress = IpAddress.valueOf(((InetSocketAddress) channel.localAddress()).getAddress());
+        ControllerInfo controllerInfo = new ControllerInfo(ipAddress, OvsdbConstant.OFPORT, "tcp");
+        log.debug("Automatically setting controller for bridge {} to {}",
+                  bridgeUuid, controllerInfo.target());
+        setControllersWithUUID(UUID.uuid(bridgeUuid), ImmutableList.of(controllerInfo));
     }
 
-    /**
-     * Sets the Controllers.
-     *
-     * @param bridgeUuid bridge uuid
-     */
     @Override
     public void setControllersWithUUID(UUID bridgeUuid, List<ControllerInfo> controllers) {
 
@@ -539,7 +531,6 @@
             return;
         }
 
-//        removeControllers.forEach(c -> controllerRowStore.deleteRow(c.getRow().uuid().value()));
         removeControllers.forEach(c -> deleteConfig(OvsdbConstant.CONTROLLER, "_uuid", c.getRow().uuid().value(),
                                                     OvsdbConstant.BRIDGE, "controller"));
 
@@ -549,16 +540,9 @@
             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));
 
         });
@@ -574,55 +558,13 @@
         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);
-            if (controllerUuid == null) {
-
-                insertConfig(OvsdbConstant.CONTROLLER, "_uuid",
-                             OvsdbConstant.BRIDGE, "controller", bridgeUuid,
-                             controller.getRow());
-
-            } else {
-
-                Bridge bridge = (Bridge) TableGenerator
-                        .createTable(dbSchema, OvsdbTable.BRIDGE);
-                Set<UUID> controllerUuids = new HashSet<>();
-                controllerUuids.add(UUID.uuid(controllerUuid));
-                bridge.setController(OvsdbSet.ovsdbSet(controllerUuids));
-                updateConfig(OvsdbConstant.CONTROLLER, "_uuid", bridgeUuid, bridge.getRow());
-
-            }
-        }
-    }
-
     @Override
     public void dropBridge(String bridgeName) {
         String bridgeUUID = getBridgeUuid(bridgeName);
