diff --git a/ofdpa/bugsKnown.py b/ofdpa/bugsKnown.py
index c7cb5dd..aa941f3 100755
--- a/ofdpa/bugsKnown.py
+++ b/ofdpa/bugsKnown.py
@@ -55,44 +55,24 @@
                         verify_no_packet(self, pkt, ofport)
 
                 verify_no_other_packets(self)
-@disabled
-class Mtu4500(base_tests.SimpleDataPlane):
+
+class Unfiltered(base_tests.SimpleDataPlane):
+    """
+    Testing addition of unfiltered groups
+    """
 
     def runTest(self):
         ports = sorted(config["port_map"].keys())
-
-        delete_all_flows(self.controller)
-        delete_all_groups(self.controller)
-
+        vlan_id = 1;
+        Groups = Queue.LifoQueue()
         for port in ports:
-            add_one_l2_interface_group(self.controller, port, 1, True, False)
-            add_one_vlan_table_flow(self.controller, port, 1, flag=VLAN_TABLE_FLAG_ONLY_TAG)
-            group_id = encode_l2_interface_group_id(1, port)
-            add_bridge_flow(self.controller, [0x00, 0x12, 0x34, 0x56, 0x78, port], 1, group_id, True)
+            L2gid, l2msg = add_l2_unfiltered_group(self.controller, [port], False)
+            Groups.put(L2gid)
         do_barrier(self.controller)
