Index: uspace/lib/hound/include/hound/protocol.h
===================================================================
--- uspace/lib/hound/include/hound/protocol.h	(revision a41655618515f74ae931bef021d28647f53fa6ec)
+++ uspace/lib/hound/include/hound/protocol.h	(revision 37ea3338a9369eabc02376eb6132bff066522be2)
@@ -64,4 +64,5 @@
 	int (*add_context)(void *, hound_context_id_t *, const char *, bool);
 	int (*rem_context)(void *, hound_context_id_t);
+	bool (*is_record_context)(void *, hound_context_id_t);
 	int (*add_stream)(void *, hound_context_id_t, int, pcm_format_t, size_t,
 	    void **);
Index: uspace/lib/hound/src/protocol.c
===================================================================
--- uspace/lib/hound/src/protocol.c	(revision a41655618515f74ae931bef021d28647f53fa6ec)
+++ uspace/lib/hound/src/protocol.c	(revision 37ea3338a9369eabc02376eb6132bff066522be2)
@@ -139,4 +139,5 @@
 
 static int hound_server_read_data(void *stream);
+static int hound_server_write_data(void *stream);
 static const hound_server_iface_t *server_iface;
 
@@ -194,5 +195,6 @@
 		}
 		case IPC_M_HOUND_STREAM_ENTER: {
-			if (!server_iface || !server_iface->add_stream) {
+			if (!server_iface || !server_iface->add_stream
+			    || !server_iface->is_record_context) {
 				async_answer_0(callid, ENOTSUP);
 				break;
@@ -213,6 +215,11 @@
 				break;
 			}
-			//TODO consider record context
-			hound_server_read_data(stream);
+			const bool rec = server_iface->is_record_context(
+			    server_iface->server, id);
+			if (rec) {
+				hound_server_write_data(stream);
+			} else {
+				hound_server_read_data(stream);
+			}
 			break;
 		}
@@ -245,10 +252,36 @@
 		int ret = async_data_write_finalize(callid, buffer, size);
 		if (ret == EOK) {
-			server_iface->stream_data_write(stream, buffer, size);
-		} else {
-			async_answer_0(callid, ret);
-		}
+			ret = server_iface->stream_data_write(stream, buffer, size);
+		}
+		async_answer_0(callid, ret);
 	}
 	//TODO drain?
+	const int ret = IPC_GET_IMETHOD(call) == IPC_M_HOUND_STREAM_EXIT
+	    ? EOK : EINVAL;
+
+	async_answer_0(callid, ret);
+	return ret;
+}
+
+static int hound_server_write_data(void *stream)
+{
+	if (!server_iface || !server_iface->stream_data_read)
+		return ENOTSUP;
+
+	ipc_callid_t callid;
+	ipc_call_t call;
+	size_t size = 0;
+	while (async_data_read_receive_call(&callid, &call, &size)) {
+		char *buffer = malloc(size);
+		if (!buffer) {
+			async_answer_0(callid, ENOMEM);
+			continue;
+		}
+		int ret = server_iface->stream_data_read(stream, buffer, size);
+		if (ret == EOK) {
+			ret = async_data_read_finalize(callid, buffer, size);
+		}
+		async_answer_0(callid, ret);
+	}
 	const int ret = IPC_GET_IMETHOD(call) == IPC_M_HOUND_STREAM_EXIT
 	    ? EOK : EINVAL;
