Index: branches/supervisor/src/main/java/omq/server/InvocationThread.java
===================================================================
--- branches/supervisor/src/main/java/omq/server/InvocationThread.java	(revision 90)
+++ branches/supervisor/src/main/java/omq/server/InvocationThread.java	(revision 91)
@@ -24,11 +24,13 @@
 	private static final Logger logger = Logger.getLogger(InvocationThread.class.getName());
 	private RemoteObject obj;
-	private transient Serializer serializer;
+	private Serializer serializer;
+	// private RemoteWrapper wrapper;
 	private BlockingQueue<Delivery> deliveryQueue;
 	private boolean killed = false;
 
-	public InvocationThread(RemoteObject obj, BlockingQueue<Delivery> deliveryQueue, Serializer serializer) {
+	public InvocationThread(RemoteObject obj, RemoteWrapper wrapper, Serializer serializer) {
 		this.obj = obj;
-		this.deliveryQueue = deliveryQueue;
+		// this.wrapper = wrapper;
+		this.deliveryQueue = wrapper.getDeliveryQueue();
 		this.serializer = serializer;
 	}
@@ -40,4 +42,7 @@
 				// Get the delivery
 				Delivery delivery = deliveryQueue.take();
+
+				// // Indicate this thread is not available
+				// wrapper.increaseBusy();
 
 				String serializerType = delivery.getProperties().getType();
@@ -64,9 +69,13 @@
 				}
 
+				
+				Channel channel = obj.getChannel();
+				
+				
 				// Reply if it's necessary
 				if (!request.isAsync()) {
 					Response resp = new Response(request.getId(), obj.getRef(), result, error);
 
-					Channel channel = obj.getChannel();
+					
 
 					BasicProperties props = delivery.getProperties();
@@ -79,5 +88,9 @@
 							+ props.getReplyTo());
 				}
-
+				
+				channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
+				
+				// // Indicate this thread is available
+				// wrapper.decreaseBusy();
 			} catch (InterruptedException i) {
 				logger.error(i);
Index: branches/supervisor/src/main/java/omq/server/RemoteObject.java
===================================================================
--- branches/supervisor/src/main/java/omq/server/RemoteObject.java	(revision 90)
+++ branches/supervisor/src/main/java/omq/server/RemoteObject.java	(revision 91)
@@ -38,13 +38,13 @@
 	private static final Logger logger = Logger.getLogger(RemoteObject.class.getName());
 
-	private String UID;
-	private Properties env;
-	private transient Broker broker;
-	private transient String multiQueue;
-	private transient RemoteWrapper remoteWrapper;
-	private transient Map<String, List<Class<?>>> params;
-	private transient Channel channel;
-	private transient QueueingConsumer consumer;
-	private transient boolean killed = false;
+	protected String UID;
+	protected Properties env;
+	protected transient Broker broker;
+	protected transient String multiQueue;
+	protected transient RemoteWrapper remoteWrapper;
+	protected transient Map<String, List<Class<?>>> params;
+	protected transient Channel channel;
+	protected transient QueueingConsumer consumer;
+	protected transient boolean killed = false;
 
 	private static final Map<String, Class<?>> primitiveClasses = new HashMap<String, Class<?>>();
@@ -317,8 +317,10 @@
 		 */
 
+		boolean autoAck = false;
+
 		// Declare a new consumer
 		consumer = new QueueingConsumer(channel);
-		channel.basicConsume(queue, true, consumer);
-		channel.basicConsume(multiQueue, true, consumer);
+		channel.basicConsume(queue, autoAck, consumer);
+		channel.basicConsume(multiQueue, autoAck, consumer);
 	}
 
Index: branches/supervisor/src/main/java/omq/server/RemoteWrapper.java
===================================================================
--- branches/supervisor/src/main/java/omq/server/RemoteWrapper.java	(revision 90)
+++ branches/supervisor/src/main/java/omq/server/RemoteWrapper.java	(revision 91)
@@ -24,4 +24,6 @@
 	private RemoteObject obj;
 	private int numThreads;
+	// private AtomicInteger busy;
+	private Object waitLock;
 	private ArrayList<InvocationThread> invocationList;
 	private BlockingQueue<Delivery> deliveryQueue;
@@ -30,4 +32,6 @@
 		this.obj = obj;
 		this.numThreads = numThreads;
+		// this.busy = new AtomicInteger(0);
+		this.waitLock = new Object();
 		invocationList = new ArrayList<InvocationThread>();
 		deliveryQueue = new LinkedBlockingDeque<QueueingConsumer.Delivery>();
@@ -36,5 +40,5 @@
 
 		for (int i = 0; i < numThreads; i++) {
-			InvocationThread thread = new InvocationThread(obj, deliveryQueue, serializer);
+			InvocationThread thread = new InvocationThread(obj, this, serializer);
 			invocationList.add(thread);
 			thread.start();
@@ -51,5 +55,17 @@
 	 */
 	public void notifyDelivery(Delivery delivery) throws Exception {
+
+		// // Ensure there is at least one thread available
+		// while (this.busy.get() == this.numThreads) {
+		// System.out.println("Waiting for a thread available");
+		// logger.debug("Object reference: " + obj.getRef() + " is busy");
+		//
+		// synchronized (waitLock) {
+		// waitLock.wait();
+		// }
+		// }
+		// Notify an available thread
 		this.deliveryQueue.put(delivery);
+
 	}
 
@@ -63,4 +79,16 @@
 		}
 	}
+
+	// public int increaseBusy() {
+	// return this.busy.incrementAndGet();
+	// }
+	//
+	// public int decreaseBusy() {
+	// int value = this.busy.decrementAndGet();
+	// synchronized (waitLock) {
+	// waitLock.notifyAll();
+	// }
+	// return value;
+	// }
 
 	public RemoteObject getObj() {
@@ -95,3 +123,11 @@
 		this.deliveryQueue = deliveryQueue;
 	}
+
+	public Object getLock() {
+		return waitLock;
+	}
+
+	public void setLock(Object lock) {
+		this.waitLock = lock;
+	}
 }
