Index: uspace/lib/drv/generic/remote_usbhid.c
===================================================================
--- uspace/lib/drv/generic/remote_usbhid.c	(revision d7c72dbaa2549fcbbdb999bf6cac53fa7bb3c408)
+++ uspace/lib/drv/generic/remote_usbhid.c	(revision fa8d346ef5665261176259869ebcc53b8ab53d26)
@@ -117,4 +117,5 @@
 		async_answer_0(data_callid, EINVAL);
 		async_answer_0(callid, EINVAL);
+		return;
 	}
 
@@ -125,4 +126,5 @@
 		async_answer_0(data_callid, ENOMEM);
 		async_answer_0(callid, ENOMEM);
+		return;
 	}
 
@@ -133,4 +135,5 @@
 		async_answer_0(data_callid, rc);
 		async_answer_0(callid, rc);
+		return;
 	}
 	if (act_length >= len) {
@@ -147,15 +150,68 @@
 }
 
-void remote_usbhid_get_report_descriptor(ddf_fun_t *fun, void *iface, 
-    ipc_callid_t callid, ipc_call_t *call)
-{
-	/** @todo Implement! */
-}
-
-void remote_usbhid_get_report_descriptor_length(ddf_fun_t *fun, void *iface, 
-    ipc_callid_t callid, ipc_call_t *call)
-{
-	/** @todo Implement! */
-}
+void remote_usbhid_get_report_descriptor_length(ddf_fun_t *fun, void *iface,
+    ipc_callid_t callid, ipc_call_t *call)
+{
+	usbhid_iface_t *hid_iface = (usbhid_iface_t *) iface;
+
+	if (!hid_iface->get_report_descriptor_length) {
+		async_answer_0(callid, ENOTSUP);
+		return;
+	}
+
+	size_t len = hid_iface->get_report_descriptor_length(fun);
+	async_answer_1(callid, EOK, (sysarg_t) len);
+}
+
+void remote_usbhid_get_report_descriptor(ddf_fun_t *fun, void *iface,
+    ipc_callid_t callid, ipc_call_t *call)
+{
+	usbhid_iface_t *hid_iface = (usbhid_iface_t *) iface;
+
+	if (!hid_iface->get_report_descriptor) {
+		async_answer_0(callid, ENOTSUP);
+		return;
+	}
+
+	size_t len;
+	ipc_callid_t data_callid;
+	if (!async_data_read_receive(&data_callid, &len)) {
+		async_answer_0(callid, EINVAL);
+		return;
+	}
+
+	if (len == 0) {
+		async_answer_0(data_callid, EINVAL);
+		async_answer_0(callid, EINVAL);
+		return;
+	}
+
+	uint8_t *descriptor = malloc(len);
+	if (descriptor == NULL) {
+		async_answer_0(data_callid, ENOMEM);
+		async_answer_0(callid, ENOMEM);
+		return;
+	}
+
+	size_t act_len = 0;
+	int rc = hid_iface->get_report_descriptor(fun, descriptor, len,
+	    &act_len);
+	if (act_len > len) {
+		rc = ELIMIT;
+	}
+	if (rc != EOK) {
+		free(descriptor);
+		async_answer_0(data_callid, rc);
+		async_answer_0(callid, rc);
+		return;
+	}
+
+	async_data_read_finalize(data_callid, descriptor, act_len);
+	async_answer_0(callid, EOK);
+
+	free(descriptor);
+}
+
+
 
 /**
