Index: uspace/lib/c/generic/io/log.c
===================================================================
--- uspace/lib/c/generic/io/log.c	(revision f72ae3b5d74ccbf6f8f546b2bbadc5a85f4fb81b)
+++ uspace/lib/c/generic/io/log.c	(revision f039dbab175faa56569d0d741d9f6d9f2d76113d)
@@ -43,17 +43,5 @@
 #include <ns.h>
 
-typedef struct {
-	char *name;
-	sysarg_t top_log_id;
-	sysarg_t log_id;
-} log_info_t;
-
-static log_info_t default_log = {
-	.name = NULL,
-	.top_log_id = 0,
-	.log_id = 0
-};
-
-static sysarg_t default_top_log_id;
+static sysarg_t default_log_id;
 
 /** Log messages are printed under this name. */
@@ -85,5 +73,5 @@
 
 	ipc_call_t answer;
-	aid_t reg_msg = async_send_0(exchange, LOGGER_WRITER_CREATE_TOPLEVEL_LOG, &answer);
+	aid_t reg_msg = async_send_1(exchange, LOGGER_WRITER_CREATE_LOG, LOG_NO_PARENT, &answer);
 	int rc = async_data_write_start(exchange, prog_name, str_size(prog_name));
 	sysarg_t reg_msg_rc;
@@ -99,11 +87,10 @@
 		return reg_msg_rc;
 
-	default_top_log_id = IPC_GET_ARG1(answer);
-	default_log.top_log_id = default_top_log_id;
+	default_log_id = IPC_GET_ARG1(answer);
 
 	return EOK;
 }
 
-static int logger_message(async_sess_t *session, log_t ctx, log_level_t level, const char *message)
+static int logger_message(async_sess_t *session, log_t log, log_level_t level, const char *message)
 {
 	async_exch_t *exchange = async_exchange_begin(session);
@@ -111,8 +98,9 @@
 		return ENOMEM;
 	}
-	log_info_t *log_info = ctx != 0 ? (log_info_t *) ctx : &default_log;
-
-	aid_t reg_msg = async_send_3(exchange, LOGGER_WRITER_MESSAGE,
-	    log_info->top_log_id, log_info->log_id, level, NULL);
+	if (log == LOG_DEFAULT)
+		log = default_log_id;
+
+	aid_t reg_msg = async_send_2(exchange, LOGGER_WRITER_MESSAGE,
+	    log, level, NULL);
 	int rc = async_data_write_start(exchange, message, str_size(message));
 	sysarg_t reg_msg_rc;
@@ -206,31 +194,15 @@
 log_t log_create(const char *name, log_t parent)
 {
-	log_info_t *info = malloc(sizeof(log_info_t));
-	if (info == NULL)
-		return LOG_DEFAULT;
-	info->name = NULL;
-
-	if (parent == LOG_DEFAULT) {
-		info->name = str_dup(name);
-		if (info->name == NULL)
-			goto error;
-		info->top_log_id = default_top_log_id;
-	} else {
-		log_info_t *parent_info = (log_info_t *) parent;
-		int rc = asprintf(&info->name, "%s/%s",
-		    parent_info->name, name);
-		if (rc < 0)
-			goto error;
-		info->top_log_id = parent_info->top_log_id;
-	}
-
 	async_exch_t *exchange = async_exchange_begin(logger_session);
 	if (exchange == NULL)
-		goto error;
+		return parent;
+
+	if (parent == LOG_DEFAULT)
+		parent = default_log_id;
 
 	ipc_call_t answer;
-	aid_t reg_msg = async_send_1(exchange, LOGGER_WRITER_CREATE_SUB_LOG,
-	    info->top_log_id, &answer);
-	int rc = async_data_write_start(exchange, info->name, str_size(info->name));
+	aid_t reg_msg = async_send_1(exchange, LOGGER_WRITER_CREATE_LOG,
+	    parent, &answer);
+	int rc = async_data_write_start(exchange, name, str_size(name));
 	sysarg_t reg_msg_rc;
 	async_wait_for(reg_msg, &reg_msg_rc);
@@ -239,13 +211,7 @@
 
 	if ((rc != EOK) || (reg_msg_rc != EOK))
-		goto error;
-
-	info->log_id = IPC_GET_ARG1(answer);
-	return (sysarg_t) info;
-
-error:
-	free(info->name);
-	free(info);
-	return parent;
+		return parent;
+
+	return IPC_GET_ARG1(answer);
 }
 
