Index: uspace/srv/audio/hound/Makefile
===================================================================
--- uspace/srv/audio/hound/Makefile	(revision 39c4d1fcc4ef3db6fd729c7933a9c29213dab92d)
+++ uspace/srv/audio/hound/Makefile	(revision fa60cd6916b124f0460287cd7ff7f3f27ad2813c)
@@ -46,4 +46,5 @@
 	audio_sink.c \
 	audio_source.c \
+	connection.c \
 	hound.c \
 	hound_ctx.c \
Index: uspace/srv/audio/hound/audio_client.c
===================================================================
--- uspace/srv/audio/hound/audio_client.c	(revision 39c4d1fcc4ef3db6fd729c7933a9c29213dab92d)
+++ uspace/srv/audio/hound/audio_client.c	(revision fa60cd6916b124f0460287cd7ff7f3f27ad2813c)
@@ -55,5 +55,5 @@
 
 static int client_sink_connection_change(audio_sink_t *sink, bool new);
-static int client_source_connection_change(audio_source_t *source);
+static int client_source_connection_change(audio_source_t *source, bool new);
 static int client_source_update_data(audio_source_t *source, size_t size);
 
@@ -111,14 +111,18 @@
 }
 
-static int client_source_connection_change(audio_source_t *source)
+static int client_source_connection_change(audio_source_t *source, bool new)
 {
 	assert(source);
 	audio_client_t *client = source->private_data;
-	if (source->connected_sink) {
+	if (new && list_count(&source->connections) == 1) {
+		assert(!client->exch);
 		client->exch = async_exchange_begin(client->sess);
 		return client->exch ? EOK : ENOMEM;
 	}
-	async_exchange_end(client->exch);
-	client->exch = NULL;
+	if (list_count(&source->connections) == 0) {
+		assert(!new);
+		async_exchange_end(client->exch);
+		client->exch = NULL;
+	}
 	return EOK;
 }
Index: uspace/srv/audio/hound/audio_device.c
===================================================================
--- uspace/srv/audio/hound/audio_device.c	(revision 39c4d1fcc4ef3db6fd729c7933a9c29213dab92d)
+++ uspace/srv/audio/hound/audio_device.c	(revision fa60cd6916b124f0460287cd7ff7f3f27ad2813c)
@@ -49,5 +49,5 @@
 
 static int device_sink_connection_callback(audio_sink_t *sink, bool new);
-static int device_source_connection_callback(audio_source_t *source);
+static int device_source_connection_callback(audio_source_t *source, bool new);
 static void device_event_callback(ipc_callid_t iid, ipc_call_t *icall, void *arg);
 static int device_check_format(audio_sink_t* sink);
@@ -94,5 +94,5 @@
 	assert(sink);
 	audio_device_t *dev = sink->private_data;
-	if (new && list_count(&sink->sources) == 1) {
+	if (new && list_count(&sink->connections) == 1) {
 		log_verbose("First connection on device sink '%s'", sink->name);
 
@@ -104,5 +104,6 @@
 		}
 		audio_pcm_register_event_callback(dev->sess,
-		    device_event_callback, dev);
+		    device_event_callback, dev);\
+		// TODO set formats
 
 		/* Fill the buffer first */
@@ -110,6 +111,9 @@
 		    dev->buffer.base, dev->buffer.size);
 
+		log_verbose("Mixed inputs: %zu/(%u * %u)",
+		    dev->buffer.size, BUFFER_PARTS, pcm_format_frame_size(&dev->sink.format));
 		const unsigned frames = dev->buffer.size /
 		    (BUFFER_PARTS * pcm_format_frame_size(&dev->sink.format));
+		log_verbose("FRAME COUNT %u", frames);
 		ret = audio_pcm_start_playback_fragment(dev->sess, frames,
 		    dev->sink.format.channels, dev->sink.format.sampling_rate,
@@ -122,5 +126,5 @@
 		}
 	}
