Index: uspace/srv/audio/hound/hound_ctx.c
===================================================================
--- uspace/srv/audio/hound/hound_ctx.c	(revision 6133470b77e0c859395a7aded61ec6750499588d)
+++ uspace/srv/audio/hound/hound_ctx.c	(revision b266f9e57ef5c1024140a20b06e19bf34a2b9a58)
@@ -38,4 +38,5 @@
 
 #include "hound_ctx.h"
+#include "log.h"
 
 hound_ctx_t *hound_record_ctx_get(const char *name)
@@ -49,4 +50,5 @@
 	if (ctx) {
 		link_initialize(&ctx->link);
+		list_initialize(&ctx->streams);
 		ctx->sink = NULL;
 		ctx->source = malloc(sizeof(audio_source_t));
@@ -74,4 +76,5 @@
 	if (ctx->sink)
 		audio_sink_fini(ctx->sink);
+	//TODO remove streams
 	free(ctx->source);
 	free(ctx->sink);
@@ -88,6 +91,37 @@
 {
 	assert(ctx);
-	//TODO fix this
-	return false;
+	return ctx->source == NULL;
+}
+
+hound_ctx_stream_t *hound_ctx_create_stream(hound_ctx_t *ctx, int flags,
+	pcm_format_t format, size_t buffer_size)
+{
+	assert(ctx);
+	hound_ctx_stream_t *stream = malloc(sizeof(hound_ctx_stream_t));
+	if (stream) {
+		link_initialize(&stream->link);
+		stream->ctx = ctx;
+		stream->flags = flags;
+		stream->format = format;
+		stream->allowed_size = buffer_size;
+		list_append(&stream->link, &ctx->streams);
+		log_verbose("CTX: %p added stream; flags:%#x ch: %u r:%u f:%s",
+		    ctx, flags, format.channels, format.sampling_rate,
+		    pcm_sample_format_str(format.sample_format));
+	}
+	return stream;
+}
+
+void hound_ctx_destroy_stream(hound_ctx_stream_t *stream)
+{
+	if (stream) {
+		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,
+		    stream->format.sampling_rate,
+		    pcm_sample_format_str(stream->format.sample_format));
+		free(stream);
+	}
 }
 
Index: uspace/srv/audio/hound/hound_ctx.h
===================================================================
--- uspace/srv/audio/hound/hound_ctx.h	(revision 6133470b77e0c859395a7aded61ec6750499588d)
+++ uspace/srv/audio/hound/hound_ctx.h	(revision b266f9e57ef5c1024140a20b06e19bf34a2b9a58)
@@ -54,4 +54,18 @@
 }
 
+typedef struct {
+	link_t link;
+	hound_ctx_t *ctx;
+	pcm_format_t format;
+	int flags;
+	size_t allowed_size;
+} hound_ctx_stream_t;
+
+static inline hound_ctx_stream_t *hound_ctx_stream_from_link(link_t *l)
+{
+	return l ? list_get_instance(l, hound_ctx_stream_t, link) : NULL;
+}
+
+
 hound_ctx_t *hound_record_ctx_get(const char *name);
 hound_ctx_t *hound_playback_ctx_get(const char *name);
@@ -61,4 +75,8 @@
 bool hound_ctx_is_record(hound_ctx_t *ctx);
 
+hound_ctx_stream_t *hound_ctx_create_stream(hound_ctx_t *ctx, int flags,
+	pcm_format_t format, size_t buffer_size);
+void hound_ctx_destroy_stream(hound_ctx_stream_t *stream);
+
 #endif
 
Index: uspace/srv/audio/hound/iface.c
===================================================================
--- uspace/srv/audio/hound/iface.c	(revision 6133470b77e0c859395a7aded61ec6750499588d)
+++ uspace/srv/audio/hound/iface.c	(revision b266f9e57ef5c1024140a20b06e19bf34a2b9a58)
@@ -112,20 +112,31 @@
     pcm_format_t format, size_t size, void **data)
 {
-	log_info("%s: %p, %d %x ch:%u r:%u f:%s", __FUNCTION__, server, id,
+	assert(data);
+	assert(server);
+
+	log_verbose("%s: %p, %d %x ch:%u r:%u f:%s", __FUNCTION__, server, id,
 	    flags, format.channels, format.sampling_rate,
 	    pcm_sample_format_str(format.sample_format));
-	*data = (void*)"TEST_STREAM";
-	return ENOTSUP;
+	hound_ctx_t *ctx = hound_get_ctx_by_id(server, id);
+	if (!ctx)
+		return ENOENT;
+	hound_ctx_stream_t *stream =
+	    hound_ctx_create_stream(ctx, flags, format, size);
+	if (!stream)
+		return ENOMEM;
+	*data = stream;
+	return EOK;
 }
 
 static int iface_rem_stream(void *server, void *stream)
 {
-	log_info("%s: %p, %s", __FUNCTION__, server, (char *)stream);
-	return ENOTSUP;
+	log_verbose("%s: %p, %s", __FUNCTION__, server, (char *)stream);
+	hound_ctx_destroy_stream(stream);
+	return EOK;
 }
 
 static int iface_stream_data_read(void *stream, void *buffer, size_t size)
 {
-	log_info("%s: %s, %zu", __FUNCTION__, (char *)stream, size);
+	log_verbose("%p:, %zu", stream, size);
 	return ENOTSUP;
 }
@@ -133,5 +144,5 @@
 static int iface_stream_data_write(void *stream, const void *buffer, size_t size)
 {
-	log_info("%s: %s, %zu", __FUNCTION__, (char *)stream, size);
+	log_verbose("%p: %zu", stream, size);
 	return ENOTSUP;
 }
