diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/Constants.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/Constants.java
index 4110ac8..4410d70 100644
--- a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/Constants.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/Constants.java
@@ -147,4 +147,12 @@
 
     public static final boolean DEFAULT_HA_STATUS = false;
     public static final IpAddress DEFAULT_ACTIVE_IP_ADDRESS = IpAddress.valueOf("127.0.0.1");
+
+    public static final String SECURITY_GROUP_FORMAT = "%-40s%-20s";
+    public static final String NETWORK_FORMAT = "%-40s%-20s%-20s%-8s";
+    public static final String SUBNET_FORMAT = "%-40s%-20s%-20s";
+    public static final String ROUTER_INTF_FORMAT = "%-40s%-20s%-20s";
+    public static final String PORT_FORMAT = "%-40s%-20s%-20s%-8s";
+    public static final String ROUTER_FORMAT = "%-40s%-20s%-20s%-8s";
+    public static final String FLOATING_IP_FORMAT = "%-40s%-20s%-20s";
 }
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackDiffStateCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackDiffStateCommand.java
new file mode 100644
index 0000000..7f8b118
--- /dev/null
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackDiffStateCommand.java
@@ -0,0 +1,245 @@
+/*
+ * Copyright 2019-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.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+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.openstacknetworking.util.OpenstackNetworkingUtil;
+import org.onosproject.openstacknode.api.OpenstackNode;
+import org.onosproject.openstacknode.api.OpenstackNodeService;
+import org.openstack4j.api.OSClient;
+import org.openstack4j.model.common.IdEntity;
+import org.openstack4j.model.network.NetFloatingIP;
+import org.openstack4j.model.network.RouterInterface;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static org.onosproject.openstacknetworking.api.Constants.FLOATING_IP_FORMAT;
+import static org.onosproject.openstacknetworking.api.Constants.NETWORK_FORMAT;
+import static org.onosproject.openstacknetworking.api.Constants.PORT_FORMAT;
+import static org.onosproject.openstacknetworking.api.Constants.ROUTER_FORMAT;
+import static org.onosproject.openstacknetworking.api.Constants.ROUTER_INTF_FORMAT;
+import static org.onosproject.openstacknetworking.api.Constants.SECURITY_GROUP_FORMAT;
+import static org.onosproject.openstacknetworking.api.Constants.SUBNET_FORMAT;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.printFloatingIp;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.printNetwork;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.printPort;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.printRouter;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.printRouterIntf;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.printSecurityGroup;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.printSubnet;
+import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.CONTROLLER;
+
+/**
+ * Compares cached network state diff against neutron database.
+ */
+@Service
+@Command(scope = "onos", name = "openstack-diff-state",
+        description = "Compares cached network state with neutron database.")
+public class OpenstackDiffStateCommand extends AbstractShellCommand {
+
+    private static final String HTTP_HEADER_ACCEPT = "accept";
+    private static final String HTTP_HEADER_VALUE_JSON = "application/json";
+
+    @Option(name = "-s", aliases = "--show",
+            description = "Shows the differences between cached network state with neutron database.",
+            required = false, multiValued = false)
+    private boolean show = false;
+
+    @Option(name = "-c", aliases = "--clear",
+            description = "Clears the differences between cached network state with neutron database.",
+            required = false, multiValued = false)
+    private boolean clear = false;
+
+    @Override
+    protected void doExecute() {
+        OpenstackSecurityGroupAdminService osSgService =
+                get(OpenstackSecurityGroupAdminService.class);
+        OpenstackNetworkAdminService osNetService =
+                get(OpenstackNetworkAdminService.class);
+        OpenstackRouterAdminService osRouterService =
+                get(OpenstackRouterAdminService.class);
+        OpenstackNodeService osNodeService = get(OpenstackNodeService.class);
+
+        Map<String, String> headerMap = new HashMap<>();
+        headerMap.put(HTTP_HEADER_ACCEPT, HTTP_HEADER_VALUE_JSON);
+
+        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;
+        }
+
+        OSClient osClient = OpenstackNetworkingUtil.getConnectedClient(node.get());
+
+        if (osClient == null) {
+            return;
+        }
+
+        if (!clear) {
+            show = true;
+        }
+
+        if (show && clear) {
+            error("Either --show (-s) or --clear (-c) option should be specified.");
+        }
+
+        if (show) {
+            print("\nComparing OpenStack floating IPs");
+        } else if (clear) {
+            print("\nClearing OpenStack floating IPs");
+        }
+        Set<String> cachedFips = osRouterService.floatingIps().stream()
+                .map(NetFloatingIP::getId).collect(Collectors.toSet());
+        Set<String> osFips = osClient.headers(headerMap).networking()
+                .floatingip().list().stream().map(NetFloatingIP::getId)
+                .collect(Collectors.toSet());
+
+        print(FLOATING_IP_FORMAT, "ID", "Floating IP", "Fixed IP");
+        getDiff(cachedFips, osFips).forEach(fipId -> {
+            printFloatingIp(osRouterService.floatingIp(fipId));
+            if (clear) {
+                osRouterService.removeFloatingIp(fipId);
+            }
+        });
+
+        Set<String> cachedPorts = osNetService.ports().stream()
+                .map(IdEntity::getId).collect(Collectors.toSet());
+        Set<String> osPorts = osClient.headers(headerMap).networking()
+                .port().list().stream().map(IdEntity::getId)
+                .collect(Collectors.toSet());
+
+        if (show) {
+            print("\nComparing OpenStack router interfaces");
+        } else if (clear) {
+            print("\nClearing OpenStack router interfaces");
+        }
+        print(ROUTER_INTF_FORMAT, "ID", "Tenant ID", "Subnet ID");
+        getDiff(cachedPorts, osPorts).forEach(portId -> {
+            RouterInterface ri = osRouterService.routerInterface(portId);
+            if (ri != null) {
+                printRouterIntf(ri);
+                if (clear) {
+                    osRouterService.removeRouterInterface(portId);
+                }
+            }
+        });
+
+        if (show) {
+            print("\nComparing OpenStack ports");
+        } else if (clear) {
+            print("\nClearing OpenStack ports");
+        }
+        print(PORT_FORMAT, "ID", "Network", "MAC", "Fixed IPs");
+        getDiff(cachedPorts, osPorts).forEach(portId -> {
+            printPort(osNetService.port(portId), osNetService);
+            if (clear) {
+                osNetService.removePort(portId);
+            }
+        });
+
+        if (show) {
+            print("\nComparing OpenStack routers");
+        } else if (clear) {
+            print("\nClearing OpenStack routers");
+        }
+        Set<String> cachedRouters = osRouterService.routers().stream()
+                .map(IdEntity::getId).collect(Collectors.toSet());
+        Set<String> osRouters = osClient.headers(headerMap).networking()
+                .router().list().stream().map(IdEntity::getId)
+                .collect(Collectors.toSet());
+
+        print(ROUTER_FORMAT, "ID", "Name", "External", "Internal");
+        getDiff(cachedRouters, osRouters).forEach(routerId -> {
+            printRouter(osRouterService.router(routerId), osNetService);
+            if (clear) {
+                osRouterService.removeRouter(routerId);
+            }
+        });
+
+        if (show) {
+            print("\nComparing OpenStack subnets");
+        } else if (clear) {
+            print("\nClearing OpenStack subnets");
+        }
+        Set<String> cachedSubnets = osNetService.subnets().stream()
+                .map(IdEntity::getId).collect(Collectors.toSet());
+        Set<String> osSubnets = osClient.headers(headerMap).networking()
+                .subnet().list().stream().map(IdEntity::getId)
+                .collect(Collectors.toSet());
+
+        print(SUBNET_FORMAT, "ID", "Network", "CIDR");
+        getDiff(cachedSubnets, osSubnets).forEach(subnetId -> {
+            printSubnet(osNetService.subnet(subnetId), osNetService);
+            if (clear) {
+                osNetService.removeSubnet(subnetId);
+            }
+        });
+
+        if (show) {
+            print("\nComparing OpenStack networks");
+        } else if (clear) {
+            print("\nClearing OpenStack networks");
+        }
+        Set<String> cachedNets = osNetService.networks().stream()
+                .map(IdEntity::getId).collect(Collectors.toSet());
+        Set<String> osNets = osClient.headers(headerMap).networking()
+                .network().list().stream().map(IdEntity::getId)
+                .collect(Collectors.toSet());
+
+        print(NETWORK_FORMAT, "ID", "Name", "VNI", "Subnets");
+        getDiff(cachedNets, osNets).forEach(netId -> {
+            printNetwork(osNetService.network(netId));
+            if (clear) {
+                osNetService.removeNetwork(netId);
+            }
+        });
+
+        if (show) {
+            print("\nComparing OpenStack security groups");
+        } else if (clear) {
+            print("\nClearing OpenStack security groups");
+        }
+        Set<String> cachedSgs = osSgService.securityGroups().stream()
+                .map(IdEntity::getId).collect(Collectors.toSet());
+        Set<String> osSgs = osClient.headers(headerMap).networking()
+                .securitygroup().list().stream().map(IdEntity::getId)
+                .collect(Collectors.toSet());
+
+        print(SECURITY_GROUP_FORMAT, "ID", "Name");
+        getDiff(cachedSgs, osSgs).forEach(sgId -> {
+            printSecurityGroup(osSgService.securityGroup(sgId));
+            if (clear) {
+                osSgService.removeSecurityGroup(sgId);
+            }
+        });
+    }
+
+    private Set<String> getDiff(Set<String> orig, Set<String> comp) {
+        return orig.stream().filter(id -> !comp.contains(id))
+                .collect(Collectors.toSet());
+    }
+}
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackPortListCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackPortListCommand.java
index e3398da..131c809 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackPortListCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackPortListCommand.java
@@ -33,7 +33,6 @@
 import java.util.List;
 import java.util.stream.Collectors;
 
