Index: uspace/srv/audio/hound/audio_device.c
===================================================================
--- uspace/srv/audio/hound/audio_device.c	(revision 8f8ec698114b0144062b0cad59165bb00d097ad5)
+++ uspace/srv/audio/hound/audio_device.c	(revision 6da3baecfcac3b691488136ddd1008570eb72831)
@@ -128,5 +128,6 @@
 	if (list_count(&sink->connections) == 0) {
 		assert(!new);
-		log_verbose("No connections on device sink '%s'", sink->name);
+		log_verbose("Removed last connection on device sink '%s'",
+		    sink->name);
 		int ret = audio_pcm_stop_playback(dev->sess);
 		if (ret != EOK) {
Index: uspace/srv/audio/hound/connection.c
===================================================================
--- uspace/srv/audio/hound/connection.c	(revision 8f8ec698114b0144062b0cad59165bb00d097ad5)
+++ uspace/srv/audio/hound/connection.c	(revision 6da3baecfcac3b691488136ddd1008570eb72831)
@@ -58,4 +58,5 @@
 		if (sink->connection_change)
 			sink->connection_change(sink, true);
+		log_debug("CONNECTED: %s -> %s", source->name, sink->name);
 	}
 	return conn;
@@ -68,6 +69,10 @@
 	list_remove(&connection->source_link);
 	list_remove(&connection->sink_link);
-	connection->sink->connection_change(connection->sink, false);
-	connection->source->connection_change(connection->source, false);
+	if (connection->sink && connection->sink->connection_change)
+		connection->sink->connection_change(connection->sink, false);
+	if (connection->source && connection->source->connection_change)
+		connection->source->connection_change(connection->source, false);
+	log_debug("DISCONNECTED: %s -> %s",
+	    connection->source->name, connection->sink->name);
 	free(connection);
 }
Index: uspace/srv/audio/hound/connection.h
===================================================================
--- uspace/srv/audio/hound/connection.h	(revision 8f8ec698114b0144062b0cad59165bb00d097ad5)
+++ uspace/srv/audio/hound/connection.h	(revision 6da3baecfcac3b691488136ddd1008570eb72831)
@@ -54,15 +54,15 @@
 static inline connection_t * connection_from_source_list(link_t *l)
 {
-	return list_get_instance(l, connection_t, source_link);
+	return l ? list_get_instance(l, connection_t, source_link) : NULL;
 }
 
 static inline connection_t * connection_from_sink_list(link_t *l)
 {
-	return list_get_instance(l, connection_t, sink_link);
+	return l ? list_get_instance(l, connection_t, sink_link) : NULL;
 }
 
 static inline connection_t * connection_from_hound_list(link_t *l)
 {
-	return list_get_instance(l, connection_t, hound_link);
+	return l ? list_get_instance(l, connection_t, hound_link) : NULL;
 }
 
Index: uspace/srv/audio/hound/hound.c
===================================================================
--- uspace/srv/audio/hound/hound.c	(revision 8f8ec698114b0144062b0cad59165bb00d097ad5)
+++ uspace/srv/audio/hound/hound.c	(revision 6da3baecfcac3b691488136ddd1008570eb72831)
@@ -79,4 +79,37 @@
 static int hound_disconnect_internal(hound_t *hound, const char* source_name, const char* sink_name);
 
+static void hound_remove_sink_internal(hound_t *hound, audio_sink_t *sink)
+{
+	assert(hound);
+	assert(sink);
+	log_verbose("Removing sink '%s'.", sink->name);
+	if (!list_empty(&sink->connections))
+		log_warning("Removing sink '%s' while still connected.", sink->name);
+	while (!list_empty(&sink->connections)) {
+		connection_t *conn =
+		    connection_from_sink_list(list_first(&sink->connections));
+		list_remove(&conn->hound_link);
+		connection_destroy(conn);
+	}
+	list_remove(&sink->link);
+}
+
+static void hound_remove_source_internal(hound_t *hound, audio_source_t *source)
+{
+	assert(hound);
+	assert(source);
+	log_verbose("Removing source '%s'.", source->name);
+	if (!list_empty(&source->connections))
+		log_warning("Removing source '%s' while still connected.", source->name);
+	while (!list_empty(&source->connections)) {
+		connection_t *conn =
+		    connection_from_source_list(list_first(&source->connections));
+		assert(conn);
+		list_remove(&conn->hound_link);
+		connection_destroy(conn);
+	}
+	list_remove(&source->link);
+}
+
 int hound_init(hound_t *hound)
 {
@@ -117,4 +150,8 @@
 	fibril_mutex_lock(&hound->list_guard);
 	list_remove(&ctx->link);
+	if (ctx->source)
+		hound_remove_source_internal(hound, ctx->source);
+	if (ctx->sink)
+		hound_remove_sink_internal(hound, ctx->sink);
 	fibril_mutex_unlock(&hound->list_guard);
 	return EOK;
@@ -250,11 +287,10 @@
 	if (!source)
 		return EINVAL;
-	log_verbose("Removing source '%s'.", source->name);
-	fibril_mutex_lock(&hound->list_guard);
-
-	list_remove(&source->link);
-	fibril_mutex_unlock(&hound->list_guard);
-	return EOK;
-}
+	fibril_mutex_lock(&hound->list_guard);
+	hound_remove_source_internal(hound, source);
+	fibril_mutex_unlock(&hound->list_guard);
+	return EOK;
+}
+
 
 int hound_remove_sink(hound_t *hound, audio_sink_t *sink)
@@ -263,13 +299,6 @@
 	if (!sink)
 		return EINVAL;
-	log_verbose("Removing sink '%s'.", sink->name);
-	fibril_mutex_lock(&hound->list_guard);
-
-	if (!list_empty(&sink->connections)) {
-		// TODO disconnect instead
-		fibril_mutex_unlock(&hound->list_guard);
-		return EBUSY;
-	}
-	list_remove(&sink->link);
+	fibril_mutex_lock(&hound->list_guard);
+	hound_remove_sink_internal(hound, sink);
 	fibril_mutex_unlock(&hound->list_guard);
 	return EOK;
@@ -383,5 +412,4 @@
 	list_append(&conn->hound_link, &hound->connections);
 	fibril_mutex_unlock(&hound->list_guard);
-	log_debug("CONNECTED: %s -> %s", source_name, sink_name);
 	return EOK;
 }
@@ -396,5 +424,6 @@
 }
 
-static int hound_disconnect_internal(hound_t *hound, const char* source_name, const char* sink_name)
+static int hound_disconnect_internal(hound_t *hound, const char* source_name,
+    const char* sink_name)
 {
 	assert(hound);
