diff --git a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationQueueFullWarnTest.java b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationQueueFullWarnTest.java
index 27c5bf17e5..3420df5c94 100644
--- a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationQueueFullWarnTest.java
+++ b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationQueueFullWarnTest.java
@@ -49,6 +49,7 @@ import java.util.Map;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -256,23 +257,28 @@ public class ObservationQueueFullWarnTest extends AbstractRepositoryTest {
         final Semaphore semaphore = new Semaphore(0);
         final AtomicLong counter = new AtomicLong(0);
         final AtomicLong localCounter = new AtomicLong(0);
+        final AtomicBoolean hasRecievedInit = new AtomicBoolean();
         EventListener listeners = new EventListener() {
 
             @Override
             public void onEvent(EventIterator events) {
                 try {
                     semaphore.acquire();
-                    long numEvents = events.getSize();
-                    counter.addAndGet(numEvents);
-                    System.out.println("GOT: "+numEvents + " - COUNTER: "+counter.get());
-                    while(events.hasNext()) {
-                        Event e = events.nextEvent();
-                        System.out.println(" - " + e);
-                        if (PathUtils.getName(e.getPath()).startsWith("local")) {
-                            if (e instanceof JackrabbitEvent && !((JackrabbitEvent)e).isExternal()) {
-                                localCounter.incrementAndGet();
+                    if (hasRecievedInit.get()) {
+                        long numEvents = events.getSize();
+                        counter.addAndGet(numEvents);
+                        System.out.println("GOT: " + numEvents + " - COUNTER: " + counter.get());
+                        while (events.hasNext()) {
+                            Event e = events.nextEvent();
+                            System.out.println(" - " + e);
+                            if (PathUtils.getName(e.getPath()).startsWith("local")) {
+                                if (e instanceof JackrabbitEvent && !((JackrabbitEvent) e).isExternal()) {
+                                    localCounter.incrementAndGet();
+                                }
                             }
                         }
+                    } else {
+                        hasRecievedInit.set(true);
                     }
                 } catch (InterruptedException e) {
                     throw new Error(e);
@@ -299,7 +305,17 @@ public class ObservationQueueFullWarnTest extends AbstractRepositoryTest {
         // in *that* case the queue overfills unexpectedly.
         // To avoid this, give the BackgroundObserver 2sec here to process the
         // init-token, so that the test can actually start with an empty BackgroundObserver queue
-        Thread.sleep(5000);
+        session.getNode("/testNode").setProperty("init", 1);
+        session.save();
+        semaphore.release(1);
+        boolean initNotTimeOut = waitFor(20000, new Condition() {
+            @Override
+            public boolean evaluate() {
+                return hasRecievedInit.get();
+            }
+        });
+        assertTrue("Listener didn't process initial change events within time-out", initNotTimeOut);
+
 
         int propCounter = 0;
         // send out 6 events (or in general: queue length + 1):
