diff --git a/src/main/java/org/opencord/cordvtn/cli/CordVtnNetworkListCommand.java b/src/main/java/org/opencord/cordvtn/cli/CordVtnNetworkListCommand.java
new file mode 100644
index 0000000..a97a7ae
--- /dev/null
+++ b/src/main/java/org/opencord/cordvtn/cli/CordVtnNetworkListCommand.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.opencord.cordvtn.cli;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.opencord.cordvtn.api.core.CordVtnService;
+import org.opencord.cordvtn.api.net.VtnNetwork;
+
+import java.util.Set;
+
+import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
+
+/**
+ * Lists VTN networks.
+ */
+@Command(scope = "onos", name = "cordvtn-networks",
+        description = "Lists all VTN networks")
+public class CordVtnNetworkListCommand extends AbstractShellCommand {
+
+    private static final String FORMAT = "%-40s%-20s%-8s%-20s%s";
+
+    @Override
+    protected void execute() {
+        CordVtnService service = AbstractShellCommand.get(CordVtnService.class);
+        Set<VtnNetwork> networks = service.vtnNetworks();
+
+        if (outputJson()) {
+            try {
+                print("%s", mapper().writeValueAsString(json(networks)));
+            } catch (JsonProcessingException e) {
+                print("Failed to list networks in JSON format");
+            }
+        } else {
+            print(FORMAT, "ID", "Type", "VNI", "Subnet", "Service IP");
+            for (VtnNetwork net: networks) {
+                print(FORMAT, net.id(),
+                      net.type(),
+                      net.segmentId(),
+                      net.subnet(),
+                      net.serviceIp());
+            }
+        }
+    }
+
+    private JsonNode json(Set<VtnNetwork> networks) {
+        ArrayNode result = mapper().enable(INDENT_OUTPUT).createArrayNode();
+        for (VtnNetwork net: networks) {
+            ArrayNode providers = mapper().createArrayNode();
+            net.providers().forEach(provider -> providers.add(
+                    mapper().createObjectNode()
+                            .put("networkId", provider.id().id())
+                            .put("type", provider.type().name())));
+
+            result.add(mapper().createObjectNode()
+                               .put("id", net.id().id())
+                               .put("type", net.type().name())
+                               .put("vni", net.segmentId().id())
+                               .put("subnet", net.subnet().toString())
+                               .put("serviceIp", net.serviceIp().toString())
+                               .set("providers", providers));
+        }
+        return result;
+    }
+}
diff --git a/src/main/java/org/opencord/cordvtn/cli/CordVtnNodeCheckCommand.java b/src/main/java/org/opencord/cordvtn/cli/CordVtnNodeCheckCommand.java
index 17dbb45..9e988ca 100644
--- a/src/main/java/org/opencord/cordvtn/cli/CordVtnNodeCheckCommand.java
+++ b/src/main/java/org/opencord/cordvtn/cli/CordVtnNodeCheckCommand.java
@@ -13,7 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.opencord.cordvtn.cli;
 
 import com.jcraft.jsch.Session;
@@ -45,6 +44,11 @@
             required = true, multiValued = false)
     private String hostname = null;
 
+    private static final String COMPLETE = "COMPLETE";
+    private static final String INCOMPLETE = "INCOMPLETE";
+    private static final String HINT = "hint: try init again if the state is INCOMPLETE" +
+            " but all settings OK";
+
     @Override
     protected void execute() {
         CordVtnNodeManager nodeManager = AbstractShellCommand.get(CordVtnNodeManager.class);
@@ -60,7 +64,7 @@
             print("Cannot find %s from registered nodes", hostname);
             return;
         }
-
+        print("Current state: %s (%s)", getState(nodeManager, node), HINT);
         print("%n[Integration Bridge Status]");
         Device device = deviceService.getDevice(node.integrationBridgeId());
         if (device != null) {
@@ -131,4 +135,8 @@
               isUp ? Boolean.TRUE : Boolean.FALSE,
               isIp ? Boolean.TRUE : Boolean.FALSE);
     }
