Index: uspace/srv/audio/hound/hound_ctx.c
===================================================================
--- uspace/srv/audio/hound/hound_ctx.c	(revision b266f9e57ef5c1024140a20b06e19bf34a2b9a58)
+++ uspace/srv/audio/hound/hound_ctx.c	(revision bf13c9a4e83e25ca65bac9722d9fa5c5574aea4c)
@@ -94,4 +94,19 @@
 }
 
+/*
+ * STREAMS
+ */
+
+typedef struct {
+	const void *data;
+	size_t size;
+	link_t link;
+} audio_data_t;
+
+static inline audio_data_t * audio_data_list_instance(link_t *l)
+{
+	return l ? list_get_instance(l, audio_data_t, link) : NULL;
+}
+
 hound_ctx_stream_t *hound_ctx_create_stream(hound_ctx_t *ctx, int flags,
 	pcm_format_t format, size_t buffer_size)
@@ -100,4 +115,5 @@
 	hound_ctx_stream_t *stream = malloc(sizeof(hound_ctx_stream_t));
 	if (stream) {
+		list_initialize(&stream->fifo);
 		link_initialize(&stream->link);
 		stream->ctx = ctx;
@@ -105,4 +121,5 @@
 		stream->format = format;
 		stream->allowed_size = buffer_size;
+		stream->current_size = 0;
 		list_append(&stream->link, &ctx->streams);
 		log_verbose("CTX: %p added stream; flags:%#x ch: %u r:%u f:%s",
@@ -116,8 +133,19 @@
 {
 	if (stream) {
+		//TODO consider DRAIN FLAG
 		list_remove(&stream->link);
-		//TODO free used buffer space
-		log_verbose("CTX: %p remove stream; flags:%#x ch: %u r:%u f:%s",
-		    stream->ctx, stream->flags, stream->format.channels,
+		if (!list_empty(&stream->fifo))
+			log_warning("Destroying stream with non empty buffer");
+		while (!list_empty(&stream->fifo)) {
+			link_t *l = list_first(&stream->fifo);
+			audio_data_t *data = audio_data_list_instance(l);
+			list_remove(l);
+			free(data->data);
+			free(data);
+		}
+		log_verbose("CTX: %p remove stream (%zu/%zu); "
+		    "flags:%#x ch: %u r:%u f:%s",
+		    stream->ctx, stream->current_size, stream->allowed_size,
+		    stream->flags, stream->format.channels,
 		    stream->format.sampling_rate,
 		    pcm_sample_format_str(stream->format.sample_format));
@@ -126,4 +154,37 @@
 }
 
+
+int hound_ctx_stream_write(hound_ctx_stream_t *stream, const void *data,
+    size_t size)
+{
+	assert(stream);
+        log_verbose("%p:, %zu", stream, size);
+
+	if (stream->allowed_size && size > stream->allowed_size)
+		return EINVAL;
+
+	if (stream->allowed_size &&
+	    (stream->current_size + size > stream->allowed_size))
+		return EBUSY;
+
+	audio_data_t *adata = malloc(sizeof(audio_data_t));
+	if (adata) {
+		adata->data = data;
+		adata->size = size;
+		link_initialize(&adata->link);
+		list_append(&adata->link, &stream->fifo);
+		stream->current_size += size;
+		return EOK;
+	}
+	log_warning("Failed to enqueue %zu bytes of data.", size);
+	return ENOMEM;
+}
+
+int hound_ctx_stream_read(hound_ctx_stream_t *stream, void *data, size_t size)
+{
+        log_verbose("%p:, %zu", stream, size);
+	return ENOTSUP;
+}
+
 /**
  * @}
Index: uspace/srv/audio/hound/hound_ctx.h
===================================================================
--- uspace/srv/audio/hound/hound_ctx.h	(revision b266f9e57ef5c1024140a20b06e19bf34a2b9a58)
+++ uspace/srv/audio/hound/hound_ctx.h	(revision bf13c9a4e83e25ca65bac9722d9fa5c5574aea4c)
@@ -56,8 +56,10 @@
 typedef struct {
 	link_t link;
+	list_t fifo;
 	hound_ctx_t *ctx;
 	pcm_format_t format;
 	int flags;
 	size_t allowed_size;
+	size_t current_size;
 } hound_ctx_stream_t;
 
@@ -79,4 +81,8 @@
 void hound_ctx_destroy_stream(hound_ctx_stream_t *stream);
 
+int hound_ctx_stream_write(hound_ctx_stream_t *stream, const void *buffer,
+    size_t size);
+int hound_ctx_stream_read(hound_ctx_stream_t *stream, void *buffer, size_t size);
+
 #endif
 
Index: uspace/srv/audio/hound/iface.c
===================================================================
--- uspace/srv/audio/hound/iface.c	(revision b266f9e57ef5c1024140a20b06e19bf34a2b9a58)
+++ uspace/srv/audio/hound/iface.c	(revision bf13c9a4e83e25ca65bac9722d9fa5c5574aea4c)
@@ -131,5 +131,4 @@
 static int iface_rem_stream(void *server, void *stream)
 {
-	log_verbose("%s: %p, %s", __FUNCTION__, server, (char *)stream);
 	hound_ctx_destroy_stream(stream);
 	return EOK;
@@ -138,12 +137,10 @@
 static int iface_stream_data_read(void *stream, void *buffer, size_t size)
 {
-	log_verbose("%p:, %zu", stream, size);
-	return ENOTSUP;
+	return hound_ctx_stream_read(stream, buffer, size);
 }
 
 static int iface_stream_data_write(void *stream, const void *buffer, size_t size)
 {
-	log_verbose("%p: %zu", stream, size);
-	return ENOTSUP;
+	return hound_ctx_stream_write(stream, buffer, size);
 }
 
