diff --git a/olt.py b/olt.py
index 27858b0..83aca8b 100644
--- a/olt.py
+++ b/olt.py
@@ -2,6 +2,7 @@
 OFTests for functionality needed from the OLT.
 '''
 import logging
+from __builtin__ import xrange
 from oftest import config
 import oftest.base_tests as base_tests
 import oftest.packet as scapy
@@ -16,24 +17,25 @@
 onu_port2 = test_param_get("onu_port2", 130)
 olt_port = test_param_get("olt_port", 258)
 
+
 def double_vlan_udp_packet(pktlen=100,
-                      eth_dst='00:01:02:03:04:05',
-                      eth_src='00:06:07:08:09:0a',
-                      dl_vlan_enable=False,
-                      c_vlan_vid=0,
-                      c_vlan_pcp=0,
-                      s_vlan_vid=0,
-                      s_vlan_pcp=0,
-                      ip_src='192.168.0.1',
-                      ip_dst='192.168.0.2',
-                      ip_tos=0,
-                      ip_ttl=64,
-                      udp_sport=1234,
-                      udp_dport=80,
-                      ip_ihl=None,
-                      ip_options=False,
-		      eth_type=0x8100
-                      ):
+                           eth_dst='00:01:02:03:04:05',
+                           eth_src='00:06:07:08:09:0a',
+                           dl_vlan_enable=False,
+                           c_vlan_vid=0,
+                           c_vlan_pcp=0,
+                           s_vlan_vid=0,
+                           s_vlan_pcp=0,
+                           ip_src='192.168.0.1',
+                           ip_dst='192.168.0.2',
+                           ip_tos=0,
+                           ip_ttl=64,
+                           udp_sport=1234,
+                           udp_dport=80,
+                           ip_ihl=None,
+                           ip_options=False,
+                           eth_type=0x8100
+                           ):
     """
     Return a double vlan tagged dataplane UDP packet
     Supports a few parameters:
@@ -61,74 +63,74 @@
 
     # Note Dot1Q.id is really CFI
     if (dl_vlan_enable):
-        pkt = scapy.Ether(dst=eth_dst, src=eth_src, type=eth_type)/ \
-            scapy.Dot1Q(prio=s_vlan_pcp, vlan=s_vlan_vid)/ \
-            scapy.Dot1Q(prio=c_vlan_pcp, vlan=c_vlan_vid)/ \
-            scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ttl=ip_ttl, ihl=ip_ihl)/ \
-            scapy.UDP(sport=udp_sport, dport=udp_dport)
+        pkt = scapy.Ether(dst=eth_dst, src=eth_src, type=eth_type) / \
+              scapy.Dot1Q(prio=s_vlan_pcp, vlan=s_vlan_vid) / \
+              scapy.Dot1Q(prio=c_vlan_pcp, vlan=c_vlan_vid) / \
+              scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ttl=ip_ttl, ihl=ip_ihl) / \
+              scapy.UDP(sport=udp_sport, dport=udp_dport)
     else:
         if not ip_options:
-            pkt = scapy.Ether(dst=eth_dst, src=eth_src)/ \
-                scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ttl=ip_ttl, ihl=ip_ihl)/ \
-                scapy.UDP(sport=udp_sport, dport=udp_dport)
-	
-        else:
-            pkt = scapy.Ether(dst=eth_dst, src=eth_src)/ \
-                scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ttl=ip_ttl, ihl=ip_ihl, options=ip_options)/ \
-                scapy.UDP(sport=udp_sport, dport=udp_dport)
+            pkt = scapy.Ether(dst=eth_dst, src=eth_src) / \
+                  scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ttl=ip_ttl, ihl=ip_ihl) / \
+                  scapy.UDP(sport=udp_sport, dport=udp_dport)
 
-    pkt = pkt/("D" * (pktlen - len(pkt)))
+        else:
+            pkt = scapy.Ether(dst=eth_dst, src=eth_src) / \
+                  scapy.IP(src=ip_src, dst=ip_dst, tos=ip_tos, ttl=ip_ttl, ihl=ip_ihl, options=ip_options) / \
+                  scapy.UDP(sport=udp_sport, dport=udp_dport)
+
+    pkt = pkt / ("D" * (pktlen - len(pkt)))
 
     return pkt
 
 
 def testPacketIn(self, match, parsed_pkt):
-
     delete_all_flows(self.controller)
 
     pkt = str(parsed_pkt)
 
     for of_port in config["port_map"]:
-	m = copy.deepcopy(match)
+        m = copy.deepcopy(match)
         m.oxm_list.append(ofp.oxm.in_port(of_port))
         request = ofp.message.flow_add(
-        table_id=test_param_get("table", 0),
-        cookie=42,
-        match=m,
-        instructions=[
-            ofp.instruction.apply_actions(
-                actions=[
-                    ofp.action.output(
-                        port=ofp.OFPP_CONTROLLER,
-                        max_len=ofp.OFPCML_NO_BUFFER)])],
-        buffer_id=ofp.OFP_NO_BUFFER,
-        priority=1000)
+            table_id=test_param_get("table", 0),
+            cookie=42,
+            match=m,
+            instructions=[
+                ofp.instruction.apply_actions(
+                    actions=[
+                        ofp.action.output(
+                            port=ofp.OFPP_CONTROLLER,
+                            max_len=ofp.OFPCML_NO_BUFFER)])],
+            buffer_id=ofp.OFP_NO_BUFFER,
+            priority=1000)
         logging.info("Inserting flow sending matching packets to controller")
         self.controller.message_send(request)
         do_barrier(self.controller)
-       
+
     for of_port in config["port_map"]:
         logging.info("PacketInExact test, port %d", of_port)
         self.dataplane.send(of_port, pkt)
         verify_packet_in(self, pkt, of_port, ofp.OFPR_ACTION)
         verify_packets(self, pkt, [])
 
+
 def buildIgmp(payload):
-        ether = scapy.Ether(src="00:01:02:03:04:05")
-        ip = scapy.IP(src="1.2.3.4")
-        payload.igmpize(ip, ether)
-        pkt = ether / ip / payload
-        if len(pkt) < 60:
-                pad_len = 60 - len(pkt)
-                pad = scapy.PAD() 
-                pad.load = '\x00' * pad_len
-                pkt = pkt / pad
-        return pkt
+    ether = scapy.Ether(src="00:01:02:03:04:05")
+    ip = scapy.IP(src="1.2.3.4")
+    payload.igmpize(ip, ether)
+    pkt = ether / ip / payload
+    if len(pkt) < 60:
+        pad_len = 60 - len(pkt)
+        pad = scapy.PAD()
+        pad.load = '\x00' * pad_len
+        pkt = pkt / pad
+    return pkt
+
 
 class EapolPacketIn(base_tests.SimpleDataPlane):
-    
     """Verify packet-ins are sent for EAPOL packets """
-    
+
     def runTest(self):
         logging.info("Running EAPOL Packet In test")
 
@@ -136,35 +138,35 @@
         match.oxm_list.append(ofp.oxm.eth_type(0x888e))
         # Use ethertype 0x888e and multicast destination MAC address
         pkt = simple_eth_packet(pktlen=60, eth_dst='01:00:5E:7F:FF:FF', eth_type=0x888e)
-        
+
         testPacketIn(self, match, pkt)
 
+
 class IGMPPacketIn(base_tests.SimpleDataPlane):
-    
     """Verify packet-ins are sent for IGMP packets """
-    
+
     def runTest(self):
         logging.info("Running IGMP Packet In test")
 
         match = ofp.match()
         match.oxm_list.append(ofp.oxm.eth_type(0x800))
         match.oxm_list.append(ofp.oxm.ip_proto(2))
-        
-        pkt = scapy.Ether(dst='01:00:5E:7F:FF:FF', src='00:00:00:00:00:01')/ \
-            scapy.IP(src='10.0.0.1', dst='10.0.0.2', ttl=60, tos=0, id=0, proto=2)
 
-        pkt = pkt/("0" * (100 - len(pkt)))
-        
+        pkt = scapy.Ether(dst='01:00:5E:7F:FF:FF', src='00:00:00:00:00:01') / \
+              scapy.IP(src='10.0.0.1', dst='10.0.0.2', ttl=60, tos=0, id=0, proto=2)
+
+        pkt = pkt / ("0" * (100 - len(pkt)))
+
         testPacketIn(self, match, pkt)
 
+
 class IGMPQueryPacketOut(base_tests.SimpleDataPlane):
-    
     """Verify sending multicast membership queries down to onu_ports"""
-    
+
     def runTest(self):
         logging.info("Running IGMP query packet out")
 
-        igmp = scapy.IGMP(type = 0x11, gaddr = "224.0.0.1")
+        igmp = scapy.IGMP(type=0x11, gaddr="224.0.0.1")
         pkt = buildIgmp(igmp)
 
         msg = ofp.message.packet_out()
@@ -172,24 +174,24 @@
         msg.buffer_id = 0xffffffff
         msg.data = str(pkt)
         msg.actions = [ofp.action.output(
-                        port=onu_port,
-                        max_len=ofp.OFPCML_NO_BUFFER)]
+            port=onu_port,
+            max_len=ofp.OFPCML_NO_BUFFER)]
         time.sleep(1)
 
-	self.controller.message_send(msg)
+        self.controller.message_send(msg)
 
         verify_no_errors(self.controller)
 
         verify_packet(self, pkt, onu_port)
 
+
 class TestMeter(base_tests.SimpleDataPlane):
-       
     def runTest(self):
         logging.info("Running Meter tests")
-        dropMeterBand = ofp.meter_band.drop(rate = 640)
-        meter_mod = ofp.message.meter_mod(xid = 1, command = ofp.OFPMC_ADD, meter_id = 1, meters = [ dropMeterBand ])
+        dropMeterBand = ofp.meter_band.drop(rate=640)
+        meter_mod = ofp.message.meter_mod(xid=1, command=ofp.OFPMC_ADD, meter_id=1, meters=[dropMeterBand])
         self.controller.message_send(meter_mod)
-    
+
         time.sleep(1)
 
         verify_no_errors(self.controller)
@@ -197,7 +199,7 @@
         vlan_id = 201
         match = ofp.match()
         match.oxm_list.append(ofp.oxm.in_port(onu_port))
-        match.oxm_list.append(ofp.oxm.vlan_vid(ofp.OFPVID_PRESENT | vlan_id ))
+        match.oxm_list.append(ofp.oxm.vlan_vid(ofp.OFPVID_PRESENT | vlan_id))
 
         request = ofp.message.flow_add(
             table_id=test_param_get("table", 0),
@@ -207,15 +209,15 @@
                 ofp.instruction.apply_actions(
                     actions=[ofp.action.output(port=olt_port)]
                 ),
-                ofp.instruction.meter(meter_id = 1)    
-                ],
+                ofp.instruction.meter(meter_id=1)
+            ],
             buffer_id=ofp.OFP_NO_BUFFER,
             priority=1000)
 
         self.controller.message_send(request)
         time.sleep(1)
         verify_no_errors(self.controller)
- 
+
         match = ofp.match()
         match.oxm_list.append(ofp.oxm.in_port(olt_port))
         match.oxm_list.append(ofp.oxm.vlan_vid(ofp.OFPVID_PRESENT | vlan_id))
@@ -228,8 +230,8 @@
                 ofp.instruction.apply_actions(
                     actions=[ofp.action.output(port=onu_port)]
                 ),
-                ofp.instruction.meter(meter_id = 1)    
-                ],
+                ofp.instruction.meter(meter_id=1)
+            ],
             buffer_id=ofp.OFP_NO_BUFFER,
             priority=1000)
 
@@ -238,59 +240,57 @@
         verify_no_errors(self.controller)
         do_barrier(self.controller)
         time.sleep(5)
-        
+
         inPkt = simple_udp_packet(dl_vlan_enable=True, vlan_vid=vlan_id, vlan_pcp=0)
         # downstream
-        #self.dataplane.send(olt_port, str(inPkt))
-        #verify_packet(self, inPkt, onu_port)
+        # self.dataplane.send(olt_port, str(inPkt))
+        # verify_packet(self, inPkt, onu_port)
         # upstream
-        #for i in range(1,400):
-	#	self.dataplane.send(onu_port, str(inPkt))
-        #verify_packet(self, inPkt, olt_port)
+        # for i in range(1,400):
+        #	self.dataplane.send(onu_port, str(inPkt))
+        # verify_packet(self, inPkt, olt_port)
 
         # clean up the test
-        meter_mod = ofp.message.meter_mod(xid = 2, command = ofp.OFPMC_DELETE, meter_id = 1)
+        meter_mod = ofp.message.meter_mod(xid=2, command=ofp.OFPMC_DELETE, meter_id=1)
         self.controller.message_send(meter_mod)
         time.sleep(1)
         delete_all_flows(self.controller)
         verify_no_errors(self.controller)
 
- 
-class TestDuplicateMeter(base_tests.SimpleDataPlane):
 
+class TestDuplicateMeter(base_tests.SimpleDataPlane):
     def runTest(self):
         logging.info("Running Duplicate Meter Test")
-        dropMeterBand = ofp.meter_band.drop(rate = 500)
-        meter_mod = ofp.message.meter_mod(xid = 1, command = ofp.OFPMC_ADD, meter_id = 1, meters = [ dropMeterBand ])
+        dropMeterBand = ofp.meter_band.drop(rate=500)
+        meter_mod = ofp.message.meter_mod(xid=1, command=ofp.OFPMC_ADD, meter_id=1, meters=[dropMeterBand])
         self.controller.message_send(meter_mod)
         self.controller.message_send(meter_mod)
 
         time.sleep(1)
-    
+
         try:
             verify_no_errors(self.controller)
         except AssertionError as e:
             if (not e.message == "unexpected error type=12 code=1"):
                 raise AssertionError("Incorrect error type: %s" % e.message)
-            
- 
+
+
 class VlanTest(base_tests.SimpleDataPlane):
-    
     """Verify the switch can push/pop a VLAN tag and forward out a port """
-    
+
     def runTest(self):
         logging.info("Running push VLAN test")
-        
+
         vlan_id = 200
-        
+
         delete_all_flows(self.controller)
-       
-        #PUSH
+
+        # PUSH
         match = ofp.match()
         match.oxm_list.append(ofp.oxm.in_port(onu_port))
         match.oxm_list.append(ofp.oxm.vlan_vid_masked(value=ofp.OFPVID_PRESENT, value_mask=ofp.OFPVID_PRESENT))
-        match.oxm_list.append(ofp.oxm.vlan_pcp(value = 0))
-        
+        match.oxm_list.append(ofp.oxm.vlan_pcp(value=0))
+
         request = ofp.message.flow_add(
             table_id=test_param_get("table", 0),
             cookie=42,
@@ -307,8 +307,8 @@
 
         logging.info("Inserting flow tagging upstream")
         self.controller.message_send(request)
-        
-        #POP
+
+        # POP
         match = ofp.match()
         match.oxm_list.append(ofp.oxm.in_port(olt_port))
         match.oxm_list.append(ofp.oxm.vlan_vid(ofp.OFPVID_PRESENT | vlan_id))
@@ -321,7 +321,7 @@
                 ofp.instruction.apply_actions(
                     actions=[
                         ofp.action.pop_vlan(),
-                        ofp.action.output(port=onu_port)])], 
+                        ofp.action.output(port=onu_port)])],
             buffer_id=ofp.OFP_NO_BUFFER,
             priority=1000)
 
@@ -330,19 +330,18 @@
         do_barrier(self.controller)
         time.sleep(5)
 
- 
         inPkt = simple_udp_packet(dl_vlan_enable=True, vlan_vid=0, vlan_pcp=0)
-        outPkt = simple_udp_packet(pktlen=100, dl_vlan_enable=True, 
+        outPkt = simple_udp_packet(pktlen=100, dl_vlan_enable=True,
                                    vlan_vid=vlan_id, vlan_pcp=0, dl_vlan_cfi=0)
-        
+
         # Send untagged packet in the ONU port and expect tagged packet out the OLT port
         self.dataplane.send(onu_port, str(inPkt))
         verify_packet(self, outPkt, olt_port)
-        
+
         # Send untagged packet in the OLT port and expect no packets to come out
         self.dataplane.send(olt_port, str(inPkt))
         verify_packets(self, outPkt, [])
-	
+
         inPkt = simple_udp_packet(pktlen=104, dl_vlan_enable=True,
                                   vlan_vid=vlan_id, vlan_pcp=0, dl_vlan_cfi=0)
         outPkt = simple_udp_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=0, vlan_pcp=0)
@@ -355,37 +354,39 @@
         self.dataplane.send(onu_port, str(inPkt))
         verify_packets(self, outPkt, [])
 
+
 def createAllGroupAdd(group_id, ports=[]):
     buckets = []
-    
+
     for portNum in ports:
         buckets.append(ofp.common.bucket(watch_port=ofp.OFPP_ANY, watch_group=ofp.OFPG_ANY,
                                          actions=[ofp.action.pop_vlan(), ofp.action.output(port=portNum)]))
-    
-    group_add = ofp.message.group_add(group_type = ofp.OFPGT_ALL, group_id=group_id, buckets=buckets)
-    
+
+    group_add = ofp.message.group_add(group_type=ofp.OFPGT_ALL, group_id=group_id, buckets=buckets)
+
     return group_add
 
+
 def createAllGroupMod(group_id, ports=[]):
     buckets = []
-    
+
     for portNum in ports:
         buckets.append(ofp.common.bucket(watch_port=ofp.OFPP_ANY, watch_group=ofp.OFPG_ANY,
                                          actions=[ofp.action.output(port=portNum)]))
-    
-    group_mod = ofp.message.group_mod(command=ofp.OFPGC_MODIFY, group_type = ofp.OFPGT_ALL, group_id=group_id, buckets=buckets)
-    
+
+    group_mod = ofp.message.group_mod(command=ofp.OFPGC_MODIFY, group_type=ofp.OFPGT_ALL, group_id=group_id,
+                                      buckets=buckets)
+
     return group_mod
-    
+
 
 class TestGroupAdd(base_tests.SimpleDataPlane):
-       
     def runTest(self):
         logging.info("Running Group tests")
         delete_all_flows(self.controller)
         delete_all_groups(self.controller)
 
-        test_group_id = 1 
+        test_group_id = 1
 
         # output to two ONU
         group_add = createAllGroupAdd(test_group_id, ports=[onu_port, onu_port2])
@@ -395,7 +396,7 @@
         verify_no_errors(self.controller)
 
         # Remove the group and then readd it.
-        group_delete = ofp.message.group_delete(group_id = test_group_id)
+        group_delete = ofp.message.group_delete(group_id=test_group_id)
         self.controller.message_send(group_delete)
         do_barrier(self.controller)
         verify_no_errors(self.controller)
@@ -407,30 +408,30 @@
 
 
         # clean up the test
-        group_delete = ofp.message.group_delete(group_id = test_group_id)
+        group_delete = ofp.message.group_delete(group_id=test_group_id)
         self.controller.message_send(group_delete)
-        
+
         do_barrier(self.controller)
         verify_no_errors(self.controller)
-        
+
+
 class TestGroupMod(base_tests.SimpleDataPlane):
-       
     def runTest(self):
         logging.info("Running Group tests")
         delete_all_flows(self.controller)
         delete_all_groups(self.controller)
 
-        test_group_id = 1 
+        test_group_id = 1
 
         group_add = createAllGroupAdd(test_group_id, [onu_port, onu_port2])
 
         self.controller.message_send(group_add)
         do_barrier(self.controller)
         verify_no_errors(self.controller)
-        
+
         # Modifying the group
         group_mod = createAllGroupMod(test_group_id, [onu_port2])
-        
+
         self.controller.message_send(group_mod)
         do_barrier(self.controller)
         verify_no_errors(self.controller)
@@ -453,61 +454,61 @@
             errorExperienced = 1
             if (not (e.message == "unexpected error type=6 code=8")):
                 raise AssertionError("Incorrect error type: %s" % e.message)
-        if not errorExperienced: 
+        if not errorExperienced:
             raise AssertionError("An error message is expected, but not shown.")
-          
- 
+
+
         # clean up the test
-        group_delete = ofp.message.group_delete(xid = 2, group_id = test_group_id)
+        group_delete = ofp.message.group_delete(xid=2, group_id=test_group_id)
         self.controller.message_send(group_delete)
-        
+
         do_barrier(self.controller)
         verify_no_errors(self.controller)
 
+
 class TestDuplicateGroup(base_tests.SimpleDataPlane):
-       
     def runTest(self):
         logging.info("Running Group tests")
         delete_all_flows(self.controller)
         delete_all_groups(self.controller)
 
-        test_group_id = 1 
+        test_group_id = 1
         group_add = createAllGroupAdd(test_group_id, ports=[onu_port])
 
         self.controller.message_send(group_add)
         do_barrier(self.controller)
         verify_no_errors(self.controller)
-        
+
         # Add the same group id
-        duplicate_group_fail = 0 
-        
+        duplicate_group_fail = 0
+
         self.controller.message_send(group_add)
         do_barrier(self.controller)
         try:
             verify_no_errors(self.controller)
         except AssertionError as e:
-            duplicate_group_fail = 1 
+            duplicate_group_fail = 1
             if (not e.message == "unexpected error type=6 code=0"):
                 raise AssertionError("Incorrect error type: %s" % e.message)
         if not duplicate_group_fail:
             raise AssertionError("Adding duplicate groups didn't raise an error.")
-                
+
         # clean up the test
-        group_delete = ofp.message.group_delete(xid = 2, group_id = test_group_id)
+        group_delete = ofp.message.group_delete(xid=2, group_id=test_group_id)
         self.controller.message_send(group_delete)
-        
+
         do_barrier(self.controller)
         verify_no_errors(self.controller)
 
+
 class TestGroupAndFlow(base_tests.SimpleDataPlane):
-       
     def runTest(self):
         logging.info("Running Group tests")
         delete_all_flows(self.controller)
         delete_all_groups(self.controller)
 
         # Create a group
-        test_group_id = 1 
+        test_group_id = 1
         group_add = createAllGroupAdd(test_group_id, ports=[onu_port])
 
         self.controller.message_send(group_add)
@@ -525,13 +526,13 @@
             match=match,
             instructions=[
                 ofp.instruction.apply_actions(
-                    actions=[ ofp.action.group( group_id = test_group_id ) ] ) ],
-                    buffer_id=ofp.OFP_NO_BUFFER, priority=1000)
+                    actions=[ofp.action.group(group_id=test_group_id)])],
+            buffer_id=ofp.OFP_NO_BUFFER, priority=1000)
 
         self.controller.message_send(flow_pointing_to_group)
         do_barrier(self.controller)
         verify_no_errors(self.controller)
-       
+
         # After letting a flow rule point to the group, test we can do group_mod
         group_mod = createAllGroupMod(test_group_id, ports=[onu_port2])
         self.controller.message_send(group_mod)
@@ -539,16 +540,16 @@
         verify_no_errors(self.controller)
 
         # Test we can remove flows and then remove group
-        flow_delete = ofp.message.flow_delete( table_id=test_param_get("table", 0))
+        flow_delete = ofp.message.flow_delete(table_id=test_param_get("table", 0))
         self.controller.message_send(flow_delete)
         do_barrier(self.controller)
         verify_no_errors(self.controller)
 
-        group_delete = ofp.message.group_delete(xid = 3, group_id = test_group_id)
+        group_delete = ofp.message.group_delete(xid=3, group_id=test_group_id)
         self.controller.message_send(group_delete)
         do_barrier(self.controller)
         verify_no_errors(self.controller)
- 
+
         # Add the group and flow back, test it we can first remove group and then remove the flow. 
         '''group_add = createAllGroupAdd(test_group_id, ports=[onu_port])
         self.controller.message_send(group_add)
