Index: uspace/app/bdsh/cmds/modules/layout/entry.h
===================================================================
--- uspace/app/bdsh/cmds/modules/layout/entry.h	(revision f9edc7b0761beb45018ddf98a81d955a74a24d79)
+++ uspace/app/bdsh/cmds/modules/layout/entry.h	(revision a8171b86a3e347c9295d6837ba68846a38c0eeb5)
@@ -7,3 +7,2 @@
 
 #endif /* LAYOUT_ENTRY_H */
-
Index: uspace/app/bdsh/cmds/modules/layout/layout.c
===================================================================
--- uspace/app/bdsh/cmds/modules/layout/layout.c	(revision f9edc7b0761beb45018ddf98a81d955a74a24d79)
+++ uspace/app/bdsh/cmds/modules/layout/layout.c	(revision a8171b86a3e347c9295d6837ba68846a38c0eeb5)
@@ -30,4 +30,5 @@
 #include <stdlib.h>
 #include <str.h>
+#include <str_error.h>
 #include <dirent.h>
 #include <ipc/services.h>
@@ -46,5 +47,4 @@
 static const char *path_layouts = "/lib/layouts/";
 
-
 /* Dispays help for layout in various levels */
 void help_cmd_layout(unsigned int level)
@@ -54,9 +54,9 @@
 	if (level != HELP_SHORT) {
 		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",
-			cmdname, cmdname, cmdname, cmdname);
+		    "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",
+		    cmdname, cmdname, cmdname, cmdname);
 	}
 
@@ -102,10 +102,58 @@
 }
 
+/* displays active keyboard layout */
 static int cmd_layout_get(void)
 {
-	return CMD_FAILURE;
-}
-
-
+	service_id_t svcid;
+	ipc_call_t call;
+	errno_t rc = loc_service_get_id(SERVICE_NAME_HID_INPUT, &svcid, 0);
+	if (rc != EOK) {
+		cli_error(CL_ENOENT, "%s: Failing to find service `%s`\n", cmdname, SERVICE_NAME_HID_INPUT);
+		return CMD_FAILURE;
+	}
+
+	async_sess_t *sess = loc_service_connect(svcid, INTERFACE_ANY, 0);
+	if (sess == NULL) {
+		cli_error(CL_ENOENT, "%s: Failing to connect to service `%s`\n", cmdname, SERVICE_NAME_HID_INPUT);
+		return CMD_FAILURE;
+	}
+
+	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) {
+		cli_error(CL_ENOMEM, "%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 == EOK ? CMD_SUCCESS : CMD_FAILURE;
+
+}
+
+/* changes the keyboard layout */
 static int cmd_layout_set(char *layout)
 {
@@ -129,10 +177,15 @@
 	aid_t mid = async_send_0(exch, INPUT_CHANGE_LAYOUT, &call);
 	rc = async_data_write_start(exch, layout, str_size(layout));
-	
-	if (rc == EOK)
+
+	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 == EOK ? CMD_SUCCESS : CMD_FAILURE;
@@ -155,5 +208,5 @@
 		} else if (str_cmp(argv[1], "set") == 0 && argc == 3) {
 			return cmd_layout_set(argv[2]);
-		}	
+		}
 	}
 
@@ -161,3 +214,2 @@
 	return CMD_FAILURE;
 }
-
Index: uspace/app/bdsh/cmds/modules/layout/layout.h
===================================================================
--- uspace/app/bdsh/cmds/modules/layout/layout.h	(revision f9edc7b0761beb45018ddf98a81d955a74a24d79)
+++ uspace/app/bdsh/cmds/modules/layout/layout.h	(revision a8171b86a3e347c9295d6837ba68846a38c0eeb5)
@@ -4,5 +4,3 @@
 /* Prototypes for the layout command, excluding entry points */
 
-
 #endif /* LAYOUT_H */
-
Index: uspace/lib/c/include/ipc/input.h
===================================================================
--- uspace/lib/c/include/ipc/input.h	(revision f9edc7b0761beb45018ddf98a81d955a74a24d79)
+++ uspace/lib/c/include/ipc/input.h	(revision a8171b86a3e347c9295d6837ba68846a38c0eeb5)
@@ -40,5 +40,6 @@
 typedef enum {
 	INPUT_ACTIVATE = IPC_FIRST_USER_METHOD,
-	INPUT_CHANGE_LAYOUT
+	INPUT_CHANGE_LAYOUT,
+	INPUT_GET_LAYOUT
 } input_request_t;
 
Index: uspace/srv/hid/input/input.c
===================================================================
--- uspace/srv/hid/input/input.c	(revision f9edc7b0761beb45018ddf98a81d955a74a24d79)
+++ uspace/srv/hid/input/input.c	(revision a8171b86a3e347c9295d6837ba68846a38c0eeb5)
@@ -120,5 +120,5 @@
 	length += str_size(layout_name);
 	char *path = malloc(sizeof(char) * (length + 1));
-	
+
 	if (path == NULL) {
 		printf("%s: Error allocating layout path. Out of memory.\n", NAME);
@@ -130,5 +130,4 @@
 	str_append(path, length, layout_name);
 	str_append(path, length, suffix);
-	printf("%s\n", path);
 
 	void *handle = dlopen(path, 0);
@@ -340,4 +339,32 @@
 }
 
+/* Handler for IPC call INPUT_CHANGE_LAYOUT */
+static void client_change_layout_handler(ipc_call_t *call)
+{
+	void *layout_name;
+	errno_t ret = async_data_write_accept(&layout_name, true, 0, 0, 0, 0);
+	if (ret != EOK) {
+		async_answer_0(call, ret);
+		return;
+	}
+
+	errno_t retval = layout_load((char *)layout_name);
+	free(layout_name);
+	async_answer_0(call, retval);
+}
+
+/* Handler for IPC call INPUT_GET_LAYOUT */
+static void client_get_layout_handler(ipc_call_t *call)
+{
+	const char *layout_name = layout_active.get_name();
+	size_t length = str_size(layout_name) + 1;
+	ipc_call_t id;
+
+	async_answer_1(call, EOK, length);
+	if (async_data_read_receive(&id, NULL)) {
+		async_data_read_finalize(&id, layout_name, length);
+	}
+}
+
 /** New client connection */
 static void client_connection(ipc_call_t *icall, void *arg)
@@ -380,17 +407,10 @@
 				async_answer_0(&call, EOK);
 				break;
-			case INPUT_CHANGE_LAYOUT: {
-				void * layout_name;
-				errno_t ret = async_data_write_accept(&layout_name, true, 0, 0, 0, 0);
-				if (ret != EOK) {
-					async_answer_0(&call, ret);
-					break;
-				}
-
-				errno_t retval = layout_load((char *)layout_name);
-				free(layout_name);
-				async_answer_0(&call, retval);
+			case INPUT_CHANGE_LAYOUT:
+				client_change_layout_handler(&call);
 				break;
-			}
+			case INPUT_GET_LAYOUT:
+				client_get_layout_handler(&call);
+				break;
 			default:
 				async_answer_0(&call, EINVAL);
Index: uspace/srv/hid/input/layout/us_qwerty.c
===================================================================
--- uspace/srv/hid/input/layout/us_qwerty.c	(revision f9edc7b0761beb45018ddf98a81d955a74a24d79)
+++ uspace/srv/hid/input/layout/us_qwerty.c	(revision a8171b86a3e347c9295d6837ba68846a38c0eeb5)
@@ -68,5 +68,4 @@
 #endif
 
-
 static const char *us_qwerty_name(void)
 {
