Index: kernel/generic/include/ipc/ipc.h
===================================================================
--- kernel/generic/include/ipc/ipc.h	(revision 903bac0a01dd5f66eea02dd20f41ae57d9c41fb3)
+++ kernel/generic/include/ipc/ipc.h	(revision e2ab36f1e7abed06e401610969fa967f43774dd8)
@@ -40,4 +40,5 @@
 #include <synch/mutex.h>
 #include <synch/waitq.h>
+#include <typedefs.h>
 
 #define IPC_MAX_PHONES  32
@@ -98,5 +99,5 @@
 	sysarg_t args[IPC_CALL_LEN];
 	/** Task which made or forwarded the call with IPC_FF_ROUTE_FROM_ME. */
-	struct task *task;
+	task_id_t task_id;
 	/** Phone which made or last masqueraded this call. */
 	phone_t *phone;
Index: kernel/generic/src/ipc/event.c
===================================================================
--- kernel/generic/src/ipc/event.c	(revision 903bac0a01dd5f66eea02dd20f41ae57d9c41fb3)
+++ kernel/generic/src/ipc/event.c	(revision e2ab36f1e7abed06e401610969fa967f43774dd8)
@@ -161,4 +161,6 @@
 				IPC_SET_ARG5(call->data, a5);
 				
+				call->data.task_id = TASK ? TASK->taskid : 0;
+				
 				irq_spinlock_lock(&event->answerbox->irq_lock, true);
 				list_append(&call->link, &event->answerbox->irq_notifs);
Index: kernel/generic/src/ipc/ipc.c
===================================================================
--- kernel/generic/src/ipc/ipc.c	(revision 903bac0a01dd5f66eea02dd20f41ae57d9c41fb3)
+++ kernel/generic/src/ipc/ipc.c	(revision e2ab36f1e7abed06e401610969fa967f43774dd8)
@@ -294,5 +294,5 @@
 		atomic_inc(&phone->active_calls);
 		call->data.phone = phone;
-		call->data.task = TASK;
+		call->data.task_id = TASK->taskid;
 	}
 	
@@ -406,5 +406,5 @@
 			call->caller_phone = call->data.phone;
 		call->data.phone = newphone;
-		call->data.task = TASK;
+		call->data.task_id = TASK->taskid;
 	}
 	
Index: kernel/generic/src/ipc/sysipc.c
===================================================================
--- kernel/generic/src/ipc/sysipc.c	(revision 903bac0a01dd5f66eea02dd20f41ae57d9c41fb3)
+++ kernel/generic/src/ipc/sysipc.c	(revision e2ab36f1e7abed06e401610969fa967f43774dd8)
@@ -54,4 +54,5 @@
 #include <mm/as.h>
 #include <print.h>
+#include <macros.h>
 
 /**
@@ -375,6 +376,6 @@
 				    IPC_GET_ARG2(*olddata),
 				    IPC_GET_ARG3(*olddata),
-				    (sysarg_t) olddata->task,
-				    (sysarg_t) TASK);
+				    LOWER32(olddata->task_id),
+				    UPPER32(olddata->task_id));
 				IPC_SET_RETVAL(answer->data, rc);
 			}
Index: uspace/lib/c/generic/async.c
===================================================================
--- uspace/lib/c/generic/async.c	(revision 903bac0a01dd5f66eea02dd20f41ae57d9c41fb3)
+++ 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 903bac0a01dd5f66eea02dd20f41ae57d9c41fb3)
+++ 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 903bac0a01dd5f66eea02dd20f41ae57d9c41fb3)
+++ 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;
Index: uspace/srv/vfs/vfs.c
===================================================================
--- uspace/srv/vfs/vfs.c	(revision 903bac0a01dd5f66eea02dd20f41ae57d9c41fb3)
+++ uspace/srv/vfs/vfs.c	(revision e2ab36f1e7abed06e401610969fa967f43774dd8)
@@ -36,4 +36,5 @@
  */
 
+#include <vfs/vfs.h>
 #include <ipc/services.h>
 #include <abi/ipc/event.h>
@@ -47,5 +48,5 @@
 #include <as.h>
 #include <atomic.h>
-#include <vfs/vfs.h>
+#include <macros.h>
 #include "vfs.h"
 
@@ -143,6 +144,8 @@
 	case VFS_TASK_STATE_CHANGE:
 		if (IPC_GET_ARG1(*call) == VFS_PASS_HANDLE)
-			vfs_pass_handle(IPC_GET_ARG4(*call),
-			    IPC_GET_ARG5(*call), (int) IPC_GET_ARG2(*call));
+			vfs_pass_handle(
+			    (task_id_t) MERGE_LOUP32(IPC_GET_ARG4(*call),
+			    IPC_GET_ARG5(*call)), call->in_task_id,
+			    (int) IPC_GET_ARG2(*call));
 		break;
 	default:
Index: uspace/srv/vfs/vfs.h
===================================================================
--- uspace/srv/vfs/vfs.h	(revision 903bac0a01dd5f66eea02dd20f41ae57d9c41fb3)
+++ uspace/srv/vfs/vfs.h	(revision e2ab36f1e7abed06e401610969fa967f43774dd8)
@@ -41,4 +41,5 @@
 #include <bool.h>
 #include <ipc/vfs.h>
+#include <task.h>
 
 #ifndef dprintf
@@ -188,5 +189,5 @@
 extern void vfs_client_data_destroy(void *);
 
-extern void vfs_pass_handle(sysarg_t, sysarg_t, int);
+extern void vfs_pass_handle(task_id_t, task_id_t, int);
 extern int vfs_wait_handle_internal(void);
 
Index: uspace/srv/vfs/vfs_file.c
===================================================================
--- uspace/srv/vfs/vfs_file.c	(revision 903bac0a01dd5f66eea02dd20f41ae57d9c41fb3)
+++ uspace/srv/vfs/vfs_file.c	(revision e2ab36f1e7abed06e401610969fa967f43774dd8)
@@ -44,4 +44,5 @@
 #include <fibril_synch.h>
 #include <adt/list.h>
+#include <task.h>
 #include "vfs.h"
 
@@ -346,5 +347,5 @@
 }
 
-void vfs_pass_handle(sysarg_t donor_hash, sysarg_t acceptor_hash, int donor_fd)
+void vfs_pass_handle(task_id_t donor_id, task_id_t acceptor_id, int donor_fd)
 {
 	vfs_client_data_t *donor_data = NULL;
@@ -355,5 +356,5 @@
 	int acceptor_fd;
 
-	acceptor_data = async_get_client_data_by_hash(acceptor_hash);
+	acceptor_data = async_get_client_data_by_id(acceptor_id);
 	if (!acceptor_data)
 		return;
@@ -365,5 +366,5 @@
 	bh->handle = -1;
 
-	donor_data = async_get_client_data_by_hash(donor_hash);
+	donor_data = async_get_client_data_by_id(donor_id);
 	if (!donor_data)
 		goto out;
@@ -402,7 +403,7 @@
 
 	if (donor_data)
-		async_put_client_data_by_hash(donor_hash);
+		async_put_client_data_by_id(donor_id);
 	if (acceptor_data)
-		async_put_client_data_by_hash(acceptor_hash);
+		async_put_client_data_by_id(acceptor_id);
 	if (donor_file)
 		_vfs_file_put(donor_data, donor_file);
