Index: kernel/arch/abs32le/src/proc/thread.c
===================================================================
--- kernel/arch/abs32le/src/proc/thread.c	(revision 90efa3b9570ec6f523c45b1a178410890295d3ec)
+++ kernel/arch/abs32le/src/proc/thread.c	(revision deacd722f7dca626637926215ebe69ffd2fd67f5)
@@ -35,6 +35,7 @@
 #include <proc/thread.h>
 
-void thread_create_arch(thread_t *t)
+errno_t thread_create_arch(thread_t *t, thread_flags_t flags)
 {
+	return EOK;
 }
 
Index: kernel/arch/amd64/src/proc/thread.c
===================================================================
--- kernel/arch/amd64/src/proc/thread.c	(revision 90efa3b9570ec6f523c45b1a178410890295d3ec)
+++ kernel/arch/amd64/src/proc/thread.c	(revision deacd722f7dca626637926215ebe69ffd2fd67f5)
@@ -42,5 +42,5 @@
  *
  */
-void thread_create_arch(thread_t *thread)
+errno_t thread_create_arch(thread_t *thread, thread_flags_t flags)
 {
 	/*
@@ -49,4 +49,5 @@
 	thread->arch.kstack_rsp =
 	    (uintptr_t) &thread->kstack[PAGE_SIZE - sizeof(istate_t)];
+	return EOK;
 }
 
Index: kernel/arch/arm32/include/arch/proc/thread.h
===================================================================
--- kernel/arch/arm32/include/arch/proc/thread.h	(revision 90efa3b9570ec6f523c45b1a178410890295d3ec)
+++ kernel/arch/arm32/include/arch/proc/thread.h	(revision deacd722f7dca626637926215ebe69ffd2fd67f5)
@@ -42,5 +42,5 @@
 #define thr_constructor_arch(t)
 #define thr_destructor_arch(t)
-#define thread_create_arch(t)
+#define thread_create_arch(t, flags) (EOK)
 
 #endif
Index: kernel/arch/ia32/src/proc/thread.c
===================================================================
--- kernel/arch/ia32/src/proc/thread.c	(revision 90efa3b9570ec6f523c45b1a178410890295d3ec)
+++ kernel/arch/ia32/src/proc/thread.c	(revision deacd722f7dca626637926215ebe69ffd2fd67f5)
@@ -39,6 +39,7 @@
  * @param t Thread to be initialized.
  */
-void thread_create_arch(thread_t *t)
+errno_t thread_create_arch(thread_t *t, thread_flags_t flags)
 {
+	return EOK;
 }
 
Index: kernel/arch/ia64/include/arch/proc/thread.h
===================================================================
--- kernel/arch/ia64/include/arch/proc/thread.h	(revision 90efa3b9570ec6f523c45b1a178410890295d3ec)
+++ kernel/arch/ia64/include/arch/proc/thread.h	(revision deacd722f7dca626637926215ebe69ffd2fd67f5)
@@ -41,5 +41,5 @@
 #define thr_constructor_arch(t)
 #define thr_destructor_arch(t)
-#define thread_create_arch(t)
+#define thread_create_arch(t, flags) (EOK)
 
 #endif
Index: kernel/arch/mips32/include/arch/proc/thread.h
===================================================================
--- kernel/arch/mips32/include/arch/proc/thread.h	(revision 90efa3b9570ec6f523c45b1a178410890295d3ec)
+++ kernel/arch/mips32/include/arch/proc/thread.h	(revision deacd722f7dca626637926215ebe69ffd2fd67f5)
@@ -41,5 +41,5 @@
 #define thr_constructor_arch(t)
 #define thr_destructor_arch(t)
-#define thread_create_arch(t)
+#define thread_create_arch(t, flags) (EOK)
 
 #endif
Index: kernel/arch/ppc32/include/arch/proc/thread.h
===================================================================
--- kernel/arch/ppc32/include/arch/proc/thread.h	(revision 90efa3b9570ec6f523c45b1a178410890295d3ec)
+++ kernel/arch/ppc32/include/arch/proc/thread.h	(revision deacd722f7dca626637926215ebe69ffd2fd67f5)
@@ -41,5 +41,5 @@
 #define thr_constructor_arch(t)
 #define thr_destructor_arch(t)
-#define thread_create_arch(t)
+#define thread_create_arch(t, flags) (EOK)
 
 #endif
Index: kernel/arch/riscv64/src/proc/thread.c
===================================================================
--- kernel/arch/riscv64/src/proc/thread.c	(revision 90efa3b9570ec6f523c45b1a178410890295d3ec)
+++ kernel/arch/riscv64/src/proc/thread.c	(revision deacd722f7dca626637926215ebe69ffd2fd67f5)
@@ -35,6 +35,7 @@
 #include <proc/thread.h>
 
-void thread_create_arch(thread_t *t)
+errno_t thread_create_arch(thread_t *t, thread_flags_t flags)
 {
+	return EOK;
 }
 
Index: kernel/arch/sparc64/src/proc/thread.c
===================================================================
--- kernel/arch/sparc64/src/proc/thread.c	(revision 90efa3b9570ec6f523c45b1a178410890295d3ec)
+++ kernel/arch/sparc64/src/proc/thread.c	(revision deacd722f7dca626637926215ebe69ffd2fd67f5)
@@ -62,12 +62,14 @@
 }
 
