Index: uspace/app/viewer/viewer.c
===================================================================
--- uspace/app/viewer/viewer.c	(revision 45208e22ecaca3517deacac9afba5d2e05986925)
+++ uspace/app/viewer/viewer.c	(revision 41e125821f2105601cd3ddb3cbd67b66b9985370)
@@ -102,14 +102,17 @@
 }
 
-static void wnd_kbd_event(ui_window_t *window, void *arg,
-    kbd_event_t *event)
-{
-	viewer_t *viewer = (viewer_t *)arg;
+/** Viewer unmodified key press.
+ *
+ * @param viewer Viewer
+ * @param event Keyboard event
+ */
+static void viewer_kbd_event_unmod(viewer_t *viewer, kbd_event_t *event)
+{
 	bool update = false;
 
-	if ((event->type == KEY_PRESS) && (event->c == 'q'))
+	if (event->key == KC_Q || event->key == KC_ESCAPE)
 		ui_quit(viewer->ui);
 
-	if ((event->type == KEY_PRESS) && (event->key == KC_PAGE_DOWN)) {
+	if (event->key == KC_PAGE_DOWN) {
 		if (viewer->imgs_current == viewer->imgs_count - 1)
 			viewer->imgs_current = 0;
@@ -120,5 +123,5 @@
 	}
 
-	if ((event->type == KEY_PRESS) && (event->key == KC_PAGE_UP)) {
+	if (event->key == KC_PAGE_UP) {
 		if (viewer->imgs_current == 0)
 			viewer->imgs_current = viewer->imgs_count - 1;
@@ -145,4 +148,37 @@
 		}
 	}
+}
+
+/** Viewer ctrl-key key press.
+ *
+ * @param viewer Viewer
+ * @param event Keyboard event
+ */
+static void viewer_kbd_event_ctrl(viewer_t *viewer, kbd_event_t *event)
+{
+	if (event->key == KC_Q)
+		ui_quit(viewer->ui);
+}
+
+/** Viewer window keyboard event.
+ *
+ * @param window UI window
+ * @param arg Argument (viewer_t *)
+ * @param event Keyboard event
+ */
+static void wnd_kbd_event(ui_window_t *window, void *arg,
+    kbd_event_t *event)
+{
+	viewer_t *viewer = (viewer_t *)arg;
+
+	if (event->type != KEY_PRESS)
+		return;
+
+	if ((event->mods & (KM_CTRL | KM_ALT | KM_SHIFT)) == 0)
+		viewer_kbd_event_unmod(viewer, event);
+
+	if ((event->mods & KM_CTRL) != 0 &&
+	    (event->mods & (KM_ALT | KM_SHIFT)) == 0)
+		viewer_kbd_event_ctrl(viewer, event);
 }
 