@@ -566,7 +567,6 @@
 
 
 class TestGroupForwarding(base_tests.SimpleDataPlane):
-       
     def runTest(self):
         logging.info("Running Group datapath forwarding tests")
         delete_all_flows(self.controller)
@@ -575,7 +575,7 @@
         vlan_id = 201
 
         # Create a group
-        test_group_id = 1 
+        test_group_id = 1
         group_add = createAllGroupAdd(test_group_id, [onu_port])
 
         self.controller.message_send(group_add)
@@ -593,9 +593,9 @@
             match=match,
             instructions=[
                 ofp.instruction.apply_actions(
-                    actions=[ ofp.action.group( group_id = test_group_id ) ] ), 
-                ],
-                buffer_id=ofp.OFP_NO_BUFFER, priority=1000)
+                    actions=[ofp.action.group(group_id=test_group_id)]),
+            ],
+            buffer_id=ofp.OFP_NO_BUFFER, priority=1000)
 
         self.controller.message_send(request)
         do_barrier(self.controller)
@@ -603,8 +603,8 @@
 
         # It takes some time for flows to propagate down to the data plane
         time.sleep(10)
-        
-        inPkt = simple_udp_packet(pktlen=104,dl_vlan_enable=True,
+
+        inPkt = simple_udp_packet(pktlen=104, dl_vlan_enable=True,
                                   vlan_vid=vlan_id, vlan_pcp=0, dl_vlan_cfi=0, eth_dst="01:01:11:12:11:12")
         outPkt = inPkt
         self.dataplane.send(olt_port, str(inPkt))
@@ -617,36 +617,35 @@
         self.controller.message_send(group_mod)
         do_barrier(self.controller)
         verify_no_errors(self.controller)
-        
+
         # It takes some time for flows to propagate down to the data plane
         time.sleep(10)
 
         self.dataplane.send(olt_port, str(inPkt))
         verify_packet(self, outPkt, onu_port2)
         verify_packet(self, outPkt, onu_port)
-        #verify_packets(self, outPkt, [onu_port,onu_port2])
+        # verify_packets(self, outPkt, [onu_port,onu_port2])
 
         # clean up the test
-        request = ofp.message.flow_delete( table_id=test_param_get("table", 0))
+        request = ofp.message.flow_delete(table_id=test_param_get("table", 0))
         self.controller.message_send(request)
-        group_delete = ofp.message.group_delete(xid = 2, group_id = test_group_id)
+        group_delete = ofp.message.group_delete(xid=2, group_id=test_group_id)
         self.controller.message_send(group_delete)
-        
+
         do_barrier(self.controller)
         verify_no_errors(self.controller)
 
 
 class TestGroupModForwarding(base_tests.SimpleDataPlane):
-       
     def runTest(self):
-        logging.info("Running datapath forwarding tests for group mod" )
+        logging.info("Running datapath forwarding tests for group mod")
         delete_all_flows(self.controller)
         delete_all_groups(self.controller)
 
         vlan_id = 201
 
         # Create a group
-        test_group_id = 1 
+        test_group_id = 1
         group_add = createAllGroupAdd(test_group_id, [onu_port, onu_port2])
 
         self.controller.message_send(group_add)
@@ -664,9 +663,9 @@
             match=match,
             instructions=[
                 ofp.instruction.apply_actions(
-                    actions=[ ofp.action.group( group_id = test_group_id ) ] ), 
-                ],
-                buffer_id=ofp.OFP_NO_BUFFER, priority=1000)
+                    actions=[ofp.action.group(group_id=test_group_id)]),
+            ],
+            buffer_id=ofp.OFP_NO_BUFFER, priority=1000)
 
         self.controller.message_send(request)
         do_barrier(self.controller)
