Index: uspace/lib/c/generic/fibril.c
===================================================================
--- uspace/lib/c/generic/fibril.c	(revision 87a2f9b316ec093fffb699d0be0969f90507c629)
+++ uspace/lib/c/generic/fibril.c	(revision 4d11204a6f45850dfd155527e40dd9bf4c7b7bef)
@@ -57,5 +57,5 @@
 /**
  * This futex serializes access to ready_list,
- * serialized_list and manager_list.
+ * serialized_list, manager_list and fibril_list.
  */
 static futex_t fibril_futex = FUTEX_INITIALIZER;
@@ -126,12 +126,19 @@
 	
 	fibril->waits_for = NULL;
+
+	futex_lock(&fibril_futex);
 	list_append(&fibril->all_link, &fibril_list);
+	futex_unlock(&fibril_futex);
 	
 	return fibril;
 }
 
-void fibril_teardown(fibril_t *fibril)
-{
+void fibril_teardown(fibril_t *fibril, bool locked)
+{	
+	if (!locked)
+		futex_lock(&fibril_futex);
 	list_remove(&fibril->all_link);
+	if (!locked)
+		futex_unlock(&fibril_futex);
 	tls_free(fibril->tcb);
 	free(fibril);
@@ -208,5 +215,5 @@
 					as_area_destroy(stack);
 				}
-				fibril_teardown(srcf->clean_after_me);
+				fibril_teardown(srcf->clean_after_me, true);
 				srcf->clean_after_me = NULL;
 			}
@@ -294,5 +301,5 @@
 	    AS_AREA_LATE_RESERVE);
 	if (fibril->stack == (void *) -1) {
-		fibril_teardown(fibril);
+		fibril_teardown(fibril, false);
 		return 0;
 	}
@@ -321,5 +328,5 @@
 	
 	as_area_destroy(fibril->stack);
-	fibril_teardown(fibril);
+	fibril_teardown(fibril, false);
 }
 
Index: uspace/lib/c/generic/libc.c
===================================================================
--- uspace/lib/c/generic/libc.c	(revision 87a2f9b316ec093fffb699d0be0969f90507c629)
+++ uspace/lib/c/generic/libc.c	(revision 4d11204a6f45850dfd155527e40dd9bf4c7b7bef)
@@ -122,5 +122,5 @@
 		__stdio_done();
 		task_retval(status);
-		fibril_teardown(__tcb_get()->fibril_data);
+		fibril_teardown(__tcb_get()->fibril_data, false);
 	}
 	
Index: uspace/lib/c/generic/thread.c
===================================================================
--- uspace/lib/c/generic/thread.c	(revision 87a2f9b316ec093fffb699d0be0969f90507c629)
+++ uspace/lib/c/generic/thread.c	(revision 4d11204a6f45850dfd155527e40dd9bf4c7b7bef)
@@ -88,5 +88,5 @@
 #endif
 	
-	fibril_teardown(fibril);
+	fibril_teardown(fibril, false);
 	
 	thread_exit(0);
Index: uspace/lib/c/include/fibril.h
===================================================================
--- uspace/lib/c/include/fibril.h	(revision 87a2f9b316ec093fffb699d0be0969f90507c629)
+++ uspace/lib/c/include/fibril.h	(revision 4d11204a6f45850dfd155527e40dd9bf4c7b7bef)
@@ -94,5 +94,5 @@
 extern void fibril_destroy(fid_t fid);
 extern fibril_t *fibril_setup(void);
-extern void fibril_teardown(fibril_t *f);
+extern void fibril_teardown(fibril_t *f, bool locked);
 extern int fibril_switch(fibril_switch_type_t stype);
 extern void fibril_add_ready(fid_t fid);
