diff --git a/core/api/pom.xml b/core/api/pom.xml
index 3fd8a01..4229da7 100644
--- a/core/api/pom.xml
+++ b/core/api/pom.xml
@@ -21,10 +21,6 @@
             <groupId>com.google.guava</groupId>
             <artifactId>guava-testlib</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.onlab.onos</groupId>
-            <artifactId>onlab-misc</artifactId>
-        </dependency>
     </dependencies>
 
 </project>
diff --git a/core/api/src/test/java/org/onlab/onos/event/AbstractEventAccumulatorTest.java b/core/api/src/test/java/org/onlab/onos/event/AbstractEventAccumulatorTest.java
new file mode 100644
index 0000000..c0cce92
--- /dev/null
+++ b/core/api/src/test/java/org/onlab/onos/event/AbstractEventAccumulatorTest.java
@@ -0,0 +1,83 @@
+package org.onlab.onos.event;
+
+import org.junit.Test;
+
+import java.util.List;
+import java.util.Timer;
+
+import static org.junit.Assert.*;
+import static org.onlab.junit.TestTools.delay;
+import static org.onlab.onos.event.TestEvent.Type.FOO;
+
+/**
+ * Tests the operation of the accumulator.
+ */
+public class AbstractEventAccumulatorTest {
+
+    private final Timer timer = new Timer();
+
+    @Test
+    public void basics() throws Exception {
+        TestAccumulator accumulator = new TestAccumulator();
+        assertEquals("incorrect timer", timer, accumulator.timer());
+        assertEquals("incorrect max events", 5, accumulator.maxEvents());
+        assertEquals("incorrect max ms", 100, accumulator.maxBatchMillis());
+        assertEquals("incorrect idle ms", 50, accumulator.maxIdleMillis());
+    }
+
+    @Test
+    public void eventTrigger() {
+        TestAccumulator accumulator = new TestAccumulator();
+        accumulator.add(new TestEvent(FOO, "a"));
+        accumulator.add(new TestEvent(FOO, "b"));
+        accumulator.add(new TestEvent(FOO, "c"));
+        accumulator.add(new TestEvent(FOO, "d"));
+        assertTrue("should not have fired yet", accumulator.batch.isEmpty());
+        accumulator.add(new TestEvent(FOO, "e"));
+        delay(10);
+        assertFalse("should have fired", accumulator.batch.isEmpty());
+        assertEquals("incorrect batch", "abcde", accumulator.batch);
+    }
+
+    @Test
+    public void timeTrigger() {
+        TestAccumulator accumulator = new TestAccumulator();
+        accumulator.add(new TestEvent(FOO, "a"));
+        delay(40);
+        assertTrue("should not have fired yet", accumulator.batch.isEmpty());
+        accumulator.add(new TestEvent(FOO, "b"));
+        delay(40);
+        assertTrue("should not have fired yet", accumulator.batch.isEmpty());
+        accumulator.add(new TestEvent(FOO, "c"));
+        delay(40);
+        assertFalse("should have fired", accumulator.batch.isEmpty());
+        assertEquals("incorrect batch", "abc", accumulator.batch);
+    }
+
+    @Test
+    public void idleTrigger() {
+        TestAccumulator accumulator = new TestAccumulator();
+        accumulator.add(new TestEvent(FOO, "a"));
+        assertTrue("should not have fired yet", accumulator.batch.isEmpty());
+        accumulator.add(new TestEvent(FOO, "b"));
+        delay(80);
+        assertFalse("should have fired", accumulator.batch.isEmpty());
+        assertEquals("incorrect batch", "ab", accumulator.batch);
+    }
+
+    private class TestAccumulator extends AbstractEventAccumulator {
+
+        String batch = "";
+
+        protected TestAccumulator() {
+            super(timer, 5, 100, 50);
+        }
+
+        @Override
+        public void processEvents(List<Event> events) {
+            for (Event event : events) {
+                batch += event.subject();
+            }
+        }
+    }
+}
diff --git a/core/pom.xml b/core/pom.xml
index 13deec4..272b76b 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -26,11 +26,14 @@
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
         </dependency>
-
         <dependency>
             <groupId>org.onlab.onos</groupId>
             <artifactId>onlab-misc</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.onlab.onos</groupId>
+            <artifactId>onlab-junit</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/pom.xml b/pom.xml
index 73739a9..51f1a5a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -130,6 +130,12 @@
                 <artifactId>onlab-misc</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.onlab.onos</groupId>
+                <artifactId>onlab-junit</artifactId>
+                <version>1.0.0-SNAPSHOT</version>
+                <scope>test</scope>
+            </dependency>
 
             <dependency>
                 <groupId>org.onlab.onos</groupId>