@@ -674,8 +673,8 @@
 
         # It takes some time for flows to propagate down to the data plane
         time.sleep(10)
-        
-        inPkt = simple_udp_packet(pktlen=104,dl_vlan_enable=True,
+
+        inPkt = simple_udp_packet(pktlen=104, dl_vlan_enable=True,
                                   vlan_vid=vlan_id, vlan_pcp=0, dl_vlan_cfi=0, eth_dst="01:01:11:12:11:12")
         outPkt = inPkt
         self.dataplane.send(olt_port, str(inPkt))
@@ -704,7 +703,6 @@
 
 
 class TransparentVlanTest(base_tests.SimpleDataPlane):
-       
     def runTest(self):
         logging.info("Running transparent vlan tests")
         delete_all_flows(self.controller)
@@ -712,7 +710,7 @@
         vlan_id = 201
         match = ofp.match()
         match.oxm_list.append(ofp.oxm.in_port(onu_port))
-        match.oxm_list.append(ofp.oxm.vlan_vid(ofp.OFPVID_PRESENT | vlan_id ))
+        match.oxm_list.append(ofp.oxm.vlan_vid(ofp.OFPVID_PRESENT | vlan_id))
 
         request = ofp.message.flow_add(
             table_id=test_param_get("table", 0),
@@ -722,12 +720,12 @@
                 ofp.instruction.apply_actions(
                     actions=[
                         ofp.action.output(port=olt_port)]),
-                ],
+            ],
             buffer_id=ofp.OFP_NO_BUFFER,
             priority=1000)
 
         self.controller.message_send(request)
