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
