diff --git a/tests/port_stats.py b/tests/port_stats.py
index facef3e..087e725 100644
--- a/tests/port_stats.py
+++ b/tests/port_stats.py
@@ -86,6 +86,59 @@
     obj.assertEqual(str(pkt), str(rcv_pkt),
                     'Response packet does not match send packet')
 
+def getStats(obj, port):
+    stat_req = message.port_stats_request()
+    stat_req.port_no = port
+
+    fs_logger.info("Sending stats request")
+    response, pkt = obj.controller.transact(stat_req, timeout=2)
+    obj.assertTrue(response is not None, 
+                    "No response to stats request")
+    obj.assertTrue(len(response.stats) == 1,
+                    "Did not receive port stats reply")
+    for item in response.stats:
+        fs_logger.info("Sent " + str(item.tx_packets) + " packets")
+        packet_sent = item.tx_packets
+        packet_recv = item.rx_packets
+    fs_logger.info("Port %d stats count: tx %d rx %d" % (port, packet_sent, packet_recv))
+    return packet_sent, packet_recv
+
+def verifyStats(obj, port, test_timeout, packet_sent, packet_recv):
+    stat_req = message.port_stats_request()
+    stat_req.port_no = port
+
+    all_packets_received = 0
+    all_packets_sent = 0
+    sent = recv = 0
+    for i in range(0,test_timeout):
+        fs_logger.info("Sending stats request")
+        response, pkt = obj.controller.transact(stat_req,
+                                                timeout=test_timeout)
+        obj.assertTrue(response is not None, 
+                       "No response to stats request")
+        obj.assertTrue(len(response.stats) == 1,
+                       "Did not receive port stats reply")
+        for item in response.stats:
+            sent = item.tx_packets
+            recv = item.rx_packets
+            fs_logger.info("Sent " + str(item.tx_packets) + " packets")
+            if item.tx_packets == packet_sent:
+                all_packets_sent = 1
+            fs_logger.info("Received " + str(item.rx_packets) + " packets")
+            if item.rx_packets == packet_recv:
+                all_packets_received = 1
+
+        if all_packets_received and all_packets_sent:
+            break
+        sleep(1)
+
+    fs_logger.info("Expected port %d stats count: tx %d rx %d" % (port, packet_sent, packet_recv))
+    fs_logger.info("Actual port %d stats count: tx %d rx %d" % (port, sent, recv))
+    obj.assertTrue(all_packets_sent,
+                   "Packet sent does not match number sent")
+    obj.assertTrue(all_packets_received,
+                   "Packet received does not match number sent")
+
 class SingleFlowStats(basic.SimpleDataPlane):
     """
     Verify flow stats are properly retrieved.
@@ -97,37 +150,6 @@
     Verify that the packet counter has incremented
     """
 
-    def verifyStats(self, port, test_timeout, packet_sent, packet_recv):
-        stat_req = message.port_stats_request()
-        stat_req.port_no = port
-
-        all_packets_received = 0
-        all_packets_sent = 0
-        for i in range(0,test_timeout):
-            fs_logger.info("Sending stats request")
-            response, pkt = self.controller.transact(stat_req,
-                                                     timeout=test_timeout)
-            self.assertTrue(response is not None, 
-                            "No response to stats request")
-            self.assertTrue(len(response.stats) == 1,
-                            "Did not receive port stats reply")
-            for obj in response.stats:
-                fs_logger.info("Sent " + str(obj.tx_packets) + " packets")
-                if obj.tx_packets == packet_sent:
-                    all_packets_sent = 1
-                fs_logger.info("Received " + str(obj.rx_packets) + " packets")
-                if obj.rx_packets == packet_recv:
-                    all_packets_received = 1
-
-            if all_packets_received and all_packets_sent:
-                break
-            sleep(1)
-
-        self.assertTrue(all_packets_sent,
-                        "Packet sent does not match number sent")
-        self.assertTrue(all_packets_received,
-                        "Packet received does not match number sent")
-
     def runTest(self):
         global fs_port_map
 
@@ -170,9 +192,9 @@
         self.assertTrue(rv != -1, "Error installing flow mod")
         self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
 
-        # no packets sent, so zero packet count
-        self.verifyStats(ingress_port, test_timeout, 0, 0)
-        self.verifyStats(egress_port, test_timeout, 0, 0)
+        # get initial port stats count
+        initTxInPort, initRxInPort = getStats(self, ingress_port)
+        initTxOutPort, initRxOutPort = getStats(self, egress_port)
 
         # send packet N times
         num_sends = random.randint(10,20)
@@ -181,8 +203,8 @@
             sendPacket(self, pkt, ingress_port, egress_port,
                        test_timeout)
 
-        self.verifyStats(ingress_port, test_timeout, 0, num_sends)
-        self.verifyStats(egress_port, test_timeout, num_sends, 0)
+        verifyStats(self, ingress_port, test_timeout, initTxInPort, initRxInPort + num_sends)
+        verifyStats(self, egress_port, test_timeout, initTxOutPort + num_sends, initRxOutPort)
 
 
 class MultiFlowStats(basic.SimpleDataPlane):
@@ -217,37 +239,6 @@
 
         return flow_mod_msg
 
-    def verifyStats(self, port, test_timeout, packet_sent, packet_recv):
-        stat_req = message.port_stats_request()
-        stat_req.port_no = port
-
-        all_packets_received = 0
-        all_packets_sent = 0
-        for i in range(0,test_timeout):
-            fs_logger.info("Sending stats request")
-            response, pkt = self.controller.transact(stat_req,
-                                                     timeout=test_timeout)
-            self.assertTrue(response is not None,
-                            "No response to stats request")
-            self.assertTrue(len(response.stats) == 1,
-                            "Did not receive port stats reply")
-            for obj in response.stats:
-                fs_logger.info("Sent " + str(obj.tx_packets) + " packets")
-                if obj.tx_packets == packet_sent:
-                    all_packets_sent = 1
-                fs_logger.info("Received " + str(obj.rx_packets) + " packets")
-                if obj.rx_packets == packet_recv:
-                    all_packets_received = 1
-
-            if all_packets_received and all_packets_sent:
-                break
-            sleep(1)
-
-        self.assertTrue(all_packets_sent,
-                        "Packet sent does not match number sent")
-        self.assertTrue(all_packets_received,
-                        "Packet received does not match number sent")
-
     def runTest(self):
         global fs_port_map
 
@@ -278,6 +269,11 @@
         self.assertTrue(rv != -1, "Error installing flow mod")
         self.assertEqual(do_barrier(self.controller), 0, "Barrier failed")
 
+        # get initial port stats count
+        initTxInPort, initRxInPort = getStats(self, ingress_port)
+        initTxOutPort1, initRxOutPort1 = getStats(self, egress_port1)
+        initTxOutPort2, initRxOutPort2 = getStats(self, egress_port2)
+
         num_pkt1s = random.randint(10,30)
         fs_logger.info("Sending " + str(num_pkt1s) + " pkt1s")
         num_pkt2s = random.randint(10,30)
@@ -286,7 +282,10 @@
             sendPacket(self, pkt1, ingress_port, egress_port1, test_timeout)
         for i in range(0,num_pkt2s):
             sendPacket(self, pkt2, ingress_port, egress_port2, test_timeout)
-            
-        self.verifyStats(ingress_port, test_timeout, 0, num_pkt1s + num_pkt2s)
-        self.verifyStats(egress_port1, test_timeout, num_pkt1s, 0)
-        self.verifyStats(egress_port2, test_timeout, num_pkt2s, 0)
+
+        verifyStats(self, ingress_port, test_timeout,
+                    initTxInPort, initRxInPort + num_pkt1s + num_pkt2s)
+        verifyStats(self, egress_port1, test_timeout,
+                    initTxOutPort1 + num_pkt1s, initRxOutPort1)
+        verifyStats(self, egress_port2, test_timeout,
+                    initTxOutPort2 + num_pkt2s, initRxOutPort2)
