Index: uspace/srv/loader/main.c
===================================================================
--- uspace/srv/loader/main.c	(revision 0da4e41be5a0b7a29e97e1f87816593416d3db04)
+++ uspace/srv/loader/main.c	(revision 00413c5c7dfd26adbc32dc9cc467868315f9c621)
@@ -72,4 +72,7 @@
 static pcb_t pcb;
 
+/** Current working directory */
+static char *cwd = NULL;
+
 /** Number of arguments */
 static int argc = 0;
@@ -115,4 +118,32 @@
 }
 
+/** Receive a call setting the current working directory.
+ *
+ * @param rid
+ * @param request
+ */
+static void ldr_set_cwd(ipc_callid_t rid, ipc_call_t *request)
+{
+	ipc_callid_t callid;
+	size_t len;
+	
+	if (!async_data_write_receive(&callid, &len)) {
+		ipc_answer_0(callid, EINVAL);
+		ipc_answer_0(rid, EINVAL);
+		return;
+	}
+	
+	cwd = malloc(len + 1);
+	if (!cwd) {
+		ipc_answer_0(callid, ENOMEM);
+		ipc_answer_0(rid, ENOMEM);
+		return;
+	}
+	
+	async_data_write_finalize(callid, cwd, len);
+	cwd[len] = '\0';
+	
+	ipc_answer_0(rid, EOK);
+}
 
 /** Receive a call setting pathname of the program to execute.
@@ -313,4 +344,6 @@
 	elf_create_pcb(&prog_info, &pcb);
 	
+	pcb.cwd = cwd;
+	
 	pcb.argc = argc;
 	pcb.argv = argv;
@@ -406,4 +439,7 @@
 		case LOADER_GET_TASKID:
 			ldr_get_taskid(callid, &call);
+			continue;
+		case LOADER_SET_CWD:
+			ldr_set_cwd(callid, &call);
 			continue;
 		case LOADER_SET_PATHNAME:
