Index: uspace/srv/audio/hound/audio_client.c
===================================================================
--- uspace/srv/audio/hound/audio_client.c	(revision ab07cf04b6b725547f987b92be700898b7eb42e2)
+++ uspace/srv/audio/hound/audio_client.c	(revision 13df13c8386a56a17aa0a38d1d2c103463766d45)
@@ -54,5 +54,5 @@
 }
 
-static int client_sink_connection_change(audio_sink_t *sink);
+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_update_data(audio_source_t *source, size_t size);
@@ -105,5 +105,5 @@
 }
 
-static int client_sink_connection_change(audio_sink_t *sink)
+static int client_sink_connection_change(audio_sink_t *sink, bool new)
 {
 	//TODO create fibril
Index: uspace/srv/audio/hound/audio_device.c
===================================================================
--- uspace/srv/audio/hound/audio_device.c	(revision ab07cf04b6b725547f987b92be700898b7eb42e2)
+++ uspace/srv/audio/hound/audio_device.c	(revision 13df13c8386a56a17aa0a38d1d2c103463766d45)
@@ -49,5 +49,5 @@
 #define BUFFER_BLOCKS 2
 
-static int device_sink_connection_callback(audio_sink_t *sink);
+static int device_sink_connection_callback(audio_sink_t *sink, bool new);
 static int device_source_connection_callback(audio_source_t *source);
 static void device_event_callback(ipc_callid_t iid, ipc_call_t *icall, void *arg);
@@ -95,9 +95,9 @@
 }
 
-static int device_sink_connection_callback(audio_sink_t* sink)
+static int device_sink_connection_callback(audio_sink_t* sink, bool new)
 {
 	assert(sink);
 	audio_device_t *dev = sink->private_data;
-	if (list_count(&sink->sources) == 1) {
+	if (new && list_count(&sink->sources) == 1) {
 		log_verbose("First connection on device sink '%s'", sink->name);
 
@@ -118,4 +118,5 @@
 	}
 	if (list_count(&sink->sources) == 0) {
+		assert(!new);
 		log_verbose("No connections on device sink '%s'", sink->name);
 		int ret = stop_playback(dev);
Index: uspace/srv/audio/hound/audio_sink.c
===================================================================
--- uspace/srv/audio/hound/audio_sink.c	(revision ab07cf04b6b725547f987b92be700898b7eb42e2)
+++ uspace/srv/audio/hound/audio_sink.c	(revision 13df13c8386a56a17aa0a38d1d2c103463766d45)
@@ -45,5 +45,5 @@
 
 int audio_sink_init(audio_sink_t *sink, const char *name,
-    void *private_data,int (*connection_change)(audio_sink_t *sink),
+    void *private_data, int (*connection_change)(audio_sink_t *, bool),
     const audio_format_t *f)
 {
@@ -108,5 +108,5 @@
 	if (sink->connection_change) {
 		log_verbose("Calling connection change");
-		const int ret = sink->connection_change(sink);
+		const int ret = sink->connection_change(sink, true);
 		if (ret != EOK) {
 			log_debug("Connection hook failed.");
@@ -130,5 +130,5 @@
 	list_remove(&source->link);
 	if (sink->connection_change) {
-		const int ret = sink->connection_change(sink);
+		const int ret = sink->connection_change(sink, false);
 		if (ret != EOK) {
 			log_debug("Connected hook failed.");
Index: uspace/srv/audio/hound/audio_sink.h
===================================================================
--- uspace/srv/audio/hound/audio_sink.h	(revision ab07cf04b6b725547f987b92be700898b7eb42e2)
+++ uspace/srv/audio/hound/audio_sink.h	(revision 13df13c8386a56a17aa0a38d1d2c103463766d45)
@@ -40,5 +40,4 @@
 #include <async.h>
 #include <bool.h>
-#include <pcm_sample_format.h>
 #include <fibril.h>
 
@@ -54,5 +53,5 @@
 	audio_format_t format;
 	void *private_data;
-	int (*connection_change)(audio_sink_t *sink);
+	int (*connection_change)(audio_sink_t *, bool);
 };
 
@@ -63,5 +62,5 @@
 
 int audio_sink_init(audio_sink_t *sink, const char *name,
-    void *private_data, int (*connection_change)(audio_sink_t *sink),
+    void *private_data, int (*connection_change)(audio_sink_t *, bool),
     const audio_format_t *f);
 void audio_sink_fini(audio_sink_t *sink);
Index: uspace/srv/audio/hound/audio_source.c
===================================================================
--- uspace/srv/audio/hound/audio_source.c	(revision ab07cf04b6b725547f987b92be700898b7eb42e2)
+++ uspace/srv/audio/hound/audio_source.c	(revision 13df13c8386a56a17aa0a38d1d2c103463766d45)
@@ -143,6 +143,6 @@
 	source->available_data.size -= real_size;
 
-	log_verbose("Mixing successful %p <= %p, %zu",
-	    buffer, source->available_data.position, real_size);
+//	log_verbose("Mixing successful %p <= %p, %zu",
+//	    buffer, source->available_data.position, real_size);
 
 	buffer += real_size;
Index: uspace/srv/audio/hound/hound.c
===================================================================
--- uspace/srv/audio/hound/hound.c	(revision ab07cf04b6b725547f987b92be700898b7eb42e2)
+++ uspace/srv/audio/hound/hound.c	(revision 13df13c8386a56a17aa0a38d1d2c103463766d45)
@@ -75,4 +75,5 @@
 	FIND_BY_NAME(sink);
 }
+static int hound_disconnect_internal(hound_t *hound, const char* source_name, const char* sink_name);
 
 int hound_init(hound_t *hound)
@@ -209,6 +210,7 @@
 	fibril_mutex_lock(&hound->list_guard);
 	if (!list_member(&source->link, &hound->sources)) {
-		fibril_mutex_unlock(&hound->list_guard);
-		return EBUSY;
+		assert(source->connected_sink);
+		hound_disconnect_internal(hound, source->name,
+		    source->connected_sink->name);
 	}
 	list_remove(&source->link);
@@ -224,5 +226,7 @@
 	log_verbose("Removing sink '%s'.", sink->name);
 	fibril_mutex_lock(&hound->list_guard);
+
 	if (!list_empty(&sink->sources)) {
+		// TODO disconnect instead
 		fibril_mutex_unlock(&hound->list_guard);
 		return EBUSY;
@@ -259,10 +263,18 @@
 {
 	assert(hound);
+	fibril_mutex_lock(&hound->list_guard);
+	const int ret = hound_disconnect_internal(hound, source_name, sink_name);
+	fibril_mutex_unlock(&hound->list_guard);
+	return ret;
+}
+
+static int hound_disconnect_internal(hound_t *hound, const char* source_name, const char* sink_name)
+{
+	assert(hound);
+	assert(fibril_mutex_is_locked(&hound->list_guard));
 	log_verbose("Disconnecting '%s' to '%s'.", source_name, sink_name);
-	fibril_mutex_lock(&hound->list_guard);
 	audio_sink_t *sink = find_sink_by_name(&hound->sinks, sink_name);
 	audio_source_t *source = sink ?  find_source_by_name(&sink->sources, source_name) : NULL;
 	if (!source || !sink) {
-		fibril_mutex_unlock(&hound->list_guard);
 		log_debug("Source (%p), or sink (%p) not found", source, sink);
 		return ENOENT;
@@ -274,7 +286,5 @@
 		list_append(&source->link, &hound->sources);
 	}
-	fibril_mutex_unlock(&hound->list_guard);
-	return EOK;
-	return ENOTSUP;
+	return EOK;
 }
 /**