- 
+
         match = ofp.match()
         match.oxm_list.append(ofp.oxm.in_port(olt_port))
         match.oxm_list.append(ofp.oxm.vlan_vid(ofp.OFPVID_PRESENT | vlan_id))
@@ -740,7 +738,7 @@
                 ofp.instruction.apply_actions(
                     actions=[
                         ofp.action.output(port=onu_port)]),
-                ],
+            ],
             buffer_id=ofp.OFP_NO_BUFFER,
             priority=1000)
 
@@ -750,7 +748,7 @@
 
         # It takes some time for flows to propagate down to the data plane
         time.sleep(2)
-        
+
         inPkt = simple_udp_packet(dl_vlan_enable=True, vlan_vid=vlan_id, vlan_pcp=0)
         # upstream
         self.dataplane.send(onu_port, str(inPkt))
@@ -764,21 +762,21 @@
         do_barrier(self.controller)
         verify_no_errors(self.controller)
 
+
 class DoubleVlanTest(base_tests.SimpleDataPlane):
-       
     def runTest(self):
         logging.info("Running double vlan tests")
         delete_all_flows(self.controller)
 
         c_vlan_id = 100
-	s_vlan_id = 102
-	# upstream flow rule
+        s_vlan_id = 102
+        # upstream flow rule
         match = ofp.match()
         match.oxm_list.append(ofp.oxm.in_port(onu_port))
         match.oxm_list.append(ofp.oxm.vlan_vid(value=ofp.OFPVID_PRESENT))
