Index: uspace/srv/audio/hound/hound_ctx.c
===================================================================
--- uspace/srv/audio/hound/hound_ctx.c	(revision 5c98bb285ea6f97fbb497faf9555138f22a7ff04)
+++ uspace/srv/audio/hound/hound_ctx.c	(revision 599034ee9b9a87b7d6575479407023e2e8a2496d)
@@ -56,4 +56,5 @@
 		link_initialize(&ctx->link);
 		list_initialize(&ctx->streams);
+		fibril_mutex_initialize(&ctx->guard);
 		ctx->sink = NULL;
 		ctx->source = malloc(sizeof(audio_source_t));
@@ -117,4 +118,22 @@
 }
 
+static inline void stream_append(hound_ctx_t *ctx, hound_ctx_stream_t *stream)
+{
+	assert(ctx);
+	assert(stream);
+	fibril_mutex_lock(&ctx->guard);
+	list_append(&stream->link, &ctx->streams);
+	fibril_mutex_unlock(&ctx->guard);
+}
+
+static inline void stream_remove(hound_ctx_t *ctx, hound_ctx_stream_t *stream)
+{
+	assert(ctx);
+	assert(stream);
+	fibril_mutex_lock(&ctx->guard);
+	list_remove(&stream->link);
+	fibril_mutex_unlock(&ctx->guard);
+}
+
 hound_ctx_stream_t *hound_ctx_create_stream(hound_ctx_t *ctx, int flags,
 	pcm_format_t format, size_t buffer_size)
@@ -129,5 +148,5 @@
 		stream->format = format;
 		stream->allowed_size = buffer_size;
-		list_append(&stream->link, &ctx->streams);
+		stream_append(ctx, stream);
 		log_verbose("CTX: %p added stream; flags:%#x ch: %u r:%u f:%s",
 		    ctx, flags, format.channels, format.sampling_rate,
@@ -140,6 +159,5 @@
 {
 	if (stream) {
-		//TODO consider DRAIN FLAG
-		list_remove(&stream->link);
+		stream_remove(stream->ctx, stream);
 		if (audio_pipe_bytes(&stream->fifo))
 			log_warning("Destroying stream with non empty buffer");
@@ -177,5 +195,5 @@
 }
 
-int hound_ctx_stream_add_self(hound_ctx_stream_t *stream, void *data,
+ssize_t hound_ctx_stream_add_self(hound_ctx_stream_t *stream, void *data,
     size_t size, const pcm_format_t *f)
 {
@@ -185,5 +203,5 @@
 	if (copied_size != (ssize_t)size)
 		log_warning("Not enough data in stream buffer");
-	return copied_size > 0 ? EOK : copied_size;
+	return copied_size;
 }
 
@@ -195,11 +213,4 @@
 		async_usleep(10000);
 }
-
-int hound_ctx_stream_add(hound_ctx_stream_t *stream, void *buffer, size_t size,
-    pcm_format_t format)
-{
-	return ENOTSUP;
-}
-
 
 int update_data(audio_source_t *source, size_t size)
@@ -219,4 +230,5 @@
 	    list_count(&ctx->streams));
 	pcm_format_silence(buffer, size, &source->format);
+	fibril_mutex_lock(&ctx->guard);
 	list_foreach(ctx->streams, it) {
 		hound_ctx_stream_t *stream = hound_ctx_stream_from_link(it);
@@ -229,4 +241,5 @@
 		connection_push_data(conn, adata);
 	}
+	fibril_mutex_unlock(&ctx->guard);
 	return EOK;
 }
Index: uspace/srv/audio/hound/hound_ctx.h
===================================================================
--- uspace/srv/audio/hound/hound_ctx.h	(revision 5c98bb285ea6f97fbb497faf9555138f22a7ff04)
+++ uspace/srv/audio/hound/hound_ctx.h	(revision 599034ee9b9a87b7d6575479407023e2e8a2496d)
@@ -39,4 +39,6 @@
 #include <adt/list.h>
 #include <hound/protocol.h>
+#include <fibril_synch.h>
+
 #include "audio_source.h"
 #include "audio_sink.h"
@@ -47,4 +49,5 @@
 	audio_source_t *source;
 	audio_sink_t *sink;
+	fibril_mutex_t guard;
 } hound_ctx_t;
 
@@ -71,9 +74,7 @@
     size_t size);
 int hound_ctx_stream_read(hound_ctx_stream_t *stream, void *buffer, size_t size);
-int hound_ctx_stream_add_self(hound_ctx_stream_t *stream, void *data,
+ssize_t hound_ctx_stream_add_self(hound_ctx_stream_t *stream, void *data,
     size_t size, const pcm_format_t *f);
 void hound_ctx_stream_drain(hound_ctx_stream_t *stream);
-int hound_ctx_stream_add(hound_ctx_stream_t *stream, void *buffer, size_t size,
-    pcm_format_t format);
 
 #endif