-import static org.onosproject.cli.AbstractShellCommand.get;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.modelEntityToJson;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.prettyJson;
 
@@ -71,8 +70,9 @@
                         .map(IP::getIpAddress)
                         .collect(Collectors.toList());
                 Network osNet = service.network(port.getNetworkId());
+                String netName = osNet == null ? "N/A" : osNet.getName();
                 print(FORMAT, port.getId(),
-                        osNet.getName(),
+                        netName,
                         port.getMacAddress(),
                         fixedIps.isEmpty() ? "" : fixedIps);
             }
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSubnetListCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSubnetListCommand.java
index da378b0..4a4a3c5 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSubnetListCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSubnetListCommand.java
@@ -22,13 +22,13 @@
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
+import org.openstack4j.model.network.Network;
 import org.openstack4j.model.network.Subnet;
 import org.openstack4j.openstack.networking.domain.NeutronSubnet;
 
 import java.util.Comparator;
 import java.util.List;
 
-import static org.onosproject.cli.AbstractShellCommand.get;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.modelEntityToJson;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.prettyJson;
 
@@ -55,13 +55,15 @@
                                                 "NetworkName", "HostRoutes");
 
             for (Subnet subnet: subnets) {
+                Network osNet = service.network(subnet.getNetworkId());
+                String netName = osNet == null ? "N/A" : osNet.getName();
                 print(FORMAT,
                         subnet.getId(),
                         subnet.getName(),
                         subnet.getCidr(),
                         subnet.getGateway(),
                         subnet.getNetworkId(),
-                        service.network(subnet.getNetworkId()).getName(),
+                        netName,
                         subnet.getHostRoutes());
             }
         }
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 5d3001d..29d167f 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
@@ -15,7 +15,6 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
-import com.google.common.base.Strings;
 import org.apache.karaf.shell.api.action.Command;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
