diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncStateCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncStateCommand.java
index 29823ae..9f3f4a7 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncStateCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncStateCommand.java
@@ -243,13 +243,7 @@
         StringBuilder endpointSb = new StringBuilder();
         endpointSb.append(auth.protocol().name().toLowerCase());
         endpointSb.append("://");
-
-        if (node.managementIp() == null) {
-            endpointSb.append(node.hostname());
-        } else {
-            endpointSb.append(node.managementIp());
-        }
-
+        endpointSb.append(node.endPoint());
         endpointSb.append(":");
         endpointSb.append(auth.port());
         endpointSb.append("/");
diff --git a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNode.java b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNode.java
index 25b795c..14acbea 100644
--- a/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNode.java
+++ b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/OpenstackNode.java
@@ -193,6 +193,13 @@
     OpenstackAuth authentication();
 
     /**
+     * Returns the endpoint URL info.
+     *
+     * @return keystone authentication info
+     */
+    String endPoint();
+
+    /**
      * Builder of new node entities.
      */
     interface Builder {
@@ -283,6 +290,14 @@
          * @return openstack node builder
          */
         Builder authentication(OpenstackAuth auth);
+
+        /**
+         * Returns openstack node builder with supplied endpoint info.
+         *
+         * @param endPoint endpoint info
+         * @return openstack node builder
+         */
+        Builder endPoint(String endPoint);
     }
 }
 
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackNodeCodec.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackNodeCodec.java
index cf7a150..31f32bf 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackNodeCodec.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackNodeCodec.java
@@ -56,6 +56,7 @@
     private static final String STATE = "state";
     private static final String PHYSICAL_INTERFACES = "phyIntfs";
     private static final String AUTHENTICATION = "authentication";
+    private static final String END_POINT = "endPoint";
 
     private static final String MISSING_MESSAGE = " is required in OpenstackNode";
 
@@ -66,7 +67,8 @@
         ObjectNode result = context.mapper().createObjectNode()
                 .put(HOST_NAME, node.hostname())
                 .put(TYPE, node.type().name())
-                .put(STATE, node.state().name());
+                .put(STATE, node.state().name())
+                .put(MANAGEMENT_IP, node.managementIp().toString());
 
         OpenstackNode.NodeType type = node.type();
 
@@ -75,12 +77,9 @@
         }
 
         if (type != OpenstackNode.NodeType.CONTROLLER) {
-            result.put(MANAGEMENT_IP, node.managementIp().toString());
             result.put(INTEGRATION_BRIDGE, node.intgBridge().toString());
         } else {
-            if (node.managementIp() != null) {
-                result.put(MANAGEMENT_IP, node.managementIp().toString());
-            }
+            result.put(END_POINT, node.endPoint());
         }
 
         if (node.vlanIntf() != null) {
@@ -120,11 +119,14 @@
                 HOST_NAME + MISSING_MESSAGE);
         String type = nullIsIllegal(json.get(TYPE).asText(),
                 TYPE + MISSING_MESSAGE);
+        String mIp = nullIsIllegal(json.get(MANAGEMENT_IP).asText(),
+                MANAGEMENT_IP + MISSING_MESSAGE);
 
         DefaultOpenstackNode.Builder nodeBuilder = DefaultOpenstackNode.builder()
                 .hostname(hostname)
                 .type(OpenstackNode.NodeType.valueOf(type))