-
-        for out_port in ports:
-            # change dest based on port number
-            mac_dst= '00:12:34:56:78:%02X' % out_port
-            for in_port in ports:
-                if in_port == out_port:
-                    continue
-                # change source based on port number to avoid packet-ins from learning
-                mac_src= '00:12:34:56:78:%02X' % in_port
-                parsed_pkt = simple_tcp_packet(pktlen=4500,dl_vlan_enable=True, vlan_vid=1, eth_dst=mac_dst, eth_src=mac_src)
-                pkt = str(parsed_pkt)
-                self.dataplane.send(in_port, pkt)
-
-                for ofport in ports:
-                    if ofport in [out_port]:
-                        verify_packet(self, pkt, ofport)
-                    else:
-                        verify_no_packet(self, pkt, ofport)
-
-                verify_no_other_packets(self)
+        #delete_all_flows(self.controller)
+        #delete_groups(self.controller, Groups)
 
 
-@disabled
 class L3McastToVPN(base_tests.SimpleDataPlane):
     """
     Mcast routing
@@ -101,13 +81,13 @@
         """
         port1 (vlan 1)-> port 2 (vlan 2)
         """
-        #delete_all_flows(self.controller)
-        #delete_all_groups(self.controller)
+        delete_all_flows(self.controller)
+        delete_all_groups(self.controller)
 
-        if len(config["port_map"]) <3:
-            logging.info("Port count less than 3, can't run this case")
-            assert(False)
-            return
+        #if len(config["port_map"]) <3:
+            #logging.info("Port count less than 3, can't run this case")
+            #assert(False)
+            #return
 
         vlan_id =1
         port2_out_vlan=2
@@ -126,7 +106,7 @@
 
         port1=config["port_map"].keys()[0]
         port2=config["port_map"].keys()[1]
-        port3=config["port_map"].keys()[2]
+        #port3=config["port_map"].keys()[2]
 
         #add l2 interface group
         for port in config["port_map"].keys():
@@ -141,15 +121,15 @@
         #add MPLS interface group
         l2_gid = encode_l2_interface_group_id(port2_out_vlan, port2)
         mpls_gid2, mpls_msg = add_mpls_intf_group(self.controller, l2_gid, dst_mac, intf_src_mac, port2_out_vlan, port2)
-        l2_gid3 = encode_l2_interface_group_id(port3_out_vlan, port3)
-        mpls_gid3, mpls_msg = add_mpls_intf_group(self.controller, l2_gid3, dst_mac, intf_src_mac, port3_out_vlan, port3)
+        #l2_gid3 = encode_l2_interface_group_id(port3_out_vlan, port3)
+        #mpls_gid3, mpls_msg = add_mpls_intf_group(self.controller, l2_gid3, dst_mac, intf_src_mac, port3_out_vlan, port3)
         #add L3VPN groups
         mpls_label_gid2, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
                                                                index=(0x20000+port2), ref_gid= mpls_gid2, push_mpls_header=True, set_mpls_label=port2, set_bos=1, cpy_ttl_outward=True)
-        mpls_label_gid3, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
-                                                               index=(0x10000+port3), ref_gid= mpls_gid3, push_mpls_header=True, set_mpls_label=port3, set_bos=1, cpy_ttl_outward=True)
+        #mpls_label_gid3, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
+        #                                                       index=(0x10000+port3), ref_gid= mpls_gid3, push_mpls_header=True, set_mpls_label=port3, set_bos=1, cpy_ttl_outward=True)
 
-        mcat_group_msg=add_l3_mcast_group(self.controller, in_vlan,  2, [0x92020022 , 0x92010023])
+        mcat_group_msg=add_l3_mcast_group(self.controller, in_vlan,  2, [mpls_label_gid2])
         add_mcast4_routing_flow(self.controller, in_vlan, src_ip, 0, dst_ip, mcat_group_msg.group_id)
 
         parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=1,
@@ -160,16 +140,16 @@
                                        ip_dst=dst_ip_str)
         pkt=str(parsed_pkt)
         self.dataplane.send(port1, pkt)
-        label = (in_vlan, 0, 1, 63)
-        parsed_pkt = mpls_packet(pktlen=100,
+        label = (12, 0, 1, 63)
+        exp_pkt = mpls_packet(pktlen=100,
                                  eth_dst=dst_mac_str,
                                  eth_src=intf_src_mac_str,
-                                 ip_ttl=63,
+                                 ip_ttl=64,
                                  ip_src=src_ip_str, label= [label],
                                  ip_dst=dst_ip_str)
-        pkt=str(parsed_pkt)
+        pkt=str(exp_pkt)
         verify_packet(self, pkt, port2)
-        verify_packet(self, pkt, port3)
+        #verify_packet(self, pkt, port3)
         verify_no_other_packets(self)
 
 class LPMDirect(base_tests.SimpleDataPlane):
@@ -196,19 +176,19 @@
             mpls_gid, mpls_msg = add_mpls_intf_group(self.controller, l2_gid, dst_mac, intf_src_mac, vlan_id, port)
             #add MPLS L3 VPN group
             mpls_label_gid, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
-                                                                  index=port, ref_gid= mpls_gid, push_mpls_header=True, set_mpls_label=port, set_bos=1, set_ttl=32)
+                                             index=port, ref_gid= mpls_gid, push_mpls_header=True, set_mpls_label=port, set_bos=1, set_ttl=32)
             #ecmp_msg=add_l3_ecmp_group(self.controller, vlan_id, [mpls_label_gid])
             Groups._put(l2_gid)
             Groups._put(mpls_gid)
             Groups._put(mpls_label_gid)
             do_barrier(self.controller)
             #add vlan flow table
-            add_one_vlan_table_flow(self.controller, port, vlan_id, vrf=0, flag=VLAN_TABLE_FLAG_ONLY_TAG)
+            add_one_vlan_table_flow(self.controller, port, vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
             #add termination flow
             add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
             #add routing flow
             dst_ip = dip + (vlan_id<<8)
-            add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffff00, mpls_label_gid, vrf=2)
+            add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffff00, mpls_label_gid)
             #add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffff00, ecmp_msg.group_id)
         port = ports[0]
         #add l2 interface group
@@ -223,7 +203,7 @@
         do_barrier(self.controller)
         #add routing flow
         dst_ip = 0x0
-        add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0x0, mpls_label_gid, vrf=2)
+        add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0x0, mpls_label_gid)
         #add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0x0, ecmp_msg.group_id)
 
         do_barrier(self.controller)
@@ -253,15 +233,15 @@
                 parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
                                                eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst)
                 pkt=str(parsed_pkt)
-                self.dataplane.send(in_port, pkt)
+                #self.dataplane.send(in_port, pkt)
                 #build expect packet
                 mac_dst='00:00:00:22:22:%02X' % ports[0]
                 label = (ports[0], 0, 1, 32)
                 exp_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=ports[0], ip_ttl=63, ip_src=ip_src,
                                       ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac, label=[label])
                 pkt=str(exp_pkt)
-                verify_packet(self, pkt, ports[0])
-                verify_no_other_packets(self)
+                #verify_packet(self, pkt, ports[0])
+                #verify_no_other_packets(self)
         delete_all_flows(self.controller)
         delete_groups(self.controller,Groups)
 
@@ -396,7 +376,7 @@
 
         verify_no_other_packets(self)
 
-
+@disabled
 class PacketInIPTable(base_tests.SimpleDataPlane):
     """
     Test packet in function on IPTABLE