-        match.oxm_list.append(ofp.oxm.vlan_pcp(value = 0))
+        match.oxm_list.append(ofp.oxm.vlan_pcp(value=0))
 
-	# push inner vlan (c-vlan) for upstream
+        # push inner vlan (c-vlan) for upstream
         request = ofp.message.flow_add(
             table_id=test_param_get("table", 0),
             cookie=42,
@@ -786,20 +784,20 @@
             instructions=[
                 ofp.instruction.apply_actions(
                     actions=[
-                        ofp.action.set_field(ofp.oxm.vlan_vid(ofp.OFPVID_PRESENT | c_vlan_id)) ] ),
-		ofp.instruction.goto_table(1) ],
+                        ofp.action.set_field(ofp.oxm.vlan_vid(ofp.OFPVID_PRESENT | c_vlan_id))]),
+                ofp.instruction.goto_table(1)],
             buffer_id=ofp.OFP_NO_BUFFER,
             priority=1000)
 
         self.controller.message_send(request)
         do_barrier(self.controller)
         verify_no_errors(self.controller)
- 
-	# push outer vlan (s-vlan) for upstream
+
+        # push outer vlan (s-vlan) for upstream
         match = ofp.match()
         match.oxm_list.append(ofp.oxm.in_port(onu_port))
         match.oxm_list.append(ofp.oxm.vlan_vid(ofp.OFPVID_PRESENT | c_vlan_id))