-                .state(NodeState.INIT);
+                .state(NodeState.INIT)
+                .managementIp(IpAddress.valueOf(mIp));
 
         if (type.equals(GATEWAY)) {
             nodeBuilder.uplinkPort(nullIsIllegal(json.get(UPLINK_PORT).asText(),
@@ -134,14 +136,10 @@
             String iBridge = nullIsIllegal(json.get(INTEGRATION_BRIDGE).asText(),
                     INTEGRATION_BRIDGE + MISSING_MESSAGE);
             nodeBuilder.intgBridge(DeviceId.deviceId(iBridge));
-
-            String mIp = nullIsIllegal(json.get(MANAGEMENT_IP).asText(),
-                    MANAGEMENT_IP + MISSING_MESSAGE);
-            nodeBuilder.managementIp(IpAddress.valueOf(mIp));
         } else {
-            if (json.get(MANAGEMENT_IP) != null) {
-                nodeBuilder.managementIp(IpAddress.valueOf(json.get(MANAGEMENT_IP).asText()));
-            }
+            String endPoint = nullIsIllegal(json.get(END_POINT).asText(),
+                    END_POINT + MISSING_MESSAGE);
+            nodeBuilder.endPoint(endPoint);
         }
         if (json.get(VLAN_INTF_NAME) != null) {
             nodeBuilder.vlanIntf(json.get(VLAN_INTF_NAME).asText());
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNode.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNode.java
index aad1fbb..73c8e1b 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNode.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNode.java
@@ -58,6 +58,7 @@
     private final NodeState state;
     private final Collection<OpenstackPhyInterface> phyIntfs;
     private final OpenstackAuth auth;
+    private final String endPoint;
 
     private static final String NOT_NULL_MSG = "Node % cannot be null";
 
@@ -76,6 +77,7 @@
      * @param state         node state
      * @param phyIntfs      physical interfaces
      * @param auth          keystone authentication info
+     * @param endPoint      openstack endpoint URL
      */
     protected DefaultOpenstackNode(String hostname, NodeType type,
                                    DeviceId intgBridge,
@@ -85,7 +87,8 @@
                                    String uplinkPort,
                                    NodeState state,
                                    Collection<OpenstackPhyInterface> phyIntfs,
-                                   OpenstackAuth auth) {
+                                   OpenstackAuth auth,
+                                   String endPoint) {
         this.hostname = hostname;
         this.type = type;
         this.intgBridge = intgBridge;
@@ -96,6 +99,7 @@
         this.state = state;
         this.phyIntfs = phyIntfs;
         this.auth = auth;
+        this.endPoint = endPoint;
     }
 
     @Override
@@ -235,7 +239,8 @@
                     Objects.equals(uplinkPort, that.uplinkPort) &&
                     Objects.equals(vlanIntf, that.vlanIntf) &&
                     Objects.equals(phyIntfs, that.phyIntfs) &&
-                    Objects.equals(auth, that.auth);
+                    Objects.equals(auth, that.auth) &&
+                    Objects.equals(endPoint, that.endPoint);
         }
         return false;
     }
@@ -250,7 +255,8 @@
                 vlanIntf,
                 uplinkPort,
                 phyIntfs,
-                auth);
+                auth,
+                endPoint);
     }
 
     @Override
@@ -266,6 +272,7 @@
                 .add("state", state)
                 .add("phyIntfs", phyIntfs)
                 .add("auth", auth)
+                .add("endpoint", endPoint)
                 .toString();
     }
 
@@ -282,6 +289,7 @@
                 .state(newState)
                 .phyIntfs(phyIntfs)
                 .authentication(auth)
+                .endPoint(endPoint)
                 .build();
     }
 
@@ -319,6 +327,11 @@
         return auth;
     }
 