Index: uspace/lib/c/generic/io/logctl.c
===================================================================
--- uspace/lib/c/generic/io/logctl.c	(revision f72ae3b5d74ccbf6f8f546b2bbadc5a85f4fb81b)
+++ uspace/lib/c/generic/io/logctl.c	(revision f039dbab175faa56569d0d741d9f6d9f2d76113d)
@@ -81,27 +81,5 @@
 }
 
-int logctl_set_top_log_level(const char *namespace, log_level_t new_level)
-{
-	async_exch_t *exchange = NULL;
-	int rc = start_logger_exchange(&exchange);
-	if (rc != EOK)
-		return rc;
-
-	aid_t reg_msg = async_send_1(exchange, LOGGER_CTL_SET_TOP_LOG_LEVEL,
-	    new_level, NULL);
-	rc = async_data_write_start(exchange, namespace, str_size(namespace));
-	sysarg_t reg_msg_rc;
-	async_wait_for(reg_msg, &reg_msg_rc);
-
-	async_exchange_end(exchange);
-
-	if (rc != EOK) {
-		return rc;
-	}
-
-	return (int) reg_msg_rc;
-}
-
-int logctl_set_log_level(const char *namespace, const char *context, log_level_t new_level)
+int logctl_set_log_level(const char *logname, log_level_t new_level)
 {
 	async_exch_t *exchange = NULL;
@@ -112,6 +90,5 @@
 	aid_t reg_msg = async_send_1(exchange, LOGGER_CTL_SET_LOG_LEVEL,
 	    new_level, NULL);
-	rc = async_data_write_start(exchange, namespace, str_size(namespace));
-	int rc2 = async_data_write_start(exchange, context, str_size(context));
+	rc = async_data_write_start(exchange, logname, str_size(logname));
 	sysarg_t reg_msg_rc;
 	async_wait_for(reg_msg, &reg_msg_rc);
@@ -122,7 +99,4 @@
 		return rc;
 
-	if (rc2 != EOK)
-		return rc2;
-
 	return (int) reg_msg_rc;
 }
Index: uspace/lib/c/include/io/log.h
===================================================================
--- uspace/lib/c/include/io/log.h	(revision f72ae3b5d74ccbf6f8f546b2bbadc5a85f4fb81b)
+++ uspace/lib/c/include/io/log.h	(revision f039dbab175faa56569d0d741d9f6d9f2d76113d)
@@ -53,5 +53,6 @@
 typedef sysarg_t log_t;
 #define PRIlogctx PRIxn
-#define LOG_DEFAULT 0
+#define LOG_DEFAULT ((log_t) -1)
+#define LOG_NO_PARENT ((log_t) 0)
 
 extern const char *log_level_str(log_level_t);
Index: uspace/lib/c/include/io/logctl.h
===================================================================
--- uspace/lib/c/include/io/logctl.h	(revision f72ae3b5d74ccbf6f8f546b2bbadc5a85f4fb81b)
+++ uspace/lib/c/include/io/logctl.h	(revision f039dbab175faa56569d0d741d9f6d9f2d76113d)
@@ -37,6 +37,5 @@
 
 extern int logctl_set_default_level(log_level_t);
-extern int logctl_set_top_log_level(const char *, log_level_t);
-extern int logctl_set_log_level(const char *, const char *, log_level_t);
+extern int logctl_set_log_level(const char *, log_level_t);
 
 #endif
Index: uspace/lib/c/include/ipc/logger.h
===================================================================
--- uspace/lib/c/include/ipc/logger.h	(revision f72ae3b5d74ccbf6f8f546b2bbadc5a85f4fb81b)
+++ uspace/lib/c/include/ipc/logger.h	(revision f039dbab175faa56569d0d741d9f6d9f2d76113d)
@@ -38,5 +38,4 @@
 typedef enum {
 	LOGGER_CTL_SET_DEFAULT_LEVEL = IPC_FIRST_USER_METHOD,
-	LOGGER_CTL_SET_TOP_LOG_LEVEL,
 	LOGGER_CTL_SET_LOG_LEVEL
 } logger_control_request_t;
@@ -44,6 +43,5 @@
 typedef enum {
 	/** Followed by STRING, returns ID to be used for CREATE_SUB_LOG */
-	LOGGER_WRITER_CREATE_TOPLEVEL_LOG = IPC_FIRST_USER_METHOD,
-	LOGGER_WRITER_CREATE_SUB_LOG,
+	LOGGER_WRITER_CREATE_LOG = IPC_FIRST_USER_METHOD,
 	LOGGER_WRITER_MESSAGE
 } logger_writer_request_t;
