diff --git a/src/main/java/org/jboss/remoting3/remote/ClientConnectionOpenListener.java b/src/main/java/org/jboss/remoting3/remote/ClientConnectionOpenListener.java
index f1547ca..4f9d0e5 100644
--- a/src/main/java/org/jboss/remoting3/remote/ClientConnectionOpenListener.java
+++ b/src/main/java/org/jboss/remoting3/remote/ClientConnectionOpenListener.java
@@ -94,6 +94,24 @@ final class ClientConnectionOpenListener implements ChannelListener<ConduitStrea
         this.disallowedMechs = disallowedMechs == null ? Collections.emptySet() : new HashSet<String>(disallowedMechs);
     }
 
+    private void resumeReads() {
+        connection.getMessageReader().getSourceChannel().getIoThread().execute(new Runnable() {
+            @Override
+            public void run() {
+                connection.getMessageReader().resumeReads();
+            }
+        });
+    }
+
+    private void suspendReads() {
+        connection.getMessageReader().getSourceChannel().getIoThread().execute(new Runnable() {
+            @Override
+            public void run() {
+                connection.getMessageReader().suspendReads();
+            }
+        });
+    }
+    
     public void handleEvent(final ConduitStreamSourceChannel channel) {
         connection.setReadListener(new Greeting(), true);
     }
@@ -444,7 +462,7 @@ final class ClientConnectionOpenListener implements ChannelListener<ConduitStrea
                         final String mechanismName = saslClient.getMechanismName();
                         client.tracef("Client initiating authentication using mechanism %s", mechanismName);
 
-                        connection.getMessageReader().suspendReads();
+                        suspendReads();
                         final int negotiatedVersion = version;
                         final SaslClient usedSaslClient = saslClient;
                         final Authentication authentication = new Authentication(usedSaslClient, remoteServerName, remoteEndpointName, behavior, channelsIn, channelsOut, authCap, serverSaslMechs);
@@ -630,7 +648,7 @@ final class ClientConnectionOpenListener implements ChannelListener<ConduitStrea
                     }
                     case Protocol.AUTH_CHALLENGE: {
                         client.trace("Client received authentication challenge");
-                        messageReader.suspendReads();
+                        suspendReads();
                         connection.getExecutor().execute(() -> {
                             try {
                                 final boolean clientComplete = saslClient.isComplete();
@@ -660,7 +678,7 @@ final class ClientConnectionOpenListener implements ChannelListener<ConduitStrea
                                     sendBuffer.flip();
                                     connection.send(pooled);
                                     ok = true;
-                                    messageReader.resumeReads();
+                                    resumeReads();
                                 } finally {
                                     if (! ok) pooled.free();
                                 }
@@ -674,7 +692,7 @@ final class ClientConnectionOpenListener implements ChannelListener<ConduitStrea
                     }
                     case Protocol.AUTH_COMPLETE: {
                         client.trace("Client received authentication complete");
-                        messageReader.suspendReads();
+                        suspendReads();
                         connection.getExecutor().execute(() -> {
                             try {
                                 final boolean clientComplete = saslClient.isComplete();
@@ -715,7 +733,7 @@ final class ClientConnectionOpenListener implements ChannelListener<ConduitStrea
                                     return connectionHandler;
                                 };
                                 connection.getResult().setResult(connectionHandlerFactory);
-                                messageReader.resumeReads();
+                                resumeReads();
                                 return;
                             } finally {
                                 message.free();
