Index: uspace/srv/logger/ctl.c
===================================================================
--- uspace/srv/logger/ctl.c	(revision bf9ac4e8bd9ebe9b2a11cce61848bb60ffa8d492)
+++ uspace/srv/logger/ctl.c	(revision 3cf862fd42e4f830d1960e02ad6e05ba615222ec)
@@ -51,5 +51,5 @@
 	}
 
-	logger_log_t *log = find_log_by_name(full_name);
+	logger_log_t *log = find_log_by_name_and_acquire(full_name);
 	free(full_name);
 	if (log == NULL)
@@ -57,4 +57,6 @@
 
 	log->logged_level = new_level;
+
+	log_release(log);
 
 	return EOK;
Index: uspace/srv/logger/initlvl.c
===================================================================
--- uspace/srv/logger/initlvl.c	(revision bf9ac4e8bd9ebe9b2a11cce61848bb60ffa8d492)
+++ uspace/srv/logger/initlvl.c	(revision 3cf862fd42e4f830d1960e02ad6e05ba615222ec)
@@ -61,9 +61,11 @@
 		return;
 
-	logger_log_t *log = find_or_create_log(key, 0);
+	logger_log_t *log = find_or_create_log_and_acquire(key, 0);
 	if (log == NULL)
 		return;
 
 	log->logged_level = level;
+
+	log_release(log);
 }
 
Index: uspace/srv/logger/logger.h
===================================================================
--- uspace/srv/logger/logger.h	(revision bf9ac4e8bd9ebe9b2a11cce61848bb60ffa8d492)
+++ uspace/srv/logger/logger.h	(revision 3cf862fd42e4f830d1960e02ad6e05ba615222ec)
@@ -57,4 +57,6 @@
 	link_t link;
 
+	fibril_mutex_t guard;
+
 	char *name;
 	char *full_name;
@@ -64,8 +66,9 @@
 };
 
-logger_log_t *find_log_by_name(const char *name);
-logger_log_t *find_or_create_log(const char *name, sysarg_t parent);
-logger_log_t *find_log_by_id(sysarg_t);
+logger_log_t *find_log_by_name_and_acquire(const char *name);
+logger_log_t *find_or_create_log_and_acquire(const char *name, sysarg_t parent);
+logger_log_t *find_log_by_id_and_acquire(sysarg_t);
 bool shall_log_message(logger_log_t *, log_level_t);
+void log_release(logger_log_t *);
 
 log_level_t get_default_logging_level(void);
Index: uspace/srv/logger/logs.c
===================================================================
--- uspace/srv/logger/logs.c	(revision bf9ac4e8bd9ebe9b2a11cce61848bb60ffa8d492)
+++ uspace/srv/logger/logs.c	(revision 3cf862fd42e4f830d1960e02ad6e05ba615222ec)
@@ -62,5 +62,5 @@
 }
 
-logger_log_t *find_or_create_log(const char *name, sysarg_t parent_id)
+logger_log_t *find_or_create_log_and_acquire(const char *name, sysarg_t parent_id)
 {
 	logger_log_t *result = NULL;
@@ -88,9 +88,11 @@
 	}
 	result->parent = parent;
+	fibril_mutex_initialize(&result->guard);
 
 	link_initialize(&result->link);
 
+	fibril_mutex_lock(&result->guard);
+
 	list_append(&result->link, &log_list);
-
 leave:
 	fibril_mutex_unlock(&log_list_guard);
@@ -99,5 +101,5 @@
 }
 
-logger_log_t *find_log_by_name(const char *name)
+logger_log_t *find_log_by_name_and_acquire(const char *name)
 {
 	logger_log_t *result = NULL;
@@ -107,4 +109,5 @@
 		logger_log_t *log = list_get_instance(it, logger_log_t, link);
 		if (str_cmp(log->full_name, name) == 0) {
+			fibril_mutex_lock(&log->guard);
 			result = log;
 			break;
@@ -116,5 +119,5 @@
 }
 
-logger_log_t *find_log_by_id(sysarg_t id)
+logger_log_t *find_log_by_id_and_acquire(sysarg_t id)
 {
 	logger_log_t *result = NULL;
@@ -124,4 +127,5 @@
 		logger_log_t *log = list_get_instance(it, logger_log_t, link);
 		if ((sysarg_t) log == id) {
+			fibril_mutex_lock(&log->guard);
 			result = log;
 			break;
@@ -147,5 +151,14 @@
 bool shall_log_message(logger_log_t *log, log_level_t level)
 {
-	return level <= get_actual_log_level(log);
+	fibril_mutex_lock(&log_list_guard);
+	bool result = level <= get_actual_log_level(log);
+	fibril_mutex_unlock(&log_list_guard);
+	return result;
+}
+
+void log_release(logger_log_t *log)
+{
+	assert(fibril_mutex_is_locked(&log->guard));
+	fibril_mutex_unlock(&log->guard);
 }
 
Index: uspace/srv/logger/writer.c
===================================================================
--- uspace/srv/logger/writer.c	(revision bf9ac4e8bd9ebe9b2a11cce61848bb60ffa8d492)
+++ uspace/srv/logger/writer.c	(revision 3cf862fd42e4f830d1960e02ad6e05ba615222ec)
@@ -56,5 +56,5 @@
 		return NULL;
 
-	logger_log_t *log = find_or_create_log(name, parent);
+	logger_log_t *log = find_or_create_log_and_acquire(name, parent);
 
 	free(name);
@@ -65,16 +65,16 @@
 static int handle_receive_message(sysarg_t log_id, sysarg_t level)
 {
-	logger_log_t *log = find_log_by_id(log_id);
+	logger_log_t *log = find_log_by_id_and_acquire(log_id);
 	if (log == NULL)
 		return ENOENT;
 
-	void *message;
+	void *message = NULL;
 	int rc = async_data_write_accept(&message, true, 1, 0, 0, NULL);
 	if (rc != EOK)
-		return rc;
+		goto leave;
 
 	if (!shall_log_message(log, level)) {
-		free(message);
-		return EOK;
+		rc = EOK;
+		goto leave;
 	}
 
@@ -83,7 +83,11 @@
 	    (const char *) message);
 
+	rc = EOK;
+
+leave:
+	log_release(log);
 	free(message);
 
-	return EOK;
+	return rc;
 }
 
@@ -109,4 +113,5 @@
 				break;
 			}
+			log_release(log);
 			async_answer_1(callid, EOK, (sysarg_t) log);
 			break;
