diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackControllerJsonMatcher.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackControllerJsonMatcher.java
new file mode 100644
index 0000000..0d1340c
--- /dev/null
+++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackControllerJsonMatcher.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.openstacknode.codec;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeDiagnosingMatcher;
+import org.onosproject.net.behaviour.ControllerInfo;
+
+/**
+ * Hamcrest matcher for openstack controller.
+ */
+public final class OpenstackControllerJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
+
+    private final ControllerInfo controller;
+    private static final String IP = "ip";
+    private static final String PORT = "port";
+
+    private OpenstackControllerJsonMatcher(ControllerInfo controller) {
+        this.controller = controller;
+    }
+
+    @Override
+    protected boolean matchesSafely(JsonNode jsonNode, Description description) {
+
+        // check IP address
+        String jsonIp = jsonNode.get(IP).asText();
+        String ip = controller.ip().toString();
+        if (!jsonIp.equals(ip)) {
+            description.appendText("controller IP was " + jsonIp);
+            return false;
+        }
+
+        // check port
+        int jsonPort = jsonNode.get(PORT).asInt();
+        int port = controller.port();
+
+        if (jsonPort != port) {
+            description.appendText("controller port was " + jsonPort);
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public void describeTo(Description description) {
+        description.appendText(controller.toString());
+    }
+
+    /**
+     * Factory to allocate an openstack controller matcher.
+     *
+     * @param controller openstack controller object we are looking for
+     * @return matcher
+     */
+    public static OpenstackControllerJsonMatcher
+                    matchesOpenstackController(ControllerInfo controller) {
+        return new OpenstackControllerJsonMatcher(controller);
+    }
+}
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackNodeCodecTest.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackNodeCodecTest.java
index 3f9fcb4..7d504d3 100644
--- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackNodeCodecTest.java
+++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackNodeCodecTest.java
@@ -28,6 +28,7 @@
 import org.onosproject.codec.impl.CodecManager;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.behaviour.ControllerInfo;
 import org.onosproject.openstacknode.api.NodeState;
 import org.onosproject.openstacknode.api.OpenstackAuth;
 import org.onosproject.openstacknode.api.OpenstackNode;
@@ -57,6 +58,7 @@
     MockCodecContext context;
     JsonCodec<OpenstackNode> openstackNodeCodec;
     JsonCodec<OpenstackPhyInterface> openstackPhyIntfJsonCodec;
+    JsonCodec<ControllerInfo> openstackControllerJsonCodec;
     JsonCodec<OpenstackAuth> openstackAuthJsonCodec;
     final CoreService mockCoreService = createMock(CoreService.class);
     private static final String REST_APP_ID = "org.onosproject.rest";
@@ -66,10 +68,12 @@
         context = new MockCodecContext();
         openstackNodeCodec = new OpenstackNodeCodec();
         openstackPhyIntfJsonCodec = new OpenstackPhyInterfaceCodec();
+        openstackControllerJsonCodec = new OpenstackControllerCodec();
         openstackAuthJsonCodec = new OpenstackAuthCodec();
 
         assertThat(openstackNodeCodec, notNullValue());
         assertThat(openstackPhyIntfJsonCodec, notNullValue());
+        assertThat(openstackControllerJsonCodec, notNullValue());
         assertThat(openstackAuthJsonCodec, notNullValue());
 
         expect(mockCoreService.registerApplication(REST_APP_ID))
@@ -93,6 +97,11 @@
                                 .intf("eth4")
                                 .build();
 
+        ControllerInfo controller1 =
+                new ControllerInfo(IpAddress.valueOf("10.10.10.2"), 6653, "tcp");
+        ControllerInfo controller2 =
+                new ControllerInfo(IpAddress.valueOf("10.10.10.3"), 6663, "tcp");
+
         OpenstackNode node = DefaultOpenstackNode.builder()
                                 .hostname("compute")
                                 .type(OpenstackNode.NodeType.COMPUTE)
@@ -102,6 +111,7 @@
                                 .vlanIntf("vxlan")
                                 .dataIp(IpAddress.valueOf("20.20.20.2"))
                                 .phyIntfs(ImmutableList.of(phyIntf1, phyIntf2))
+                                .controllers(ImmutableList.of(controller1, controller2))
                                 .build();
 
         ObjectNode nodeJson = openstackNodeCodec.encode(node, context);
@@ -124,6 +134,7 @@
         assertThat(node.intgBridge().toString(), is("of:00000000000000a1"));
         assertThat(node.vlanIntf(), is("eth2"));
         assertThat(node.phyIntfs().size(), is(2));
+        assertThat(node.controllers().size(), is(2));
 
         node.phyIntfs().forEach(intf -> {
             if (intf.network().equals("mgmtnetwork")) {
@@ -133,6 +144,15 @@
                 assertThat(intf.intf(), is("eth4"));
             }
         });
+
+        node.controllers().forEach(ctrl -> {
+            if (ctrl.ip().toString().equals("10.10.10.2")) {
+                assertThat(ctrl.port(), is(6653));
+            }
+            if (ctrl.ip().toString().equals("10.10.10.3")) {
+                assertThat(ctrl.port(), is(6663));
+            }
+        });
     }
 
     /**
@@ -228,6 +248,9 @@
             if (entityClass == OpenstackPhyInterface.class) {
                 return (JsonCodec<T>) openstackPhyIntfJsonCodec;
             }
+            if (entityClass == ControllerInfo.class) {
+                return (JsonCodec<T>) openstackControllerJsonCodec;
+            }
             if (entityClass == OpenstackAuth.class) {
                 return (JsonCodec<T>) openstackAuthJsonCodec;
             }
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackNodeJsonMatcher.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackNodeJsonMatcher.java
index 603edac..d715865 100644
--- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackNodeJsonMatcher.java
+++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackNodeJsonMatcher.java
@@ -18,6 +18,7 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeDiagnosingMatcher;
+import org.onosproject.net.behaviour.ControllerInfo;
 import org.onosproject.openstacknode.api.Constants;
 import org.onosproject.openstacknode.api.OpenstackAuth;
 import org.onosproject.openstacknode.api.OpenstackNode;
@@ -36,6 +37,7 @@
     private static final String INTEGRATION_BRIDGE = "integrationBridge";
     private static final String STATE = "state";
     private static final String PHYSICAL_INTERFACES = "phyIntfs";
+    private static final String CONTROLLERS = "controllers";
     private static final String AUTHENTICATION = "authentication";
     private static final String END_POINT = "endPoint";
 
@@ -154,6 +156,32 @@
             }
         }
 
+        // check controllers
+        JsonNode jsonControllers = jsonNode.get(CONTROLLERS);
+        if (jsonControllers != null) {
+            if (jsonControllers.size() != node.controllers().size()) {
+                description.appendText("controllers size was " + jsonControllers.size());
+                return false;
+            }
+
+            for (ControllerInfo controller : node.controllers()) {
+                boolean ctrlFound = false;
+                for (int ctrlIndex = 0; ctrlIndex < jsonControllers.size(); ctrlIndex++) {
+                    OpenstackControllerJsonMatcher ctrlMatcher =
+                            OpenstackControllerJsonMatcher.matchesOpenstackController(controller);
+                    if (ctrlMatcher.matches(jsonControllers.get(ctrlIndex))) {
+                        ctrlFound = true;
+                        break;
+                    }
+                }
+
+                if (!ctrlFound) {
+                    description.appendText("Controller not found " + controller.toString());
+                    return false;
+                }
+            }
+        }
+
         return true;
     }
 
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackPhyInterfaceJsonMatcher.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackPhyInterfaceJsonMatcher.java
index 09955bd..6a4cce7 100644
--- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackPhyInterfaceJsonMatcher.java
+++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackPhyInterfaceJsonMatcher.java
@@ -20,6 +20,9 @@
 import org.hamcrest.TypeSafeDiagnosingMatcher;
 import org.onosproject.openstacknode.api.OpenstackPhyInterface;
 
+/**
+ * Hamcrest matcher for openstack physical interface.
+ */
 public final class OpenstackPhyInterfaceJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNode> {
 
     private final OpenstackPhyInterface phyIntf;
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandlerTest.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandlerTest.java
index 4305cc3..92c7615 100644
--- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandlerTest.java
+++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandlerTest.java
@@ -49,6 +49,7 @@
 import org.onosproject.net.behaviour.BridgeConfig;
 import org.onosproject.net.behaviour.BridgeDescription;
 import org.onosproject.net.behaviour.BridgeName;
+import org.onosproject.net.behaviour.ControllerInfo;
 import org.onosproject.net.behaviour.DefaultBridgeDescription;
 import org.onosproject.net.behaviour.ExtensionTreatmentResolver;
 import org.onosproject.net.behaviour.InterfaceConfig;
@@ -152,6 +153,10 @@
     private static final Set<OpenstackPhyInterface> COMPUTE_2_PHY_INTFS = createPhyIntfs();
     private static final Set<OpenstackPhyInterface> COMPUTE_3_PHY_INTFS = createPhyIntfs();
 
+    private static final Set<ControllerInfo> COMPUTE_1_CONTROLLERS = createControllers();
+    private static final Set<ControllerInfo> COMPUTE_2_CONTROLLERS = createControllers();
+    private static final Set<ControllerInfo> COMPUTE_3_CONTROLLERS = createControllers();
+
     private static final Device COMPUTE_1_INTG_DEVICE = createOpenFlowDevice(1, INTEGRATION_BRIDGE);
     private static final Device COMPUTE_2_INTG_DEVICE = createOpenFlowDevice(2, INTEGRATION_BRIDGE);
     private static final Device COMPUTE_3_INTG_DEVICE = createOpenFlowDevice(3, INTEGRATION_BRIDGE);
@@ -170,7 +175,8 @@
             COMPUTE_1_INTG_DEVICE,
             COMPUTE_1_IP,
             INIT,
-            COMPUTE_1_PHY_INTFS
+            COMPUTE_1_PHY_INTFS,
+            COMPUTE_1_CONTROLLERS
     );
 
     private static final OpenstackNode COMPUTE_2 = createNode(
@@ -179,7 +185,8 @@
             COMPUTE_2_INTG_DEVICE,
             COMPUTE_2_IP,
             DEVICE_CREATED,
-            COMPUTE_2_PHY_INTFS
+            COMPUTE_2_PHY_INTFS,
+            COMPUTE_2_CONTROLLERS
     );
 
     private static final OpenstackNode COMPUTE_3 = createNode(
@@ -188,7 +195,8 @@
             COMPUTE_3_INTG_DEVICE,
             COMPUTE_3_IP,
             COMPLETE,
-            COMPUTE_3_PHY_INTFS
+            COMPUTE_3_PHY_INTFS,
+            COMPUTE_3_CONTROLLERS
     );
 
     private static final OpenstackNode GATEWAY_1 = createGatewayNode(
@@ -397,19 +405,24 @@
         return Sets.newConcurrentHashSet();
     }
 
