Index: kernel/generic/include/synch/waitq.h
===================================================================
--- kernel/generic/include/synch/waitq.h	(revision 81193639c9f3af3b65a6ea46f1f7422d4d3bec12)
+++ kernel/generic/include/synch/waitq.h	(revision d3b2ffaddcda1e7c3db7a9f643033e62c4c947a0)
@@ -82,5 +82,4 @@
 extern void _waitq_wakeup_unsafe(waitq_t *, wakeup_mode_t);
 extern void waitq_interrupt_sleep(struct thread *);
-extern void waitq_unsleep(waitq_t *);
 extern int waitq_count_get(waitq_t *);
 extern void waitq_count_set(waitq_t *, int val);
Index: kernel/generic/src/ipc/ipc.c
===================================================================
--- kernel/generic/src/ipc/ipc.c	(revision 81193639c9f3af3b65a6ea46f1f7422d4d3bec12)
+++ kernel/generic/src/ipc/ipc.c	(revision d3b2ffaddcda1e7c3db7a9f643033e62c4c947a0)
@@ -550,5 +550,4 @@
 	errno_t rc;
 
-restart:
 	rc = waitq_sleep_timeout(&box->wq, usec, flags, NULL);
 	if (rc != EOK)
@@ -590,7 +589,10 @@
 		list_append(&request->ab_link, &box->dispatched_calls);
 	} else {
-		/* This can happen regularly after ipc_cleanup */
+		/*
+		 * This can happen regularly after ipc_cleanup, or in
+		 * response to ipc_poke(). Let the caller sort out the wakeup.
+		 */
 		irq_spinlock_unlock(&box->lock, true);
-		goto restart;
+		return NULL;
 	}
 
Index: kernel/generic/src/ipc/sysipc.c
===================================================================
--- kernel/generic/src/ipc/sysipc.c	(revision 81193639c9f3af3b65a6ea46f1f7422d4d3bec12)
+++ kernel/generic/src/ipc/sysipc.c	(revision d3b2ffaddcda1e7c3db7a9f643033e62c4c947a0)
@@ -856,5 +856,5 @@
 sys_errno_t sys_ipc_poke(void)
 {
-	waitq_unsleep(&TASK->answerbox.wq);
+	waitq_wakeup(&TASK->answerbox.wq, WAKEUP_FIRST);
 	return EOK;
 }
Index: kernel/generic/src/synch/waitq.c
===================================================================
--- kernel/generic/src/synch/waitq.c	(revision 81193639c9f3af3b65a6ea46f1f7422d4d3bec12)
+++ kernel/generic/src/synch/waitq.c	(revision d3b2ffaddcda1e7c3db7a9f643033e62c4c947a0)
@@ -190,39 +190,4 @@
 	if (do_wakeup)
 		thread_ready(thread);
-}
-
-/** Interrupt the first thread sleeping in the wait queue.
- *
- * Note that the caller somehow needs to know that the thread to be interrupted
- * is sleeping interruptibly.
- *
- * @param wq Pointer to wait queue.
- *
- */
-void waitq_unsleep(waitq_t *wq)
-{
-	irq_spinlock_lock(&wq->lock, true);
-
-	if (!list_empty(&wq->sleepers)) {
-		thread_t *thread = list_get_instance(list_first(&wq->sleepers),
-		    thread_t, wq_link);
-
-		irq_spinlock_lock(&thread->lock, false);
-
-		assert(thread->sleep_interruptible);
-
-		if ((thread->timeout_pending) &&
-		    (timeout_unregister(&thread->sleep_timeout)))
-			thread->timeout_pending = false;
-
-		list_remove(&thread->wq_link);
-		thread->saved_context = thread->sleep_interruption_context;
-		thread->sleep_queue = NULL;
-
-		irq_spinlock_unlock(&thread->lock, false);
-		thread_ready(thread);
-	}
-
-	irq_spinlock_unlock(&wq->lock, true);
 }
 
