diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenStackEndPointCompleter.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenStackEndPointCompleter.java
deleted file mode 100644
index 0a42609..0000000
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenStackEndPointCompleter.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.openstacknetworking.cli;
-
-
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
-
-import java.util.List;
-import java.util.SortedSet;
-
-/**
- * OpenStack end point completer.
- */
-public class OpenStackEndPointCompleter implements Completer {
-
-    private static final String OPENSTACK_ENDPOINT_EXAMPLE_V2 =
-            "http://IP address of OpenStack end point:35357/v2.0 ProjectName ID Password [Perspective]";
-    private static final String OPENSTACK_ENDPOINT_EXAMPLE_V3 =
-            "http://IP address of OpenStack end point/identity/v3 ProjectName ID Password [Perspective]";
-    private static final String SEPARATOR = "\n or \n";
-
-    @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
-        StringsCompleter delegate = new StringsCompleter();
-
-        SortedSet<String> strings = delegate.getStrings();
-
-        strings.add(OPENSTACK_ENDPOINT_EXAMPLE_V2);
-        strings.add(SEPARATOR);
-        strings.add(OPENSTACK_ENDPOINT_EXAMPLE_V3);
-
-        return delegate.complete(buffer, cursor, candidates);
-    }
-}
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 d85f39e..b1e57be 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
@@ -17,12 +17,14 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.base.Strings;
-import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkAdminService;
 import org.onosproject.openstacknetworking.api.OpenstackRouterAdminService;
 import org.onosproject.openstacknetworking.api.OpenstackSecurityGroupAdminService;
+import org.onosproject.openstacknode.api.OpenstackAuth;
+import org.onosproject.openstacknode.api.OpenstackNode;
+import org.onosproject.openstacknode.api.OpenstackNodeService;
 import org.openstack4j.api.OSClient;
 import org.openstack4j.api.client.IOSClientBuilder;
 import org.openstack4j.api.exceptions.AuthenticationException;
@@ -43,14 +45,15 @@
 import javax.net.ssl.HttpsURLConnection;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
 import java.io.IOException;
