diff --git a/tests/FuncUtils.py b/tests/FuncUtils.py
index f320652..278f15c 100644
--- a/tests/FuncUtils.py
+++ b/tests/FuncUtils.py
@@ -19,6 +19,21 @@
 
 #################### Functions for various types of flow_mod  ##########################################################################################
 
+def match_send_flowadd(self, match, priority, port):
+    msg = message.flow_mod()
+    msg.out_port = ofp.OFPP_NONE
+    msg.command = ofp.OFPFC_ADD
+    # msg.cookie = random.randint(0,9007199254740992)
+    msg.buffer_id = 0xffffffff
+    msg.match = match
+    if priority != None :
+        msg.priority = priority
+    act = action.action_output()
+    act.port = port 
+    msg.actions.add(act)
+    self.controller.message_send(msg)
+    do_barrier(self.controller)
+
 def exact_match(self,of_ports,priority=None):
 # Generate ExactMatch flow .
 
@@ -29,21 +44,7 @@
     match.in_port = of_ports[0]
     #match.nw_src = 1
     match.wildcards=0
-    msg = message.flow_mod()
-    msg.out_port = ofp.OFPP_NONE
-    msg.command = ofp.OFPFC_ADD
-    msg.buffer_id = 0xffffffff
-    msg.match = match
-    if priority != None :
-        msg.priority = priority
-
-    act = action.action_output()
-    act.port = of_ports[1]
-    msg.actions.add(act)
-
-    self.controller.message_send(msg)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match, priority, of_ports[1])
     return (pkt_exactflow,match)
 
 def exact_match_with_prio(self,of_ports,priority=None):
@@ -56,21 +57,7 @@
     match.in_port = of_ports[0]
     #match.nw_src = 1
     match.wildcards=0
-    msg = message.flow_mod()
-    msg.out_port = ofp.OFPP_NONE
-    msg.command = ofp.OFPFC_ADD
-    msg.buffer_id = 0xffffffff
-    msg.match = match
-    if priority != None :
-        msg.priority = priority
-
-    act = action.action_output()
-    act.port = of_ports[2]
-    msg.actions.add(act)
-
-    self.controller.message_send(msg)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match, priority, of_ports[2])
     return (pkt_exactflow,match)         
        
 
@@ -84,21 +71,7 @@
     match1.in_port = of_ports[0]
     #match1.nw_src = 1
     match1.wildcards = ofp.OFPFW_DL_SRC
-    msg1 = message.flow_mod()
-    msg1.out_port = ofp.OFPP_NONE
-    msg1.command = ofp.OFPFC_ADD
-    msg1.buffer_id = 0xffffffff
-    msg1.match = match1
-    if priority != None :
-        msg1.priority = priority
-
-    act1 = action.action_output()
-    act1.port = of_ports[1]
-    msg1.actions.add(act1)
-
-    self.controller.message_send(msg1)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match1, priority, of_ports[1])
     return (pkt_wildcardsrc,match1)
 
 def match_ethernet_src_address(self,of_ports,priority=None):
@@ -108,24 +81,8 @@
     pkt_MatchSrc = simple_eth_packet(dl_src='00:01:01:01:01:01')
     match = parse.packet_to_flow_match(pkt_MatchSrc)
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
-
     match.wildcards = ofp.OFPFW_ALL ^ofp.OFPFW_DL_SRC
-        
-    msg = message.flow_mod()
-    msg.out_port = ofp.OFPP_NONE
-    msg.command = ofp.OFPFC_ADD
-    msg.buffer_id = 0xffffffff
-    msg.match = match
-    if priority != None :
-        msg.priority = priority
-
-    act = action.action_output()
-    act.port = of_ports[1]
-    msg.actions.add(act)
-
-    self.controller.message_send(msg)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match, priority, of_ports[1])
     return (pkt_MatchSrc,match)
       
 def match_ethernet_dst_address(self,of_ports,priority=None):
@@ -137,21 +94,7 @@
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
 
     match.wildcards = ofp.OFPFW_ALL ^ofp.OFPFW_DL_DST
-    msg = message.flow_mod()
-    msg.out_port = ofp.OFPP_NONE
-    msg.command = ofp.OFPFC_ADD
-    msg.buffer_id = 0xffffffff
-    msg.match = match
-    if priority != None :
-        msg.priority = priority
-
-    act = action.action_output()
-    act.port = of_ports[1]
-    msg.actions.add(act)
-
-    self.controller.message_send(msg)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match, priority, of_ports[1])
     return (pkt_matchdst,match)
 
 def wildcard_all(self,of_ports,priority=None):
@@ -163,26 +106,11 @@
     self.assertTrue(match2 is not None, "Could not generate flow match from pkt")
     match2.wildcards=ofp.OFPFW_ALL
     match2.in_port = of_ports[0]