-        match.oxm_list.append(ofp.oxm.vlan_pcp( 0 ))
+        match.oxm_list.append(ofp.oxm.vlan_pcp(0))
 
         request = ofp.message.flow_add(
             table_id=test_param_get("table", 1),
@@ -812,7 +810,7 @@
                         ofp.action.set_field(ofp.oxm.vlan_vid(ofp.OFPVID_PRESENT | s_vlan_id)),
                         ofp.action.set_field(ofp.oxm.vlan_pcp(0)),
                         ofp.action.output(port=olt_port)]),
-                ],
+            ],
             buffer_id=ofp.OFP_NO_BUFFER,
             priority=1000)
 
@@ -820,31 +818,31 @@
         do_barrier(self.controller)
         verify_no_errors(self.controller)
 
-	# strip outer vlan (s-vlan) for downstream
+        # strip outer vlan (s-vlan) for downstream
         match = ofp.match()
         match.oxm_list.append(ofp.oxm.in_port(olt_port))
         match.oxm_list.append(ofp.oxm.vlan_vid(ofp.OFPVID_PRESENT | s_vlan_id))
-        match.oxm_list.append(ofp.oxm.vlan_pcp( 0 ))
+        match.oxm_list.append(ofp.oxm.vlan_pcp(0))
         request = ofp.message.flow_add(
             table_id=test_param_get("table", 0),
             cookie=44,
             match=match,
             instructions=[
                 ofp.instruction.apply_actions(
-                    actions=[ ofp.action.pop_vlan() ] ),
-		ofp.instruction.goto_table(1) ],
+                    actions=[ofp.action.pop_vlan()]),
+                ofp.instruction.goto_table(1)],
             buffer_id=ofp.OFP_NO_BUFFER,
             priority=1000)
 
         self.controller.message_send(request)
         do_barrier(self.controller)
         verify_no_errors(self.controller)