diff --git a/utils/junit/pom.xml b/utils/junit/pom.xml
new file mode 100644
index 0000000..d994a07
--- /dev/null
+++ b/utils/junit/pom.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onlab.onos</groupId>
+        <artifactId>onlab-utils</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>onlab-junit</artifactId>
+    <packaging>bundle</packaging>
+
+    <description>ON.Lab JUnit test utilities</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava-testlib</artifactId>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/utils/junit/src/main/java/org/onlab/junit/TestTools.java b/utils/junit/src/main/java/org/onlab/junit/TestTools.java
new file mode 100644
index 0000000..959d5d9
--- /dev/null
+++ b/utils/junit/src/main/java/org/onlab/junit/TestTools.java
@@ -0,0 +1,93 @@
+package org.onlab.junit;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static org.junit.Assert.fail;
+
+/**
+ * Utilities to aid in producing JUnit tests.
+ */
+public final class TestTools {
+
+    // Prohibit construction
+    private TestTools() {
+    }
+
+    /**
+     * Suspends the current thread for a specified number of millis.
+     *
+     * @param ms number of millis
+     */
+    public static void delay(int ms) {
+        try {
+            Thread.sleep(ms);
+        } catch (InterruptedException e) {
+            fail("test interrupted");
+        }
+    }
+
+    /**
+     * Returns the current time in millis since epoch.
+     *
+     * @return current time
+     */
+    public static long now() {
+        return System.currentTimeMillis();
+    }
+
+    /**
+     * Runs the specified runnable until it completes successfully or until the
+     * specified time expires. If the latter occurs, the first encountered
+     * assertion on the last attempt will be re-thrown. Errors other than
+     * assertion errors will be propagated immediately.
+     * <p>
+     * Assertions attempts will not be closer than 10 millis apart and no
+     * further than 50 millis.
+     * </p>
+     *
+     * @param delay      number of millis to delay before the first attempt
+     * @param duration   number of milliseconds beyond the current time
+     * @param assertions test assertions runnable
+     */
+    public static void assertAfter(int delay, int duration, Runnable assertions) {
+        checkArgument(delay < duration, "delay >= duration");
+        long start = now();
+        int step = Math.max(Math.min((duration - delay) / 100, 50), 10);
+
+        // Is there an initial delay?
+        if (delay > 0) {
+            delay(delay);
+        }
+
+        // Keep going until the assertions succeed or until time runs-out.
+        while (true) {
+            try {
+                assertions.run();
+                break;
+            } catch (AssertionError e) {
+                // If there was an error and time ran out, re-throw it.
+                if (now() - start > duration) {
+                    throw e;
+                }
+            }
+            delay(step);
+        }
+    }
+
+    /**
+     * Runs the specified runnable until it completes successfully or until the
+     * specified time expires. If the latter occurs, the first encountered
+     * assertion on the last attempt will be re-thrown. Errors other than
+     * assertion errors will be propagated immediately.
+     * <p>
+     * Assertions attempts will not be closer than 10 millis apart and no
+     * further than 50 millis.
+     * </p>
+     *
+     * @param duration   number of milliseconds beyond the current time
+     * @param assertions test assertions runnable
+     */
+    public static void assertAfter(int duration, Runnable assertions) {
+        assertAfter(0, duration, assertions);
+    }
+
+}
diff --git a/utils/junit/src/main/javadoc/org/onlab/junit/package.html b/utils/junit/src/main/javadoc/org/onlab/junit/package.html
new file mode 100644
index 0000000..4e84cb9
--- /dev/null
+++ b/utils/junit/src/main/javadoc/org/onlab/junit/package.html
@@ -0,0 +1,3 @@
+<body>
+Utilities to assist in developing JUnit tests.
+</body>
\ No newline at end of file
diff --git a/utils/junit/src/test/java/org/onlab/junit/TestToolsTest.java b/utils/junit/src/test/java/org/onlab/junit/TestToolsTest.java
new file mode 100644
index 0000000..9afc913
--- /dev/null
+++ b/utils/junit/src/test/java/org/onlab/junit/TestToolsTest.java
@@ -0,0 +1,32 @@
+package org.onlab.junit;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+import static org.onlab.junit.TestTools.assertAfter;
+
+public class TestToolsTest {
+
+    @Test
+    public void testSuccess() {
+        assertAfter(10, 100, new Runnable() {
+            int count = 0;
+            @Override
+            public void run() {
+                if (count++ < 3) {
+                    assertTrue(false);
+                }
+            }
+        });
+    }
+
+    @Test(expected = AssertionError.class)
+    public void testFailure() {
+        assertAfter(100, new Runnable() {
+            @Override
+            public void run() {
+                assertTrue(false);
+            }
+        });
+    }
+}
diff --git a/utils/pom.xml b/utils/pom.xml
index c956abe..d9e013c 100644
--- a/utils/pom.xml
+++ b/utils/pom.xml
@@ -17,6 +17,7 @@
     <description>Domain agnostic ON.Lab utilities</description>
 
     <modules>
+        <module>junit</module>
         <module>misc</module>
         <module>osgi</module>
         <module>rest</module>