+import java.security.cert.X509Certificate;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
-import javax.net.ssl.X509TrustManager;
-import java.security.cert.X509Certificate;
-
+import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.CONTROLLER;
 import static org.openstack4j.core.transport.ObjectMapperSingleton.getContext;
 
 /**
@@ -60,26 +63,6 @@
         description = "Synchronizes all OpenStack network states")
 public class OpenstackSyncStateCommand extends AbstractShellCommand {
 
-    @Argument(index = 0, name = "endpoint", description = "OpenStack service endpoint",
-            required = true, multiValued = false)
-    private String endpoint = null;
-
-    @Argument(index = 1, name = "tenant", description = "OpenStack admin tenant name",
-            required = true, multiValued = false)
-    private String tenant = null;
-
-    @Argument(index = 2, name = "user", description = "OpenStack admin user name",
-            required = true, multiValued = false)
-    private String user = null;
-
-    @Argument(index = 3, name = "password", description = "OpenStack admin user password",
-            required = true, multiValued = false)
-    private String password = null;
-
-    @Argument(index = 4, name = "perspective", description = "OpenStack endpoint perspective",
-            required = false, multiValued = false)
-    private String perspective = null;
-
     private static final String DOMAIN_DEFUALT = "default";
 
     private static final String SECURITY_GROUP_FORMAT = "%-40s%-20s";
@@ -100,47 +83,56 @@
         OpenstackSecurityGroupAdminService osSgAdminService = get(OpenstackSecurityGroupAdminService.class);
         OpenstackNetworkAdminService osNetAdminService = get(OpenstackNetworkAdminService.class);
         OpenstackRouterAdminService osRouterAdminService = get(OpenstackRouterAdminService.class);
+        OpenstackNodeService osNodeService = get(OpenstackNodeService.class);
+
+        Optional<OpenstackNode> node = osNodeService.nodes(CONTROLLER).stream().findFirst();
+        if (!node.isPresent()) {
+            error("Keystone auth info has not been configured. " +
+                    "Please specify auth info via network-cfg.json.");
+            return;
+        }
+
+        OpenstackAuth auth = node.get().authentication();
+        String endpoint = buildEndpoint(node.get());
+        OpenstackAuth.Perspective perspective = auth.perspective();
+
+        log.info("Access the ENDPOINT: {}, with AUTH_INFO username: {}, password: {}, project: {}",
+                endpoint, auth.username(), auth.password(), auth.project());
 
         OSClient osClient;
-
         Config config = getSslConfig();
 
         try {
-            if (endpoint != null) {
-                if (endpoint.contains(KEYSTONE_V2)) {
-                    IOSClientBuilder.V2 builder = OSFactory.builderV2()
-                            .endpoint(this.endpoint)
-                            .tenantName(this.tenant)
-                            .credentials(this.user, this.password)
-                            .withConfig(config);
+            if (endpoint.contains(KEYSTONE_V2)) {
+                IOSClientBuilder.V2 builder = OSFactory.builderV2()
+                        .endpoint(endpoint)
+                        .tenantName(auth.project())
+                        .credentials(auth.username(), auth.password())
+                        .withConfig(config);
 
-                    if (perspective != null) {
-                        builder.perspective(getFacing(perspective));
-                    }
-
-                    osClient = builder.authenticate();
-                } else if (endpoint.contains(KEYSTONE_V3)) {
-
-                    Identifier project = Identifier.byName(this.tenant);
-                    Identifier domain = Identifier.byName(DOMAIN_DEFUALT);
-
-                    IOSClientBuilder.V3 builder = OSFactory.builderV3()
-                            .endpoint(this.endpoint)
-                            .credentials(this.user, this.password, domain)
-                            .scopeToProject(project, domain)
-                            .withConfig(config);
-
-                    if (perspective != null) {
-                        builder.perspective(getFacing(perspective));
-                    }
-
-                    osClient = builder.authenticate();
-                } else {
-                    print("Unrecognized keystone version type");
-                    return;
+                if (perspective != null) {
+                    builder.perspective(getFacing(perspective));
                 }
+
+                osClient = builder.authenticate();
+            } else if (endpoint.contains(KEYSTONE_V3)) {
+
+                Identifier project = Identifier.byName(auth.project());
+                Identifier domain = Identifier.byName(DOMAIN_DEFUALT);
+
+                IOSClientBuilder.V3 builder = OSFactory.builderV3()
+                        .endpoint(endpoint)
+                        .credentials(auth.username(), auth.password(), domain)
+                        .scopeToProject(project, domain)
+                        .withConfig(config);
+
+                if (perspective != null) {
+                    builder.perspective(getFacing(perspective));
+                }
+
+                osClient = builder.authenticate();
             } else {
-                print("Need to specify a valid endpoint");
+                print("Unrecognized keystone version type");
                 return;
             }
         } catch (AuthenticationException e) {
@@ -244,6 +236,27 @@
         });
     }
 
+    private String buildEndpoint(OpenstackNode node) {
+
+        OpenstackAuth auth = node.authentication();
+
+        StringBuilder endpointSb = new StringBuilder();
+        endpointSb.append(auth.protocol().name().toLowerCase());
+        endpointSb.append("://");
+        endpointSb.append(node.managementIp());
+        endpointSb.append(":");
+        endpointSb.append(auth.port());
+        endpointSb.append("/");
+
+        // in case the version is v3, we need to append identity path into endpoint
+        if (auth.version().equals("v3")) {
+            endpointSb.append("identity/");
+        }
+
+        endpointSb.append(auth.version());
+        return endpointSb.toString();
+    }
+
     private void printNetwork(Network osNet) {
         final String strNet = String.format(NETWORK_FORMAT,
                 osNet.getId(),
@@ -341,18 +354,14 @@
         return config;
     }
 
-    private Facing getFacing(String strFacing) {
+    private Facing getFacing(OpenstackAuth.Perspective perspective) {
 
-        if (strFacing == null) {
-            return null;
-        }
-
-        switch (strFacing) {
-            case "public":
+        switch (perspective) {
+            case PUBLIC:
                 return Facing.PUBLIC;
-            case "admin":
+            case ADMIN:
                 return Facing.ADMIN;
-            case "internal":
+            case INTERNAL:
                 return Facing.INTERNAL;
             default:
                 return null;
diff --git a/apps/openstacknetworking/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/openstacknetworking/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index a525e86..d3884df 100644
--- a/apps/openstacknetworking/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/apps/openstacknetworking/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -32,9 +32,6 @@
         </command>
         <command>
             <action class="org.onosproject.openstacknetworking.cli.OpenstackSyncStateCommand"/>
-            <completers>
-                <ref component-id="openStackEndPointCompleter"/>
-            </completers>
         </command>
         <command>
             <action class="org.onosproject.openstacknetworking.cli.OpenstackSecurityGroupListCommand"/>
@@ -73,5 +70,4 @@
     <bean id="ipAddressCompleter" class="org.onosproject.openstacknetworking.cli.IpAddressCompleter"/>
     <bean id="macAddressCompleter" class="org.onosproject.openstacknetworking.cli.MacAddressCompleter"/>
     <bean id="vlanIdCompleter" class="org.onosproject.openstacknetworking.cli.VlanIdCompleter"/>
-    <bean id="openStackEndPointCompleter" class="org.onosproject.openstacknetworking.cli.OpenStackEndPointCompleter"/>
 </blueprint>
