Index: uspace/srv/hid/remcons/remcons.c
===================================================================
--- uspace/srv/hid/remcons/remcons.c	(revision c7ecd290f693e7f9f29a2d321c3981c90695a028)
+++ uspace/srv/hid/remcons/remcons.c	(revision 5f5d3757f78727d04ad0b50a7312cbe9fd6b71a0)
@@ -540,15 +540,15 @@
 		    "failed: %s.", APP_GETTERM, user->service_name, APP_SHELL,
 		    str_error(rc));
-		fibril_mutex_lock(&user->guard);
+		fibril_mutex_lock(&user->recv_lock);
 		user->task_finished = true;
 		user->srvs.aborted = true;
 		fibril_condvar_signal(&user->refcount_cv);
-		fibril_mutex_unlock(&user->guard);
+		fibril_mutex_unlock(&user->recv_lock);
 		return EOK;
 	}
 
-	fibril_mutex_lock(&user->guard);
+	fibril_mutex_lock(&user->recv_lock);
 	user->task_id = task;
-	fibril_mutex_unlock(&user->guard);
+	fibril_mutex_unlock(&user->recv_lock);
 
 	task_exit_t task_exit;
@@ -560,9 +560,9 @@
 
 	/* Announce destruction. */
-	fibril_mutex_lock(&user->guard);
+	fibril_mutex_lock(&user->recv_lock);
 	user->task_finished = true;
 	user->srvs.aborted = true;
 	fibril_condvar_signal(&user->refcount_cv);
-	fibril_mutex_unlock(&user->guard);
+	fibril_mutex_unlock(&user->recv_lock);
 
 	return EOK;
@@ -728,5 +728,5 @@
 
 	/* Wait for all clients to exit. */
-	fibril_mutex_lock(&user->guard);
+	fibril_mutex_lock(&user->recv_lock);
 	while (!user_can_be_destroyed_no_lock(user)) {
 		if (user->task_finished) {
@@ -740,7 +740,7 @@
 			}
 		}
-		fibril_condvar_wait_timeout(&user->refcount_cv, &user->guard, 1000);
-	}
-	fibril_mutex_unlock(&user->guard);
+		fibril_condvar_wait_timeout(&user->refcount_cv, &user->recv_lock, 1000);
+	}
+	fibril_mutex_unlock(&user->recv_lock);
 
 	rc = loc_service_unregister(remcons_srv, user->service_id);
Index: uspace/srv/hid/remcons/user.c
===================================================================
--- uspace/srv/hid/remcons/user.c	(revision c7ecd290f693e7f9f29a2d321c3981c90695a028)
+++ uspace/srv/hid/remcons/user.c	(revision 5f5d3757f78727d04ad0b50a7312cbe9fd6b71a0)
@@ -97,5 +97,6 @@
 
 	fibril_condvar_initialize(&user->refcount_cv);
-	fibril_mutex_initialize(&user->guard);
+	fibril_mutex_initialize(&user->send_lock);
+	fibril_mutex_initialize(&user->recv_lock);
 	user->task_finished = false;
 	user->socket_closed = false;
@@ -151,5 +152,5 @@
 
 	telnet_user_t *tmp = user;
-	fibril_mutex_lock(&tmp->guard);
+	fibril_mutex_lock(&tmp->recv_lock);
 	user->locsrv_connection_count++;
 
@@ -163,5 +164,5 @@
 	}
 
-	fibril_mutex_unlock(&tmp->guard);
+	fibril_mutex_unlock(&tmp->recv_lock);
 
 	fibril_mutex_unlock(&users_guard);
@@ -176,9 +177,9 @@
 void telnet_user_notify_client_disconnected(telnet_user_t *user)
 {
-	fibril_mutex_lock(&user->guard);
+	fibril_mutex_lock(&user->recv_lock);
 	assert(user->locsrv_connection_count > 0);
 	user->locsrv_connection_count--;
 	fibril_condvar_signal(&user->refcount_cv);
-	fibril_mutex_unlock(&user->guard);
+	fibril_mutex_unlock(&user->recv_lock);
 }
 
@@ -189,7 +190,7 @@
 bool telnet_user_is_zombie(telnet_user_t *user)
 {
-	fibril_mutex_lock(&user->guard);
+	fibril_mutex_lock(&user->recv_lock);
 	bool zombie = user->socket_closed || user->task_finished;
-	fibril_mutex_unlock(&user->guard);
+	fibril_mutex_unlock(&user->recv_lock);
 
 	return zombie;
@@ -401,5 +402,5 @@
 {
 	uint8_t *bp = (uint8_t *)buf;
-	fibril_mutex_lock(&user->guard);
+	fibril_mutex_lock(&user->recv_lock);
 
 	assert(size > 0);
@@ -417,5 +418,5 @@
 			    &next_byte);
 			if (rc != EOK) {
-				fibril_mutex_unlock(&user->guard);
+				fibril_mutex_unlock(&user->recv_lock);
 				return rc;
 			}
@@ -453,5 +454,5 @@
 	} while (size > 0 && (telnet_user_byte_avail(user) || *nread == 0));
 
-	fibril_mutex_unlock(&user->guard);
+	fibril_mutex_unlock(&user->recv_lock);
 	return EOK;
 }
@@ -534,9 +535,9 @@
     size_t size)
 {
-	fibril_mutex_lock(&user->guard);
+	fibril_mutex_lock(&user->send_lock);
 
 	errno_t rc = telnet_user_send_data_locked(user, data, size);
 
-	fibril_mutex_unlock(&user->guard);
+	fibril_mutex_unlock(&user->send_lock);
 
 	return rc;
@@ -552,9 +553,9 @@
     size_t size)
 {
-	fibril_mutex_lock(&user->guard);
+	fibril_mutex_lock(&user->send_lock);
 
 	errno_t rc = telnet_user_send_raw_locked(user, data, size);
 
-	fibril_mutex_unlock(&user->guard);
+	fibril_mutex_unlock(&user->send_lock);
 
 	return rc;
@@ -577,7 +578,7 @@
 	errno_t rc;
 
-	fibril_mutex_lock(&user->guard);
+	fibril_mutex_lock(&user->send_lock);
 	rc = telnet_user_flush_locked(user);
-	fibril_mutex_unlock(&user->guard);
+	fibril_mutex_unlock(&user->send_lock);
 	return rc;
 }
@@ -592,5 +593,5 @@
 void telnet_user_update_cursor_x(telnet_user_t *user, int new_x)
 {
-	fibril_mutex_lock(&user->guard);
+	fibril_mutex_lock(&user->send_lock);
 	if (user->cursor_x - 1 == new_x) {
 		char data = '\b';
@@ -599,5 +600,5 @@
 	}
 	user->cursor_x = new_x;
-	fibril_mutex_unlock(&user->guard);
+	fibril_mutex_unlock(&user->send_lock);
 
 }
Index: uspace/srv/hid/remcons/user.h
===================================================================
--- uspace/srv/hid/remcons/user.h	(revision c7ecd290f693e7f9f29a2d321c3981c90695a028)
+++ uspace/srv/hid/remcons/user.h	(revision 5f5d3757f78727d04ad0b50a7312cbe9fd6b71a0)
@@ -52,6 +52,8 @@
 /** Representation of a connected (human) user. */
 typedef struct {
-	/** Mutex guarding the whole structure. */
-	fibril_mutex_t guard;
+	/** Synchronize send operations */
+	fibril_mutex_t send_lock;
+	/** Synchronize receive operations */
+	fibril_mutex_t recv_lock;
 	/** Callback functions */
 	telnet_cb_t *cb;
