Index: uspace/srv/hid/remcons/remcons.c
===================================================================
--- uspace/srv/hid/remcons/remcons.c	(revision 3806317addecfc44d41ef2b0a3f5739b6e683022)
+++ uspace/srv/hid/remcons/remcons.c	(revision 7c2bb2c8ef74f6bed0bbc0a019bd6a36c6b3d373)
@@ -336,18 +336,8 @@
 }
 
-
-static int network_client_fibril(void *arg)
-{
+static int spawn_task_fibril(void *arg)
+{
+	client_t *client = arg;
 	int rc;
-	client_t *client = arg;
-
-	rc = loc_service_register(client->service_name, &client->service_id);
-	if (rc != EOK) {
-		fprintf(stderr, "%s: Unable to register device %s\n", NAME,
-		    client->service_name);
-		return EOK;
-	}
-	printf("Service %s registered as %" PRIun "\n", client->service_name,
-	    client->service_id);
 
 	char term[LOC_NAME_MAXLEN];
@@ -359,9 +349,10 @@
 		printf("%s: Error spawning %s -w %s %s (%s)\n", NAME,
 		    APP_GETTERM, term, "/app/bdsh", str_error(rc));
+		fibril_mutex_lock(&client->refcount_mutex);
+		client->refcount--;
+		fibril_condvar_signal(&client->refcount_cv);
+		fibril_mutex_unlock(&client->refcount_mutex);
 		return EOK;
 	}
-	fibril_mutex_lock(&client->refcount_mutex);
-	client->refcount++;
-	fibril_mutex_unlock(&client->refcount_mutex);
 
 	task_exit_t task_exit;
@@ -370,4 +361,43 @@
 	printf("%s: getterm terminated: %d, %d\n", NAME, task_exit, task_retval);
 
+	/* Announce destruction. */
+	fibril_mutex_lock(&client->refcount_mutex);
+	client->refcount--;
+	fibril_condvar_signal(&client->refcount_cv);
+	fibril_mutex_unlock(&client->refcount_mutex);
+
+	return EOK;
+}
+
+
+static int network_client_fibril(void *arg)
+{
+	int rc;
+	client_t *client = arg;
+
+	rc = loc_service_register(client->service_name, &client->service_id);
+	if (rc != EOK) {
+		fprintf(stderr, "%s: Unable to register device %s\n", NAME,
+		    client->service_name);
+		return EOK;
+	}
+	printf("Service %s registered as %" PRIun "\n", client->service_name,
+	    client->service_id);
+
+	fibril_mutex_lock(&client->refcount_mutex);
+	client->refcount++;
+	fibril_mutex_unlock(&client->refcount_mutex);
+
+	fid_t spawn_fibril = fibril_create(spawn_task_fibril, client);
+	assert(spawn_fibril);
+	fibril_add_ready(spawn_fibril);
+
+	/* Wait for all clients to exit. */
+	fibril_mutex_lock(&client->refcount_mutex);
+	while (client->refcount > 0) {
+		fibril_condvar_wait(&client->refcount_cv, &client->refcount_mutex);
+	}
+	fibril_mutex_unlock(&client->refcount_mutex);
+
 	closesocket(client->socket);
 	rc = loc_service_unregister(client->service_id);
@@ -376,13 +406,5 @@
 	}
 
-	/* Wait for all clients to exit. */
-	fibril_mutex_lock(&client->refcount_mutex);
-	/* Drop our reference. */
-	client->refcount--;
-	while (client->refcount > 0) {
-		fibril_condvar_wait(&client->refcount_cv, &client->refcount_mutex);
-	}
-	fibril_mutex_unlock(&client->refcount_mutex);
-
+	printf("Destroying service %s.\n", client->service_name);
 	client_destroy(client);
 