+
+    private String getState(CordVtnNodeManager nodeManager, CordVtnNode node) {
+        return nodeManager.isNodeInitComplete(node) ? COMPLETE : INCOMPLETE;
+    }
 }
diff --git a/src/main/java/org/opencord/cordvtn/cli/CordVtnNodeListCommand.java b/src/main/java/org/opencord/cordvtn/cli/CordVtnNodeListCommand.java
index 1a40397..5c995f1 100644
--- a/src/main/java/org/opencord/cordvtn/cli/CordVtnNodeListCommand.java
+++ b/src/main/java/org/opencord/cordvtn/cli/CordVtnNodeListCommand.java
@@ -13,11 +13,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.opencord.cordvtn.cli;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
@@ -27,6 +26,8 @@
 import java.util.Collections;
 import java.util.List;
 
+import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
+
 /**
  * Lists all nodes registered to the service.
  */
@@ -36,6 +37,7 @@
 
     private static final String COMPLETE = "COMPLETE";
     private static final String INCOMPLETE = "INCOMPLETE";
+    private static final String FORMAT = "%-30s%-20s%-20s%-15s%-24s%s";
 
     @Override
     protected void execute() {
@@ -44,15 +46,21 @@
         Collections.sort(nodes, CordVtnNode.CORDVTN_NODE_COMPARATOR);
 
         if (outputJson()) {
-            print("%s", json(nodeManager, nodes));
+            try {
+                print("%s", mapper().writeValueAsString(json(nodeManager, nodes)));
+            } catch (JsonProcessingException e) {
+                print("Failed to list networks in JSON format");
+            }
         } else {
+            print(FORMAT, "Hostname", "Management IP", "Data IP", "Data Iface",
+                  "Br-int", "State");
+
             for (CordVtnNode node : nodes) {
-                print("hostname=%s, hostMgmtIp=%s, dataIp=%s, br-int=%s, dataIface=%s, init=%s",
-                      node.hostname(),
+                print(FORMAT, node.hostname(),
                       node.hostMgmtIp().cidr(),
                       node.dataIp().cidr(),
-                      node.integrationBridgeId().toString(),
                       node.dataIface(),
+                      node.integrationBridgeId().toString(),
                       getState(nodeManager, node));
             }
             print("Total %s nodes", nodeManager.getNodeCount());
@@ -60,16 +68,15 @@
     }
 
     private JsonNode json(CordVtnNodeManager nodeManager, List<CordVtnNode> nodes) {
-        ObjectMapper mapper = new ObjectMapper();
-        ArrayNode result = mapper.createArrayNode();
+        ArrayNode result = mapper().enable(INDENT_OUTPUT).createArrayNode();
         for (CordVtnNode node : nodes) {
-            result.add(mapper.createObjectNode()
+            result.add(mapper().createObjectNode()
                                .put("hostname", node.hostname())
-                               .put("hostManagementIp", node.hostMgmtIp().cidr())
-                               .put("dataPlaneIp", node.dataIp().cidr())
+                               .put("managementIp", node.hostMgmtIp().cidr())
+                               .put("dataIp", node.dataIp().cidr())
+                               .put("dataInterface", node.dataIface())
                                .put("bridgeId", node.integrationBridgeId().toString())
-                               .put("dataPlaneInterface", node.dataIface())
-                               .put("init", getState(nodeManager, node)));
+                               .put("state", getState(nodeManager, node)));
         }
         return result;
     }
diff --git a/src/main/java/org/opencord/cordvtn/cli/CordVtnPortListCommand.java b/src/main/java/org/opencord/cordvtn/cli/CordVtnPortListCommand.java
new file mode 100644
index 0000000..361b220
--- /dev/null
+++ b/src/main/java/org/opencord/cordvtn/cli/CordVtnPortListCommand.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.opencord.cordvtn.cli;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.opencord.cordvtn.api.core.CordVtnService;
+import org.opencord.cordvtn.api.net.NetworkId;
+import org.opencord.cordvtn.api.net.VtnNetwork;
+import org.opencord.cordvtn.api.net.VtnPort;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
+
+/**
+ * Lists VTN networks.
+ */
+@Command(scope = "onos", name = "cordvtn-ports",
+        description = "Lists all VTN ports")
+public class CordVtnPortListCommand extends AbstractShellCommand {
+
+    private static final String FORMAT = "%-40s%-20s%-18s%-6s%s";
+
+    @Argument(name = "networkId", description = "Network ID")
+    private String networkId = null;
+
+    @Override
+    protected void execute() {
+        CordVtnService service = AbstractShellCommand.get(CordVtnService.class);
+
+        List<VtnPort> ports;
+        if (Strings.isNullOrEmpty(networkId)) {
+            ports = Lists.newArrayList(service.vtnPorts());
+        } else {
+            VtnNetwork vtnNet = service.vtnNetwork(NetworkId.of(networkId));
+            if (vtnNet == null) {
+                print("Network %s does not exists", networkId);
+                return;
+            }
+            ports = service.vtnPorts().stream()
+                    .filter(p -> p.netId().equals(NetworkId.of(networkId)))
+                    .collect(Collectors.toList());
+            Collections.sort(ports, VtnPort.VTN_PORT_COMPARATOR);
+        }
+
+        if (outputJson()) {
+            try {
+                print("%s", mapper().writeValueAsString(json(ports)));
+            } catch (JsonProcessingException e) {
+                print("Failed to list networks in JSON format");
+            }
+        } else {
+            print(FORMAT, "ID", "MAC", "IP", "VLAN", "Additional IPs");
+            for (VtnPort port: ports) {
+                List<String> floatingIps = port.addressPairs().stream()
+                        .map(ip -> ip.ip().toString())
+                        .collect(Collectors.toList());
+                print(FORMAT, port.id(),
+                      port.mac(),
+                      port.ip(),
+                      port.vlanId().isPresent() ? port.vlanId().get() : "",
+                      floatingIps.isEmpty() ? "" : floatingIps);
+            }
+        }
+    }
+
+    private JsonNode json(List<VtnPort> ports) {
+        ArrayNode result = mapper().enable(INDENT_OUTPUT).createArrayNode();
+        for (VtnPort port: ports) {
+            ArrayNode addrPairs = mapper().createArrayNode();
+            port.addressPairs().forEach(pair -> addrPairs.add(
+                    mapper().createObjectNode()
+                            .put("ip", pair.ip().toString())
+                            .put("mac", pair.mac().toString())));
+
+            result.add(mapper().createObjectNode()
+                               .put("id", port.id().id())
+                               .put("networkId", port.netId().id())
+                               .put("mac", port.mac().toString())
+                               .put("ip", port.ip().toString())
+                               .put("vlan", port.vlanId().isPresent() ?
+                                       port.vlanId().get().toString() : null)
+                               .set("addressPairs", addrPairs));
+        }
+        return result;
+    }
+}
diff --git a/src/main/java/org/opencord/cordvtn/cli/CordVtnFlushRules.java b/src/main/java/org/opencord/cordvtn/cli/CordVtnPurgeRulesCommand.java
similarity index 79%
rename from src/main/java/org/opencord/cordvtn/cli/CordVtnFlushRules.java
rename to src/main/java/org/opencord/cordvtn/cli/CordVtnPurgeRulesCommand.java
index 3669b48..06f5aee 100644
--- a/src/main/java/org/opencord/cordvtn/cli/CordVtnFlushRules.java
+++ b/src/main/java/org/opencord/cordvtn/cli/CordVtnPurgeRulesCommand.java
@@ -13,7 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.opencord.cordvtn.cli;
 
 import org.apache.karaf.shell.commands.Command;
@@ -21,16 +20,15 @@
 import org.opencord.cordvtn.impl.CordVtnPipeline;
 
 /**
- * Deletes nodes from the service.
+ * Purges all flow rules installed by CORD VTN service.
  */
-@Command(scope = "onos", name = "cordvtn-flush-rules",
-        description = "Flush flow rules installed by CORD VTN")
-public class CordVtnFlushRules extends AbstractShellCommand {
+@Command(scope = "onos", name = "cordvtn-purge-rules",
+        description = "Purges all flow rules installed by CORD VTN")
+public class CordVtnPurgeRulesCommand extends AbstractShellCommand {
 
     @Override
     protected void execute() {
         CordVtnPipeline pipeline = AbstractShellCommand.get(CordVtnPipeline.class);
         pipeline.flushRules();
-        print("Successfully flushed");
     }
 }
diff --git a/src/main/java/org/opencord/cordvtn/cli/CordVtnFlushRules.java b/src/main/java/org/opencord/cordvtn/cli/CordVtnPurgeStatesCommand.java
similarity index 65%
copy from src/main/java/org/opencord/cordvtn/cli/CordVtnFlushRules.java
copy to src/main/java/org/opencord/cordvtn/cli/CordVtnPurgeStatesCommand.java
index 3669b48..b26ec66 100644
--- a/src/main/java/org/opencord/cordvtn/cli/CordVtnFlushRules.java
+++ b/src/main/java/org/opencord/cordvtn/cli/CordVtnPurgeStatesCommand.java
@@ -13,24 +13,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.opencord.cordvtn.cli;
 
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
-import org.opencord.cordvtn.impl.CordVtnPipeline;
+import org.opencord.cordvtn.api.core.CordVtnAdminService;
 
 /**
- * Deletes nodes from the service.
+ * Purges internal network states.
  */
-@Command(scope = "onos", name = "cordvtn-flush-rules",
-        description = "Flush flow rules installed by CORD VTN")
-public class CordVtnFlushRules extends AbstractShellCommand {
+@Command(scope = "onos", name = "cordvtn-purge-states",
+        description = "Purges network states")
+public class CordVtnPurgeStatesCommand extends AbstractShellCommand {
 
     @Override
     protected void execute() {
-        CordVtnPipeline pipeline = AbstractShellCommand.get(CordVtnPipeline.class);
-        pipeline.flushRules();
-        print("Successfully flushed");
+        CordVtnAdminService adminService =
+                AbstractShellCommand.get(CordVtnAdminService.class);
+        adminService.purgeStates();
     }
 }
diff --git a/src/main/java/org/opencord/cordvtn/cli/CordVtnFlushRules.java b/src/main/java/org/opencord/cordvtn/cli/CordVtnSyncStatesCommand.java
similarity index 63%
copy from src/main/java/org/opencord/cordvtn/cli/CordVtnFlushRules.java
copy to src/main/java/org/opencord/cordvtn/cli/CordVtnSyncStatesCommand.java
index 3669b48..5540391 100644
--- a/src/main/java/org/opencord/cordvtn/cli/CordVtnFlushRules.java
+++ b/src/main/java/org/opencord/cordvtn/cli/CordVtnSyncStatesCommand.java
@@ -13,24 +13,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.opencord.cordvtn.cli;
 
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
-import org.opencord.cordvtn.impl.CordVtnPipeline;
+import org.opencord.cordvtn.api.core.CordVtnAdminService;
 
 /**
- * Deletes nodes from the service.
+ * Synchronizes network states with external services.
  */
-@Command(scope = "onos", name = "cordvtn-flush-rules",
-        description = "Flush flow rules installed by CORD VTN")
-public class CordVtnFlushRules extends AbstractShellCommand {
+@Command(scope = "onos", name = "cordvtn-sync-states",
+        description = "Synchronizes network states with external services")
+public class CordVtnSyncStatesCommand extends AbstractShellCommand {
 
     @Override
     protected void execute() {
-        CordVtnPipeline pipeline = AbstractShellCommand.get(CordVtnPipeline.class);
-        pipeline.flushRules();
-        print("Successfully flushed");
+        CordVtnAdminService adminService =
+                AbstractShellCommand.get(CordVtnAdminService.class);
+        adminService.syncStates();
     }
 }