@@ -445,10 +425,9 @@
                 self.dataplane.send(in_port, pkt)
                 verify_packet_in(self, pkt, in_port, ofp.OFPR_ACTION)
                 #verify_no_other_packets(self)
-        #delete_all_flows(self.controller)
-        #delete_groups(self.controller, Groups)
+        delete_all_flows(self.controller)
+        delete_groups(self.controller, Groups)
 
-@disabled
 class PacketInSrcMacMiss(base_tests.SimpleDataPlane):
     """
     Test packet in function on a src-mac miss
diff --git a/ofdpa/flows.py b/ofdpa/flows.py
index f09e99b..0815114 100755
--- a/ofdpa/flows.py
+++ b/ofdpa/flows.py
@@ -188,6 +188,58 @@
             verify_no_other_packets(self)
         delete_all_flows(self.controller)
 
+class PacketInIPTable(base_tests.SimpleDataPlane):
+    """
+    Test packet in function on IPTABLE
+    Send a packet to each dataplane port and verify that a packet
+    in message is received from the controller for each
+    #todo verify you stop receiving after adding rule
+    """
+
+    def runTest(self):
+
+        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
+            vlan_id=port
+            add_one_l2_interface_group(self.controller, port, vlan_id=vlan_id, is_tagged=True, send_barrier=False)
+            dst_mac[5]=vlan_id
+            l3_msg=add_l3_unicast_group(self.controller, port, vlanid=vlan_id, id=vlan_id, src_mac=intf_src_mac, dst_mac=dst_mac)
+            #add vlan flow table
+            add_one_vlan_table_flow(self.controller, port, vlan_id,  flag=VLAN_TABLE_FLAG_ONLY_TAG)
+            #add termination flow
+            add_termination_flow(self.controller, port, 0x0800, intf_src_mac, vlan_id)
+            #add unicast routing flow
+            dst_ip = dip + (vlan_id<<8)
+            add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0xffffff00, l3_msg.group_id, send_ctrl=True)
+            Groups.put(l3_msg.group_id)
+
+        do_barrier(self.controller)
+
+        switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
+        for in_port in ports:
+            mac_src='00:00:00:22:22:%02X' % in_port
+            ip_src='192.168.%02d.1' % in_port
+            for out_port in ports:
+                if in_port == out_port:
+                    continue
+                ip_dst='192.168.%02d.1' % out_port
+                parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
+                                               eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src,
+                                               ip_dst=ip_dst)
+                pkt=str(parsed_pkt)
+                self.dataplane.send(in_port, pkt)
+                verify_packet_in(self, pkt, in_port, ofp.OFPR_ACTION)
+                #verify_no_other_packets(self)
+        delete_all_flows(self.controller)
+        delete_groups(self.controller, Groups)
+
+
 
 class L2FloodQinQ(base_tests.SimpleDataPlane):
     """
@@ -396,7 +448,7 @@
 
         switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
         for in_port in ports:
-            mac_src = '00:00:00:22:22:%02X' % (test_id + in_port)
+            mac_src = '00:00:00:22:32:%02X' % (test_id + in_port)
             ip_src = '192.168.%02d.1' % (test_id + in_port)
             for out_port in ports:
                 if in_port == out_port:
@@ -676,13 +728,10 @@
             # add l2 interface group
             id = port
             vlan_id = port
-            l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port,
-                                                        vlan_id, True, True)
+            l2_gid, l2_msg = add_one_l2_interface_group(self.controller, port, vlan_id, True, True)
             dst_mac[5] = vlan_id
             # add MPLS interface group
