diff --git a/src/main/java/org/jboss/remoting3/RemotingOptions.java b/src/main/java/org/jboss/remoting3/RemotingOptions.java
index a7ec4a23..a3d1c745 100644
--- a/src/main/java/org/jboss/remoting3/RemotingOptions.java
+++ b/src/main/java/org/jboss/remoting3/RemotingOptions.java
@@ -307,7 +307,7 @@ public final class RemotingOptions {
     /**
      * The default maximum inbound message size.
      */
-    public static final long DEFAULT_MAX_INBOUND_MESSAGE_SIZE = Long.MAX_VALUE;
+    public static final long DEFAULT_MAX_INBOUND_MESSAGE_SIZE = org.xnio.ByteBufferPool.LARGE_SIZE * 2;
 
     /**
      * The maximum outbound message size to send.  No messages larger than this well be transmitted; attempting to do
diff --git a/src/main/java/org/jboss/remoting3/_private/Messages.java b/src/main/java/org/jboss/remoting3/_private/Messages.java
index 4eb3335c..ac371f83 100644
--- a/src/main/java/org/jboss/remoting3/_private/Messages.java
+++ b/src/main/java/org/jboss/remoting3/_private/Messages.java
@@ -143,4 +143,7 @@ public interface Messages extends BasicLogger {
 
     @Message(id = 309, value = "Authentication not supported for this peer")
     AuthenticationException authenticationNotSupported();
+
+    @Message(id = 310, value = "Inbound message size %d is bigger than max message size %d")
+    IOException inboundMessageSizeBiggerThanLimit(int messageSize, long maxMessageSize);
 }
diff --git a/src/main/java/org/jboss/remoting3/remote/MessageReader.java b/src/main/java/org/jboss/remoting3/remote/MessageReader.java
index 3f5345b2..e9598beb 100644
--- a/src/main/java/org/jboss/remoting3/remote/MessageReader.java
+++ b/src/main/java/org/jboss/remoting3/remote/MessageReader.java
@@ -54,6 +54,10 @@ final class MessageReader {
     }
 
     Pooled<ByteBuffer> getMessage() throws IOException {
+        return getMessage (org.jboss.remoting3.RemotingOptions.DEFAULT_MAX_INBOUND_MESSAGE_SIZE);
+    }
+
+    Pooled<ByteBuffer> getMessage(long maxSize) throws IOException {
         synchronized (lock) {
             for (;;) {
                 ByteBuffer first = queue.peekFirst();
@@ -66,8 +70,10 @@ final class MessageReader {
                                 message = ByteBufferPool.MEDIUM_HEAP.allocate();
                             } else if (ByteBufferPool.LARGE_SIZE >= size) {
                                 message = ByteBufferPool.LARGE_HEAP.allocate();
-                            } else {
+                            } else if (maxSize >= size) {
                                 message = ByteBuffer.allocate(size);
+                            } else {
+                                throw conn.inboundMessageSizeBiggerThanLimit(size, maxSize);
                             }
                             first.getInt();
                             int cnt = 0;
