Index: uspace/lib/c/arch/ia64/include/fibril.h
===================================================================
--- uspace/lib/c/arch/ia64/include/fibril.h	(revision faba83975da4ba5bb605f70d4e02e065f9513e84)
+++ uspace/lib/c/arch/ia64/include/fibril.h	(revision 2902e1bb4254bbfdd521b4645e8979af80734627)
@@ -49,8 +49,6 @@
 #define PFM_MASK  (~0x3fffffffff)
 
-#define PSTHREAD_INITIAL_STACK_PAGES_NO  2
-
 /* Stack is divided into two equal parts (for memory stack and register stack). */
-#define PSTHREAD_INITIAL_STACK_DIVISION  2
+#define FIBRIL_INITIAL_STACK_DIVISION  2
 
 #define context_set(c, _pc, stack, size, tls) \
@@ -58,8 +56,8 @@
 		(c)->pc = (uint64_t) _pc; \
 		(c)->bsp = ((uint64_t) stack) + \
-		    size / PSTHREAD_INITIAL_STACK_DIVISION; \
+		    size / FIBRIL_INITIAL_STACK_DIVISION; \
 		(c)->ar_pfs &= PFM_MASK; \
 		(c)->sp = ((uint64_t) stack) + \
-		    ALIGN_UP((size / PSTHREAD_INITIAL_STACK_DIVISION), STACK_ALIGNMENT) - \
+		    ALIGN_UP((size / FIBRIL_INITIAL_STACK_DIVISION), STACK_ALIGNMENT) - \
 		    SP_DELTA; \
 		(c)->tp = (uint64_t) tls; \
Index: uspace/lib/c/arch/ia64/include/thread.h
===================================================================
--- uspace/lib/c/arch/ia64/include/thread.h	(revision faba83975da4ba5bb605f70d4e02e065f9513e84)
+++ uspace/lib/c/arch/ia64/include/thread.h	(revision 2902e1bb4254bbfdd521b4645e8979af80734627)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup libcia64	
+/** @addtogroup libcia64
  * @{
  */
@@ -36,6 +36,4 @@
 #define LIBC_ia64_THREAD_H_
 
-#define THREAD_INITIAL_STACK_PAGES_NO 2
-
 #endif
 
Index: uspace/lib/c/generic/thread.c
===================================================================
--- uspace/lib/c/generic/thread.c	(revision faba83975da4ba5bb605f70d4e02e065f9513e84)
+++ uspace/lib/c/generic/thread.c	(revision 2902e1bb4254bbfdd521b4645e8979af80734627)
@@ -41,8 +41,10 @@
 #include <str.h>
 #include <async.h>
+#include <errno.h>
+#include <as.h>
 #include "private/thread.h"
 
-#ifndef THREAD_INITIAL_STACK_PAGES_NO
-#define THREAD_INITIAL_STACK_PAGES_NO	2 
+#ifndef THREAD_INITIAL_STACK_PAGES
+	#define THREAD_INITIAL_STACK_PAGES  2
 #endif
 
@@ -65,8 +67,10 @@
 	
 	uarg->uspace_thread_function(uarg->uspace_thread_arg);
-	/* XXX: we cannot free the userspace stack while running on it
-		free(uarg->uspace_stack);
-		free(uarg);
-	*/
+	/*
+	 * XXX: we cannot free the userspace stack while running on it
+	 *
+	 * free(uarg->uspace_stack);
+	 * free(uarg);
+	 */
 	
 	/* If there is a manager, destroy it */
@@ -92,36 +96,36 @@
     thread_id_t *tid)
 {
-	char *stack;
-	uspace_arg_t *uarg;
-	int rc;
-
-	stack = (char *) malloc(getpagesize() * THREAD_INITIAL_STACK_PAGES_NO);
-	if (!stack)
-		return -1;
-		
-	uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t));
-	if (!uarg) {
-		free(stack);
-		return -1;
+	uspace_arg_t *uarg =
+	    (uspace_arg_t *) malloc(sizeof(uspace_arg_t));
+	if (!uarg)
+		return ENOMEM;
+	
+	size_t stack_size = getpagesize() * THREAD_INITIAL_STACK_PAGES;
+	void *stack = as_area_create(AS_AREA_ANY, stack_size,
+	    AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE);
+	if (stack == AS_MAP_FAILED) {
+		free(uarg);
+		return ENOMEM;
 	}
 	
 	uarg->uspace_entry = (void *) FADDR(__thread_entry);
-	uarg->uspace_stack = (void *) stack;
+	uarg->uspace_stack = stack;
+	uarg->uspace_stack_size = stack_size;
 	uarg->uspace_thread_function = function;
 	uarg->uspace_thread_arg = arg;
 	uarg->uspace_uarg = uarg;
 	
-	rc = __SYSCALL4(SYS_THREAD_CREATE, (sysarg_t) uarg, (sysarg_t) name,
-	    (sysarg_t) str_size(name), (sysarg_t) tid);
+	int rc = __SYSCALL4(SYS_THREAD_CREATE, (sysarg_t) uarg,
+	    (sysarg_t) name, (sysarg_t) str_size(name), (sysarg_t) tid);
 	
-	if (rc) {
+	if (rc != EOK) {
 		/*
 		 * Failed to create a new thread.
-		 * Free up the allocated structures.
+		 * Free up the allocated data.
 		 */
+		as_area_destroy(stack);
 		free(uarg);
-		free(stack);
 	}
-
+	
 	return rc;
 }