- 
-	# rewrite inner vlan (c-vlan) to default (0) for downstream
+
+        # rewrite inner vlan (c-vlan) to default (0) for downstream
         match = ofp.match()
         match.oxm_list.append(ofp.oxm.in_port(olt_port))
         match.oxm_list.append(ofp.oxm.vlan_vid(ofp.OFPVID_PRESENT | c_vlan_id))
-        match.oxm_list.append(ofp.oxm.vlan_pcp( 0 ))
+        match.oxm_list.append(ofp.oxm.vlan_pcp(0))
 
         request = ofp.message.flow_add(
             table_id=test_param_get("table", 1),
@@ -853,9 +851,9 @@
             instructions=[
                 ofp.instruction.apply_actions(
                     actions=[
-			ofp.action.pop_vlan(),
-                        ofp.action.output(port=onu_port) ] )
-                ],
+                        ofp.action.pop_vlan(),
+                        ofp.action.output(port=onu_port)])
+            ],
             buffer_id=ofp.OFP_NO_BUFFER,
             priority=1000)
 
@@ -863,51 +861,191 @@
         do_barrier(self.controller)
         verify_no_errors(self.controller)
         # It takes some time for flows to propagate down to the data plane
+
         time.sleep(10)
-	incorrectTagPkt = simple_udp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=100, vlan_pcp=0)
+        incorrectTagPkt = simple_udp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=100, vlan_pcp=0)
         untaggedPkt = simple_udp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=0, vlan_pcp=0)
 
-
-	'''
+        '''
 		FIXME: hack because OLT does _not_ tag packets correctly
 			it ignores the eth_type in the push_vlan action
 			and always slaps on 0x8100 even though the 
 			down stream flow must be 0x88a8.
-	'''
-        doubleTaggedPkt = double_vlan_udp_packet(pktlen=104, dl_vlan_enable=True, 
-						 c_vlan_vid=c_vlan_id, 
-						 s_vlan_vid=s_vlan_id, 
-						 c_vlan_pcp=0, s_vlan_pcp=0, eth_type=0x88a8)
+	    '''
+        doubleTaggedPkt = double_vlan_udp_packet(pktlen=104, dl_vlan_enable=True,
+                                                 c_vlan_vid=c_vlan_id,
+                                                 s_vlan_vid=s_vlan_id,
+                                                 c_vlan_pcp=0, s_vlan_pcp=0, eth_type=0x88a8)
 
-	upstreamDoubleTaggedPkt = double_vlan_udp_packet(pktlen=104, dl_vlan_enable=True, 
-						 c_vlan_vid=c_vlan_id, 
-						 s_vlan_vid=s_vlan_id, 
-						 c_vlan_pcp=0, s_vlan_pcp=0)
+        upstreamDoubleTaggedPkt = double_vlan_udp_packet(pktlen=104, dl_vlan_enable=True,
+                                                         c_vlan_vid=c_vlan_id,
+                                                         s_vlan_vid=s_vlan_id,
+                                                         c_vlan_pcp=0, s_vlan_pcp=0)
 
         # test upstream untagged packet got double tag at OLT
-	logging.info(str(doubleTaggedPkt))
+        logging.info(str(doubleTaggedPkt))
+
         self.dataplane.send(onu_port, str(untaggedPkt))
         verify_packet(self, upstreamDoubleTaggedPkt, olt_port)
-        
-	# test downstream doubletagged packet got untagged at ONU
+
+        # test downstream doubletagged packet got untagged at ONU
         self.dataplane.send(olt_port, str(doubleTaggedPkt))
         verify_packet(self, untaggedPkt, onu_port)
-        
-	# test upstream doubletagged packet got dropped 
+
+        # test upstream doubletagged packet got dropped
         self.dataplane.send(onu_port, str(doubleTaggedPkt))
         verify_no_packet(self, upstreamDoubleTaggedPkt, olt_port)
-        
-	# test downstream untagged packet got dropped at ONU
+
+        # test downstream untagged packet got dropped at ONU
         self.dataplane.send(olt_port, str(untaggedPkt))
         verify_no_packet(self, untaggedPkt, onu_port)
-	
-	# test upstream icorrectly tagged packet; should get dropped
-	self.dataplane.send(onu_port, str(incorrectTagPkt))
-	verify_no_packet(self, upstreamDoubleTaggedPkt, olt_port)
-       	
-	time.sleep(2) 
+
+        # test upstream icorrectly tagged packet; should get dropped
+        self.dataplane.send(onu_port, str(incorrectTagPkt))
+
+        verify_no_packet(self, upstreamDoubleTaggedPkt, olt_port)
+
+        time.sleep(2)
 
         # clean up the test
         delete_all_flows(self.controller)
         do_barrier(self.controller)
         verify_no_errors(self.controller)
