diff --git a/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java b/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java
index 342e91b2baaa24d24232882b88b9b836e90653e7..96415b6aaa8838d83cb42562dad4d6711caae4a9 100644
--- a/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java
+++ b/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java
@@ -410,11 +410,17 @@ public class Forwarding extends ForwardingBase implements IFloodlightModule, IOF
         MacAddress dstMac = eth.getDestinationMACAddress();
 
         Match.Builder mb = sw.getOFFactory().buildMatch();
-        mb.setExact(MatchField.IN_PORT, inPort);
+        if (FLOWMOD_DEFAULT_MATCH_IN_PORT) {
+            mb.setExact(MatchField.IN_PORT, inPort);
+        }
 
         if (FLOWMOD_DEFAULT_MATCH_MAC) {
-            mb.setExact(MatchField.ETH_SRC, srcMac)
-            .setExact(MatchField.ETH_DST, dstMac);
+            if (FLOWMOD_DEFAULT_MATCH_MAC_SRC) {
+                mb.setExact(MatchField.ETH_SRC, srcMac);
+            }
+            if (FLOWMOD_DEFAULT_MATCH_MAC_DST) {
+                mb.setExact(MatchField.ETH_DST, dstMac);
+            }
         }
 
         if (FLOWMOD_DEFAULT_MATCH_VLAN) {
@@ -429,10 +435,14 @@ public class Forwarding extends ForwardingBase implements IFloodlightModule, IOF
             IPv4Address srcIp = ip.getSourceAddress();
             IPv4Address dstIp = ip.getDestinationAddress();
 
-            if (FLOWMOD_DEFAULT_MATCH_IP_ADDR) {
-                mb.setExact(MatchField.ETH_TYPE, EthType.IPv4)
-                .setExact(MatchField.IPV4_SRC, srcIp)
-                .setExact(MatchField.IPV4_DST, dstIp);
+            if (FLOWMOD_DEFAULT_MATCH_IP) {
+                mb.setExact(MatchField.ETH_TYPE, EthType.IPv4);
+                if (FLOWMOD_DEFAULT_MATCH_IP_SRC) {
+                    mb.setExact(MatchField.IPV4_SRC, srcIp);
+                }
+                if (FLOWMOD_DEFAULT_MATCH_IP_DST) {
+                    mb.setExact(MatchField.IPV4_DST, dstIp);
+                }
             }
 
             if (FLOWMOD_DEFAULT_MATCH_TRANSPORT) {
@@ -440,20 +450,28 @@ public class Forwarding extends ForwardingBase implements IFloodlightModule, IOF
                  * Take care of the ethertype if not included earlier,
                  * since it's a prerequisite for transport ports.
                  */
-                if (!FLOWMOD_DEFAULT_MATCH_IP_ADDR) {
+                if (!FLOWMOD_DEFAULT_MATCH_IP) {
                     mb.setExact(MatchField.ETH_TYPE, EthType.IPv4);
                 }
 
                 if (ip.getProtocol().equals(IpProtocol.TCP)) {
                     TCP tcp = (TCP) ip.getPayload();
-                    mb.setExact(MatchField.IP_PROTO, IpProtocol.TCP)
-                    .setExact(MatchField.TCP_SRC, tcp.getSourcePort())
-                    .setExact(MatchField.TCP_DST, tcp.getDestinationPort());
+                    mb.setExact(MatchField.IP_PROTO, IpProtocol.TCP);
+                    if (FLOWMOD_DEFAULT_MATCH_TRANSPORT_SRC) {
+                        mb.setExact(MatchField.TCP_SRC, tcp.getSourcePort());
+                    }
+                    if (FLOWMOD_DEFAULT_MATCH_TRANSPORT_DST) {
+                        mb.setExact(MatchField.TCP_DST, tcp.getDestinationPort());
+                    }
                 } else if (ip.getProtocol().equals(IpProtocol.UDP)) {
                     UDP udp = (UDP) ip.getPayload();
-                    mb.setExact(MatchField.IP_PROTO, IpProtocol.UDP)
-                    .setExact(MatchField.UDP_SRC, udp.getSourcePort())
-                    .setExact(MatchField.UDP_DST, udp.getDestinationPort());
+                    mb.setExact(MatchField.IP_PROTO, IpProtocol.UDP);
+                    if (FLOWMOD_DEFAULT_MATCH_TRANSPORT_SRC) {
+                        mb.setExact(MatchField.UDP_SRC, udp.getSourcePort());
+                    }
+                    if (FLOWMOD_DEFAULT_MATCH_TRANSPORT_DST) {
+                        mb.setExact(MatchField.UDP_DST, udp.getDestinationPort());
+                    }
                 }
             }
         } else if (eth.getEtherType() == EthType.ARP) { /* shallow check for equality is okay for EthType */
@@ -463,10 +481,14 @@ public class Forwarding extends ForwardingBase implements IFloodlightModule, IOF
             IPv6Address srcIp = ip.getSourceAddress();
             IPv6Address dstIp = ip.getDestinationAddress();
 
-            if (FLOWMOD_DEFAULT_MATCH_IP_ADDR) {
-                mb.setExact(MatchField.ETH_TYPE, EthType.IPv6)
-                .setExact(MatchField.IPV6_SRC, srcIp)
-                .setExact(MatchField.IPV6_DST, dstIp);
+            if (FLOWMOD_DEFAULT_MATCH_IP) {
+                mb.setExact(MatchField.ETH_TYPE, EthType.IPv6);
+                if (FLOWMOD_DEFAULT_MATCH_IP_SRC) {
+                    mb.setExact(MatchField.IPV6_SRC, srcIp);
+                }
+                if (FLOWMOD_DEFAULT_MATCH_IP_DST) {
+                    mb.setExact(MatchField.IPV6_DST, dstIp);
+                }
             }
 
             if (FLOWMOD_DEFAULT_MATCH_TRANSPORT) {
@@ -474,20 +496,28 @@ public class Forwarding extends ForwardingBase implements IFloodlightModule, IOF
                  * Take care of the ethertype if not included earlier,
                  * since it's a prerequisite for transport ports.
                  */
-                if (!FLOWMOD_DEFAULT_MATCH_IP_ADDR) {
+                if (!FLOWMOD_DEFAULT_MATCH_IP) {
                     mb.setExact(MatchField.ETH_TYPE, EthType.IPv6);
                 }
 
                 if (ip.getNextHeader().equals(IpProtocol.TCP)) {
                     TCP tcp = (TCP) ip.getPayload();
-                    mb.setExact(MatchField.IP_PROTO, IpProtocol.TCP)
-                    .setExact(MatchField.TCP_SRC, tcp.getSourcePort())
-                    .setExact(MatchField.TCP_DST, tcp.getDestinationPort());
+                    mb.setExact(MatchField.IP_PROTO, IpProtocol.TCP);
+                    if (FLOWMOD_DEFAULT_MATCH_TRANSPORT_SRC) {
+                        mb.setExact(MatchField.TCP_SRC, tcp.getSourcePort());
+                    }
+                    if (FLOWMOD_DEFAULT_MATCH_TRANSPORT_DST) {
+                        mb.setExact(MatchField.TCP_DST, tcp.getDestinationPort());
+                    }
                 } else if (ip.getNextHeader().equals(IpProtocol.UDP)) {
                     UDP udp = (UDP) ip.getPayload();
-                    mb.setExact(MatchField.IP_PROTO, IpProtocol.UDP)
-                    .setExact(MatchField.UDP_SRC, udp.getSourcePort())
-                    .setExact(MatchField.UDP_DST, udp.getDestinationPort());
+                    mb.setExact(MatchField.IP_PROTO, IpProtocol.UDP);
+                    if (FLOWMOD_DEFAULT_MATCH_TRANSPORT_SRC) {
+                        mb.setExact(MatchField.UDP_SRC, udp.getSourcePort());
+                    }
+                    if (FLOWMOD_DEFAULT_MATCH_TRANSPORT_DST) {
+                        mb.setExact(MatchField.UDP_DST, udp.getDestinationPort());
+                    }
                 }
             }
         }
@@ -611,21 +641,47 @@ public class Forwarding extends ForwardingBase implements IFloodlightModule, IOF
         tmp = configParameters.get("match");
         if (tmp != null) {
             tmp = tmp.toLowerCase();
-            if (!tmp.contains("vlan") && !tmp.contains("mac") && !tmp.contains("ip") && !tmp.contains("port")) {
+            if (!tmp.contains("in-port") && !tmp.contains("vlan") 
+                    && !tmp.contains("mac") && !tmp.contains("ip") 
+                    && !tmp.contains("transport")) {
                 /* leave the default configuration -- blank or invalid 'match' value */
             } else {
+                FLOWMOD_DEFAULT_MATCH_IN_PORT = tmp.contains("in-port") ? true : false;
                 FLOWMOD_DEFAULT_MATCH_VLAN = tmp.contains("vlan") ? true : false;
                 FLOWMOD_DEFAULT_MATCH_MAC = tmp.contains("mac") ? true : false;
-                FLOWMOD_DEFAULT_MATCH_IP_ADDR = tmp.contains("ip") ? true : false;
-                FLOWMOD_DEFAULT_MATCH_TRANSPORT = tmp.contains("port") ? true : false;
-
+                FLOWMOD_DEFAULT_MATCH_IP = tmp.contains("ip") ? true : false;
+                FLOWMOD_DEFAULT_MATCH_TRANSPORT = tmp.contains("transport") ? true : false;
             }
         }
-        log.info("Default flow matches set to: VLAN=" + FLOWMOD_DEFAULT_MATCH_VLAN
+        log.info("Default flow matches set to: IN_PORT=" + FLOWMOD_DEFAULT_MATCH_IN_PORT
+                + ", VLAN=" + FLOWMOD_DEFAULT_MATCH_VLAN
                 + ", MAC=" + FLOWMOD_DEFAULT_MATCH_MAC
-                + ", IP=" + FLOWMOD_DEFAULT_MATCH_IP_ADDR
+                + ", IP=" + FLOWMOD_DEFAULT_MATCH_IP
                 + ", TPPT=" + FLOWMOD_DEFAULT_MATCH_TRANSPORT);
-
+        
+        tmp = configParameters.get("detailed-match");
+        if (tmp != null) {
+            tmp = tmp.toLowerCase();
+            if (!tmp.contains("src-mac") && !tmp.contains("dst-mac") 
+                    && !tmp.contains("src-ip") && !tmp.contains("dst-ip")
+                    && !tmp.contains("src-transport") && !tmp.contains("dst-transport")) {
+                /* leave the default configuration -- both src and dst for layers defined above */
+            } else {
+                FLOWMOD_DEFAULT_MATCH_MAC_SRC = tmp.contains("src-mac") ? true : false;
+                FLOWMOD_DEFAULT_MATCH_MAC_DST = tmp.contains("dst-mac") ? true : false;
+                FLOWMOD_DEFAULT_MATCH_IP_SRC = tmp.contains("src-ip") ? true : false;
+                FLOWMOD_DEFAULT_MATCH_IP_DST = tmp.contains("dst-ip") ? true : false;
+                FLOWMOD_DEFAULT_MATCH_TRANSPORT_SRC = tmp.contains("src-transport") ? true : false;
+                FLOWMOD_DEFAULT_MATCH_TRANSPORT_DST = tmp.contains("dst-transport") ? true : false;
+            }
+        }
+        log.info("Default detailed flow matches set to: SRC_MAC=" + FLOWMOD_DEFAULT_MATCH_MAC_SRC
+                + ", DST_MAC=" + FLOWMOD_DEFAULT_MATCH_MAC_DST
+                + ", SRC_IP=" + FLOWMOD_DEFAULT_MATCH_IP_SRC
+                + ", DST_IP=" + FLOWMOD_DEFAULT_MATCH_IP_DST
+                + ", SRC_TPPT=" + FLOWMOD_DEFAULT_MATCH_TRANSPORT_SRC
+                + ", DST_TPPT=" + FLOWMOD_DEFAULT_MATCH_TRANSPORT_DST);
+        
         tmp = configParameters.get("flood-arp");
         if (tmp != null) {
             tmp = tmp.toLowerCase();
diff --git a/src/main/java/net/floodlightcontroller/routing/ForwardingBase.java b/src/main/java/net/floodlightcontroller/routing/ForwardingBase.java
index 194ce547421a5f0de9d40b9199def1646183dafa..068db2550716a1a68e210d851175ddcdc56aea62 100644
--- a/src/main/java/net/floodlightcontroller/routing/ForwardingBase.java
+++ b/src/main/java/net/floodlightcontroller/routing/ForwardingBase.java
@@ -87,10 +87,18 @@ public abstract class ForwardingBase implements IOFMessageListener {
 
     protected static boolean FLOWMOD_DEFAULT_SET_SEND_FLOW_REM_FLAG = false;
 
+    protected static boolean FLOWMOD_DEFAULT_MATCH_IN_PORT = true;
     protected static boolean FLOWMOD_DEFAULT_MATCH_VLAN = true;
     protected static boolean FLOWMOD_DEFAULT_MATCH_MAC = true;
-    protected static boolean FLOWMOD_DEFAULT_MATCH_IP_ADDR = true;
+    protected static boolean FLOWMOD_DEFAULT_MATCH_IP = true;
     protected static boolean FLOWMOD_DEFAULT_MATCH_TRANSPORT = true;
+    
+    protected static boolean FLOWMOD_DEFAULT_MATCH_MAC_SRC = true;
+    protected static boolean FLOWMOD_DEFAULT_MATCH_MAC_DST = true;
+    protected static boolean FLOWMOD_DEFAULT_MATCH_IP_SRC = true;
+    protected static boolean FLOWMOD_DEFAULT_MATCH_IP_DST = true;
+    protected static boolean FLOWMOD_DEFAULT_MATCH_TRANSPORT_SRC = true;
+    protected static boolean FLOWMOD_DEFAULT_MATCH_TRANSPORT_DST = true;
 
     protected static final short FLOWMOD_DEFAULT_IDLE_TIMEOUT_CONSTANT = 5;
     protected static final short FLOWMOD_DEFAULT_HARD_TIMEOUT_CONSTANT = 0;
diff --git a/src/main/resources/floodlightdefault.properties b/src/main/resources/floodlightdefault.properties
index e757e85f4bc498a01f1d5cddb71d97973af6f943..cc43bac5e8a2ac39f7d395baf2f94a59f42e6714 100644
--- a/src/main/resources/floodlightdefault.properties
+++ b/src/main/resources/floodlightdefault.properties
@@ -29,7 +29,8 @@ org.sdnplatform.sync.internal.SyncManager.nodes=[\
 {"nodeId": 1, "domainId": 1, "hostname": "192.168.1.100", "port": 6642},\
 {"nodeId": 2, "domainId": 1, "hostname": "192.168.1.100", "port": 6643}\
 ]
-net.floodlightcontroller.forwarding.Forwarding.match=vlan, mac, ip, transport
+net.floodlightcontroller.forwarding.Forwarding.match=in-port, vlan, mac, ip, transport
+net.floodlightcontroller.forwarding.Forwarding.detailed-match=src-mac, dst-mac, src-ip, dst-ip, src-transport, dst-transport
 net.floodlightcontroller.forwarding.Forwarding.flood-arp=NO
 net.floodlightcontroller.forwarding.Forwarding.idle-timeout=5
 net.floodlightcontroller.forwarding.Forwarding.set-send-flow-rem-flag=FALSE