Index: uspace/app/layout/layout.c
===================================================================
--- uspace/app/layout/layout.c	(revision 19f60a38af814614ddf905c12dbc60cfbe9687b0)
+++ uspace/app/layout/layout.c	(revision a76ba5f310b3db71c7ee27837278d0123689f1b7)
@@ -40,4 +40,5 @@
 #include <ipc/services.h>
 #include <ipc/input.h>
+#include <io/input.h>
 #include <abi/ipc/interfaces.h>
 #include <loc.h>
@@ -52,8 +53,30 @@
 	printf(
 	    "Usage: %s\n"
-	    "\t%s list\tlists all layouts\n"
-	    "\t%s get\t displays currently set layout\n"
-	    "\t%s set <layout>\tchanges to the new layout\n",
+	    "\t%s list             lists all layouts\n"
+	    "\t%s get              displays currently set layout\n"
+	    "\t%s set <layout>     changes to the new layout\n",
 	    cmdname, cmdname, cmdname, cmdname);
+}
+
+static async_sess_t *hid_exchange_start()
+{
+	service_id_t svcid;
+	errno_t rc = loc_service_get_id(SERVICE_NAME_HID_INPUT, &svcid, 0);
+	if (rc != EOK) {
+		printf("%s: Failing to find service `%s` (%s)\n",
+		    cmdname,
+		    SERVICE_NAME_HID_INPUT,
+		    str_error(rc));
+		return NULL;
+	}
+
+	async_sess_t *sess = loc_service_connect(svcid, INTERFACE_ANY, 0);
+	if (sess == NULL) {
+		printf("%s: Failing to connect to service `%s`\n",
+		    cmdname,
+		    SERVICE_NAME_HID_INPUT);
+	}
+
+	return sess;
 }
 