+
+
+class TestCyclingDoubleVlan(base_tests.SimpleDataPlane):
+    """Cycle through vlans and test traffic flow"""
+
+    def runTest(self):
+        logging.info("Running cycling vlan test")
+
+        self.vlan_pairs = []
+
+        for stag in xrange(1, 4000, 100):
+            for ctag in xrange(1, 4000, 100):
+                self.installDoubleTaggingRule(stag, ctag)
+                self.vlan_pairs.append((stag, ctag))
+                time.sleep(1)
+                self.testPacketFlow()
+
+    def testPacketFlow(self):
+        for (s_vlan_id, c_vlan_id) in self.vlan_pairs:
+            incorrectTagPkt = simple_udp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=100, vlan_pcp=0)
+            untaggedPkt = simple_udp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=0, vlan_pcp=0)
+
+            upstreamDoubleTaggedPkt = double_vlan_udp_packet(pktlen=104, dl_vlan_enable=True,
+                                                             c_vlan_vid=c_vlan_id,
+                                                             s_vlan_vid=s_vlan_id,
+                                                             c_vlan_pcp=0, s_vlan_pcp=0)
+
+            logging.info("Testing s-tag %d, c-tag %d" % (s_vlan_id, c_vlan_id))
+
+            self.dataplane.send(onu_port, str(untaggedPkt))
+            verify_packet(self, upstreamDoubleTaggedPkt, olt_port)
+
+            # test downstream doubletagged packet got untagged at ONU
+            self.dataplane.send(olt_port, str(upstreamDoubleTaggedPkt))
+            verify_packet(self, untaggedPkt, onu_port)
+
+            # test upstream doubletagged packet got dropped
+            self.dataplane.send(onu_port, str(upstreamDoubleTaggedPkt))
+            verify_no_packet(self, upstreamDoubleTaggedPkt, olt_port)
+
+            # test downstream untagged packet got dropped at ONU
+            self.dataplane.send(olt_port, str(untaggedPkt))
+            verify_no_packet(self, untaggedPkt, onu_port)
+
+            # test upstream icorrectly tagged packet; should get dropped
+            self.dataplane.send(onu_port, str(incorrectTagPkt))
+            verify_no_packet(self, upstreamDoubleTaggedPkt, olt_port)
+
+    def installDoubleTaggingRule(self, s_vlan_id, c_vlan_id):
+        match = ofp.match()
+        match.oxm_list.append(ofp.oxm.in_port(onu_port))
+        match.oxm_list.append(ofp.oxm.vlan_vid(value=ofp.OFPVID_PRESENT))
+        match.oxm_list.append(ofp.oxm.vlan_pcp(value=0))
+
+        # push inner vlan (c-vlan) for upstream
+        request = ofp.message.flow_add(
+            table_id=test_param_get("table", 0),
+            cookie=42,
+            match=match,
+            instructions=[
+                ofp.instruction.apply_actions(
+                    actions=[
+                        ofp.action.set_field(ofp.oxm.vlan_vid(ofp.OFPVID_PRESENT | c_vlan_id))]),
+                ofp.instruction.goto_table(1)],
+            buffer_id=ofp.OFP_NO_BUFFER,
+            priority=1000)
+
+        self.controller.message_send(request)
+        do_barrier(self.controller)
+        verify_no_errors(self.controller)
+
+        # push outer vlan (s-vlan) for upstream
+        match = ofp.match()
+        match.oxm_list.append(ofp.oxm.in_port(onu_port))
+        match.oxm_list.append(ofp.oxm.vlan_vid(ofp.OFPVID_PRESENT | c_vlan_id))
+        match.oxm_list.append(ofp.oxm.vlan_pcp(0))
+
+        request = ofp.message.flow_add(
+            table_id=test_param_get("table", 1),
+            cookie=43,
+            match=match,
+            instructions=[
+                ofp.instruction.apply_actions(
+                    actions=[
+                        ofp.action.push_vlan(ethertype=0x8100),
+                        ofp.action.set_field(ofp.oxm.vlan_vid(ofp.OFPVID_PRESENT | s_vlan_id)),
+                        ofp.action.set_field(ofp.oxm.vlan_pcp(0)),
+                        ofp.action.output(port=olt_port)]),
+            ],
+            buffer_id=ofp.OFP_NO_BUFFER,
+            priority=1000)
+
+        self.controller.message_send(request)
+        do_barrier(self.controller)
+        verify_no_errors(self.controller)
+
+        # strip outer vlan (s-vlan) for downstream
+        match = ofp.match()
+        match.oxm_list.append(ofp.oxm.in_port(olt_port))
+        match.oxm_list.append(ofp.oxm.vlan_vid(ofp.OFPVID_PRESENT | s_vlan_id))
+        match.oxm_list.append(ofp.oxm.vlan_pcp(0))
+        request = ofp.message.flow_add(
+            table_id=test_param_get("table", 0),
+            cookie=44,
+            match=match,
+            instructions=[
+                ofp.instruction.apply_actions(
+                    actions=[ofp.action.pop_vlan()]),
+                ofp.instruction.goto_table(1)],
+            buffer_id=ofp.OFP_NO_BUFFER,
+            priority=1000)
+
+        self.controller.message_send(request)
+        do_barrier(self.controller)
+        verify_no_errors(self.controller)
+
+        # rewrite inner vlan (c-vlan) to default (0) for downstream
+        match = ofp.match()
+        match.oxm_list.append(ofp.oxm.in_port(olt_port))
+        match.oxm_list.append(ofp.oxm.vlan_vid(ofp.OFPVID_PRESENT | c_vlan_id))
+        match.oxm_list.append(ofp.oxm.vlan_pcp(0))
+
+        request = ofp.message.flow_add(
+            table_id=test_param_get("table", 1),
+            cookie=45,
+            match=match,
+            instructions=[
+                ofp.instruction.apply_actions(
+                    actions=[
+                        ofp.action.pop_vlan(),
+                        ofp.action.output(port=onu_port)])
+            ],
+            buffer_id=ofp.OFP_NO_BUFFER,
+            priority=1000)
+
+        self.controller.message_send(request)
+        do_barrier(self.controller)
+        verify_no_errors(self.controller)
