diff --git a/bindings/java/src/main/com/apple/foundationdb/BufferPool.java b/bindings/java/src/main/com/apple/foundationdb/BufferPool.java
index a7c5fb9fcf..66ee5d7db2 100644
--- a/bindings/java/src/main/com/apple/foundationdb/BufferPool.java
+++ b/bindings/java/src/main/com/apple/foundationdb/BufferPool.java
@@ -33,6 +33,8 @@ import java.util.concurrent.CompletableFuture;
 class DirectBufferPool {
 	static final DirectBufferPool __instance = new DirectBufferPool();
 
+	// When tuning this, make sure that the size of the buffer,
+	// is always greater than the maximum size KV allowed by FDB.
 	static private final int DEFAULT_NUM_BUFFERS = 128;
 	static private final int DEFAULT_BUFFER_SIZE = 1024 * 512;
 
diff --git a/bindings/java/src/main/com/apple/foundationdb/FDBTransaction.java b/bindings/java/src/main/com/apple/foundationdb/FDBTransaction.java
index 967c9e16ec..80788f89a3 100644
--- a/bindings/java/src/main/com/apple/foundationdb/FDBTransaction.java
+++ b/bindings/java/src/main/com/apple/foundationdb/FDBTransaction.java
@@ -37,6 +37,7 @@ class FDBTransaction extends NativeObjectWrapper implements Transaction, OptionC
 	private final TransactionOptions options;
 
 	private boolean transactionOwner;
+	private boolean enableDirectBufferQueries = false;
 
 	public final ReadTransaction snapshot;
 
@@ -283,6 +284,17 @@ class FDBTransaction extends NativeObjectWrapper implements Transaction, OptionC
 		return this.getEstimatedRangeSizeBytes(range.begin, range.end);
 	}
 
+	///////////////////
+	//  Feature Options
+	///////////////////
+
+	/**
+	 * Use DirectByteBuffers to fetch getRange() results.
+	 */
+	public void setDirectBufferQueryEnabled(boolean v) {
+		enableDirectBufferQueries = v;
+	}
+
 	///////////////////
 	//  getRange -> KeySelectors
 	///////////////////
@@ -373,7 +385,7 @@ class FDBTransaction extends NativeObjectWrapper implements Transaction, OptionC
 			return new FutureResults(Transaction_getRange(
 					getPtr(), begin.getKey(), begin.orEqual(), begin.getOffset(),
 					end.getKey(), end.orEqual(), end.getOffset(), rowLimit, targetBytes,
-					streamingMode, iteration, isSnapshot, reverse), executor);
+					streamingMode, iteration, isSnapshot, reverse), enableDirectBufferQueries, executor);
 		} finally {
 			pointerReadLock.unlock();
 		}
diff --git a/bindings/java/src/main/com/apple/foundationdb/FutureResults.java b/bindings/java/src/main/com/apple/foundationdb/FutureResults.java
index 731866bb64..715e2bf569 100644
--- a/bindings/java/src/main/com/apple/foundationdb/FutureResults.java
+++ b/bindings/java/src/main/com/apple/foundationdb/FutureResults.java
@@ -24,9 +24,10 @@ import java.nio.ByteBuffer;
 import java.util.concurrent.Executor;
 
 class FutureResults extends NativeFuture<RangeResultInfo> {
-	FutureResults(long cPtr, Executor executor) {
+	FutureResults(long cPtr, boolean enableDirectBufferQueries, Executor executor) {
 		super(cPtr);
 		registerMarshalCallback(executor);
+		this.enableDirectBufferQueries = enableDirectBufferQueries;
 	}
 
 	@Override
@@ -46,7 +47,9 @@ class FutureResults extends NativeFuture<RangeResultInfo> {
 	}
 
 	public RangeResult getResults() {
-		DirectBufferIterator directIterator = new DirectBufferIterator();
+		DirectBufferIterator directIterator = enableDirectBufferQueries
+				? new DirectBufferIterator()
+				: null;
 		try {
 			pointerReadLock.lock();
 			if (directIterator.getBuffer() != null) {
@@ -61,6 +64,8 @@ class FutureResults extends NativeFuture<RangeResultInfo> {
 		}
 	}
 
+	private boolean enableDirectBufferQueries = false;
+
 	private native RangeResult FutureResults_get(long cPtr) throws FDBException;
 	private native void FutureResults_getDirect(long cPtr, ByteBuffer buffer, int capacity)
 		throws FDBException;