Index: uspace/lib/c/generic/async.c
===================================================================
--- uspace/lib/c/generic/async.c	(revision 42a619b240617c4f0e4dd04ddf2366f3c5a0709a)
+++ uspace/lib/c/generic/async.c	(revision e2ab36f1e7abed06e401610969fa967f43774dd8)
@@ -112,4 +112,5 @@
 #include <mem.h>
 #include <stdlib.h>
+#include <macros.h>
 #include "private/async.h"
 
@@ -138,5 +139,5 @@
 	link_t link;
 	
-	sysarg_t in_task_hash;
+	sysarg_t in_task_id;
 	atomic_t refcnt;
 	void *data;
@@ -150,6 +151,6 @@
 	link_t link;
 	
-	/** Incoming client task hash. */
-	sysarg_t in_task_hash;
+	/** Incoming client task ID. */
+	task_id_t in_task_id;
 	
 	/** Incoming phone hash. */
@@ -283,8 +284,10 @@
 {
 	assert(key);
+	assert(keys == 2);
 	assert(item);
 	
 	client_t *client = hash_table_get_instance(item, client_t, link);
-	return (key[0] == client->in_task_hash);
+	return (key[0] == LOWER32(client->in_task_id) &&
+	    (key[1] == UPPER32(client->in_task_id)));
 }
 
@@ -574,11 +577,14 @@
 }
 
-static client_t *async_client_get(sysarg_t client_hash, bool create)
-{
-	unsigned long key = client_hash;
+static client_t *async_client_get(task_id_t client_id, bool create)
+{
+	unsigned long key[2] = {
+		LOWER32(client_id),
+		UPPER32(client_id),
+	};
 	client_t *client = NULL;
 
 	futex_down(&async_futex);
-	link_t *lnk = hash_table_find(&client_hash_table, &key);
+	link_t *lnk = hash_table_find(&client_hash_table, key);
 	if (lnk) {
 		client = hash_table_get_instance(lnk, client_t, link);
@@ -587,9 +593,9 @@
 		client = malloc(sizeof(client_t));
 		if (client) {
-			client->in_task_hash = client_hash;
+			client->in_task_id = client_id;
 			client->data = async_client_data_create();
 		
 			atomic_set(&client->refcnt, 1);
-			hash_table_insert(&client_hash_table, &key, &client->link);
+			hash_table_insert(&client_hash_table, key, &client->link);
 		}
 	}
@@ -602,10 +608,13 @@
 {
 	bool destroy;
-	unsigned long key = client->in_task_hash;
+	unsigned long key[2] = {
+		LOWER32(client->in_task_id),
+		UPPER32(client->in_task_id)
+	};
 	
 	futex_down(&async_futex);
 	
 	if (atomic_predec(&client->refcnt) == 0) {
-		hash_table_remove(&client_hash_table, &key, 1);
+		hash_table_remove(&client_hash_table, key, 2);
 		destroy = true;
 	} else
@@ -628,7 +637,7 @@
 }
 
-void *async_get_client_data_by_hash(sysarg_t client_hash)
-{
-	client_t *client = async_client_get(client_hash, false);
+void *async_get_client_data_by_id(task_id_t client_id)
+{
+	client_t *client = async_client_get(client_id, false);
 	if (!client)
 		return NULL;
@@ -641,7 +650,7 @@
 }
 
-void async_put_client_data_by_hash(sysarg_t client_hash)
-{
-	client_t *client = async_client_get(client_hash, false);
+void async_put_client_data_by_id(task_id_t client_id)
+{
+	client_t *client = async_client_get(client_id, false);
 
 	assert(client);
@@ -680,5 +689,5 @@
 	 */
 
-	client_t *client = async_client_get(fibril_connection->in_task_hash, true);
+	client_t *client = async_client_get(fibril_connection->in_task_id, true);
 	if (!client) {
 		ipc_answer_0(fibril_connection->callid, ENOMEM);
@@ -737,5 +746,5 @@
  * particular fibrils.
  *
- * @param in_task_hash  Identification of the incoming connection.
+ * @param in_task_id    Identification of the incoming connection.
  * @param in_phone_hash Identification of the incoming connection.
  * @param callid        Hash of the opening IPC_M_CONNECT_ME_TO call.
@@ -751,5 +760,5 @@
  *
  */
-fid_t async_new_connection(sysarg_t in_task_hash, sysarg_t in_phone_hash,
+fid_t async_new_connection(task_id_t in_task_id, sysarg_t in_phone_hash,
     ipc_callid_t callid, ipc_call_t *call,
     async_client_conn_t cfibril, void *carg)
@@ -763,5 +772,5 @@
 	}
 	
-	conn->in_task_hash = in_task_hash;
+	conn->in_task_id = in_task_id;
 	conn->in_phone_hash = in_phone_hash;
 	list_initialize(&conn->msg_queue);
@@ -822,5 +831,5 @@
 	case IPC_M_CONNECT_ME_TO:
 		/* Open new connection with fibril, etc. */
-		async_new_connection(call->in_task_hash, IPC_GET_ARG5(*call),
+		async_new_connection(call->in_task_id, IPC_GET_ARG5(*call),
 		    callid, call, client_connection, NULL);
 		return;
@@ -970,5 +979,5 @@
 {
 	if (!hash_table_create(&client_hash_table, CLIENT_HASH_TABLE_BUCKETS,
-	    1, &client_hash_table_ops))
+	    2, &client_hash_table_ops))
 		abort();
 	
Index: uspace/lib/c/include/async.h
===================================================================
--- uspace/lib/c/include/async.h	(revision 42a619b240617c4f0e4dd04ddf2366f3c5a0709a)
+++ uspace/lib/c/include/async.h	(revision e2ab36f1e7abed06e401610969fa967f43774dd8)
@@ -176,5 +176,5 @@
 extern int async_wait_timeout(aid_t, sysarg_t *, suseconds_t);
 
-extern fid_t async_new_connection(sysarg_t, sysarg_t, ipc_callid_t,
+extern fid_t async_new_connection(task_id_t, sysarg_t, ipc_callid_t,
     ipc_call_t *, async_client_conn_t, void *);
 
@@ -186,6 +186,6 @@
 extern void async_set_client_data_destructor(async_client_data_dtor_t);
 extern void *async_get_client_data(void);
-extern void *async_get_client_data_by_hash(sysarg_t);
-extern void async_put_client_data_by_hash(sysarg_t);
+extern void *async_get_client_data_by_id(task_id_t);
+extern void async_put_client_data_by_id(task_id_t);
 
 extern void async_set_client_connection(async_client_conn_t);
Index: uspace/lib/c/include/ipc/common.h
===================================================================
--- uspace/lib/c/include/ipc/common.h	(revision 42a619b240617c4f0e4dd04ddf2366f3c5a0709a)
+++ uspace/lib/c/include/ipc/common.h	(revision e2ab36f1e7abed06e401610969fa967f43774dd8)
@@ -39,4 +39,5 @@
 #include <abi/ipc/ipc.h>
 #include <atomic.h>
+#include <task.h>
 
 #define IPC_FLAG_BLOCKING  0x01
@@ -44,5 +45,5 @@
 typedef struct {
 	sysarg_t args[IPC_CALL_LEN];
-	sysarg_t in_task_hash;
+	task_id_t in_task_id;
 	sysarg_t in_phone_hash;
 } ipc_call_t;
