diff --git a/CHANGES.txt b/CHANGES.txt
index 120569a..1e5f747 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -588,6 +588,9 @@
     TAJO-602: WorkerResourceManager should be broke down into 3 parts.
     (hyunsik)
 
+  TEST
+
+    TAJO-686: Integration test aborted. (jinho)
 
 Release 0.2.0 - released
 
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/master/rm/TestTajoResourceManager.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/master/rm/TestTajoResourceManager.java
index af48fa6..34deb29 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/master/rm/TestTajoResourceManager.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/master/rm/TestTajoResourceManager.java
@@ -30,6 +30,8 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 import static org.apache.tajo.ipc.TajoResourceTrackerProtocol.NodeHeartbeat;
 import static org.junit.Assert.assertEquals;
@@ -148,25 +150,20 @@
           .setMaxMemoryMBPerContainer(maxMemory)
           .build();
 
-      final Object monitor = new Object();
+      final CountDownLatch barrier = new CountDownLatch(1);
       final List<YarnProtos.ContainerIdProto> containerIds = new ArrayList<YarnProtos.ContainerIdProto>();
 
-
       RpcCallback<WorkerResourceAllocationResponse> callBack = new RpcCallback<WorkerResourceAllocationResponse>() {
 
         @Override
         public void run(WorkerResourceAllocationResponse response) {
           TestTajoResourceManager.this.response = response;
-          synchronized(monitor) {
-            monitor.notifyAll();
-          }
+          barrier.countDown();
         }
       };
 
       tajoWorkerResourceManager.allocateWorkerResources(request, callBack);
-      synchronized(monitor) {
-        monitor.wait();
-      }
+      assertTrue(barrier.await(3, TimeUnit.SECONDS));
 
 
       // assert after callback
@@ -242,22 +239,19 @@
             .setMaxMemoryMBPerContainer(maxMemory)
             .build();
 
-        final Object monitor = new Object();
+        final CountDownLatch barrier = new CountDownLatch(1);
 
         RpcCallback<WorkerResourceAllocationResponse> callBack = new RpcCallback<WorkerResourceAllocationResponse>() {
           @Override
           public void run(WorkerResourceAllocationResponse response) {
             TestTajoResourceManager.this.response = response;
-            synchronized(monitor) {
-              monitor.notifyAll();
-            }
+            barrier.countDown();
           }
         };
 
         tajoWorkerResourceManager.allocateWorkerResources(request, callBack);
-        synchronized(monitor) {
-          monitor.wait();
-        }
+
+        assertTrue(barrier.await(3, TimeUnit.SECONDS));
 
         numAllocatedContainers += TestTajoResourceManager.this.response.getWorkerAllocatedResourceList().size();
 
@@ -324,7 +318,7 @@
           .setMaxMemoryMBPerContainer(memoryMB)
           .build();
 
-      final Object monitor = new Object();
+      final CountDownLatch barrier = new CountDownLatch(1);
       final List<YarnProtos.ContainerIdProto> containerIds = new ArrayList<YarnProtos.ContainerIdProto>();
 
 
@@ -333,16 +327,13 @@
         @Override
         public void run(WorkerResourceAllocationResponse response) {
           TestTajoResourceManager.this.response = response;
-          synchronized(monitor) {
-            monitor.notifyAll();
-          }
+          barrier.countDown();
         }
       };
 
       tajoWorkerResourceManager.allocateWorkerResources(request, callBack);
-      synchronized(monitor) {
-        monitor.wait();
-      }
+      assertTrue(barrier.await(3, TimeUnit.SECONDS));
+
       for(WorkerAllocatedResource eachResource: response.getWorkerAllocatedResourceList()) {
         assertTrue("AllocatedDiskSlot:" + eachResource.getAllocatedDiskSlots(),
             eachResource.getAllocatedDiskSlots() >= minDiskSlots &&
