Index: uspace/srv/test/chardev-test/doc/doxygroups.h
===================================================================
--- uspace/srv/test/chardev-test/doc/doxygroups.h	(revision 3aa24ae822ac690c08d9cd4c3f87063e2fdb547e)
+++ uspace/srv/test/chardev-test/doc/doxygroups.h	(revision 3aa24ae822ac690c08d9cd4c3f87063e2fdb547e)
@@ -0,0 +1,4 @@
+/** @addtogroup chardev-test chardev-test
+ * @ingroup srvs
+ * @brief Character device interface test service
+ */
Index: uspace/srv/test/chardev-test/main.c
===================================================================
--- uspace/srv/test/chardev-test/main.c	(revision 1edd6d0c4201fd549dcce1ac7154c0ee7d6ab4c9)
+++ uspace/srv/test/chardev-test/main.c	(revision 3aa24ae822ac690c08d9cd4c3f87063e2fdb547e)
@@ -27,4 +27,12 @@
  */
 
+/** @addtogroup chardev-test
+ * @{
+ */
+/**
+ * @file
+ * @brief Character device interface test service
+ */
+
 #include <async.h>
 #include <errno.h>
@@ -259,2 +267,6 @@
 	return EIO;
 }
+
+/**
+ * @}
+ */
Index: uspace/srv/test/ipc-test/doc/doxygroups.h
===================================================================
--- uspace/srv/test/ipc-test/doc/doxygroups.h	(revision 3aa24ae822ac690c08d9cd4c3f87063e2fdb547e)
+++ uspace/srv/test/ipc-test/doc/doxygroups.h	(revision 3aa24ae822ac690c08d9cd4c3f87063e2fdb547e)
@@ -0,0 +1,4 @@
+/** @addtogroup ipc-test ipc-test
+ * @ingroup srvs
+ * @brief IPC test service
+ */
Index: uspace/srv/test/ipc-test/main.c
===================================================================
--- uspace/srv/test/ipc-test/main.c	(revision 1edd6d0c4201fd549dcce1ac7154c0ee7d6ab4c9)
+++ uspace/srv/test/ipc-test/main.c	(revision 3aa24ae822ac690c08d9cd4c3f87063e2fdb547e)
@@ -27,7 +27,20 @@
  */
 
+/** @addtogroup ipc-test
+ * @{
+ */
+/**
+ * @file
+ * @brief IPC test service
+ *
+ * If run as an initial task, this can be used to test sharing areas
+ * backed by the ELF backend.
+ */
+
+#include <as.h>
 #include <async.h>
 #include <errno.h>
 #include <str_error.h>
+#include <io/log.h>
 #include <ipc/ipc_test.h>
 #include <ipc/services.h>
@@ -41,4 +54,132 @@
 static service_id_t svc_id;
 