+    @Override
+    public String endPoint() {
+        return endPoint;
+    }
+
     /**
      * Returns new builder instance.
      *
@@ -345,7 +358,8 @@
                 .uplinkPort(osNode.uplinkPort())
                 .state(osNode.state())
                 .phyIntfs(osNode.phyIntfs())
-                .authentication(osNode.authentication());
+                .authentication(osNode.authentication())
+                .endPoint(osNode.endPoint());
     }
 
     /**
@@ -363,6 +377,7 @@
         private NodeState state;
         private Collection<OpenstackPhyInterface> phyIntfs;
         private OpenstackAuth auth;
+        private String endPoint;
 
         // private constructor not intended to use from external
         private Builder() {
@@ -373,16 +388,17 @@
             checkArgument(hostname != null, NOT_NULL_MSG, "hostname");
             checkArgument(type != null, NOT_NULL_MSG, "type");
             checkArgument(state != null, NOT_NULL_MSG, "state");
+            checkArgument(managementIp != null, NOT_NULL_MSG, "management IP");
 
             if (type != NodeType.CONTROLLER) {
-                checkArgument(managementIp != null, NOT_NULL_MSG, "management IP");
-
                 checkArgument(intgBridge != null, NOT_NULL_MSG, "integration bridge");
 
                 if (dataIp == null && Strings.isNullOrEmpty(vlanIntf)) {
                     throw new IllegalArgumentException("Either data IP or VLAN interface is required");
                 }
             } else {
+                checkArgument(endPoint != null, NOT_NULL_MSG, "endpoint URL");
+
                 // we force controller node to have COMPLETE state for now
                 state = NodeState.COMPLETE;
             }
@@ -400,7 +416,8 @@
                     uplinkPort,
                     state,
                     phyIntfs,
-                    auth);
+                    auth,
+                    endPoint);
         }
 
         @Override
@@ -464,6 +481,12 @@
             this.auth = auth;
             return this;
         }
+
+        @Override
+        public Builder endPoint(String endPoint) {
+            this.endPoint = endPoint;
+            return this;
+        }
     }
 }
 
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 5019234..da4680c 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
@@ -155,6 +155,7 @@
                 .type(OpenstackNode.NodeType.CONTROLLER)
                 .state(NodeState.INIT)
                 .managementIp(IpAddress.valueOf("172.16.130.10"))
+                .endPoint("keystone-end-point-url")
                 .authentication(auth)
                 .build();
 
@@ -172,6 +173,7 @@
         assertThat(node.hostname(), is("controller"));
         assertThat(node.type().name(), is("CONTROLLER"));
         assertThat(node.managementIp().toString(), is("172.16.130.10"));
+        assertThat(node.endPoint(), is("keystone-end-point-url"));
 
         OpenstackAuth auth = node.authentication();
 
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 ac1d471..603edac 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
@@ -37,6 +37,7 @@
     private static final String STATE = "state";
     private static final String PHYSICAL_INTERFACES = "phyIntfs";
     private static final String AUTHENTICATION = "authentication";
+    private static final String END_POINT = "endPoint";
 
     private OpenstackNodeJsonMatcher(OpenstackNode node) {
         this.node = node;
@@ -117,6 +118,16 @@
             }
         }
 
+        // check endpoint URL
+        JsonNode jsonEndPoint = jsonNode.get(END_POINT);
+        if (jsonEndPoint != null) {
+            String endPoint = node.endPoint();
+            if (!jsonEndPoint.asText().equals(endPoint)) {
+                description.appendText("endpoint URL was " + jsonEndPoint);
+                return false;
+            }
+        }
+
         // check physical interfaces
         JsonNode jsonPhyIntfs = jsonNode.get(PHYSICAL_INTERFACES);
         if (jsonPhyIntfs != null) {
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 ff59237..b07044f 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
@@ -408,7 +408,7 @@
                 intgBridge.id(),
                 ipAddr,
                 ipAddr,
-                null, null, state, phyIntfs, null);
+                null, null, state, phyIntfs, null, null);
     }
 
     private static OpenstackNode createGatewayNode(String hostname,
@@ -423,7 +423,7 @@
                 intgBridge.id(),
                 ipAddr,
                 ipAddr,
-                null, uplinkPort, state, null, null);
+                null, uplinkPort, state, null, null, null);
     }
 
     private static final class TestDevice extends DefaultDevice {
@@ -482,7 +482,8 @@
                                   String uplinkPort,
                                   NodeState state,
                                   Set<OpenstackPhyInterface> phyIntfs,
-                                  OpenstackAuth auth) {
+                                  OpenstackAuth auth,
+                                  String endPoint) {
             super(hostname,
                     type,
                     intgBridge,
@@ -492,7 +493,8 @@
                     uplinkPort,
                     state,
                     phyIntfs,
-                    auth);
+                    auth,
+                    endPoint);
         }
 
         @Override
diff --git a/apps/openstacknode/app/src/test/resources/org/onosproject/openstacknode/codec/OpenstackControllerNode.json b/apps/openstacknode/app/src/test/resources/org/onosproject/openstacknode/codec/OpenstackControllerNode.json
index 8745d27..705a977 100644
--- a/apps/openstacknode/app/src/test/resources/org/onosproject/openstacknode/codec/OpenstackControllerNode.json
+++ b/apps/openstacknode/app/src/test/resources/org/onosproject/openstacknode/codec/OpenstackControllerNode.json
@@ -2,6 +2,7 @@
   "hostname": "controller",
   "type": "CONTROLLER",
   "managementIp": "172.16.130.10",
+  "endPoint": "keystone-end-point-url",
   "authentication": {
     "version": "v2.0",
     "port": 35357,