-            mpls_gid, mpls_msg = add_mpls_intf_group(self.controller, l2_gid,
-                                                     dst_mac, intf_src_mac,
-                                                     vlan_id, id)
+            mpls_gid, mpls_msg = add_mpls_intf_group(self.controller, l2_gid, dst_mac, intf_src_mac, vlan_id, id)
             # add MPLS L3 VPN group
             mpls_label_gid, mpls_label_msg = add_mpls_label_group(
                     self.controller,
@@ -1354,3 +1403,91 @@
                 verify_no_other_packets(self)
         delete_all_flows(self.controller)
         delete_groups(self.controller, Groups)
+
+class _0Ucast(base_tests.SimpleDataPlane):
+    """
+    Verify a IP forwarding works for a /0 rule to L3 Unicast Interface
+    """
+
+    def runTest(self):
+        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
+            l2gid, msg = add_one_l2_interface_group(self.controller, port,
+                                                    vlan_id=vlan_id,
+                                                    is_tagged=True,
+                                                    send_barrier=False)
+            dst_mac[5] = vlan_id
+            l3_msg = add_l3_unicast_group(self.controller, port, vlanid=vlan_id,
+                                          id=vlan_id, src_mac=intf_src_mac,
+                                          dst_mac=dst_mac)
+            # add vlan flow table
+            add_one_vlan_table_flow(self.controller, port, vlan_id,
+                                    flag=VLAN_TABLE_FLAG_ONLY_TAG)
+            # add termination flow
+            add_termination_flow(self.controller, port, 0x0800, intf_src_mac,
+                                 vlan_id)
+            # add unicast routing flow
+            dst_ip = dip + (vlan_id << 8)
+            add_unicast_routing_flow(self.controller, 0x0800, dst_ip,
+                                     0xffffffff, l3_msg.group_id)
+            Groups.put(l2gid)
+            Groups.put(l3_msg.group_id)
+        l3_gid = encode_l3_unicast_group_id(ports[0])
+        dst_ip = 0x0
+        add_unicast_routing_flow(self.controller, 0x0800, dst_ip, 0x0, l3_gid)
+        do_barrier(self.controller)
+
+        switch_mac = ':'.join(['%02X' % x for x in intf_src_mac])
+        for in_port in ports:
+            mac_src = '00:00:00:22:22:%02X' % (in_port)
+            ip_src = '192.168.%02d.1' % (in_port)
+            for out_port in ports:
+                if in_port == out_port:
+                    continue
+                ip_dst = '192.168.%02d.1' % (out_port)
+                parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True,
+                                               vlan_vid=(in_port),
+                                               eth_dst=switch_mac,
+                                               eth_src=mac_src, ip_ttl=64,
+                                               ip_src=ip_src,
+                                               ip_dst=ip_dst)
+                pkt = str(parsed_pkt)
+                self.dataplane.send(in_port, pkt)
+                # build expected packet
+                mac_dst = '00:00:00:22:22:%02X' % (out_port)
+                exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True,
+                                            vlan_vid=(out_port),
+                                            eth_dst=mac_dst, eth_src=switch_mac,
+                                            ip_ttl=63,
+                                            ip_src=ip_src, ip_dst=ip_dst)
+                pkt = str(exp_pkt)
+                verify_packet(self, pkt, out_port)
+                verify_no_other_packets(self)
+                ip_dst='1.168.%02d.1' % ports[0]
+                parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=in_port,
+                                               eth_dst=switch_mac, eth_src=mac_src, ip_ttl=64, ip_src=ip_src, ip_dst=ip_dst)
+                pkt=str(parsed_pkt)
+                self.dataplane.send(in_port, pkt)
+                #build expect packet
+                mac_dst='00:00:00:22:22:%02X' % ports[0]
+                exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=ports[0], ip_ttl=63, ip_src=ip_src,
+                                      ip_dst=ip_dst, eth_dst=mac_dst, eth_src=switch_mac)
+                pkt=str(exp_pkt)
+                verify_packet(self, pkt, ports[0])
+                verify_no_other_packets(self)
+
+        delete_all_flows(self.controller)
+        delete_groups(self.controller, Groups)
+
+
+
