Index: uspace/app/tester/proc/task_anywait.c
===================================================================
--- uspace/app/tester/proc/task_anywait.c	(revision bb57a00a13ab04b0a688c6f763d8758eb1a50587)
+++ uspace/app/tester/proc/task_anywait.c	(revision 4ff66ae57af053109c34f24cd433ec080d97444c)
@@ -111,5 +111,5 @@
 	int rc;
 
-	rc = task_register_event_handler(task_event_handler);
+	rc = task_register_event_handler(task_event_handler, false);
 	TASSERT(rc == EOK);
 
Index: uspace/lib/c/generic/task_event.c
===================================================================
--- uspace/lib/c/generic/task_event.c	(revision bb57a00a13ab04b0a688c6f763d8758eb1a50587)
+++ uspace/lib/c/generic/task_event.c	(revision 4ff66ae57af053109c34f24cd433ec080d97444c)
@@ -83,5 +83,5 @@
  * Blocks, calls handler in another fibril
  */
-int task_register_event_handler(task_event_handler_t handler)
+int task_register_event_handler(task_event_handler_t handler, bool past_events)
 {
 	/*
@@ -95,5 +95,5 @@
 
 	async_exch_t *exch = taskman_exchange_begin();
-	aid_t req = async_send_0(exch, TASKMAN_EVENT_CALLBACK, NULL);
+	aid_t req = async_send_1(exch, TASKMAN_EVENT_CALLBACK, past_events, NULL);
 
 	int rc = async_connect_to_me(exch, 0, 0, 0, taskman_event_conn, NULL);
Index: uspace/lib/c/generic/taskman.c
===================================================================
--- uspace/lib/c/generic/taskman.c	(revision bb57a00a13ab04b0a688c6f763d8758eb1a50587)
+++ uspace/lib/c/generic/taskman.c	(revision 4ff66ae57af053109c34f24cd433ec080d97444c)
@@ -127,15 +127,4 @@
  */
 
-int taskman_dump_events(void)
-{
-	assert(session_taskman);
-
-	async_exch_t *exch = async_exchange_begin(session_taskman);
-	int rc = async_req_0_0(exch, TASKMAN_DUMP_EVENTS);
-	taskman_exchange_end(exch);
-
-	return rc;
-}
-
 async_sess_t *taskman_get_session(void)
 {
Index: uspace/lib/c/include/ipc/taskman.h
===================================================================
--- uspace/lib/c/include/ipc/taskman.h	(revision bb57a00a13ab04b0a688c6f763d8758eb1a50587)
+++ uspace/lib/c/include/ipc/taskman.h	(revision 4ff66ae57af053109c34f24cd433ec080d97444c)
@@ -44,6 +44,5 @@
 	TASKMAN_EVENT_CALLBACK,
 	TASKMAN_NEW_TASK,
-	TASKMAN_I_AM_NS,
-	TASKMAN_DUMP_EVENTS
+	TASKMAN_I_AM_NS
 } taskman_request_t;
 
Index: uspace/lib/c/include/taskman.h
===================================================================
--- uspace/lib/c/include/taskman.h	(revision bb57a00a13ab04b0a688c6f763d8758eb1a50587)
+++ uspace/lib/c/include/taskman.h	(revision 4ff66ae57af053109c34f24cd433ec080d97444c)
@@ -40,6 +40,4 @@
 #endif
 
-extern int taskman_dump_events(void);
-
 /* Internal functions to be used by loader only */
 #ifndef TASKMAN_DISABLE_ASYNC
Index: uspace/srv/sysman/main.c
===================================================================
--- uspace/srv/sysman/main.c	(revision bb57a00a13ab04b0a688c6f763d8758eb1a50587)
+++ uspace/srv/sysman/main.c	(revision 4ff66ae57af053109c34f24cd433ec080d97444c)
@@ -215,5 +215,4 @@
 	sysman_events_init();
 	job_queue_init();
-	sm_task_init();
 
 	/*
@@ -246,6 +245,6 @@
 	}
 
-	/* We're almost ready, scan for boot time tasks */
-	rc = taskman_dump_events();
+	/* Start listening task events and scan boot time tasks */
+	rc = sm_task_start();
 	if (rc != EOK) {
 		sysman_log(LVL_FATAL,
Index: uspace/srv/sysman/sm_task.c
===================================================================
--- uspace/srv/sysman/sm_task.c	(revision bb57a00a13ab04b0a688c6f763d8758eb1a50587)
+++ uspace/srv/sysman/sm_task.c	(revision 4ff66ae57af053109c34f24cd433ec080d97444c)
@@ -206,9 +206,7 @@
 }
 
-int sm_task_init(void)
-{
-	int rc = task_register_event_handler(&sm_task_event_handler);
-
-	//TODO dump taskman info for boot time tasks
+int sm_task_start(void)
+{
+	int rc = task_register_event_handler(&sm_task_event_handler, true);
 	return rc;
 }
Index: uspace/srv/sysman/sm_task.h
===================================================================
--- uspace/srv/sysman/sm_task.h	(revision bb57a00a13ab04b0a688c6f763d8758eb1a50587)
+++ uspace/srv/sysman/sm_task.h	(revision 4ff66ae57af053109c34f24cd433ec080d97444c)
@@ -33,5 +33,5 @@
 typedef struct sm_task_event sm_task_event_t;
 
-extern int sm_task_init(void);
+extern int sm_task_start(void);
 
 #endif
Index: uspace/srv/taskman/event.c
===================================================================
--- uspace/srv/taskman/event.c	(revision bb57a00a13ab04b0a688c6f763d8758eb1a50587)
+++ uspace/srv/taskman/event.c	(revision 4ff66ae57af053109c34f24cd433ec080d97444c)
@@ -188,7 +188,19 @@
 }
 
-int event_register_listener(task_id_t id, async_sess_t *sess)
+static bool dump_walker(task_t *t, void *arg)
+{
+	event_notify(t, arg);
+	return true;
+}
+
+void event_register_listener(task_id_t id, bool past_events, async_sess_t *sess,
+    ipc_callid_t iid)
 {
 	int rc = EOK;
+	/*
+	 * We have lock of tasks structures so that we can guarantee
+	 * that dump receiver will receive tasks correctly ordered (retval,
+	 * exit updates are serialized via exclusive lock).
+	 */
 	fibril_rwlock_write_lock(&task_hash_table_lock);
 	fibril_rwlock_write_lock(&listeners_lock);
@@ -203,45 +215,16 @@
 	t->sess = sess;
 
+	/*
+	 * Answer caller first, so that they are not unnecessarily waiting
+	 * while we dump events.
+	 */
+	async_answer_0(iid, rc);
+	if (past_events) {
+		task_foreach(&dump_walker, t->sess);
+	}
+
 finish:
 	fibril_rwlock_write_unlock(&listeners_lock);
 	fibril_rwlock_write_unlock(&task_hash_table_lock);
-	return rc;
-}
-
-static bool dump_walker(task_t *t, void *arg)
-{
-	event_notify(t, arg);
-	return true;
-}
-
-void dump_events(task_id_t receiver_id, ipc_callid_t iid)
-{
-	int rc = EOK;
-	/*
-	 * We have shared lock of tasks structures so that we can guarantee
-	 * that dump receiver will receive tasks correctly ordered (retval,
-	 * exit updates are serialized via exclusive lock).
-	 */
-	fibril_rwlock_read_lock(&task_hash_table_lock);
-
-	task_t *receiver = task_get_by_id(receiver_id);
-	if (receiver == NULL) {
-		rc = ENOENT;
-		goto finish;
-	}
-	if (receiver->sess == NULL) {
-		rc = ENOENT;
-		goto finish;
-	}
-
-	/*
-	 * Answer caller first, so that they are not unnecessarily waiting
-	 * while we dump events.
-	 */
-	async_answer_0(iid, rc);
-	task_foreach(&dump_walker, receiver->sess);
-
-finish:
-	fibril_rwlock_read_unlock(&task_hash_table_lock);
 	if (rc != EOK) {
 		async_answer_0(iid, rc);
Index: uspace/srv/taskman/event.h
===================================================================
--- uspace/srv/taskman/event.h	(revision bb57a00a13ab04b0a688c6f763d8758eb1a50587)
+++ uspace/srv/taskman/event.h	(revision 4ff66ae57af053109c34f24cd433ec080d97444c)
@@ -41,5 +41,6 @@
 extern int event_init(void);
 
-extern int event_register_listener(task_id_t, async_sess_t *);
+extern void event_register_listener(task_id_t, bool, async_sess_t *,
+    ipc_callid_t);
 extern void dump_events(task_id_t, ipc_callid_t);
 extern void wait_for_task(task_id_t, int, ipc_callid_t, task_id_t);
Index: uspace/srv/taskman/main.c
===================================================================
--- uspace/srv/taskman/main.c	(revision bb57a00a13ab04b0a688c6f763d8758eb1a50587)
+++ uspace/srv/taskman/main.c	(revision 4ff66ae57af053109c34f24cd433ec080d97444c)
@@ -186,4 +186,6 @@
 	DPRINTF("%s:%i from %llu\n", __func__, __LINE__, icall->in_task_id);
 
+	bool past_events = IPC_GET_ARG1(*icall);
+
 	/* Atomic -- will be used for notifications only */
 	async_sess_t *sess = async_callback_receive(EXCHANGE_ATOMIC);
@@ -193,13 +195,5 @@
 	}
 
-	int rc = event_register_listener(icall->in_task_id, sess);
-	async_answer_0(iid, rc);
-}
-
-static void taskman_ctl_dump_events(ipc_callid_t iid, ipc_call_t *icall)
-{
-	DPRINTF("%s:%i from %llu\n", __func__, __LINE__, icall->in_task_id);
-
-	dump_events(icall->in_task_id, iid);
+	event_register_listener(icall->in_task_id, past_events, sess, iid);
 }
 
@@ -263,7 +257,4 @@
 		taskman_ctl_ev_callback(iid, icall);
 		break;
-	case TASKMAN_DUMP_EVENTS:
-		taskman_ctl_dump_events(iid, icall);
-		break;
 	default:
 		return false;
@@ -274,8 +265,8 @@
 static bool handle_implicit_call(ipc_callid_t iid, ipc_call_t *icall)
 {
-	DPRINTF("%s:%i %i(%i) from %llu\n", __func__, __LINE__,
+	/*DPRINTF("%s:%i %i(%i) from %llu\n", __func__, __LINE__,
 	    IPC_GET_IMETHOD(*icall),
 	    IPC_GET_ARG1(*icall),
-	    icall->in_task_id);
+	    icall->in_task_id);*/
 
 	if (IPC_GET_IMETHOD(*icall) < IPC_FIRST_USER_METHOD) {
