diff --git a/ofdpa/flows.py b/ofdpa/flows.py
index 36db256..b2a11be 100755
--- a/ofdpa/flows.py
+++ b/ofdpa/flows.py
@@ -190,13 +190,12 @@
     """
 
     def runTest(self):
-
+        Groups = Queue.LifoQueue()
         try:
             intf_src_mac=[0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
             dst_mac=[0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
             dip=0xc0a80001
             ports = sorted(config["port_map"].keys())
-            Groups = Queue.LifoQueue()
 
             for port in ports:
                 #add l2 interface group
@@ -241,11 +240,11 @@
     """
 
     def runTest(self):
+        Groups = Queue.LifoQueue()
         try:
             ports = sorted(config["port_map"].keys())
             vlan_id = 1
 
-            Groups = Queue.LifoQueue()
             for port in ports:
                 L2gid, l2msg = add_one_l2_interface_group(self.controller, port,
                                                           vlan_id, True, False)
@@ -332,10 +331,11 @@
     """
 
     def runTest(self):
+
+        Groups = Queue.LifoQueue()
         try:
             ports = sorted(config["port_map"].keys())
             vlan_id = 1;
-            Groups = Queue.LifoQueue()
             for port in ports:
                 L2gid, l2msg = add_one_l2_interface_group(self.controller, port,
                                                           vlan_id, True, False)
@@ -370,10 +370,10 @@
 
 class Mtu1500(base_tests.SimpleDataPlane):
     def runTest(self):
+        Groups = Queue.LifoQueue()
         try:
             ports = sorted(config["port_map"].keys())
             vlan_id = 18
-            Groups = Queue.LifoQueue()
             for port in ports:
                 L2gid, msg = add_one_l2_interface_group(self.controller, port,
                                                         vlan_id, True, False)
@@ -411,6 +411,7 @@
     """
 
     def runTest(self):
+        Groups = Queue.LifoQueue()
         try:
             test_id = 26
             if len(config["port_map"]) < 2:
@@ -421,7 +422,6 @@
             dst_mac = [0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
             dip = 0xc0a80001
             ports = config["port_map"].keys()
-            Groups = Queue.LifoQueue()
             for port in ports:
                 # add l2 interface group
                 vlan_id = port + test_id
@@ -485,6 +485,7 @@
     """
 
     def runTest(self):
+        Groups = Queue.LifoQueue()
         try:
             if len(config["port_map"]) < 2:
                 logging.info("Port count less than 2, can't run this case")
@@ -494,7 +495,6 @@
             dst_mac = [0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
             dip = 0xc0a80001
             ports = config["port_map"].keys()
-            Groups = Queue.LifoQueue()
             for port in ports:
                 # add l2 interface group
                 id = port
@@ -566,6 +566,7 @@
     """
 
     def runTest(self):
+        Groups = Queue.LifoQueue()
         try:
             if len(config["port_map"]) < 2:
                 logging.info("Port count less than 2, can't run this case")
@@ -575,7 +576,6 @@
             dst_mac = [0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
             dip = 0xc0a80001
             ports = config["port_map"].keys()
-            Groups = Queue.LifoQueue()
             for port in ports:
                 # add l2 interface group
                 id = port
@@ -648,8 +648,8 @@
     """
 
     def runTest(self):
+        Groups = Queue.LifoQueue()
         try:
-            Groups = Queue.LifoQueue()
             if len(config["port_map"]) < 2:
                 logging.info("Port count less than 2, can't run this case")
                 return
@@ -725,6 +725,7 @@
     """
 
     def runTest(self):
+        Groups = Queue.LifoQueue()
         try:
             if len(config["port_map"]) < 2:
                 logging.info("Port count less than 2, can't run this case")
@@ -734,7 +735,6 @@
             dst_mac = [0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
             dip = 0xc0a80001
             ports = config["port_map"].keys()
-            Groups = Queue.LifoQueue()
             for port in ports:
                 # add l2 interface group
                 id = port
@@ -803,6 +803,7 @@
     """
 
     def runTest(self):
+        Groups = Queue.LifoQueue()
         try:
             if len(config["port_map"]) < 2:
                 logging.info("Port count less than 2, can't run this case")
@@ -810,7 +811,6 @@
             intf_src_mac = [0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
             dst_mac = [0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
             dip = 0xc0a80001
-            Groups = Queue.LifoQueue()
             ports = config["port_map"].keys()
             for port in ports:
                 # add l2 interface group
@@ -888,8 +888,8 @@
     """
 
     def runTest(self):
+        Groups = Queue.LifoQueue()
         try:
-            Groups = Queue.LifoQueue()
             if len(config["port_map"]) < 2:
                 logging.info("Port count less than 2, can't run this case")
                 return
@@ -1056,12 +1056,12 @@
         """
         port1 (vlan 300)-> All Ports (vlan 300)
         """
+        Groups = Queue.LifoQueue()
         try:
             if len(config["port_map"]) < 3:
                 logging.info("Port count less than 3, can't run this case")
                 assert (False)
                 return
-            Groups = Queue.LifoQueue()
             vlan_id = 300
             intf_src_mac = [0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
             intf_src_mac_str = ':'.join(['%02X' % x for x in intf_src_mac])
@@ -1134,8 +1134,8 @@
         """
         port1 (vlan 1)-> port 2 (vlan 2)
         """
+        Groups = Queue.LifoQueue()
         try:
-            Groups = Queue.LifoQueue()
             if len(config["port_map"]) < 3:
                 logging.info("Port count less than 3, can't run this case")
                 assert (False)
@@ -1221,8 +1221,8 @@
         Receive MPLS packet
     """
     def runTest(self):
+        Groups = Queue.LifoQueue()
         try:
-            Groups = Queue.LifoQueue()
             if len(config["port_map"]) < 2:
                 logging.info("Port count less than 2, can't run this case")
                 return
@@ -1296,8 +1296,8 @@
         Receive MPLS packet
     """
     def runTest(self):
+        Groups = Queue.LifoQueue()
         try:
-            Groups = Queue.LifoQueue()
             if len(config["port_map"]) < 2:
                 logging.info("Port count less than 2, can't run this case")
                 return
@@ -1365,17 +1365,16 @@
     """
 
     def runTest(self):
+        Groups = Queue.LifoQueue()
         try:
             test_id = 26
             if len(config["port_map"]) < 2:
                 logging.info("Port count less than 2, can't run this case")
                 return
-
             intf_src_mac = [0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc]
             dst_mac = [0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
             dip = 0xc0a80001
             ports = config["port_map"].keys()
-            Groups = Queue.LifoQueue()
             for port in ports:
                 # add l2 interface group
                 vlan_id = port + test_id
@@ -1438,6 +1437,7 @@
     """
 
     def runTest(self):
+        Groups = Queue.LifoQueue()
         try:
             if len(config["port_map"]) < 2:
                 logging.info("Port count less than 2, can't run this case")
@@ -1447,7 +1447,6 @@
             dst_mac = [0x00, 0x00, 0x00, 0x22, 0x22, 0x00]
             dip = 0xc0a80001
             ports = config["port_map"].keys()
-            Groups = Queue.LifoQueue()
             for port in ports:
                 # add l2 interface group
                 vlan_id = port
@@ -1629,6 +1628,7 @@
     """
 
     def runTest(self):
+        Groups = Queue.LifoQueue()
         try:
             ports = sorted(config["port_map"].keys())
 
@@ -1647,5 +1647,4 @@
                 verify_no_other_packets(self)
         finally:
             delete_all_flows(self.controller)
-            delete_groups(self.controller, Groups)
             delete_all_groups(self.controller)
\ No newline at end of file
diff --git a/ofdpa/ofdpa_utils.py b/ofdpa/ofdpa_utils.py
deleted file mode 100644
index 4fa4d0a..0000000
--- a/ofdpa/ofdpa_utils.py
+++ /dev/null
@@ -1,156 +0,0 @@
-"""
-
-A set of inter-test utility functions for dealing with OF-DPA
-
-
-"""
-
-import logging
-import ofp
-
-from oftest import config
-from oftest.testutils import *
-
-
-
-class table(object):
-    """ Metadata on each OFDPA table """
-    def __init__(self, table_id, table_name):
-        self.table_id = table_id
-        self.table_name = table_name
-    # TODO consider adding type checking verification here
-
-INGRESS_TABLE           = table(0, "Ingress")
-VLAN_TABLE              = table(10, "VLAN")
-MACTERM_TABLE           = table(20, "MacTerm")
-UNICAST_ROUTING_TABLE   = table(30, "Unicast Routing")
-MULTICAST_ROUTING_TABLE = table(40, "Multicast Routing")
-BRIDGING_TABLE          = table(50, "Bridging Table")
-ACL_TABLE               = table(60, "ACL Policy Table")
-#.... FIXME add all tables
-
-DEFAULT_VLAN = 1
-
-def enableVlanOnPort(controller, vlan, port=ofp.OFPP_ALL, priority=0):
-    if port == ofp.OFPP_ALL:
-        ports = sorted(config["port_map"].keys())
-    else:
-        ports = [port]
-    for port in ports:
-        tagged_match = ofp.match([
-                ofp.oxm.in_port(port),
-                ofp.oxm.vlan_vid(vlan | ofp.OFPVID_PRESENT)
-                ])
-
-        request = ofp.message.flow_add(
-            table_id = VLAN_TABLE.table_id,
-            cookie = 0xdead,
-            match = tagged_match,
-            instructions = [
-                ofp.instruction.goto_table(MACTERM_TABLE.table_id),
-#                 ofp.instruction.apply_actions(
-#                     actions=[
-#                         ofp.action.push_vlan(ethertype=0x8100), # DO NOT PUT THIS FOR OF-DPA 2.0 EA1 - seems to not matter for EA2
-#                         ofp.action.set_field(ofp.oxm.vlan_vid( ofp.OFPVID_PRESENT | vlan))
-#                     ]),
-                    ],
-            buffer_id = ofp.OFP_NO_BUFFER,
-            priority = priority)
-
-        logging.info("Inserting vlan rule allowing tagged vlan %d on port %d" % (vlan, port))
-        controller.message_send(request)
-        do_barrier(controller)
-        verify_no_errors(controller)
-
-
-def installDefaultVlan(controller, vlan=DEFAULT_VLAN, port=ofp.OFPP_ALL, priority=0):
-    """ Insert a rule that maps all untagged traffic to vlan $vlan
-
-    In OFDPA, table 10 (the vlan table) requires that all traffic be
-    mapped to an internal vlan else the packets be dropped.  This function
-    sets up a default vlan mapping all untagged traffic to an internal VLAN.
-
-    With OF-DPA, before you can insert a 'untagged to X' rule on a
-    port, you must first insert a 'X --> X' rule for the same port.
-
-    Further, the 'X --> X' rule must set ofp.OFPVID_PRESENT even
-    though 'X' is non-zero.
-
-    The 'controller' variable is self.controller from a test
-    """
-    # OFDPA seems to be dumb and wants each port set individually
-    #       Can't set all ports by using OFPP_ALL
-    if port == ofp.OFPP_ALL:
-        ports = sorted(config["port_map"].keys())
-    else:
-        ports = [port]
-
-    for port in ports:
-        # enable this vlan on this port before we can map untagged packets to the vlan
-        enableVlanOnPort(controller, vlan, port)
-
-        untagged_match = ofp.match([
-                ofp.oxm.in_port(port),
-                # OFDPA 2.0 says untagged is vlan_id=0, mask=ofp.OFPVID_PRESENT
-                ofp.oxm.vlan_vid_masked(0,ofp.OFPVID_PRESENT)    # WTF OFDPA 2.0EA2 -- really!?
-                ])
-
-        request = ofp.message.flow_add(
-            table_id = VLAN_TABLE.table_id,
-            cookie = 0xbeef,
-            match = untagged_match,
-            instructions = [
-                ofp.instruction.apply_actions(
-                    actions=[
-                        #ofp.action.push_vlan(ethertype=0x8100),
-                        ofp.action.set_field(ofp.oxm.vlan_vid(ofp.OFPVID_PRESENT | vlan))
-                    ]),
-                ofp.instruction.goto_table(MACTERM_TABLE.table_id)   
-                    ],
-            buffer_id = ofp.OFP_NO_BUFFER,
-            priority = priority)
-
-        logging.info("Inserting default vlan sending all untagged traffic to vlan %d on port %d" % (vlan, port))
-        controller.message_send(request)
-        do_barrier(controller)
-        verify_no_errors(controller)
-
-
-_group_types = {
-    "L2 Interface": 0,
-    "L2 Rewrite" : 1,
-    "L3 Unicast" : 2,
-    "L2 Multicast" : 3,
-    "L2 Flood" : 4,
-    "L3 Interface" : 5,
-    "L3 Multicast": 6,
-    "L3 ECMP": 7,
-    "L2 Data Center Overlay": 8,
-    "MPLS Label" : 9,
-    "MPLS Forwarding" :10,
-    "L2 Unfiltered Interface": 11,
-    "L2 Loopback": 12,
-}
-
-
-def makeGroupID(groupType, local_id):
-    """ Group IDs in OF-DPA have rich meaning
-
-    @param groupType is a key in _group_types
-    @param local_id is an integer 0<= local_id < 2**27,
-        but it may have more semantic meaning depending on the
-        groupType
-
-
-    Read Section 4.3 of the OF-DPA manual on groups for 
-    details
-    """
-    if groupType not in _group_types:
-        raise KeyError("%s not a valid OF-DPA group type" % groupType)
-    if local_id < 0 or local_id >=134217728:
-        raise ValueError("local_id %d must be  0<= local_id < 2**27" % local_id)
-    return (_group_types[groupType] << 28) + local_id
-
-
-def delete_all_recursive_groups(controller):
-    pass
