Index: uspace/srv/audio/hound/hound.c
===================================================================
--- uspace/srv/audio/hound/hound.c	(revision 35ab943cbb0162f23c86c28b47e8d730a630befa)
+++ uspace/srv/audio/hound/hound.c	(revision 5ffcbaf8d1dd79e1d93f7124f3072eb6d9a496d4)
@@ -97,6 +97,8 @@
 	if (!ctx)
 		return EINVAL;
+	fibril_mutex_lock(&hound->list_guard);
 	list_append(&ctx->link, &hound->contexts);
 	//TODO register sinks/sources
+	fibril_mutex_unlock(&hound->list_guard);
 	return EOK;
 }
@@ -107,5 +109,7 @@
 	if (!ctx)
 		return EINVAL;
+	fibril_mutex_lock(&hound->list_guard);
 	list_remove(&ctx->link);
+	fibril_mutex_unlock(&hound->list_guard);
 	return EOK;
 }
@@ -115,12 +119,15 @@
 	assert(hound);
 
-	//TODO locking
-
+	fibril_mutex_lock(&hound->list_guard);
+	hound_ctx_t *res = NULL;
 	list_foreach(hound->contexts, it) {
 		hound_ctx_t *ctx = hound_ctx_from_link(it);
-		if (hound_ctx_get_id(ctx) == id)
-			return ctx;
-	}
-	return NULL;
+		if (hound_ctx_get_id(ctx) == id) {
+			res = ctx;
+			break;
+		}
+	}
+	fibril_mutex_unlock(&hound->list_guard);
+	return res;
 }
 
@@ -263,4 +270,85 @@
 }
 
+int hound_list_sources(hound_t *hound, const char ***list, size_t *size)
+{
+	assert(hound);
+	if (!list || !size)
+		return EINVAL;
+
+	fibril_mutex_lock(&hound->list_guard);
+	const size_t count = list_count(&hound->sources);
+	if (count == 0) {
+		*list = NULL;
+		*size = 0;
+		fibril_mutex_unlock(&hound->list_guard);
+		return EOK;
+	}
+	const char **names = calloc(count, sizeof(char *));
+	int ret = names ? EOK : ENOMEM;
+	for (size_t i = 0; i < count && ret == EOK; ++i) {
+		link_t *slink = list_nth(&hound->sources, i);
+		audio_source_t *source = audio_source_list_instance(slink);
+		names[i] = str_dup(source->name);
+		if (names[i])
+			ret = ENOMEM;
+	}
+	if (ret == EOK) {
+		*size = count;
+		*list = names;
+	} else {
+		for (size_t i = 0; i < count; ++i)
+			free(names[i]);
+		free(names);
+	}
+	fibril_mutex_unlock(&hound->list_guard);
+	return ret;
+}
+
+int hound_list_sinks(hound_t *hound, const char ***list, size_t *size)
+{
+	assert(hound);
+	log_verbose("Hound list sinks: %p %p %p", hound, list, size);
+	if (!list || !size)
+		return EINVAL;
+
+	fibril_mutex_lock(&hound->list_guard);
+	const size_t count = list_count(&hound->sinks);
+	if (count == 0) {
+		printf("ZERO SINKS!\n");
+		*list = NULL;
+		*size = 0;
+		fibril_mutex_unlock(&hound->list_guard);
+		return EOK;
+	}
+	const char **names = calloc(count, sizeof(char *));
+	int ret = names ? EOK : ENOMEM;
+	for (size_t i = 0; i < count && ret == EOK; ++i) {
+		link_t *slink = list_nth(&hound->sinks, i);
+		audio_sink_t *sink = audio_sink_list_instance(slink);
+		names[i] = str_dup(sink->name);
+		if (!names[i])
+			ret = ENOMEM;
+	}
+	if (ret == EOK) {
+		*size = count;
+		*list = names;
+		printf("%zu SINKS %s!\n", count, names[0]);
+	} else {
+		for (size_t i = 0; i < count; ++i)
+			free(names[i]);
+		free(names);
+	}
+	fibril_mutex_unlock(&hound->list_guard);
+	return ret;
+}
+
+int hound_list_connections(hound_t *hound, const char ***sources,
+    const char ***sinks, size_t *size)
+{
+	fibril_mutex_lock(&hound->list_guard);
+	fibril_mutex_unlock(&hound->list_guard);
+	return ENOTSUP;
+}
+
 int hound_connect(hound_t *hound, const char* source_name, const char* sink_name)
 {
Index: uspace/srv/audio/hound/hound.h
===================================================================
--- uspace/srv/audio/hound/hound.h	(revision 35ab943cbb0162f23c86c28b47e8d730a630befa)
+++ uspace/srv/audio/hound/hound.h	(revision 5ffcbaf8d1dd79e1d93f7124f3072eb6d9a496d4)
@@ -67,4 +67,8 @@
 int hound_add_source(hound_t *hound, audio_source_t *source);
 int hound_add_sink(hound_t *hound, audio_sink_t *sink);
+int hound_list_sources(hound_t *hound, const char ***list, size_t *size);
+int hound_list_sinks(hound_t *hound, const char ***list, size_t *size);
+int hound_list_connections(hound_t *hound, const char ***sources,
+    const char ***sinks, size_t *size);
 int hound_remove_source(hound_t *hound, audio_source_t *source);
 int hound_remove_sink(hound_t *hound, audio_sink_t *sink);