@@ -26,21 +25,25 @@
 import org.onosproject.openstacknode.api.OpenstackNode;
 import org.onosproject.openstacknode.api.OpenstackNodeService;
 import org.openstack4j.api.OSClient;
-import org.openstack4j.model.network.IP;
-import org.openstack4j.model.network.NetFloatingIP;
-import org.openstack4j.model.network.Network;
-import org.openstack4j.model.network.Port;
-import org.openstack4j.model.network.Router;
-import org.openstack4j.model.network.Subnet;
 
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
-import java.util.stream.Collectors;
 
+import static org.onosproject.openstacknetworking.api.Constants.FLOATING_IP_FORMAT;
+import static org.onosproject.openstacknetworking.api.Constants.NETWORK_FORMAT;
+import static org.onosproject.openstacknetworking.api.Constants.PORT_FORMAT;
+import static org.onosproject.openstacknetworking.api.Constants.ROUTER_FORMAT;
+import static org.onosproject.openstacknetworking.api.Constants.SECURITY_GROUP_FORMAT;
+import static org.onosproject.openstacknetworking.api.Constants.SUBNET_FORMAT;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.addRouterIface;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.printFloatingIp;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.printNetwork;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.printPort;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.printRouter;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.printSecurityGroup;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.printSubnet;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.CONTROLLER;
 
 /**
@@ -51,13 +54,6 @@
         description = "Synchronizes all OpenStack network states")
 public class OpenstackSyncStateCommand extends AbstractShellCommand {
 
-    private static final String SECURITY_GROUP_FORMAT = "%-40s%-20s";
-    private static final String NETWORK_FORMAT = "%-40s%-20s%-20s%-8s";
-    private static final String SUBNET_FORMAT = "%-40s%-20s%-20s";
-    private static final String PORT_FORMAT = "%-40s%-20s%-20s%-8s";
-    private static final String ROUTER_FORMAT = "%-40s%-20s%-20s%-8s";
-    private static final String FLOATING_IP_FORMAT = "%-40s%-20s%-20s";
-
     private static final String DEVICE_OWNER_GW = "network:router_gateway";
     private static final String DEVICE_OWNER_IFACE = "network:router_interface";
 
@@ -98,7 +94,7 @@
             } else {
                 osSgAdminService.createSecurityGroup(osSg);
             }
-            print(SECURITY_GROUP_FORMAT, osSg.getId(), osSg.getName());
+            printSecurityGroup(osSg);
         });
 
 
@@ -165,65 +161,4 @@
             printFloatingIp(osFloating);
         });
     }
-
-    private void printNetwork(Network osNet) {
-        final String strNet = String.format(NETWORK_FORMAT,
-                osNet.getId(),
-                osNet.getName(),
-                osNet.getProviderSegID(),
-                osNet.getSubnets());
-        print(strNet);
-    }
-
-    private void printSubnet(Subnet osSubnet, OpenstackNetworkAdminService osNetService) {
-        final String strSubnet = String.format(SUBNET_FORMAT,
-                osSubnet.getId(),
-                osNetService.network(osSubnet.getNetworkId()).getName(),
-                osSubnet.getCidr());
-        print(strSubnet);
-    }
-
-    private void printPort(Port osPort, OpenstackNetworkAdminService osNetService) {
-        List<String> fixedIps = osPort.getFixedIps().stream()
-                .map(IP::getIpAddress)
-                .collect(Collectors.toList());
-        final String strPort = String.format(PORT_FORMAT,
-                osPort.getId(),
-                osNetService.network(osPort.getNetworkId()).getName(),
-                osPort.getMacAddress(),
-                fixedIps.isEmpty() ? "" : fixedIps);
-        print(strPort);
-    }
-
-    private void printRouter(Router osRouter, OpenstackNetworkAdminService osNetService) {
-        List<String> externals = osNetService.ports().stream()
-                .filter(osPort -> Objects.equals(osPort.getDeviceId(), osRouter.getId()) &&
-                        Objects.equals(osPort.getDeviceOwner(), DEVICE_OWNER_GW))
-                .flatMap(osPort -> osPort.getFixedIps().stream())
-                .map(IP::getIpAddress)
-                .collect(Collectors.toList());
-
-        List<String> internals = osNetService.ports().stream()
-                .filter(osPort -> Objects.equals(osPort.getDeviceId(), osRouter.getId()) &&
-                        Objects.equals(osPort.getDeviceOwner(), DEVICE_OWNER_IFACE))
-                .flatMap(osPort -> osPort.getFixedIps().stream())
-                .map(IP::getIpAddress)
-                .collect(Collectors.toList());
-
-        final String strRouter = String.format(ROUTER_FORMAT,
-                osRouter.getId(),
-                osRouter.getName(),
-                externals.isEmpty() ? "" : externals,
-                internals.isEmpty() ? "" : internals);
-        print(strRouter);
-    }
-
-    private void printFloatingIp(NetFloatingIP floatingIp) {
-        final String strFloating = String.format(FLOATING_IP_FORMAT,
-                floatingIp.getId(),
-                floatingIp.getFloatingIpAddress(),
-                Strings.isNullOrEmpty(floatingIp.getFixedIpAddress()) ?
-                        "" : floatingIp.getFixedIpAddress());
-        print(strFloating);
-    }
 }
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
index 8837a65..615de0e 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
@@ -85,11 +85,13 @@
 import org.openstack4j.model.ModelEntity;
 import org.openstack4j.model.common.Identifier;
 import org.openstack4j.model.network.ExternalGateway;
+import org.openstack4j.model.network.IP;
 import org.openstack4j.model.network.NetFloatingIP;
 import org.openstack4j.model.network.Network;
 import org.openstack4j.model.network.Port;
 import org.openstack4j.model.network.Router;
 import org.openstack4j.model.network.RouterInterface;
+import org.openstack4j.model.network.SecurityGroup;
 import org.openstack4j.model.network.Subnet;
 import org.openstack4j.openstack.OSFactory;
 import org.openstack4j.openstack.networking.domain.NeutronRouterInterface;
@@ -118,12 +120,14 @@
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -133,15 +137,22 @@
 import static org.onlab.packet.Ip4Address.valueOf;
 import static org.onosproject.net.AnnotationKeys.PORT_NAME;
 import static org.onosproject.openstacknetworking.api.Constants.DEFAULT_GATEWAY_MAC_STR;
+import static org.onosproject.openstacknetworking.api.Constants.FLOATING_IP_FORMAT;
+import static org.onosproject.openstacknetworking.api.Constants.NETWORK_FORMAT;
 import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_REST_PATH;
 import static org.onosproject.openstacknetworking.api.Constants.PCISLOT;
 import static org.onosproject.openstacknetworking.api.Constants.PCI_VENDOR_INFO;
+import static org.onosproject.openstacknetworking.api.Constants.PORT_FORMAT;
 import static org.onosproject.openstacknetworking.api.Constants.PORT_NAME_PREFIX_VM;
 import static org.onosproject.openstacknetworking.api.Constants.PORT_NAME_VHOST_USER_PREFIX_VM;
 import static org.onosproject.openstacknetworking.api.Constants.REST_PASSWORD;
 import static org.onosproject.openstacknetworking.api.Constants.REST_PORT;
 import static org.onosproject.openstacknetworking.api.Constants.REST_USER;
 import static org.onosproject.openstacknetworking.api.Constants.REST_UTF8;
+import static org.onosproject.openstacknetworking.api.Constants.ROUTER_FORMAT;
+import static org.onosproject.openstacknetworking.api.Constants.ROUTER_INTF_FORMAT;
+import static org.onosproject.openstacknetworking.api.Constants.SECURITY_GROUP_FORMAT;
+import static org.onosproject.openstacknetworking.api.Constants.SUBNET_FORMAT;
 import static org.onosproject.openstacknetworking.api.Constants.UNSUPPORTED_VENDOR;
 import static org.onosproject.openstacknetworking.api.Constants.portNamePrefixMap;
 import static org.openstack4j.core.transport.ObjectMapperSingleton.getContext;
@@ -184,6 +195,11 @@
     private static final String COMMA = ",";
     private static final String TUN_ID = "tun_id=";
 
+    private static final String DEVICE_OWNER_GW = "network:router_gateway";
+    private static final String DEVICE_OWNER_IFACE = "network:router_interface";
+
+    private static final String NOT_AVAILABLE = "N/A";
+
     private static final long TIMEOUT_MS = 5000;
     private static final long WAIT_OUTPUT_STREAM_SECOND = 2;
     private static final int SSH_PORT = 22;
@@ -483,6 +499,124 @@
     }
 
     /**
+     * Prints openstack security group.
+     *
+     * @param osSg  openstack security group
+     */
+    public static void printSecurityGroup(SecurityGroup osSg) {
+        print(SECURITY_GROUP_FORMAT, osSg.getId(), osSg.getName());
+    }
+
+    /**
+     * Prints openstack network.
+     *
+     * @param osNet openstack network
+     */
+    public static void printNetwork(Network osNet) {
+        final String strNet = String.format(NETWORK_FORMAT,
+                osNet.getId(),
+                osNet.getName(),
+                osNet.getProviderSegID(),
+                osNet.getSubnets());
+        print(strNet);
+    }
+
+    /**
+     * Prints openstack subnet.
+     *
+     * @param osSubnet      openstack subnet
+     * @param osNetService  openstack network service
+     */
+    public static void printSubnet(Subnet osSubnet,
+                                   OpenstackNetworkService osNetService) {
+        final Network network = osNetService.network(osSubnet.getNetworkId());
+        final String netName = network == null ? NOT_AVAILABLE : network.getName();
+        final String strSubnet = String.format(SUBNET_FORMAT,
+                osSubnet.getId(),
+                netName,
+                osSubnet.getCidr());
+        print(strSubnet);
+    }
+
+    /**
+     * Prints openstack port.
+     *
+     * @param osPort        openstack port
+     * @param osNetService  openstack network service
+     */
+    public static void printPort(Port osPort,
+                                 OpenstackNetworkService osNetService) {
+        List<String> fixedIps = osPort.getFixedIps().stream()
+                .map(IP::getIpAddress)
+                .collect(Collectors.toList());
+        final Network network = osNetService.network(osPort.getNetworkId());
+        final String netName = network == null ? NOT_AVAILABLE : network.getName();
+        final String strPort = String.format(PORT_FORMAT,
+                osPort.getId(),
+                netName,
+                osPort.getMacAddress(),
+                fixedIps.isEmpty() ? "" : fixedIps);
+        print(strPort);
+    }
+
+    /**
+     * Prints openstack router.
+     *
+     * @param osRouter      openstack router
+     * @param osNetService  openstack network service
+     */
+    public static void printRouter(Router osRouter,
+                                   OpenstackNetworkService osNetService) {
+        List<String> externals = osNetService.ports().stream()
+                .filter(osPort -> Objects.equals(osPort.getDeviceId(), osRouter.getId()) &&
+                        Objects.equals(osPort.getDeviceOwner(), DEVICE_OWNER_GW))
+                .flatMap(osPort -> osPort.getFixedIps().stream())
+                .map(IP::getIpAddress)
+                .collect(Collectors.toList());
+
+        List<String> internals = osNetService.ports().stream()
+                .filter(osPort -> Objects.equals(osPort.getDeviceId(), osRouter.getId()) &&
+                        Objects.equals(osPort.getDeviceOwner(), DEVICE_OWNER_IFACE))
+                .flatMap(osPort -> osPort.getFixedIps().stream())
+                .map(IP::getIpAddress)
+                .collect(Collectors.toList());
+
+        final String strRouter = String.format(ROUTER_FORMAT,
+                osRouter.getId(),
+                osRouter.getName(),
+                externals.isEmpty() ? "" : externals,
+                internals.isEmpty() ? "" : internals);
+        print(strRouter);
+    }
+
+    /**
+     * Prints openstack router interface.
+     *
+     * @param osRouterIntf  openstack router interface
+     */
+    public static void printRouterIntf(RouterInterface osRouterIntf) {
+        final String strRouterIntf = String.format(ROUTER_INTF_FORMAT,
+                osRouterIntf.getId(),
+                osRouterIntf.getTenantId(),
+                osRouterIntf.getSubnetId());
+        print(strRouterIntf);
+    }
+
+    /**
+     * Prints openstack floating IP.
+     *
+     * @param floatingIp    floating IP
+     */
+    public static void printFloatingIp(NetFloatingIP floatingIp) {
+        final String strFloating = String.format(FLOATING_IP_FORMAT,
+                floatingIp.getId(),
+                floatingIp.getFloatingIpAddress(),
+                Strings.isNullOrEmpty(floatingIp.getFixedIpAddress()) ?
+                        "" : floatingIp.getFixedIpAddress());
+        print(strFloating);
+    }
+
+    /**
      * Obtains the property value with specified property key name.
      *
      * @param properties    a collection of properties
@@ -1443,4 +1577,8 @@
         }
         return gw;
     }
+
+    private static void print(String format, Object... args) {
+        System.out.println(String.format(format, args));
+    }
 }
\ No newline at end of file
