Index: uspace/app/logset/main.c
===================================================================
--- uspace/app/logset/main.c	(revision 32b26cf7e8613d62e2a282715e3dcb25d396c761)
+++ uspace/app/logset/main.c	(revision 80d8885598c0f6408d107f683d6e7f9bfefe2bf8)
@@ -55,4 +55,5 @@
 	fprintf(stderr, "  %s <default-logging-level>\n", progname);
 	fprintf(stderr, "  %s <namespace> <logging-level>\n", progname);
+	fprintf(stderr, "  %s <namespace> <context> <logging-level>\n", progname);
 }
 
@@ -78,4 +79,14 @@
 			return 2;
 		}
+	} else if (argc == 4) {
+		log_level_t new_level = parse_log_level_or_die(argv[3]);
+		const char *namespace = argv[1];
+		const char *context = argv[2];
+		int rc = logctl_set_context_level(namespace, context, new_level);
+		if (rc != EOK) {
+			fprintf(stderr, "Failed to change logging level: %s.\n",
+			    str_error(rc));
+			return 2;
+		}
 	} else {
 		usage(argv[0]);
Index: uspace/lib/c/generic/io/logctl.c
===================================================================
--- uspace/lib/c/generic/io/logctl.c	(revision 32b26cf7e8613d62e2a282715e3dcb25d396c761)
+++ uspace/lib/c/generic/io/logctl.c	(revision 80d8885598c0f6408d107f683d6e7f9bfefe2bf8)
@@ -105,4 +105,30 @@
 }
 
+int logctl_set_context_level(const char *namespace, const char *context, 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_CONTEXT_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));
+	sysarg_t reg_msg_rc;
+	async_wait_for(reg_msg, &reg_msg_rc);
+
+	async_exchange_end(exchange);
+
+	if (rc != EOK)
+		return rc;
+
+	if (rc2 != EOK)
+		return rc2;
+
+	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 32b26cf7e8613d62e2a282715e3dcb25d396c761)
+++ uspace/lib/c/include/io/logctl.h	(revision 80d8885598c0f6408d107f683d6e7f9bfefe2bf8)
@@ -38,4 +38,5 @@
 extern int logctl_set_default_level(log_level_t);
 extern int logctl_set_namespace_level(const char *, log_level_t);
+extern int logctl_set_context_level(const char *, 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 32b26cf7e8613d62e2a282715e3dcb25d396c761)
+++ uspace/lib/c/include/ipc/logger.h	(revision 80d8885598c0f6408d107f683d6e7f9bfefe2bf8)
@@ -39,5 +39,6 @@
 	LOGGER_CTL_GET_DEFAULT_LEVEL = IPC_FIRST_USER_METHOD,
 	LOGGER_CTL_SET_DEFAULT_LEVEL,
-	LOGGER_CTL_SET_NAMESPACE_LEVEL
+	LOGGER_CTL_SET_NAMESPACE_LEVEL,
+	LOGGER_CTL_SET_CONTEXT_LEVEL
 } logger_control_request_t;
 
Index: uspace/srv/logger/logger.h
===================================================================
--- uspace/srv/logger/logger.h	(revision 32b26cf7e8613d62e2a282715e3dcb25d396c761)
+++ uspace/srv/logger/logger.h	(revision 80d8885598c0f6408d107f683d6e7f9bfefe2bf8)
@@ -61,4 +61,5 @@
 
 int namespace_create_context(logging_namespace_t *, const char *);
+int namespace_change_context_level(logging_namespace_t *, const char *, log_level_t);
 
 log_level_t get_default_logging_level(void);
Index: uspace/srv/logger/main.c
===================================================================
--- uspace/srv/logger/main.c	(revision 32b26cf7e8613d62e2a282715e3dcb25d396c761)
+++ uspace/srv/logger/main.c	(revision 80d8885598c0f6408d107f683d6e7f9bfefe2bf8)
@@ -67,4 +67,31 @@
 }
 
+static int handle_context_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;
+
+	void *context_name;
+	rc = async_data_write_accept(&context_name, true, 0, 0, 0, NULL);
+	if (rc != EOK) {
+		namespace_writer_detach(namespace);
+		return rc;
+	}
+
+	rc = namespace_change_context_level(namespace, context_name, new_level);
+	free(context_name);
+	namespace_writer_detach(namespace);
+
+	return rc;
+}
+
 static void connection_handler_control(void)
 {
@@ -90,4 +117,8 @@
 		case LOGGER_CTL_SET_NAMESPACE_LEVEL:
 			rc = handle_namespace_level_change(IPC_GET_ARG1(call));
+			async_answer_0(callid, rc);
+			break;
+		case LOGGER_CTL_SET_CONTEXT_LEVEL:
+			rc = handle_context_level_change(IPC_GET_ARG1(call));
 			async_answer_0(callid, rc);
 			break;
Index: uspace/srv/logger/namespace.c
===================================================================
--- uspace/srv/logger/namespace.c	(revision 32b26cf7e8613d62e2a282715e3dcb25d396c761)
+++ uspace/srv/logger/namespace.c	(revision 80d8885598c0f6408d107f683d6e7f9bfefe2bf8)
@@ -71,4 +71,5 @@
 	if (context >= namespace->context_count) {
 		fibril_mutex_unlock(&namespace->guard);
+		fprintf(stderr, "Invalid context!\n");
 		return LVL_FATAL;
 	}
@@ -265,11 +266,31 @@
 }
 
+int namespace_change_context_level(logging_namespace_t *namespace, const char *context, log_level_t new_level)
+{
+	if (new_level >= LVL_LIMIT)
+		return ERANGE;
+
+	int rc;
+	fibril_mutex_lock(&namespace->guard);
+	for (size_t i = 0; i < namespace->context_count; i++) {
+		if (str_cmp(namespace->context[i].name, context) == 0) {
+			namespace->context[i].level = new_level;
+			rc = EOK;
+			fibril_condvar_broadcast(&namespace->level_changed_cv);
+			goto leave;
+		}
+	}
+	rc =  ENOENT;
+
+leave:
+	fibril_mutex_unlock(&namespace->guard);
+	return rc;
+}
+
 void namespace_wait_for_reader_change(logging_namespace_t *namespace, bool *has_reader_now)
 {
 	fibril_mutex_lock(&namespace->guard);
-	log_level_t previous_level = namespace->level;
-	while (previous_level == namespace->level) {
-		fibril_condvar_wait(&namespace->level_changed_cv, &namespace->guard);
-	}
+	// FIXME: properly watch for state change
+	fibril_condvar_wait(&namespace->level_changed_cv, &namespace->guard);
 	*has_reader_now = true;
 	fibril_mutex_unlock(&namespace->guard);
