Index: uspace/app/logset/main.c
===================================================================
--- uspace/app/logset/main.c	(revision eab3d0480f33fbfac5b74bb7b810c256b8cb688d)
+++ uspace/app/logset/main.c	(revision 494f417f0c783cba28829b62278c85e90f9410a7)
@@ -38,26 +38,47 @@
 #include <io/logctl.h>
 
+static log_level_t parse_log_level_or_die(const char *log_level)
+{
+	log_level_t result;
+	int rc = log_level_from_str(log_level, &result);
+	if (rc != EOK) {
+		fprintf(stderr, "Unrecognised log level '%s': %s.\n",
+		    log_level, str_error(rc));
+		exit(2);
+	}
+	return result;
+}
+
+static void usage(const char *progname)
+{
+	fprintf(stderr, "Usage:\n");
+	fprintf(stderr, "  %s <default-logging-level>\n", progname);
+	fprintf(stderr, "  %s <namespace> <logging-level>\n", progname);
+}
+
 int main(int argc, char *argv[])
 {
-	/* The only action is to set default logging level. */
+	if (argc == 2) {
+		log_level_t new_default_level = parse_log_level_or_die(argv[1]);
+		int rc = logctl_set_default_level(new_default_level);
 
-	if (argc < 2) {
-		fprintf(stderr, "Usage: %s <default-logging-level>\n", argv[0]);
+		if (rc != EOK) {
+			fprintf(stderr, "Failed to change default logging level: %s.\n",
+			    str_error(rc));
+			return 2;
+		}
+	} else if (argc == 3) {
+		log_level_t new_level = parse_log_level_or_die(argv[2]);
+		const char *namespace = argv[1];
+		int rc = logctl_set_namespace_level(namespace, new_level);
+
+		if (rc != EOK) {
+			fprintf(stderr, "Failed to change logging level: %s.\n",
+			    str_error(rc));
+			return 2;
+		}
+	} else {
+		usage(argv[0]);
 		return 1;
-	}
-
-	log_level_t new_default_level;
-	int rc = log_level_from_str(argv[1], &new_default_level);
-	if (rc != EOK) {
-		fprintf(stderr, "Unrecognised log level '%s': %s.\n",
-		    argv[1], str_error(rc));
-	}
-
-	rc = logctl_set_default_level(new_default_level);
-
-	if (rc != EOK) {
-		fprintf(stderr, "Failed to change default logging level: %s.\n",
-		    str_error(rc));
-		return 2;
 	}
 
Index: uspace/lib/c/generic/io/logctl.c
===================================================================
--- uspace/lib/c/generic/io/logctl.c	(revision eab3d0480f33fbfac5b74bb7b810c256b8cb688d)
+++ uspace/lib/c/generic/io/logctl.c	(revision 494f417f0c783cba28829b62278c85e90f9410a7)
@@ -77,4 +77,29 @@
 }
 
+int logctl_set_namespace_level(const char *namespace, log_level_t new_level)
+{
+	int rc = connect_to_logger();
+	if (rc != EOK)
+		return rc;
+
+	async_exch_t *exchange = async_exchange_begin(logger_session);
+	if (exchange == NULL)
+		return ENOMEM;
+
+	aid_t reg_msg = async_send_1(exchange, LOGGER_CTL_SET_NAMESPACE_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_get_boot_level(log_level_t *level)
 {
Index: uspace/lib/c/include/io/logctl.h
===================================================================
--- uspace/lib/c/include/io/logctl.h	(revision eab3d0480f33fbfac5b74bb7b810c256b8cb688d)
+++ uspace/lib/c/include/io/logctl.h	(revision 494f417f0c783cba28829b62278c85e90f9410a7)
@@ -37,4 +37,5 @@
 
 extern int logctl_set_default_level(log_level_t);
+extern int logctl_set_namespace_level(const char *, log_level_t);
 extern int logctl_get_boot_level(log_level_t *);
 
Index: uspace/lib/c/include/ipc/logger.h
===================================================================
--- uspace/lib/c/include/ipc/logger.h	(revision eab3d0480f33fbfac5b74bb7b810c256b8cb688d)
+++ uspace/lib/c/include/ipc/logger.h	(revision 494f417f0c783cba28829b62278c85e90f9410a7)
@@ -38,5 +38,6 @@
 typedef enum {
 	LOGGER_CTL_GET_DEFAULT_LEVEL = IPC_FIRST_USER_METHOD,
-	LOGGER_CTL_SET_DEFAULT_LEVEL
+	LOGGER_CTL_SET_DEFAULT_LEVEL,
+	LOGGER_CTL_SET_NAMESPACE_LEVEL
 } logger_control_request_t;
 
Index: uspace/srv/logger/logger.h
===================================================================
--- uspace/srv/logger/logger.h	(revision eab3d0480f33fbfac5b74bb7b810c256b8cb688d)
+++ uspace/srv/logger/logger.h	(revision 494f417f0c783cba28829b62278c85e90f9410a7)
@@ -54,4 +54,6 @@
 void namespace_writer_detach(logging_namespace_t *);
 
+int namespace_change_level(logging_namespace_t *, log_level_t);
+
 void namespace_wait_for_reader_change(logging_namespace_t *, bool *);
 bool namespace_has_reader(logging_namespace_t *, log_level_t);
Index: uspace/srv/logger/main.c
===================================================================
--- uspace/srv/logger/main.c	(revision eab3d0480f33fbfac5b74bb7b810c256b8cb688d)
+++ uspace/srv/logger/main.c	(revision 494f417f0c783cba28829b62278c85e90f9410a7)
@@ -48,4 +48,23 @@
 #include "logger.h"
 
+static int handle_namespace_level_change(sysarg_t new_level)
+{
+	void *namespace_name;
+	int rc = async_data_write_accept(&namespace_name, true, 0, 0, 0, NULL);
+	if (rc != EOK) {
+		return rc;
+	}
+
+	logging_namespace_t *namespace = namespace_writer_attach((const char *) namespace_name);
+	free(namespace_name);
+	if (namespace == NULL)
+		return ENOENT;
+
+	rc = namespace_change_level(namespace, (log_level_t) new_level);
+	namespace_writer_detach(namespace);
+
+	return rc;
+}
+
 static void connection_handler_control(void)
 {
@@ -67,4 +86,8 @@
 		case LOGGER_CTL_SET_DEFAULT_LEVEL:
 			rc = set_default_logging_level(IPC_GET_ARG1(call));
+			async_answer_0(callid, rc);
+			break;
+		case LOGGER_CTL_SET_NAMESPACE_LEVEL:
+			rc = handle_namespace_level_change(IPC_GET_ARG1(call));
 			async_answer_0(callid, rc);
 			break;
Index: uspace/srv/logger/namespace.c
===================================================================
--- uspace/srv/logger/namespace.c	(revision eab3d0480f33fbfac5b74bb7b810c256b8cb688d)
+++ uspace/srv/logger/namespace.c	(revision 494f417f0c783cba28829b62278c85e90f9410a7)
@@ -34,4 +34,5 @@
 #include <str.h>
 #include <stdio.h>
+#include <errno.h>
 #include "logger.h"
 
@@ -198,4 +199,18 @@
 }
 
+int namespace_change_level(logging_namespace_t *namespace, log_level_t level)
+{
+	if (level >= LVL_LIMIT)
+		return ERANGE;
+
+	fibril_mutex_lock(&namespace->guard);
+	namespace->level = level;
+	fibril_condvar_broadcast(&namespace->level_changed_cv);
+	fibril_mutex_unlock(&namespace->guard);
+
+	return EOK;
+}
+
+
 bool namespace_has_reader(logging_namespace_t *namespace, log_level_t level)
 {
