diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java
index 5d116da..8d9955f 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java
@@ -92,7 +92,7 @@
             vTapCriterionBuilder.srcIpPrefix(IpPrefix.valueOf(srcIp));
             vTapCriterionBuilder.dstIpPrefix(IpPrefix.valueOf(dstIp));
         } catch (Exception e) {
-            print("Inputted valid source IP & destination IP in CIDR (e.g., \"10.1.0.0/16\")");
+            print("Inputted valid source IP & destination IP in CIDR (e.g., \"10.1.0.4/32\")");
             return false;
         }
 
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/OpenstackVtapManager.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/OpenstackVtapManager.java
index a789e43..1e9d7c9 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/OpenstackVtapManager.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/OpenstackVtapManager.java
@@ -177,6 +177,10 @@
     private static final int FLAT_OUTBOUND_NEXT_TABLE = FLAT_TABLE;
     private static final int OUTBOUND_NEXT_TABLE = FORWARDING_TABLE;
 
+    private static final IpPrefix ARBITRARY_IP_PREFIX =
+                    IpPrefix.valueOf(IpAddress.valueOf("0.0.0.0"), 0);
+    private static final String TABLE_PROPERTY_KEY = "table";
+
     private final DeviceListener deviceListener = new InternalDeviceListener();
     private final HostListener hostListener = new InternalHostListener();
     private final OpenstackNodeListener osNodeListener = new InternalOpenstackNodeListener();
@@ -250,20 +254,19 @@
     }
 
     @Override
-    public OpenstackVtap createVtap(Type type,
-                                    OpenstackVtapCriterion vTapCriterionOpenstack) {
-        checkNotNull(vTapCriterionOpenstack, VTAP_DESC_NULL);
+    public OpenstackVtap createVtap(Type type, OpenstackVtapCriterion vTapCriterion) {
+        checkNotNull(vTapCriterion, VTAP_DESC_NULL);
 
         Set<DeviceId> txDevices = type.isValid(Type.VTAP_TX) ?
-                getEdgeDevice(type, vTapCriterionOpenstack) : ImmutableSet.of();
+                getEdgeDevice(type, vTapCriterion) : ImmutableSet.of();
         Set<DeviceId> rxDevices = type.isValid(Type.VTAP_RX) ?
-                getEdgeDevice(type, vTapCriterionOpenstack) : ImmutableSet.of();
+                getEdgeDevice(type, vTapCriterion) : ImmutableSet.of();
 
         OpenstackVtap description =
                             DefaultOpenstackVtap.builder()
                                                 .id(OpenstackVtapId.vTapId())
                                                 .type(type)
-                                                .vTapCriterion(vTapCriterionOpenstack)
+                                                .vTapCriterion(vTapCriterion)
                                                 .txDeviceIds(txDevices)
                                                 .rxDeviceIds(rxDevices)
                                                 .build();
@@ -540,40 +543,47 @@
     }
 
     private void connectTables(DeviceId deviceId, int fromTable, int toTable, int toGroup,
-                               OpenstackVtapCriterion vTapCriterionOpenstack, int rulePriority,
+                               OpenstackVtapCriterion vTapCriterion, int rulePriority,
                                boolean install) {
         log.trace("Table Transition: table[{}] -> table[{}] or group[{}]", fromTable, toTable, toGroup);
 
         TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder()
-                .matchEthType(TYPE_IPV4)
-                .matchIPSrc(vTapCriterionOpenstack.srcIpPrefix())
-                .matchIPDst(vTapCriterionOpenstack.dstIpPrefix());
+                .matchEthType(TYPE_IPV4);
 
-        switch (vTapCriterionOpenstack.ipProtocol()) {
+        // if the IpPrefix is "0.0.0.0/0", we do not include such a match into the flow rule
+        if (!vTapCriterion.srcIpPrefix().equals(ARBITRARY_IP_PREFIX)) {
+            selectorBuilder.matchIPSrc(vTapCriterion.srcIpPrefix());
+        }
+
+        if (!vTapCriterion.dstIpPrefix().equals(ARBITRARY_IP_PREFIX)) {
+            selectorBuilder.matchIPDst(vTapCriterion.dstIpPrefix());
+        }
+
+        switch (vTapCriterion.ipProtocol()) {
             case PROTOCOL_TCP:
-                selectorBuilder.matchIPProtocol(vTapCriterionOpenstack.ipProtocol());
+                selectorBuilder.matchIPProtocol(vTapCriterion.ipProtocol());
 
                 // Add port match only if the port number is greater than zero
-                if (vTapCriterionOpenstack.srcTpPort().toInt() > 0) {
-                    selectorBuilder.matchTcpSrc(vTapCriterionOpenstack.srcTpPort());
+                if (vTapCriterion.srcTpPort().toInt() > 0) {
+                    selectorBuilder.matchTcpSrc(vTapCriterion.srcTpPort());
                 }
-                if (vTapCriterionOpenstack.dstTpPort().toInt() > 0) {
-                    selectorBuilder.matchTcpDst(vTapCriterionOpenstack.dstTpPort());
+                if (vTapCriterion.dstTpPort().toInt() > 0) {
+                    selectorBuilder.matchTcpDst(vTapCriterion.dstTpPort());
                 }
                 break;
             case PROTOCOL_UDP:
-                selectorBuilder.matchIPProtocol(vTapCriterionOpenstack.ipProtocol());
+                selectorBuilder.matchIPProtocol(vTapCriterion.ipProtocol());
 
                 // Add port match only if the port number is greater than zero
-                if (vTapCriterionOpenstack.srcTpPort().toInt() > 0) {
-                    selectorBuilder.matchUdpSrc(vTapCriterionOpenstack.srcTpPort());
+                if (vTapCriterion.srcTpPort().toInt() > 0) {
+                    selectorBuilder.matchUdpSrc(vTapCriterion.srcTpPort());
                 }
-                if (vTapCriterionOpenstack.dstTpPort().toInt() > 0) {
-                    selectorBuilder.matchUdpDst(vTapCriterionOpenstack.dstTpPort());
+                if (vTapCriterion.dstTpPort().toInt() > 0) {
+                    selectorBuilder.matchUdpDst(vTapCriterion.dstTpPort());
                 }
                 break;
             case PROTOCOL_ICMP:
-                selectorBuilder.matchIPProtocol(vTapCriterionOpenstack.ipProtocol());
+                selectorBuilder.matchIPProtocol(vTapCriterion.ipProtocol());
                 break;
             default:
                 break;
@@ -640,7 +650,7 @@
                     resolver.getExtensionInstruction(NICIRA_RESUBMIT_TABLE.type());
 
         try {
-            extensionInstruction.setPropertyValue("table", ((short) tableId));
+            extensionInstruction.setPropertyValue(TABLE_PROPERTY_KEY, ((short) tableId));
         } catch (Exception e) {
             log.error("Failed to set extension treatment for resubmit table {}", id);
         }
@@ -683,12 +693,12 @@
         flowRuleService.apply(flowOpsBuilder.build(new FlowRuleOperationsContext() {
             @Override
             public void onSuccess(FlowRuleOperations ops) {
-                log.trace("Installed flow rules for tapping");
+                log.debug("Installed flow rules for tapping");
             }
 
             @Override
             public void onError(FlowRuleOperations ops) {
-                log.error("Failed to install flow rules for tapping");
+                log.debug("Failed to install flow rules for tapping");
             }
         }));
     }