-
-    msg2 = message.flow_mod()
-    msg2.out_port = ofp.OFPP_NONE
-    msg2.command = ofp.OFPFC_ADD
-    msg2.buffer_id = 0xffffffff
-    msg2.match = match2
-    act2 = action.action_output()
-    act2.port = of_ports[1]
-    msg2.actions.add(act2)
-    if priority != None :
-        msg2.priority = priority
-
-    self.controller.message_send(msg2)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match2, priority, of_ports[1])
     return (pkt_wildcard,match2)
 
 def wildcard_all_except_ingress(self,of_ports,priority=None):
 # Generate Wildcard_All_Except_Ingress_port flow
-        
 
     #Create a simple tcp packet and generate wildcard all except ingress_port flow.
     pkt_matchingress = simple_tcp_packet()
@@ -190,32 +118,11 @@
     self.assertTrue(match3 is not None, "Could not generate flow match from pkt")
     match3.wildcards = ofp.OFPFW_ALL-ofp.OFPFW_IN_PORT
     match3.in_port = of_ports[0]
-
-    msg3 = message.flow_mod()
-    msg3.command = ofp.OFPFC_ADD
-    msg3.match = match3
-    msg3.out_port = of_ports[2] # ignored by flow add,flow modify 
-    msg3.cookie = random.randint(0,9007199254740992)
-    msg3.buffer_id = 0xffffffff
-    msg3.idle_timeout = 0
-    msg3.hard_timeout = 0
-    msg3.buffer_id = 0xffffffff
-       
-    act3 = action.action_output()
-    act3.port = of_ports[1]
-    msg3.actions.add(act3)
-
-    if priority != None :
-        msg3.priority = priority
-
-    self.controller.message_send(msg3)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match3, priority, of_ports[1])
     return (pkt_matchingress,match3)
 
 def wildcard_all_except_ingress1(self,of_ports,priority=None):
 # Generate Wildcard_All_Except_Ingress_port flow with action output to port egress_port 2 
-        
 
     #Create a simple tcp packet and generate wildcard all except ingress_port flow.
     pkt_matchingress = simple_tcp_packet()
@@ -223,26 +130,7 @@
     self.assertTrue(match3 is not None, "Could not generate flow match from pkt")
     match3.wildcards = ofp.OFPFW_ALL-ofp.OFPFW_IN_PORT
     match3.in_port = of_ports[0]
-
-    msg3 = message.flow_mod()
-    msg3.command = ofp.OFPFC_ADD
-    msg3.match = match3
-    msg3.out_port = of_ports[2] # ignored by flow add,flow modify 
-    msg3.cookie = random.randint(0,9007199254740992)
-    msg3.buffer_id = 0xffffffff
-    msg3.idle_timeout = 0
-    msg3.hard_timeout = 0
-    msg3.buffer_id = 0xffffffff
-       
-    act3 = action.action_output()
-    act3.port = of_ports[2]
-    msg3.actions.add(act3)
-    if priority != None :
-        msg3.priority = priority
-
-    self.controller.message_send(msg3)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match3, priority, of_ports[2])
     return (pkt_matchingress,match3)
 
 
@@ -255,21 +143,7 @@
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
 
     match.wildcards = ofp.OFPFW_ALL^ofp.OFPFW_DL_TYPE ^ofp.OFPFW_DL_VLAN
-    msg = message.flow_mod()
-    msg.out_port = ofp.OFPP_NONE
-    msg.command = ofp.OFPFC_ADD
-    msg.buffer_id = 0xffffffff
-    msg.match = match
-    if priority != None :
-        msg.priority = priority
-
-    act = action.action_output()
-    act.port = of_ports[1]
-    msg.actions.add(act)
-
-    self.controller.message_send(msg)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match, priority, of_ports[1])
     return (pkt_matchvlanid,match)
 
 def match_vlan_pcp(self,of_ports,priority=None):
@@ -281,21 +155,7 @@
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
 
     match.wildcards = ofp.OFPFW_ALL ^ofp.OFPFW_DL_TYPE^ofp.OFPFW_DL_VLAN^ofp.OFPFW_DL_VLAN_PCP 
-    msg = message.flow_mod()
-    msg.out_port = ofp.OFPP_NONE
-    msg.command = ofp.OFPFC_ADD
-    msg.buffer_id = 0xffffffff
-    msg.match = match
-    if priority != None :
-        msg.priority = priority
-
-    act = action.action_output()
-    act.port = of_ports[1]
-    msg.actions.add(act)
-
-    self.controller.message_send(msg)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match, priority, of_ports[1])
     return (pkt_matchvlanpcp,match)
 
 
