diff --git a/nio-impl/src/main/java/org/xnio/nio/WorkerThread.java b/nio-impl/src/main/java/org/xnio/nio/WorkerThread.java
index 2a695a0..a1fcdde 100644
--- a/nio-impl/src/main/java/org/xnio/nio/WorkerThread.java
+++ b/nio-impl/src/main/java/org/xnio/nio/WorkerThread.java
@@ -95,6 +95,7 @@ final class WorkerThread extends XnioIoThread implements XnioExecutor {
 
     private static final AtomicIntegerFieldUpdater<WorkerThread> stateUpdater = AtomicIntegerFieldUpdater.newUpdater(WorkerThread.class, "state");
 
+    private Thread debugThread;
     static {
         OLD_LOCKING = Boolean.parseBoolean(AccessController.doPrivileged(new ReadPropertyAction("xnio.nio.old-locking", "false")));
         THREAD_SAFE_SELECTION_KEYS = Boolean.parseBoolean(AccessController.doPrivileged(new ReadPropertyAction("xnio.nio.thread-safe-selection-keys", "false")));
@@ -268,11 +269,14 @@ final class WorkerThread extends XnioIoThread implements XnioExecutor {
                     ChannelListeners.invokeChannelListener(connection, bindListener);
                 }
                 if (channel.connect(destinationAddress)) {
+                    selectorLog.tracef("@@@Connect immediate connect");
                     execute(ChannelListeners.getChannelListenerTask(connection, openListener));
                     final FinishedIoFuture<StreamConnection> finishedIoFuture = new FinishedIoFuture<StreamConnection>(connection);
                     ok = true;
+                    selectorLog.tracef("@@@Connect returning immediate connect");
                     return finishedIoFuture;
                 }
+                selectorLog.tracef("@@@Connect delayed connect");
                 final FutureResult<StreamConnection> futureResult = new FutureResult<StreamConnection>(this);
                 final ConnectHandle connectHandle = new ConnectHandle(this, key, futureResult, connection, openListener);
                 key.attach(connectHandle);
@@ -284,7 +288,9 @@ final class WorkerThread extends XnioIoThread implements XnioExecutor {
                         return this;
                     }
                 });
+                selectorLog.trace("@@@Connect will resume connect, interested ops " + key.interestOps());
                 connectHandle.resume(SelectionKey.OP_CONNECT);
+                selectorLog.trace("@@@Connect resumed connect, interested ops " + key.interestOps());
                 ok = true;
                 return futureResult.getIoFuture();
             } finally {
@@ -322,12 +328,17 @@ final class WorkerThread extends XnioIoThread implements XnioExecutor {
             final SocketChannel channel = getChannel();
             boolean ok = false;
             try {
+                selectorLog.trace("@@@Connect handleReady");
                 if (channel.finishConnect()) {
+                    selectorLog.trace("@@@Connect finishConnect returned true");
                     suspend(SelectionKey.OP_CONNECT);
                     getSelectionKey().attach(connection.getConduit());
                     if (futureResult.setResult(connection)) {
                         ok = true;
                         ChannelListeners.invokeChannelListener(connection, openListener);
+                        selectorLog.trace("@@@Connect listener invoked.");
+                    } else {
+                        selectorLog.trace("@@@Connect futureResult.setResult returned false.");
                     }
                 }
             } catch (IOException e) {
@@ -431,6 +442,23 @@ final class WorkerThread extends XnioIoThread implements XnioExecutor {
         final Selector selector = this.selector;
         try {
             log.tracef("Starting worker thread %s", this);
+            if (debugThread == null) {
+                Runnable r = new Runnable() {
+                    @Override
+                    public void run() {
+                        while (true) {
+                            try {
+                                Thread.sleep(5000);
+                            } catch (InterruptedException ex) {
+                            }
+                            int i = 0;
+                            i += 1;
+                        }
+                    }
+                };
+                debugThread = new Thread(r, "DEBUG THREAD JF");
+                debugThread.start();
+            }
             final Object lock = workLock;
             final Queue<Runnable> workQueue = selectorWorkQueue;
             final TreeSet<TimeKey> delayQueue = delayWorkQueue;
@@ -760,6 +788,7 @@ final class WorkerThread extends XnioIoThread implements XnioExecutor {
     void setOps(final SelectionKey key, final int ops) {
         if (currentThread() == this) {
             try {
+                selectorLog.tracef("setOps1 key %s ops %s", key, ops);
                 key.interestOps(key.interestOps() | ops);
             } catch (CancelledKeyException ignored) {}
         } else if (OLD_LOCKING) {
@@ -767,6 +796,7 @@ final class WorkerThread extends XnioIoThread implements XnioExecutor {
             queueTask(task);
             try {
                 // Prevent selector from sleeping until we're done!
+                selectorLog.tracef("setOps2 key %s ops %s", key, ops);
                 selector.wakeup();
                 key.interestOps(key.interestOps() | ops);
             } catch (CancelledKeyException ignored) {
@@ -775,6 +805,7 @@ final class WorkerThread extends XnioIoThread implements XnioExecutor {
             }
         } else {
             try {
+                selectorLog.tracef("setOps3 key %s ops %s", key, ops);
                 key.interestOps(key.interestOps() | ops);
                 if (polling) selector.wakeup();
             } catch (CancelledKeyException ignored) {
@@ -785,6 +816,7 @@ final class WorkerThread extends XnioIoThread implements XnioExecutor {
     void clearOps(final SelectionKey key, final int ops) {
         if (currentThread() == this || ! OLD_LOCKING) {
             try {
+                selectorLog.tracef("clearOps1 key %s ops %s", key, ops);
                 key.interestOps(key.interestOps() & ~ops);
             } catch (CancelledKeyException ignored) {}
         } else {
@@ -792,6 +824,7 @@ final class WorkerThread extends XnioIoThread implements XnioExecutor {
             queueTask(task);
             try {
                 // Prevent selector from sleeping until we're done!
+                selectorLog.tracef("clearOps2 key %s ops %s", key, ops);
                 selector.wakeup();
                 key.interestOps(key.interestOps() & ~ops);
             } catch (CancelledKeyException ignored) {
@@ -842,14 +875,19 @@ final class WorkerThread extends XnioIoThread implements XnioExecutor {
         volatile boolean done;
 
         public void run() {
-            while (! done) {
+            while (!done) {
+                selectorLog.tracef("@@@Connect, thread will be parked");
                 park();
+                selectorLog.tracef("@@@Connect, park exit?");
             }
         }
 
         void done() {
+            selectorLog.tracef("@@@Connect, thread will be unparked");
             done = true;
             unpark(WorkerThread.this);
+            selectorLog.tracef("@@@Connect, thread unparked DONE");
+
         }
     }
 }
