diff --git a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java
index 65a77e6..ceed2a7 100644
--- a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java
+++ b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java
@@ -19,11 +19,13 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.google.common.collect.Lists;
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.openstacknode.OpenstackNode;
-import org.onosproject.openstacknode.OpenstackNodeService;
+import org.onosproject.openstacknode.api.OpenstackNode;
+import org.onosproject.openstacknode.api.OpenstackNodeService;
 
+import java.util.Comparator;
 import java.util.List;
 
 /**
@@ -37,43 +39,45 @@
 
     @Override
     protected void execute() {
-        OpenstackNodeService nodeService = AbstractShellCommand.get(OpenstackNodeService.class);
-        List<OpenstackNode> nodes = nodeService.nodes();
-        nodes.sort(OpenstackNode.OPENSTACK_NODE_COMPARATOR);
+        OpenstackNodeService osNodeService = AbstractShellCommand.get(OpenstackNodeService.class);
+        List<OpenstackNode> osNodes = Lists.newArrayList(osNodeService.nodes());
+        osNodes.sort(Comparator.comparing(OpenstackNode::hostname));
 
         if (outputJson()) {
-            print("%s", json(nodes));
+            print("%s", json(osNodes));
         } else {
             print(FORMAT, "Hostname", "Type", "Integration Bridge", "Router Bridge",
                     "Management IP", "Data IP", "VLAN Intf", "State");
-            for (OpenstackNode node : nodes) {
+            for (OpenstackNode osNode : osNodes) {
                 print(FORMAT,
-                        node.hostname(),
-                        node.type(),
-                        node.intBridge(),
-                        node.routerBridge().isPresent() ? node.routerBridge().get() : "",
-                        node.managementIp(),
-                        node.dataIp().isPresent() ? node.dataIp().get() : "",
-                        node.vlanPort().isPresent() ? node.vlanPort().get() : "",
-                        node.state());
+                        osNode.hostname(),
+                        osNode.type(),
+                        osNode.intgBridge(),
+                        osNode.routerBridge() != null ? osNode.routerBridge() : "",
+                        osNode.managementIp(),
+                        osNode.dataIp() != null ? osNode.dataIp() : "",
+                        osNode.vlanIntf() != null ? osNode.vlanIntf() : "",
+                        osNode.state());
             }
-            print("Total %s nodes", nodeService.nodes().size());
+            print("Total %s nodes", osNodeService.nodes().size());
         }
     }
 
-    private JsonNode json(List<OpenstackNode> nodes) {
+    private JsonNode json(List<OpenstackNode> osNodes) {
         ObjectMapper mapper = new ObjectMapper();
         ArrayNode result = mapper.createArrayNode();
-        for (OpenstackNode node : nodes) {
+        for (OpenstackNode osNode : osNodes) {
             result.add(mapper.createObjectNode()
-                    .put("hostname", node.hostname())
-                    .put("type", node.type().name())
-                    .put("intBridge", node.intBridge().toString())
-                    .put("routerBridge", node.routerBridge().toString())
-                    .put("managementIp", node.managementIp().toString())
-                    .put("dataIp", node.dataIp().toString())
-                    .put("vlanPort", node.vlanPort().toString())
-                    .put("state", node.state().name()));
+                    .put("hostname", osNode.hostname())
+                    .put("type", osNode.type().name())
+                    .put("integrationBridge", osNode.intgBridge().toString())
+                    .put("routerBridge", osNode.routerBridge().toString())
+                    .put("managementIp", osNode.managementIp().toString())
+                    .put("dataIp", osNode.dataIp().toString())
+                    .put("vlanIntf", osNode.vlanIntf())
+                    .put("tunnelPortNum", osNode.tunnelPortNum().toString())
+                    .put("vlanPortNum", osNode.vlanPortNum().toString())
+                    .put("state", osNode.state().name()));
         }
         return result;
     }