@@ -308,21 +168,7 @@
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
 
     match.wildcards = ofp.OFPFW_ALL ^ofp.OFPFW_DL_TYPE ^ofp.OFPFW_DL_DST ^ofp.OFPFW_DL_SRC
-    msg = message.flow_mod()
-    msg.out_port = ofp.OFPP_NONE
-    msg.command = ofp.OFPFC_ADD
-    msg.buffer_id = 0xffffffff
-    msg.match = match
-    if priority != None :
-        msg.priority = priority
-
-    act = action.action_output()
-    act.port = of_ports[1]
-    msg.actions.add(act)
-
-    self.controller.message_send(msg)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match, priority, of_ports[1])
     return (pkt_mulL2,match)
 
 
@@ -334,46 +180,19 @@
     match = parse.packet_to_flow_match(pkt_mulL4)
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
     match.wildcards = ofp.OFPFW_ALL^ofp.OFPFW_DL_TYPE ^ofp.OFPFW_NW_PROTO^ofp.OFPFW_TP_SRC ^ofp.OFPFW_TP_DST 
-    msg = message.flow_mod()
-    msg.out_port = ofp.OFPP_NONE
-    msg.command = ofp.OFPFC_ADD
-    msg.buffer_id = 0xffffffff
-    msg.match = match
-    if priority != None :
-        msg.priority = priority
-
-    act = action.action_output()
-    act.port = of_ports[1]
-    msg.actions.add(act)
-
-    self.controller.message_send(msg)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match, priority, of_ports[1])
     return (pkt_mulL4,match)  
 
 def match_ip_tos(self,of_ports,priority=None):
     #Generate a Match on IP Type of service flow
 
-        #Create a simple tcp packet and generate match on Type of service 
+    #Create a simple tcp packet and generate match on Type of service 
     pkt_iptos = simple_tcp_packet(ip_tos=28)
     match = parse.packet_to_flow_match(pkt_iptos)
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
 
     match.wildcards = ofp.OFPFW_ALL^ofp.OFPFW_DL_TYPE^ofp.OFPFW_NW_PROTO ^ofp.OFPFW_NW_TOS
-    msg = message.flow_mod()
-    msg.out_port = ofp.OFPP_NONE
-    msg.command = ofp.OFPFC_ADD
-    msg.buffer_id = 0xffffffff
-    msg.match = match
-    if priority != None :
-        msg.priority = priority
-    act = action.action_output()
-    act.port = of_ports[1]
-    msg.actions.add(act)
-
-    self.controller.message_send(msg)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match, priority, of_ports[1])
     return (pkt_iptos,match)
 
 def match_ip_protocol(self,of_ports,priority=None):
@@ -385,23 +204,9 @@
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
 
     match.wildcards = ofp.OFPFW_ALL^ofp.OFPFW_DL_TYPE^ofp.OFPFW_NW_PROTO 
-    msg = message.flow_mod()
-    msg.out_port = ofp.OFPP_NONE
-    msg.command = ofp.OFPFC_ADD
-    msg.buffer_id = 0xffffffff
-    msg.match = match
-    if priority != None :
-        msg.priority = priority
-    act = action.action_output()
-    act.port = of_ports[1]
-    msg.actions.add(act)
-
-    self.controller.message_send(msg)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match, priority, of_ports[1])
     return (pkt_iptos,match)
 
-
 def match_tcp_src(self,of_ports,priority=None):
     #Generate Match_Tcp_Src
 
@@ -411,46 +216,19 @@
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
 
     match.wildcards = ofp.OFPFW_ALL^ofp.OFPFW_DL_TYPE ^ofp.OFPFW_NW_PROTO ^ofp.OFPFW_TP_SRC  
-    msg = message.flow_mod()
-    msg.out_port = ofp.OFPP_NONE
-    msg.command = ofp.OFPFC_ADD
-    msg.buffer_id = 0xffffffff
-    msg.match = match
-    if priority != None :
-        msg.priority = priority
-
-    act = action.action_output()
-    act.port = of_ports[1]
-    msg.actions.add(act)
-
-    self.controller.message_send(msg)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match, priority, of_ports[1])
     return (pkt_matchtSrc,match)  
 
 def match_tcp_dst(self,of_ports,priority=None):
     #Generate Match_Tcp_Dst
 
-        #Create a simple tcp packet and generate match on tcp destination port flow
+    #Create a simple tcp packet and generate match on tcp destination port flow
     pkt_matchdst = simple_tcp_packet(tcp_dport=112)
     match = parse.packet_to_flow_match(pkt_matchdst)
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
 
     match.wildcards = ofp.OFPFW_ALL ^ofp.OFPFW_DL_TYPE^ofp.OFPFW_NW_PROTO^ofp.OFPFW_TP_DST  