-void thread_create_arch(thread_t *t)
+errno_t thread_create_arch(thread_t *t, thread_flags_t flags)
 {
-	if ((t->uspace) && (!t->arch.uspace_window_buffer)) {
+	if ((flags & THREAD_FLAG_USPACE) && (!t->arch.uspace_window_buffer)) {
 		/*
 		 * The thread needs userspace window buffer and the object
 		 * returned from the slab allocator doesn't have any.
 		 */
-		t->arch.uspace_window_buffer = slab_alloc(uwb_cache, 0);
+		t->arch.uspace_window_buffer = slab_alloc(uwb_cache, FRAME_ATOMIC);
+		if (!t->arch.uspace_window_buffer)
+			return ENOMEM;
 	} else {
 		uintptr_t uw_buf = (uintptr_t) t->arch.uspace_window_buffer;
@@ -80,4 +82,5 @@
 		    UWB_ALIGNMENT);
 	}
+	return EOK;
 }
 
Index: kernel/generic/include/proc/thread.h
===================================================================
--- kernel/generic/include/proc/thread.h	(revision 90efa3b9570ec6f523c45b1a178410890295d3ec)
+++ kernel/generic/include/proc/thread.h	(revision deacd722f7dca626637926215ebe69ffd2fd67f5)
@@ -225,5 +225,5 @@
 
 #ifndef thread_create_arch
-extern void thread_create_arch(thread_t *);
+extern errno_t thread_create_arch(thread_t *, thread_flags_t);
 #endif
 
Index: kernel/generic/src/proc/thread.c
===================================================================
--- kernel/generic/src/proc/thread.c	(revision 90efa3b9570ec6f523c45b1a178410890295d3ec)
+++ kernel/generic/src/proc/thread.c	(revision deacd722f7dca626637926215ebe69ffd2fd67f5)
@@ -346,4 +346,9 @@
 		return NULL;
 
+	if (thread_create_arch(thread, flags) != EOK) {
+		slab_free(thread_cache, thread);
+		return NULL;
+	}
+
 	/* Not needed, but good for debugging */
 	memsetb(thread->kstack, STACK_SIZE, 0);
@@ -407,7 +412,4 @@
 	udebug_thread_initialize(&thread->udebug);
 #endif
-
-	/* Might depend on previous initialization */
-	thread_create_arch(thread);
 
 	if ((flags & THREAD_FLAG_NOATTACH) != THREAD_FLAG_NOATTACH)
