diff --git a/apps/foo/src/main/java/org/onlab/onos/foo/IOLoopTestClient.java b/apps/foo/src/main/java/org/onlab/onos/foo/IOLoopTestClient.java
index ebbe5bc..5c96d49 100644
--- a/apps/foo/src/main/java/org/onlab/onos/foo/IOLoopTestClient.java
+++ b/apps/foo/src/main/java/org/onlab/onos/foo/IOLoopTestClient.java
@@ -27,6 +27,7 @@
 
 import static java.lang.String.format;
 import static java.lang.System.currentTimeMillis;
+import static java.lang.System.nanoTime;
 import static java.lang.System.out;
 import static org.onlab.onos.foo.IOLoopTestServer.PORT;
 import static org.onlab.util.Tools.delay;
@@ -185,7 +186,7 @@
      */
     public void report() {
         DecimalFormat f = new DecimalFormat("#,##0");
-        out.println(format("Client: %s messages; %s bytes; %s mps; %s Mbs; %s ms latency",
+        out.println(format("Client: %s messages; %s bytes; %s mps; %s Mbs; %s ns latency",
                            f.format(messages.total()), f.format(bytes.total()),
                            f.format(messages.throughput()),
                            f.format(bytes.throughput() / (1024 * msgLength)),
@@ -233,7 +234,7 @@
                                        MessageStream<TestMessage> stream) {
             for (TestMessage message : messages) {
                 // TODO: summarize latency data better
-                latencyTotal += currentTimeMillis() - message.requestorTime();
+                latencyTotal += nanoTime() - message.requestorTime();
                 latencyCount++;
             }
             worker.release(messages.size());
@@ -254,7 +255,7 @@
      */
     private class Worker implements Runnable {
 
-        private static final int BATCH_SIZE = 1000;
+        private static final int BATCH_SIZE = 10;
         private static final int PERMITS = 2 * BATCH_SIZE;
 
         private TestMessageStream stream;
@@ -297,7 +298,7 @@
             // Build a batch of messages
             List<TestMessage> batch = Lists.newArrayListWithCapacity(size);
             for (int i = 0; i < size; i++) {
-                batch.add(new TestMessage(msgLength, currentTimeMillis(), 0,
+                batch.add(new TestMessage(msgLength, nanoTime(), 0,
                                           stream.padding()));
             }
             acquire(size);
diff --git a/apps/foo/src/main/java/org/onlab/onos/foo/IOLoopTestServer.java b/apps/foo/src/main/java/org/onlab/onos/foo/IOLoopTestServer.java
index 778f217..ad7e6b8 100644
--- a/apps/foo/src/main/java/org/onlab/onos/foo/IOLoopTestServer.java
+++ b/apps/foo/src/main/java/org/onlab/onos/foo/IOLoopTestServer.java
@@ -24,6 +24,7 @@
 
 import static java.lang.String.format;
 import static java.lang.System.currentTimeMillis;
+import static java.lang.System.nanoTime;
 import static java.lang.System.out;
 import static org.onlab.util.Tools.delay;
 import static org.onlab.util.Tools.namedThreads;
@@ -92,6 +93,7 @@
             int r = server.prune();
             remaining = remaining == -1 && r == 0 ? remaining : r;
         }
+        server.stop();
     }
 
     /**
@@ -220,7 +222,7 @@
             List<TestMessage> responses = Lists.newArrayListWithCapacity(messages.size());
             for (TestMessage message : messages) {
                 responses.add(new TestMessage(message.length(), message.requestorTime(),
-                                              currentTimeMillis(), message.padding()));
+                                              nanoTime(), message.padding()));
             }
             return responses;
         }
diff --git a/utils/nio/src/test/java/org/onlab/nio/IOLoopTestClient.java b/utils/nio/src/test/java/org/onlab/nio/IOLoopTestClient.java
index 6f6bd6d..dba0b18 100644
--- a/utils/nio/src/test/java/org/onlab/nio/IOLoopTestClient.java
+++ b/utils/nio/src/test/java/org/onlab/nio/IOLoopTestClient.java
@@ -25,6 +25,7 @@
 
 import static java.lang.String.format;
 import static java.lang.System.currentTimeMillis;
+import static java.lang.System.nanoTime;
 import static java.lang.System.out;
 import static org.onlab.nio.IOLoopTestServer.PORT;
 import static org.onlab.util.Tools.delay;
@@ -183,7 +184,7 @@
      */
     public void report() {
         DecimalFormat f = new DecimalFormat("#,##0");
-        out.println(format("Client: %s messages; %s bytes; %s mps; %s Mbs; %s ms latency",
+        out.println(format("Client: %s messages; %s bytes; %s mps; %s Mbs; %s ns latency",
                            f.format(messages.total()), f.format(bytes.total()),
                            f.format(messages.throughput()),
                            f.format(bytes.throughput() / (1024 * msgLength)),
@@ -231,7 +232,7 @@
                                        MessageStream<TestMessage> stream) {
             for (TestMessage message : messages) {
                 // TODO: summarize latency data better
-                latencyTotal += currentTimeMillis() - message.requestorTime();
+                latencyTotal += nanoTime() - message.requestorTime();
                 latencyCount++;
             }
             worker.release(messages.size());
@@ -252,7 +253,7 @@
      */
     private class Worker implements Runnable {
 
-        private static final int BATCH_SIZE = 1000;
+        private static final int BATCH_SIZE = 50;
         private static final int PERMITS = 2 * BATCH_SIZE;
 
         private TestMessageStream stream;
@@ -295,8 +296,7 @@
             // Build a batch of messages
             List<TestMessage> batch = Lists.newArrayListWithCapacity(size);
             for (int i = 0; i < size; i++) {
-                batch.add(new TestMessage(msgLength, currentTimeMillis(), 0,
-                                          stream.padding()));
+                batch.add(new TestMessage(msgLength, nanoTime(), 0, stream.padding()));
             }
             acquire(size);
             stream.write(batch);
diff --git a/utils/nio/src/test/java/org/onlab/nio/IOLoopTestServer.java b/utils/nio/src/test/java/org/onlab/nio/IOLoopTestServer.java
index 18566d7..457023b 100644
--- a/utils/nio/src/test/java/org/onlab/nio/IOLoopTestServer.java
+++ b/utils/nio/src/test/java/org/onlab/nio/IOLoopTestServer.java
@@ -82,11 +82,14 @@
         IOLoopTestServer server = new IOLoopTestServer(ip, wc, ml, PORT);
         server.start();
 
-        // Start pruning clients.
-        while (true) {
+        // Start pruning clients and keep going until their number goes to 0.
+        int remaining = -1;
+        while (remaining == -1 || remaining > 0) {
             delay(PRUNE_FREQUENCY);
-            server.prune();
+            int r = server.prune();
+            remaining = remaining == -1 && r == 0 ? remaining : r;
         }
+        server.stop();
     }
 
     /**
@@ -158,11 +161,15 @@
 
     /**
      * Prunes the IO loops of stale message buffers.
+     *
+     * @return number of remaining IO loops among all workers.
      */
-    public void prune() {
+    public int prune() {
+        int count = 0;
         for (CustomIOLoop l : iloops) {
-            l.pruneStaleStreams();
+            count += l.pruneStaleStreams();
         }
+        return count;
     }
 
     // Get the next worker to which a client should be assigned
@@ -211,7 +218,7 @@
             List<TestMessage> responses = Lists.newArrayListWithCapacity(messages.size());
             for (TestMessage message : messages) {
                 responses.add(new TestMessage(message.length(), message.requestorTime(),
-                                              currentTimeMillis(), message.padding()));
+                                              System.nanoTime(), message.padding()));
             }
             return responses;
         }