-    msg = message.flow_mod()
-    msg.out_port = ofp.OFPP_NONE
-    msg.command = ofp.OFPFC_ADD
-    msg.buffer_id = 0xffffffff
-    msg.match = match
-    if priority != None :
-        msg.priority = priority
-    act = action.action_output()
-    act.port = of_ports[1]
-    msg.actions.add(act)
-
-    self.controller.message_send(msg)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match, priority, of_ports[1])
     return (pkt_matchdst,match)        
 
 
@@ -463,46 +241,19 @@
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
 
     match.wildcards = ofp.OFPFW_ALL^ofp.OFPFW_DL_TYPE ^ofp.OFPFW_NW_PROTO ^ofp.OFPFW_TP_SRC  
-    msg = message.flow_mod()
-    msg.out_port = ofp.OFPP_NONE
-    msg.command = ofp.OFPFC_ADD
-    msg.buffer_id = 0xffffffff
-    msg.match = match
-    if priority != None :
-        msg.priority = priority
-
-    act = action.action_output()
-    act.port = of_ports[1]
-    msg.actions.add(act)
-
-    self.controller.message_send(msg)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match, priority, of_ports[1])
     return (pkt_matchtSrc,match)  
 
 def match_udp_dst(self,of_ports,priority=None):
     #Generate Match_Udp_Dst
 
-        #Create a simple udp packet and generate match on udp destination port flow
+    #Create a simple udp packet and generate match on udp destination port flow
     pkt_matchdst = simple_udp_packet(udp_dport=112)
     match = parse.packet_to_flow_match(pkt_matchdst)
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
 
     match.wildcards = ofp.OFPFW_ALL ^ofp.OFPFW_DL_TYPE^ofp.OFPFW_NW_PROTO^ofp.OFPFW_TP_DST  
-    msg = message.flow_mod()
-    msg.out_port = ofp.OFPP_NONE
-    msg.command = ofp.OFPFC_ADD
-    msg.buffer_id = 0xffffffff
-    msg.match = match
-    if priority != None :
-        msg.priority = priority
-    act = action.action_output()
-    act.port = of_ports[1]
-    msg.actions.add(act)
-
-    self.controller.message_send(msg)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match, priority, of_ports[1])
     return (pkt_matchdst,match)        
 
 
@@ -515,21 +266,7 @@
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
 
     match.wildcards = ofp.OFPFW_ALL^ofp.OFPFW_DL_TYPE ^ofp.OFPFW_NW_PROTO ^ofp.OFPFW_TP_SRC  
-    msg = message.flow_mod()
-    msg.out_port = ofp.OFPP_NONE
-    msg.command = ofp.OFPFC_ADD
-    msg.buffer_id = 0xffffffff
-    msg.match = match
-    if priority != None :
-        msg.priority = priority
-
-    act = action.action_output()
-    act.port = of_ports[1]
-    msg.actions.add(act)
-
-    self.controller.message_send(msg)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match, priority, of_ports[1])
     return (pkt_match, match)
 
 def match_icmp_code(self,of_ports,priority=None):
@@ -541,21 +278,7 @@
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
 
     match.wildcards = ofp.OFPFW_ALL^ofp.OFPFW_DL_TYPE ^ofp.OFPFW_NW_PROTO ^ofp.OFPFW_TP_DST
-    msg = message.flow_mod()
-    msg.out_port = ofp.OFPP_NONE
-    msg.command = ofp.OFPFC_ADD
-    msg.buffer_id = 0xffffffff
-    msg.match = match
-    if priority != None :
-        msg.priority = priority
-
-    act = action.action_output()
-    act.port = of_ports[1]
-    msg.actions.add(act)
-
-    self.controller.message_send(msg)
-    do_barrier(self.controller)
-
+    match_send_flowadd(self, match, priority, of_ports[1])
     return (pkt_match, match)  
 
 
@@ -568,20 +291,7 @@
     self.assertTrue(match is not None, "Could not generate flow match from pkt")
 
     match.wildcards = ofp.OFPFW_ALL ^ofp.OFPFW_DL_TYPE
-    msg = message.flow_mod()
-    msg.out_port = ofp.OFPP_NONE
-    msg.command = ofp.OFPFC_ADD
-    msg.buffer_id = 0xffffffff
-    msg.match = match
-    if priority != None :
-        msg.priority = priority
-
-    act = action.action_output()
-    act.port = of_ports[1]
-    msg.actions.add(act)
-
-    self.controller.message_send(msg)
-    do_barrier(self.controller)
+    match_send_flowadd(self, match, priority, of_ports[1])
     return (pkt_matchtype,match)
 
    
