Index: uspace/app/trace/trace.c
===================================================================
--- uspace/app/trace/trace.c	(revision 9d8a1ed039f7790dbad40cecbffe6cd7efe0c963)
+++ uspace/app/trace/trace.c	(revision 654a30a03ff570f4d023672f19c1ac01f956fb9e)
@@ -47,4 +47,5 @@
 #include <io/console.h>
 #include <io/keycode.h>
+#include <fibril_sync.h>
 
 #include <libc.h>
@@ -72,4 +73,6 @@
 uintptr_t thash;
 volatile int paused;
+fibril_condvar_t paused_cv;
+fibril_mutex_t paused_lock;
 
 void thread_trace_start(uintptr_t thread_hash);
@@ -454,11 +457,15 @@
 	while (!abort_trace) {
 
+		fibril_mutex_lock(&paused_lock);
 		if (paused) {
-			printf("Press R to resume.\n");
-			while (paused) {
-				async_usleep(1000000);
-			}
-			printf("Resumed\n");
+			printf("Thread [%d] paused. Press R to resume.\n",
+			    thread_id);
+
+			while (paused)
+				fibril_condvar_wait(&paused_cv, &paused_lock);
+
+			printf("Thread [%d] resumed.\n", thread_id);
 		}
+		fibril_mutex_unlock(&paused_lock);
 
 		/* Run thread until an event occurs */
@@ -482,4 +489,7 @@
 			case UDEBUG_EVENT_STOP:
 				printf("Stop event\n");
+				fibril_mutex_lock(&paused_lock);
+				paused = 1;
+				fibril_mutex_unlock(&paused_lock);
 				break;
 			case UDEBUG_EVENT_THREAD_B:
@@ -599,11 +609,12 @@
 			printf("Pause...\n");
 			rc = udebug_stop(phoneid, thash);
-			if (rc == EOK)
-				paused = 1;
-			else
-				printf("stop -> %d\n", rc);
+			if (rc != EOK)
+				printf("Error: stop -> %d\n", rc);
 			break;
 		case KC_R:
+			fibril_mutex_lock(&paused_lock);
 			paused = 0;
+			fibril_condvar_broadcast(&paused_cv);
+			fibril_mutex_unlock(&paused_lock);
 			printf("Resume...\n");
 			break;
@@ -645,4 +656,6 @@
 	next_thread_id = 1;
 	paused = 0;
+	fibril_mutex_initialize(&paused_lock);
+	fibril_condvar_initialize(&paused_cv);
 
 	proto_init();