-	if (list_count(&sink->sources) == 0) {
+	if (list_count(&sink->connections) == 0) {
 		assert(!new);
 		log_verbose("No connections on device sink '%s'", sink->name);
@@ -142,9 +146,9 @@
 }
 
-static int device_source_connection_callback(audio_source_t *source)
+static int device_source_connection_callback(audio_source_t *source, bool new)
 {
 	assert(source);
 	audio_device_t *dev = source->private_data;
-	if (source->connected_sink) {
+	if (new && list_count(&source->connections)) {
 		int ret = get_buffer(dev);
 		if (ret != EOK) {
@@ -164,5 +168,7 @@
 			return ret;
 		}
-	} else { /* Disconnected */
+	}
+	if (list_count(&source->connections) == 0) { /* Disconnected */
+		assert(!new);
 		int ret = audio_pcm_stop_capture(dev->sess);
 		if (ret != EOK) {
Index: uspace/srv/audio/hound/audio_sink.c
===================================================================
--- uspace/srv/audio/hound/audio_sink.c	(revision 39c4d1fcc4ef3db6fd729c7933a9c29213dab92d)
+++ uspace/srv/audio/hound/audio_sink.c	(revision fa60cd6916b124f0460287cd7ff7f3f27ad2813c)
@@ -41,4 +41,5 @@
 
 #include "audio_sink.h"
+#include "connection.h"
 #include "log.h"
 
@@ -54,5 +55,5 @@
 	}
 	link_initialize(&sink->link);
-	list_initialize(&sink->sources);
+	list_initialize(&sink->connections);
 	sink->name = str_dup(name);
 	sink->private_data = private_data;
@@ -67,4 +68,5 @@
 {
 	assert(sink);
+	assert(list_empty(&sink->connections));
 	assert(!sink->private_data);
 	free(sink->name);
@@ -72,4 +74,5 @@
 }
 
+#if 0
 int audio_sink_add_source(audio_sink_t *sink, audio_source_t *source)
 {
@@ -92,5 +95,4 @@
 
 	audio_source_connected(source, sink);
-
 	if (sink->connection_change) {
 		log_verbose("Calling connection change");
@@ -98,7 +100,7 @@
 		if (ret != EOK) {
 			log_debug("Connection hook failed.");
-			audio_source_connected(source, NULL);
-			list_remove(&source->link);
-			sink->format = old_format;
+	//		audio_source_connected(source, NULL);
+	//		list_remove(&source->link);
+//			sink->format = old_format;
 			return ret;
 		}
@@ -109,4 +111,5 @@
 	return EOK;
 }
+#endif
 
 int audio_sink_set_format(audio_sink_t *sink, const pcm_format_t *format)
@@ -118,5 +121,5 @@
 		return EEXISTS;
 	}
-	const pcm_format_t old_format;
+	const pcm_format_t old_format = sink->format;
 
 	if (pcm_format_is_any(format)) {
@@ -140,4 +143,5 @@
 }
 
+#if 0
 int audio_sink_remove_source(audio_sink_t *sink, audio_source_t *source)
 {
@@ -157,4 +161,5 @@
 	return EOK;
 }
+#endif
 
 
@@ -165,11 +170,11 @@
 
 	pcm_format_silence(dest, size, &sink->format);
-	list_foreach(sink->sources, it) {
-		audio_source_t *source = audio_source_list_instance(it);
-		const int ret =
-		    audio_source_add_self(source, dest, size, &sink->format);
+	list_foreach(sink->connections, it) {
+		connection_t * conn = connection_from_sink_list(it);
+		const int ret = connection_add_source_data(
+		    conn, dest, size, sink->format);
 		if (ret != EOK) {
-			log_warning("Failed to mix source %s: %s",
-			    source->name, str_error(ret));
+			log_warning("Failed to add source %s: %s",
+			    connection_source_name(conn), str_error(ret));
 		}
 	}
Index: uspace/srv/audio/hound/audio_sink.h
===================================================================
--- uspace/srv/audio/hound/audio_sink.h	(revision 39c4d1fcc4ef3db6fd729c7933a9c29213dab92d)
+++ uspace/srv/audio/hound/audio_sink.h	(revision fa60cd6916b124f0460287cd7ff7f3f27ad2813c)
@@ -49,5 +49,5 @@
 struct audio_sink {
 	link_t link;
-	list_t sources;
+	list_t connections;
 	const char *name;
 	pcm_format_t format;
@@ -68,6 +68,6 @@
 
 int audio_sink_set_format(audio_sink_t *sink, const pcm_format_t *format);
-int audio_sink_add_source(audio_sink_t *sink, audio_source_t *source);
-int audio_sink_remove_source(audio_sink_t *sink, audio_source_t *source);
+//int audio_sink_add_source(audio_sink_t *sink, audio_source_t *source);
+//int audio_sink_remove_source(audio_sink_t *sink, audio_source_t *source);
 void audio_sink_mix_inputs(audio_sink_t *sink, void* dest, size_t size);
 
Index: uspace/srv/audio/hound/audio_source.c
===================================================================
--- uspace/srv/audio/hound/audio_source.c	(revision 39c4d1fcc4ef3db6fd729c7933a9c29213dab92d)
+++ uspace/srv/audio/hound/audio_source.c	(revision fa60cd6916b124f0460287cd7ff7f3f27ad2813c)
@@ -47,5 +47,5 @@
 
 int audio_source_init(audio_source_t *source, const char *name, void *data,
-    int (*connection_change)(audio_source_t *),
+    int (*connection_change)(audio_source_t *, bool new),
     int (*update_available_data)(audio_source_t *, size_t),
     const pcm_format_t *f)
@@ -57,9 +57,9 @@
 	}
 	link_initialize(&source->link);
+	list_initialize(&source->connections);
 	source->name = str_dup(name);
 	source->private_data = data;
 	source->connection_change = connection_change;
 	source->update_available_data = update_available_data;
-	source->connected_sink = NULL;
 	source->format = *f;
 	source->available_data.base = NULL;
@@ -73,30 +73,6 @@
 {
 	assert(source);
-	assert(source->connected_sink == NULL);
 	free(source->name);
 	source->name = NULL;
-}
-
-int audio_source_connected(audio_source_t *source, struct audio_sink *sink)
-{
-	assert(source);
-	audio_sink_t *old_sink = source->connected_sink;
-	const pcm_format_t old_format = source->format;
-
-	source->connected_sink = sink;
-	if (pcm_format_is_any(&source->format)) {
-		assert(sink);
-		assert(!pcm_format_is_any(&sink->format));
-		source->format = sink->format;
-	}
-	if (source->connection_change) {
-		const int ret = source->connection_change(source);
-		if (ret != EOK) {
-			source->format = old_format;
-			source->connected_sink = old_sink;
-			return ret;
-		}
-	}
-	return EOK;
 }
 
Index: uspace/srv/audio/hound/audio_source.h
===================================================================
--- uspace/srv/audio/hound/audio_source.h	(revision 39c4d1fcc4ef3db6fd729c7933a9c29213dab92d)
+++ uspace/srv/audio/hound/audio_source.h	(revision fa60cd6916b124f0460287cd7ff7f3f27ad2813c)
@@ -45,10 +45,10 @@
 struct audio_source {
 	link_t link;
+	list_t connections;
 	const char *name;
 	pcm_format_t format;
 	void *private_data;
-	int (*connection_change)(audio_source_t *source);
+	int (*connection_change)(audio_source_t *source, bool added);
 	int (*update_available_data)(audio_source_t *source, size_t size);
-	struct audio_sink *connected_sink;
 	struct {
 		void *position;
@@ -64,9 +64,9 @@
 
 int audio_source_init(audio_source_t *source, const char *name, void *data,
-    int (*connection_change)(audio_source_t *),
+    int (*connection_change)(audio_source_t *, bool),
     int (*update_available_data)(audio_source_t *, size_t),
     const pcm_format_t *f);
 void audio_source_fini(audio_source_t *source);
-int audio_source_connected(audio_source_t *source, struct audio_sink *sink);
+//int audio_source_connected(audio_source_t *source, struct audio_sink *sink);
 int audio_source_add_self(audio_source_t *source, void *buffer, size_t size,
     const pcm_format_t *f);
Index: uspace/srv/audio/hound/connection.c
===================================================================
--- uspace/srv/audio/hound/connection.c	(revision fa60cd6916b124f0460287cd7ff7f3f27ad2813c)
+++ uspace/srv/audio/hound/connection.c	(revision fa60cd6916b124f0460287cd7ff7f3f27ad2813c)
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2013 Jan Vesely
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup audio
+ * @brief HelenOS sound server
+ * @{
+ */
+/** @file
+ */
+
+#include <malloc.h>
+#include <errno.h>
+
+#include "log.h"
+#include "connection.h"
+
+connection_t *connection_create(audio_source_t *source, audio_sink_t *sink)
+{
+	assert(source);
+	assert(sink);
+	connection_t *conn = malloc(sizeof(connection_t));
+	if (conn) {
+		link_initialize(&conn->source_link);
+		link_initialize(&conn->sink_link);
+		link_initialize(&conn->hound_link);
+		conn->sink = sink;
+		conn->source = source;
+		list_append(&conn->source_link, &source->connections);
+		list_append(&conn->sink_link, &sink->connections);
+		audio_sink_set_format(sink, audio_source_format(source));
+		source->connection_change(source, true);
+		sink->connection_change(sink, true);
+	}
+	return conn;
+}
+
+void connection_destroy(connection_t *connection)
+{
+	assert(connection);
+	assert(!link_in_use(&connection->hound_link));
+	list_remove(&connection->source_link);
+	list_remove(&connection->sink_link);
+	connection->sink->connection_change(connection->sink, false);
+	connection->source->connection_change(connection->source, false);
+	free(connection);
+}
+
+ssize_t connection_add_source_data(connection_t *connection, void *data,
+    size_t size, pcm_format_t format)
+{
+	assert(connection);
+	if (!data)
+		return EBADMEM;
+	return audio_source_add_self(connection->source, data, size, &format);
+}
+
+int connection_new_data(connection_t *connection, const void *data, size_t size)
+{
+	assert(connection);
+	return ENOTSUP;
+}
+
+
+/**
+ * @}
+ */
Index: uspace/srv/audio/hound/connection.h
===================================================================
--- uspace/srv/audio/hound/connection.h	(revision fa60cd6916b124f0460287cd7ff7f3f27ad2813c)
+++ uspace/srv/audio/hound/connection.h	(revision fa60cd6916b124f0460287cd7ff7f3f27ad2813c)
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2013 Jan Vesely
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup audio
+ * @brief HelenOS sound server
+ * @{
+ */
+/** @file
+ */
+
+#ifndef CONNECTION_H_
+#define CONNECTION_H_
+
+#include <assert.h>
+#include <adt/list.h>
+#include <pcm/format.h>
+
+#include "audio_source.h"
+#include "audio_sink.h"
+
+typedef struct {
+	link_t source_link;
+	link_t sink_link;
+	link_t hound_link;
+	audio_sink_t *sink;
+	audio_source_t *source;
+} connection_t;
+
+static inline connection_t * connection_from_source_list(link_t *l)
+{
+	return list_get_instance(l, connection_t, source_link);
+}
+
+static inline connection_t * connection_from_sink_list(link_t *l)
+{
+	return list_get_instance(l, connection_t, sink_link);
+}
+
+static inline connection_t * connection_from_hound_list(link_t *l)
+{
+	return list_get_instance(l, connection_t, hound_link);
+}
+
+connection_t *connection_create(audio_source_t *source, audio_sink_t *sink);
+void connection_destroy(connection_t *connection);
+
+ssize_t connection_add_source_data(connection_t *connection, void *data,
+    size_t size, pcm_format_t format);
+
+int connection_new_data(connection_t *connection, const void *data, size_t size);
+
+static inline const char *connection_source_name(connection_t *connection)
+{
+	assert(connection);
+	if (connection->source && connection->source->name)
+		return connection->source->name;
+	return connection->source ? "unnamed source" : "no source";
+}
+
+static inline const char *connection_sink_name(connection_t *connection)
+{
+	assert(connection);
+	if (connection->sink && connection->sink->name)
+		return connection->sink->name;
+	return connection->source ? "unnamed source" : "no source";
+}
+
+
+#endif
+/**
+ * @}
+ */
Index: uspace/srv/audio/hound/hound.c
===================================================================
--- uspace/srv/audio/hound/hound.c	(revision 39c4d1fcc4ef3db6fd729c7933a9c29213dab92d)
+++ uspace/srv/audio/hound/hound.c	(revision fa60cd6916b124f0460287cd7ff7f3f27ad2813c)
@@ -43,4 +43,5 @@
 #include "audio_sink.h"
 #include "audio_source.h"
+#include "connection.h"
 #include "log.h"
 #include "errno.h"
@@ -86,4 +87,5 @@
 	list_initialize(&hound->sources);
 	list_initialize(&hound->sinks);
+	list_initialize(&hound->connections);
 	return EOK;
 }
@@ -207,12 +209,4 @@
 		return EEXISTS;
 	}
-	list_foreach(hound->sinks, it) {
-		audio_sink_t *sink = audio_sink_list_instance(it);
-		if (find_source_by_name(&sink->sources, source->name)) {
-			log_debug("Source by that name already exists");
-			fibril_mutex_unlock(&hound->list_guard);
-			return EEXISTS;
-		}
-	}
 	list_append(&source->link, &hound->sources);
 	fibril_mutex_unlock(&hound->list_guard);
@@ -245,9 +239,5 @@
 	log_verbose("Removing source '%s'.", source->name);
 	fibril_mutex_lock(&hound->list_guard);
-	if (!list_member(&source->link, &hound->sources)) {
-		assert(source->connected_sink);
-		hound_disconnect_internal(hound, source->name,
-		    source->connected_sink->name);
-	}
+
 	list_remove(&source->link);
 	fibril_mutex_unlock(&hound->list_guard);
@@ -263,5 +253,5 @@
 	fibril_mutex_lock(&hound->list_guard);
 
-	if (!list_empty(&sink->sources)) {
+	if (!list_empty(&sink->connections)) {
 		// TODO disconnect instead
 		fibril_mutex_unlock(&hound->list_guard);
@@ -278,4 +268,16 @@
 	log_verbose("Connecting '%s' to '%s'.", source_name, sink_name);
 	fibril_mutex_lock(&hound->list_guard);
+
+	if (list_empty(&hound->sinks)) {
+		fibril_mutex_unlock(&hound->list_guard);
+		log_debug("No sinks available");
+		return EINVAL;
+	}
+
+	if (list_empty(&hound->sources)) {
+		fibril_mutex_unlock(&hound->list_guard);
+		log_debug("No sinks available");
+		return EINVAL;
+	}
 
 	audio_source_t *source =
@@ -294,11 +296,13 @@
 		return ENOENT;
 	}
-	list_remove(&source->link);
-	const int ret = audio_sink_add_source(sink, source);
-	if (ret != EOK) {
-		log_debug("Failed add source to sink list: %s", str_error(ret));
-		list_append(&source->link, &hound->sources);
-	}
-	fibril_mutex_unlock(&hound->list_guard);
+	connection_t *conn = connection_create(source, sink);
+	if (!conn) {
+		fibril_mutex_unlock(&hound->list_guard);
+		log_debug("Failed to create connection");
+		return ENOMEM;
+	}
+	list_append(&conn->hound_link, &hound->connections);
+	fibril_mutex_unlock(&hound->list_guard);
+	log_debug("CONNECTED: %s -> %s", source_name, sink_name);
 	return EOK;
 }
@@ -317,25 +321,17 @@
 	assert(hound);
 	assert(fibril_mutex_is_locked(&hound->list_guard));
-	log_verbose("Disconnecting '%s' to '%s'.", source_name, sink_name);
-
-	audio_sink_t *sink =
-	    audio_sink_list_instance(list_first(&hound->sinks));
-	if (str_cmp(sink_name, "default") != 0)
-	    sink = find_sink_by_name(&hound->sinks, sink_name);
-
-	audio_source_t *source =
-	    audio_source_list_instance(list_first(&hound->sources));
-	if (str_cmp(source_name, "default") != 0)
-	    source = sink ? find_source_by_name(&sink->sources, source_name) : NULL;
-	if (!source || !sink) {
-		log_debug("Source (%p), or sink (%p) not found", source, sink);
-		return ENOENT;
-	}
-	const int ret = audio_sink_remove_source(sink, source);
-	if (ret != EOK) {
-		log_debug("Failed remove source to sink list: %s", str_error(ret));
-	} else {
-		list_append(&source->link, &hound->sources);
-	}
+	log_debug("Disconnecting '%s' to '%s'.", source_name, sink_name);
+
+	list_foreach_safe(hound->connections, it, next) {
+		connection_t *conn = connection_from_hound_list(it);
+		if (str_cmp(connection_source_name(conn), source_name) == 0 ||
+		    str_cmp(connection_sink_name(conn), sink_name) == 0) {
+		    log_debug("Removing %s -> %s", connection_source_name(conn),
+		        connection_sink_name(conn));
+		    list_remove(it);
+		    connection_destroy(conn);
+		}
+	}
+
 	return EOK;
 }
Index: uspace/srv/audio/hound/hound.h
===================================================================
--- uspace/srv/audio/hound/hound.h	(revision 39c4d1fcc4ef3db6fd729c7933a9c29213dab92d)
+++ uspace/srv/audio/hound/hound.h	(revision fa60cd6916b124f0460287cd7ff7f3f27ad2813c)
@@ -56,4 +56,5 @@
 	list_t sources;
 	list_t sinks;
+	list_t connections;
 } hound_t;
 
Index: uspace/srv/audio/hound/main.c
===================================================================
--- uspace/srv/audio/hound/main.c	(revision 39c4d1fcc4ef3db6fd729c7933a9c29213dab92d)
+++ uspace/srv/audio/hound/main.c	(revision fa60cd6916b124f0460287cd7ff7f3f27ad2813c)
@@ -132,7 +132,8 @@
 			hound_server_get_unregister_params(&name);
 			int ret = ENOENT;
-			list_foreach(local_playback, it) {
+			list_foreach_safe(local_playback, it, next) {
 				audio_client_t *client =
 				    audio_client_list_instance(it);
+				log_fatal("UNREGISTER_PLAYBACK %p", client);
 				if (str_cmp(client->name, name) == 0) {
 					ret = hound_remove_source(&hound,
@@ -213,4 +214,5 @@
 				        list_first(&local_playback));
 				list_remove(&client->link);
+				log_fatal("CASE 0 %p", client);
 				hound_remove_source(&hound, &client->source);
 				audio_client_destroy(client);