+    private static Set<ControllerInfo> createControllers() {
+        return Sets.newConcurrentHashSet();
+    }
+
     private static OpenstackNode createNode(String hostname,
                                             OpenstackNode.NodeType type,
                                             Device intgBridge,
                                             IpAddress ipAddr,
                                             NodeState state,
-                                            Set<OpenstackPhyInterface> phyIntfs) {
+                                            Set<OpenstackPhyInterface> phyIntfs,
+                                            Set<ControllerInfo> controllers) {
         return new TestOpenstackNode(
                 hostname,
                 type,
                 intgBridge.id(),
                 ipAddr,
                 ipAddr,
-                null, null, state, phyIntfs, null, null);
+                null, null, state, phyIntfs, controllers, null, null);
     }
 
     private static OpenstackNode createGatewayNode(String hostname,
@@ -424,7 +437,7 @@
                 intgBridge.id(),
                 ipAddr,
                 ipAddr,
-                null, uplinkPort, state, null, null, null);
+                null, uplinkPort, state, null, null, null, null);
     }
 
     private static final class TestDevice extends DefaultDevice {
@@ -483,6 +496,7 @@
                                   String uplinkPort,
                                   NodeState state,
                                   Set<OpenstackPhyInterface> phyIntfs,
+                                  Set<ControllerInfo> controllers,
                                   OpenstackAuth auth,
                                   String endPoint) {
             super(hostname,
@@ -494,6 +508,7 @@
                     uplinkPort,
                     state,
                     phyIntfs,
+                    controllers,
                     auth,
                     endPoint);
         }
