diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackNetworkManager.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackNetworkManager.java
index 2418745..92257fd 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackNetworkManager.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackNetworkManager.java
@@ -75,8 +75,8 @@
 import static org.onosproject.net.AnnotationKeys.PORT_NAME;
 import static org.onosproject.openstacknetworking.api.Constants.DIRECT;
 import static org.onosproject.openstacknetworking.api.Constants.PCISLOT;
-import static org.onosproject.openstacknetworking.api.Constants.portNamePrefixMap;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getIntfNameFromPciAddress;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.vnicType;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -113,7 +113,6 @@
     private static final String ERR_NOT_FOUND = " does not exist";
     private static final String ERR_IN_USE = " still in use";
     private static final String ERR_DUPLICATE = " already exists";
-    private static final String PORT_NAME_PREFIX_VM = "tap";
 
     private static final int PREFIX_LENGTH = 32;
 
@@ -325,29 +324,34 @@
             return null;
         }
 
-        if (port.annotations().value(PORT_NAME).startsWith(PORT_NAME_PREFIX_VM)) {
-            Optional<Port> osPort = osNetworkStore.ports()
-                    .stream()
-                    .filter(p -> p.getId().contains(portName.substring(3)))
-                    .findFirst();
-            return osPort.orElse(null);
-        } else if (isDirectPort(portName)) {
-            //Additional prefixes will be added
-            Optional<Port> osPort = osNetworkStore.ports()
-                    .stream()
-                    .filter(p -> p.getvNicType().equals(DIRECT) && p.getProfile().get(PCISLOT) != null)
-                    .filter(p -> getIntfNameFromPciAddress(p).equals(portName))
-                    .findFirst();
-            return osPort.orElse(null);
-        } else {
+        try {
+            Optional<Port> osPort;
+            switch (vnicType(portName)) {
+                case NORMAL:
+                    osPort = osNetworkStore.ports()
+                            .stream()
+                            .filter(p -> p.getId().contains(portName.substring(3)))
+                            .findFirst();
+                    return osPort.orElse(null);
+
+                case DIRECT:
+                    //Additional prefixes will be added
+                    osPort = osNetworkStore.ports()
+                            .stream()
+                            .filter(p -> p.getvNicType().equals(DIRECT) && p.getProfile().get(PCISLOT) != null)
+                            .filter(p -> getIntfNameFromPciAddress(p).equals(portName))
+                            .findFirst();
+                    return osPort.orElse(null);
+
+                default:
+                    return null;
+            }
+        } catch (IllegalArgumentException e) {
+            log.error("IllegalArgumentException occurred because of {}", e);
             return null;
         }
     }
 
-    private boolean isDirectPort(String portName) {
-        return portNamePrefixMap().values().stream().filter(p -> portName.startsWith(p)).findAny().isPresent();
-    }
-
     @Override
     public Set<Port> ports() {
         return ImmutableSet.copyOf(osNetworkStore.ports());
