Index: uspace/lib/console/src/con_srv.c
===================================================================
--- uspace/lib/console/src/con_srv.c	(revision fb06afd8a27eb616251795f0e4cde142cb4f13fd)
+++ uspace/lib/console/src/con_srv.c	(revision 5be5396892b47291c631e7c4a282407b5c78a759)
@@ -466,5 +466,5 @@
 		}
 
-		if (!received)
+		if (!received || srv->srvs->aborted)
 			break;
 
Index: uspace/lib/vt/include/vt/vt100.h
===================================================================
--- uspace/lib/vt/include/vt/vt100.h	(revision fb06afd8a27eb616251795f0e4cde142cb4f13fd)
+++ uspace/lib/vt/include/vt/vt100.h	(revision 5be5396892b47291c631e7c4a282407b5c78a759)
@@ -179,4 +179,5 @@
 extern void vt100_set_pos(vt100_t *, sysarg_t, sysarg_t);
 extern void vt100_goto(vt100_t *, sysarg_t, sysarg_t);
+extern void vt100_sgr(vt100_t *, unsigned int);
 extern void vt100_set_sgr(vt100_t *, char_attrs_t);
 extern void vt100_set_attr(vt100_t *, char_attrs_t);
Index: uspace/lib/vt/src/vt100.c
===================================================================
--- uspace/lib/vt/src/vt100.c	(revision fb06afd8a27eb616251795f0e4cde142cb4f13fd)
+++ uspace/lib/vt/src/vt100.c	(revision 5be5396892b47291c631e7c4a282407b5c78a759)
@@ -66,5 +66,5 @@
  * @param mode SGR mode number
  */
-static void vt100_sgr(vt100_t *vt, unsigned int mode)
+void vt100_sgr(vt100_t *vt, unsigned int mode)
 {
 	char control[MAX_CONTROL];
Index: uspace/srv/hid/remcons/remcons.c
===================================================================
--- uspace/srv/hid/remcons/remcons.c	(revision fb06afd8a27eb616251795f0e4cde142cb4f13fd)
+++ uspace/srv/hid/remcons/remcons.c	(revision 5be5396892b47291c631e7c4a282407b5c78a759)
@@ -739,5 +739,5 @@
 	user->srvs.ops = &con_ops;
 	user->srvs.sarg = remcons;
-	user->srvs.abort_timeout = 1000;
+	user->srvs.abort_timeout = 1000000;
 
 	telnet_user_add(user);
@@ -765,8 +765,6 @@
 	while (!user_can_be_destroyed_no_lock(user)) {
 		if (user->task_finished) {
-			user->conn = NULL;
 			user->socket_closed = true;
 			user->srvs.aborted = true;
-			continue;
 		} else if (user->socket_closed) {
 			if (user->task_id != 0) {
@@ -774,5 +772,6 @@
 			}
 		}
-		fibril_condvar_wait_timeout(&user->refcount_cv, &user->recv_lock, 1000);
+		fibril_condvar_wait_timeout(&user->refcount_cv,
+		    &user->recv_lock, 1000000);
 	}
 	fibril_mutex_unlock(&user->recv_lock);
@@ -786,5 +785,23 @@
 
 	telnet_user_log(user, "Destroying...");
+
+	if (remcons->enable_ctl) {
+		/* Disable mouse tracking */
+		vt100_set_button_reporting(remcons->vt, false);
+
+		/* Reset all character attributes and clear screen */
+		vt100_sgr(remcons->vt, 0);
+		vt100_cls(remcons->vt);
+		vt100_set_pos(remcons->vt, 0, 0);
+
+		telnet_user_flush(user);
+	}
+
+	tcp_conn_send_fin(user->conn);
+	user->conn = NULL;
+
 	telnet_user_destroy(user);
+	vt100_destroy(remcons->vt);
+	free(remcons);
 	return;
 error:
