Index: kernel/generic/include/synch/semaphore.h
===================================================================
--- kernel/generic/include/synch/semaphore.h	(revision c0b54c9d6fa6bb96ee21171d5b8f0c3b58ed0e60)
+++ kernel/generic/include/synch/semaphore.h	(revision 4c78104a6837166b8f7dd061ec8df30c45dd4c00)
@@ -51,5 +51,4 @@
 extern void semaphore_down(semaphore_t *);
 extern void semaphore_up(semaphore_t *);
-extern int semaphore_count_get(semaphore_t *);
 
 #endif
Index: kernel/generic/include/synch/waitq.h
===================================================================
--- kernel/generic/include/synch/waitq.h	(revision c0b54c9d6fa6bb96ee21171d5b8f0c3b58ed0e60)
+++ kernel/generic/include/synch/waitq.h	(revision 4c78104a6837166b8f7dd061ec8df30c45dd4c00)
@@ -72,4 +72,5 @@
 
 extern void waitq_initialize(waitq_t *);
+extern void waitq_initialize_with_count(waitq_t *, int);
 extern errno_t waitq_sleep(waitq_t *);
 extern errno_t waitq_sleep_timeout(waitq_t *, uint32_t, unsigned int, bool *);
@@ -81,6 +82,4 @@
 extern void _waitq_wakeup_unsafe(waitq_t *, wakeup_mode_t);
 extern void waitq_interrupt_sleep(struct thread *);
-extern int waitq_count_get(waitq_t *);
-extern void waitq_count_set(waitq_t *, int val);
 
 #endif
Index: kernel/generic/src/synch/mutex.c
===================================================================
--- kernel/generic/src/synch/mutex.c	(revision c0b54c9d6fa6bb96ee21171d5b8f0c3b58ed0e60)
+++ kernel/generic/src/synch/mutex.c	(revision 4c78104a6837166b8f7dd061ec8df30c45dd4c00)
@@ -66,5 +66,9 @@
 bool mutex_locked(mutex_t *mtx)
 {
-	return semaphore_count_get(&mtx->sem) <= 0;
+	bool success = semaphore_trydown(&mtx->sem);
+	if (success) {
+		semaphore_up(&mtx->sem);
+	}
+	return !success;
 }
 
Index: kernel/generic/src/synch/semaphore.c
===================================================================
--- kernel/generic/src/synch/semaphore.c	(revision c0b54c9d6fa6bb96ee21171d5b8f0c3b58ed0e60)
+++ kernel/generic/src/synch/semaphore.c	(revision 4c78104a6837166b8f7dd061ec8df30c45dd4c00)
@@ -52,7 +52,5 @@
 void semaphore_initialize(semaphore_t *sem, int val)
 {
-	waitq_initialize(&sem->wq);
-	if (val != 0)
-		waitq_count_set(&sem->wq, val);
+	waitq_initialize_with_count(&sem->wq, val);
 }
 
@@ -100,15 +98,4 @@
 }
 
-/** Get the semaphore counter value.
- *
- * @param sem		Semaphore.
- * @return		The number of threads that can down the semaphore
- * 			without blocking.
- */
-int semaphore_count_get(semaphore_t *sem)
-{
-	return waitq_count_get(&sem->wq);
-}
-
 /** @}
  */
Index: kernel/generic/src/synch/waitq.c
===================================================================
--- kernel/generic/src/synch/waitq.c	(revision c0b54c9d6fa6bb96ee21171d5b8f0c3b58ed0e60)
+++ kernel/generic/src/synch/waitq.c	(revision 4c78104a6837166b8f7dd061ec8df30c45dd4c00)
@@ -75,4 +75,12 @@
 	irq_spinlock_initialize(&wq->lock, "wq.lock");
 	list_initialize(&wq->sleepers);
+}
+
+void waitq_initialize_with_count(waitq_t *wq, int count)
+{
+	memsetb(wq, sizeof(*wq), 0);
+	irq_spinlock_initialize(&wq->lock, "wq.lock");
+	list_initialize(&wq->sleepers);
+	wq->missed_wakeups = count;
 }
 
@@ -545,32 +553,4 @@
 }
 
-/** Get the missed wakeups count.
- *
- * @param wq	Pointer to wait queue.
- * @return	The wait queue's missed_wakeups count.
- */
-int waitq_count_get(waitq_t *wq)
-{
-	int cnt;
-
-	irq_spinlock_lock(&wq->lock, true);
-	cnt = wq->missed_wakeups;
-	irq_spinlock_unlock(&wq->lock, true);
-
-	return cnt;
-}
-
-/** Set the missed wakeups count.
- *
- * @param wq	Pointer to wait queue.
- * @param val	New value of the missed_wakeups count.
- */
-void waitq_count_set(waitq_t *wq, int val)
-{
-	irq_spinlock_lock(&wq->lock, true);
-	wq->missed_wakeups = val;
-	irq_spinlock_unlock(&wq->lock, true);
-}
-
 /** @}
  */