+/** Object in read-only memory area that will be shared.
+ *
+ * If the server is run as an initial task, the area should be backed
+ * by ELF backend.
+ */
+static const char *ro_data = "Hello, world!";
+
+/** Object in read-write memory area that will be shared.
+ *
+ * If the server is run as an initial task, the area should be backed
+ * by ELF backend.
+ */
+static char rw_data[] = "Hello, world!";
+
+static void ipc_test_get_ro_area_size_srv(ipc_call_t *icall)
+{
+	errno_t rc;
+	as_area_info_t info;
+
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "ipc_test_get_ro_area_size_srv");
+
+	rc = as_area_get_info((void *)ro_data, &info);
+	if (rc != EOK) {
+		async_answer_0(icall, EIO);
+		log_msg(LOG_DEFAULT, LVL_ERROR, "as_area_get_info failed");
+		return;
+	}
+
+	async_answer_1(icall, EOK, info.size);
+}
+
+static void ipc_test_get_rw_area_size_srv(ipc_call_t *icall)
+{
+	errno_t rc;
+	as_area_info_t info;
+
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "ipc_test_get_rw_area_size_srv");
+
+	rc = as_area_get_info(rw_data, &info);
+	if (rc != EOK) {
+		async_answer_0(icall, EIO);
+		log_msg(LOG_DEFAULT, LVL_ERROR, "as_area_get_info failed");
+		return;
+	}
+
+	async_answer_1(icall, EOK, info.size);
+}
+
+static void ipc_test_share_in_ro_srv(ipc_call_t *icall)
+{
+	ipc_call_t call;
+	errno_t rc;
+	size_t size;
+	as_area_info_t info;
+
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "ipc_test_share_in_ro_srv");
+	if (!async_share_in_receive(&call, &size)) {
+		async_answer_0(icall, EINVAL);
+		log_msg(LOG_DEFAULT, LVL_ERROR, "share_in_receive failed");
+		return;
+	}
+
+	rc = as_area_get_info((void *)ro_data, &info);
+	if (rc != EOK) {
+		async_answer_0(icall, EINVAL);
+		log_msg(LOG_DEFAULT, LVL_ERROR, "as_area_get_info failed");
+		return;
+	}
+
+	if (size != info.size) {
+		log_msg(LOG_DEFAULT, LVL_ERROR, "size(%zu) != %zu",
+		    size, info.size);
+		async_answer_0(icall, EINVAL);
+		return;
+	}
+
+	rc = async_share_in_finalize(&call, (void *) info.start_addr,
+	    AS_AREA_READ);
+	if (rc != EOK) {
+		log_msg(LOG_DEFAULT, LVL_ERROR,
+		    " - async_share_in_finalize failed");
+		async_answer_0(icall, EINVAL);
+		return;
+	}
+
+	async_answer_0(icall, EOK);
+}
+
+static void ipc_test_share_in_rw_srv(ipc_call_t *icall)
+{
+	ipc_call_t call;
+	errno_t rc;
+	size_t size;
+	as_area_info_t info;
+
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "ipc_test_share_in_ro_srv");
+	if (!async_share_in_receive(&call, &size)) {
+		async_answer_0(icall, EINVAL);
+		log_msg(LOG_DEFAULT, LVL_ERROR, "share_in_receive failed");
+		return;
+	}
+
+	rc = as_area_get_info(rw_data, &info);
+	if (rc != EOK) {
+		async_answer_0(icall, EINVAL);
+		log_msg(LOG_DEFAULT, LVL_ERROR, "as_area_get_info failed");
+		return;
+	}
+
+	if (size != info.size) {
+		log_msg(LOG_DEFAULT, LVL_ERROR, " size(%zu) != %zu",
+		    size, info.size);
+		async_answer_0(icall, EINVAL);
+		return;
+	}
+
+	rc = async_share_in_finalize(&call, (void *) info.start_addr,
+	    AS_AREA_READ | AS_AREA_WRITE);
+	if (rc != EOK) {
+		log_msg(LOG_DEFAULT, LVL_ERROR,
+		    "async_share_in_finalize failed");
+		async_answer_0(icall, EINVAL);
+		return;
+	}
+
+	async_answer_0(icall, EOK);
+}
+
 static void ipc_test_connection(ipc_call_t *icall, void *arg)
 {
@@ -59,4 +200,16 @@
 			async_answer_0(&call, EOK);
 			break;
+		case IPC_TEST_GET_RO_AREA_SIZE:
+			ipc_test_get_ro_area_size_srv(&call);
+			break;
+		case IPC_TEST_GET_RW_AREA_SIZE:
+			ipc_test_get_rw_area_size_srv(&call);
+			break;
+		case IPC_TEST_SHARE_IN_RO:
+			ipc_test_share_in_ro_srv(&call);
+			break;
+		case IPC_TEST_SHARE_IN_RW:
+			ipc_test_share_in_rw_srv(&call);
+			break;
 		default:
 			async_answer_0(&call, ENOTSUP);
@@ -73,7 +226,13 @@
 	async_set_fallback_port_handler(ipc_test_connection, NULL);
 
+	rc = log_init(NAME);
+	if (rc != EOK) {
+		printf(NAME ": Failed to initialize log.\n");
+		return rc;
+	}
+
 	rc = loc_server_register(NAME);
 	if (rc != EOK) {
-		printf("%s: Failed registering server. (%s)\n", NAME,
+		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server. (%s)\n",
 		    str_error(rc));
 		return rc;
@@ -82,5 +241,5 @@
 	rc = loc_service_register(SERVICE_NAME_IPC_TEST, &svc_id);
 	if (rc != EOK) {
-		printf("%s: Failed registering service. (%s)\n", NAME,
+		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service. (%s)\n",
 		    str_error(rc));
 		return rc;
@@ -94,2 +253,6 @@
 	return 0;
 }
+
+/**
+ * @}
+ */
