diff --git a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeCheckCommand.java b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeCheckCommand.java
index 4d54abd..a35ab1b 100644
--- a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeCheckCommand.java
+++ b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeCheckCommand.java
@@ -25,14 +25,14 @@
 import org.onosproject.net.behaviour.BridgeConfig;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.device.PortDescription;
-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.Optional;
 
 import static org.onosproject.net.AnnotationKeys.PORT_NAME;
-import static org.onosproject.openstacknode.Constants.*;
-import static org.onosproject.openstacknode.OpenstackNodeService.NodeType.GATEWAY;
+import static org.onosproject.openstacknode.api.Constants.*;
+import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
 
 /**
  * Checks detailed node init state.
@@ -50,22 +50,17 @@
 
     @Override
     protected void execute() {
-        OpenstackNodeService nodeService = AbstractShellCommand.get(OpenstackNodeService.class);
+        OpenstackNodeService osNodeService = AbstractShellCommand.get(OpenstackNodeService.class);
         DeviceService deviceService = AbstractShellCommand.get(DeviceService.class);
 
-        OpenstackNode node = nodeService.nodes()
-                .stream()
-                .filter(n -> n.hostname().equals(hostname))
-                .findFirst()
-                .orElse(null);
-
-        if (node == null) {
-            print("Cannot find %s from registered nodes", hostname);
+        OpenstackNode osNode = osNodeService.node(hostname);
+        if (osNode == null) {
+            error("Cannot find %s from registered nodes", hostname);
             return;
         }
 
         print("[Integration Bridge Status]");
-        Device device = deviceService.getDevice(node.intBridge());
+        Device device = deviceService.getDevice(osNode.intgBridge());
         if (device != null) {
             print("%s %s=%s available=%s %s",
                     deviceService.isAvailable(device.id()) ? MSG_OK : MSG_NO,
@@ -73,41 +68,39 @@
                     device.id(),
                     deviceService.isAvailable(device.id()),
                     device.annotations());
-
-            node.dataIp().ifPresent(ip -> print(getPortState(deviceService, node.intBridge(), DEFAULT_TUNNEL)));
-            node.vlanPort().ifPresent(p -> print(getPortState(deviceService, node.intBridge(), p)));
+            if (osNode.dataIp() != null) {
+                print(getPortState(deviceService, osNode.intgBridge(), DEFAULT_TUNNEL));
+            }
+            if (osNode.vlanIntf() != null) {
+                print(getPortState(deviceService, osNode.intgBridge(), osNode.vlanIntf()));
+            }
         } else {
             print("%s %s=%s is not available",
                     MSG_NO,
                     INTEGRATION_BRIDGE,
-                    node.intBridge());
+                    osNode.intgBridge());
         }
 
-        if (node.type().equals(GATEWAY)) {
-            print(getPortState(deviceService, node.intBridge(), PATCH_INTG_BRIDGE));
+        if (osNode.type() == GATEWAY) {
+            print(getPortState(deviceService, osNode.intgBridge(), PATCH_INTG_BRIDGE));
 
             print("%n[Router Bridge Status]");
-            device = deviceService.getDevice(node.ovsdbId());
+            device = deviceService.getDevice(osNode.ovsdb());
             if (device == null || !device.is(BridgeConfig.class)) {
                 print("%s %s=%s is not available(unable to connect OVSDB)",
                       MSG_NO,
                       ROUTER_BRIDGE,
-                      node.intBridge());
+                      osNode.intgBridge());
             } else {
                 BridgeConfig bridgeConfig = device.as(BridgeConfig.class);
                 boolean available = bridgeConfig.getBridges().stream()
-                        .filter(bridge -> bridge.name().equals(ROUTER_BRIDGE))
-                        .findAny()
-                        .isPresent();
-
+                        .anyMatch(bridge -> bridge.name().equals(ROUTER_BRIDGE));
                 print("%s %s=%s available=%s",
                       available ? MSG_OK : MSG_NO,
                       ROUTER_BRIDGE,
-                      node.routerBridge().get(),
+                      osNode.routerBridge(),
                       available);
-
-                print(getPortStateOvsdb(deviceService, node.ovsdbId(), PATCH_ROUT_BRIDGE));
-                print(getPortStateOvsdb(deviceService, node.ovsdbId(), node.uplink().get()));
+                print(getPortStateOvsdb(deviceService, osNode.ovsdb(), PATCH_ROUT_BRIDGE));
             }
         }
     }
diff --git a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeInitCommand.java b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeInitCommand.java
index 8f4dbb1..85da391 100644
--- a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeInitCommand.java
+++ b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeInitCommand.java
@@ -19,10 +19,10 @@
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.openstacknode.OpenstackNode;
-import org.onosproject.openstacknode.OpenstackNodeService;
-
-import java.util.NoSuchElementException;
+import org.onosproject.openstacknode.api.NodeState;
+import org.onosproject.openstacknode.api.OpenstackNode;
+import org.onosproject.openstacknode.api.OpenstackNodeAdminService;
+import org.onosproject.openstacknode.api.OpenstackNodeService;
 
 /**
  * Initializes nodes for OpenStack node service.
@@ -37,21 +37,19 @@
 
     @Override
     protected void execute() {
-        OpenstackNodeService nodeService = AbstractShellCommand.get(OpenstackNodeService.class);
+        OpenstackNodeService osNodeService =
+                AbstractShellCommand.get(OpenstackNodeService.class);
+        OpenstackNodeAdminService osNodeAdminService =
+                AbstractShellCommand.get(OpenstackNodeAdminService.class);
 
         for (String hostname : hostnames) {
-            OpenstackNode node;
-            try {
-                node = nodeService.nodes()
-                        .stream()
-                        .filter(n -> n.hostname().equals(hostname))
-                        .findFirst().get();
-            } catch (NoSuchElementException e) {
+            OpenstackNode osNode = osNodeService.node(hostname);
+            if (osNode == null) {
                 print("Unable to find %s", hostname);
                 continue;
             }
-
-            nodeService.addOrUpdateNode(node);
+            OpenstackNode updated = osNode.updateState(NodeState.INIT);
+            osNodeAdminService.updateNode(updated);
         }
     }
 }
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;
     }