@@ -75,87 +98,40 @@
 static errno_t get_layout(void)
 {
-	service_id_t svcid;
-	ipc_call_t call;
-	errno_t rc = loc_service_get_id(SERVICE_NAME_HID_INPUT, &svcid, 0);
-	if (rc != EOK) {
-		printf("%s: Failing to find service `%s`\n", cmdname, SERVICE_NAME_HID_INPUT);
-		return rc;
+	async_sess_t *sess = hid_exchange_start();
+	if (sess == NULL)
+		return EREFUSED;
+
+	char *layout_name;
+	errno_t rc = input_layout_get(sess, &layout_name);
+
+	if (rc == EOK) {
+		printf("%s\n", layout_name);
+		free(layout_name);
+	} else {
+		printf("%s: Failing to retrive keyboard layout (%s)\n",
+		    cmdname,
+		    str_error(rc));
 	}
 
-	async_sess_t *sess = loc_service_connect(svcid, INTERFACE_ANY, 0);
-	if (sess == NULL) {
-		printf("%s: Failing to connect to service `%s`\n", cmdname, SERVICE_NAME_HID_INPUT);
-		return rc;
-	}
-
-	void *layout_name = NULL;
-	async_exch_t *exch = async_exchange_begin(sess);
-	aid_t mid = async_send_0(exch, INPUT_GET_LAYOUT, &call);
-	async_wait_for(mid, &rc);
-
-	if (rc != EOK) {
-		goto error;
-	}
-
-	size_t length = ipc_get_arg1(&call);
-
-	layout_name = malloc(length * sizeof(char *));
-	if (layout_name == NULL) {
-		printf("%s: Failing to allocate memory for keyboard layout\n", cmdname);
-		rc = ENOMEM;
-		goto error;
-	}
-
-	rc = async_data_read_start(exch, layout_name, length);
-
-	if (rc == EOK) {
-		printf("%s\n", (char *)layout_name);
-	} else {
-		printf("%s: Failing to get activated keyboard layout\n (%s)\n", cmdname, str_error(rc));
-		goto error;
-	}
-
-error:
-	free(layout_name);
-	async_exchange_end(exch);
 	async_hangup(sess);
-
 	return rc;
-
 }
 
 /* changes the keyboard layout */
-static errno_t set_layout(char *layout)
+static errno_t set_layout(char *layout_name)
 {
-	service_id_t svcid;
-	ipc_call_t call;
-	errno_t rc = loc_service_get_id(SERVICE_NAME_HID_INPUT, &svcid, 0);
-	if (rc != EOK) {
-		printf("%s: Failing to find service `%s`\n", cmdname, SERVICE_NAME_HID_INPUT);
-		return rc;
-	}
+	async_sess_t *sess = hid_exchange_start();
+	if (sess == NULL)
+		return EREFUSED;
 
-	async_sess_t *sess = loc_service_connect(svcid, INTERFACE_ANY, 0);
-	if (sess == NULL) {
-		printf("%s: Failing to connect to service `%s`\n", cmdname, SERVICE_NAME_HID_INPUT);
-		return rc;
-	}
+	errno_t rc = input_layout_set(sess, layout_name);
 
-	async_exch_t *exch = async_exchange_begin(sess);
+	if (rc != EOK)
+		printf("%s: Cannot activate keyboard layout `%s`\n (%s)\n",
+		    cmdname,
+		    layout_name,
+		    str_error(rc));
 
-	aid_t mid = async_send_0(exch, INPUT_CHANGE_LAYOUT, &call);
-	rc = async_data_write_start(exch, layout, str_size(layout));
-
-	if (rc == EOK) {
-		async_wait_for(mid, &rc);
-	}
-
-	async_exchange_end(exch);
 	async_hangup(sess);
-
-	if (rc != EOK) {
-		printf("%s: Cannot activate keyboard layout `%s`\n (%s)\n", cmdname, layout, str_error(rc));
-	}
-
 	return rc;
 }
@@ -163,5 +139,8 @@
 int main(int argc, char *argv[])
 {
-	if (argc == 2) {
+	errno_t rc = EINVAL;
+	if (argc == 1) {
+		rc = EOK;
+	} else if (argc == 2) {
 		if (str_cmp(argv[1], "list") == 0) {
 			return list_layout();
@@ -176,4 +155,4 @@
 
 	print_help();
-	return 1;
+	return rc;
 }
Index: uspace/lib/c/generic/io/input.c
===================================================================
--- uspace/lib/c/generic/io/input.c	(revision 19f60a38af814614ddf905c12dbc60cfbe9687b0)
+++ uspace/lib/c/generic/io/input.c	(revision a76ba5f310b3db71c7ee27837278d0123689f1b7)
@@ -42,4 +42,5 @@
 #include <ipc/input.h>
 #include <stdlib.h>
+#include <str.h>
 
 static void input_cb_conn(ipc_call_t *icall, void *arg);
@@ -202,4 +203,65 @@
 }
 
+/**
+ * Retrieves the active keyboard layout
+ * @param sess Active session to the input server
+ * @param layout The name of the currently active layout,
+ *        needs to be freed by the caller
+ * @return EOK if sucessful or the corresponding error code.
+ *         If a failure occurs the param layout is already freed
+ */
+errno_t input_layout_get(async_sess_t *sess, char **layout)
+{
+	errno_t rc;
+	ipc_call_t call;
+	async_exch_t *exch = async_exchange_begin(sess);
+	aid_t mid = async_send_0(exch, INPUT_GET_LAYOUT, &call);
+	async_wait_for(mid, &rc);
+
+	if (rc != EOK) {
+		goto error;
+	}
+
+	size_t length = ipc_get_arg1(&call);
+
+	*layout = malloc(length * sizeof(char *));
+	if (layout == NULL) {
+		rc = ENOMEM;
+		free(*layout);
+		goto error;
+	}
+
+	rc = async_data_read_start(exch, *layout, length);
+
+	if (rc != EOK)
+		free(*layout);
+
+error:
+	async_exchange_end(exch);
+	return rc;
+}
+
+/**
+ * Changes the keyboard layout
+ * @param sess Active session to the input server
+ * @param layout The name of the layout which should be activated
+ * @return EOK if sucessful or the corresponding error code.
+ */
+errno_t input_layout_set(async_sess_t *sess, const char *layout)
+{
+	errno_t rc;
+	ipc_call_t call;
+	async_exch_t *exch = async_exchange_begin(sess);
+
+	aid_t mid = async_send_0(exch, INPUT_CHANGE_LAYOUT, &call);
+	rc = async_data_write_start(exch, layout, str_size(layout));
+
+	if (rc == EOK)
+		async_wait_for(mid, &rc);
+
+	async_exchange_end(exch);
+	return rc;
+}
+
 /** @}
  */
Index: uspace/lib/c/include/io/input.h
===================================================================
--- uspace/lib/c/include/io/input.h	(revision 19f60a38af814614ddf905c12dbc60cfbe9687b0)
+++ uspace/lib/c/include/io/input.h	(revision a76ba5f310b3db71c7ee27837278d0123689f1b7)
@@ -60,4 +60,6 @@
 extern errno_t input_activate(input_t *);
 
+extern errno_t input_layout_get(async_sess_t *sess, char **layout_name);
+extern errno_t input_layout_set(async_sess_t *sess, const char *layout_name);
 #endif
 
