Index: uspace/lib/display/include/disp_srv.h
===================================================================
--- uspace/lib/display/include/disp_srv.h	(revision 29a5a9917c778c2ef39d5fcb7843fcf719c4409e)
+++ uspace/lib/display/include/disp_srv.h	(revision df54aa85251aae893ebd928df03d3714b25ea049)
@@ -64,4 +64,5 @@
 	errno_t (*window_get_max_rect)(void *, sysarg_t, gfx_rect_t *);
 	errno_t (*window_resize)(void *, sysarg_t, gfx_coord2_t *, gfx_rect_t *);
+	errno_t (*window_minimize)(void *, sysarg_t);
 	errno_t (*window_maximize)(void *, sysarg_t);
 	errno_t (*window_unmaximize)(void *, sysarg_t);
Index: uspace/lib/display/include/display.h
===================================================================
--- uspace/lib/display/include/display.h	(revision 29a5a9917c778c2ef39d5fcb7843fcf719c4409e)
+++ uspace/lib/display/include/display.h	(revision df54aa85251aae893ebd928df03d3714b25ea049)
@@ -62,4 +62,5 @@
 extern errno_t display_window_resize(display_window_t *,
     gfx_coord2_t *, gfx_rect_t *);
+extern errno_t display_window_minimize(display_window_t *);
 extern errno_t display_window_maximize(display_window_t *);
 extern errno_t display_window_unmaximize(display_window_t *);
Index: uspace/lib/display/include/ipc/display.h
===================================================================
--- uspace/lib/display/include/ipc/display.h	(revision 29a5a9917c778c2ef39d5fcb7843fcf719c4409e)
+++ uspace/lib/display/include/ipc/display.h	(revision df54aa85251aae893ebd928df03d3714b25ea049)
@@ -42,4 +42,5 @@
 	DISPLAY_WINDOW_CREATE,
 	DISPLAY_WINDOW_DESTROY,
+	DISPLAY_WINDOW_MINIMIZE,
 	DISPLAY_WINDOW_MAXIMIZE,
 	DISPLAY_WINDOW_MOVE,
Index: uspace/lib/display/include/types/display/wndparams.h
===================================================================
--- uspace/lib/display/include/types/display/wndparams.h	(revision 29a5a9917c778c2ef39d5fcb7843fcf719c4409e)
+++ uspace/lib/display/include/types/display/wndparams.h	(revision df54aa85251aae893ebd928df03d3714b25ea049)
@@ -46,10 +46,12 @@
 	/** Set specific initial window position */
 	wndf_setpos = 0x4,
+	/** Window is minimized */
+	wndf_minimized = 0x8,
 	/** Window is maximized */
-	wndf_maximized = 0x8,
+	wndf_maximized = 0x10,
 	/** Special system window */
-	wndf_system = 0x10,
+	wndf_system = 0x20,
 	/** Maximized windows should avoid this window */
-	wndf_avoid = 0x20
+	wndf_avoid = 0x40
 } display_wnd_flags_t;
 
Index: uspace/lib/display/src/disp_srv.c
===================================================================
--- uspace/lib/display/src/disp_srv.c	(revision 29a5a9917c778c2ef39d5fcb7843fcf719c4409e)
+++ uspace/lib/display/src/disp_srv.c	(revision df54aa85251aae893ebd928df03d3714b25ea049)
@@ -391,4 +391,20 @@
 }
 
+static void display_window_minimize_srv(display_srv_t *srv, ipc_call_t *icall)
+{
+	sysarg_t wnd_id;
+	errno_t rc;
+
+	wnd_id = ipc_get_arg1(icall);
+
+	if (srv->ops->window_minimize == NULL) {
+		async_answer_0(icall, ENOTSUP);
+		return;
+	}
+
+	rc = srv->ops->window_minimize(srv->arg, wnd_id);
+	async_answer_0(icall, rc);
+}
+
 static void display_window_maximize_srv(display_srv_t *srv, ipc_call_t *icall)
 {
@@ -610,4 +626,7 @@
 		case DISPLAY_WINDOW_RESIZE:
 			display_window_resize_srv(srv, &call);
+			break;
+		case DISPLAY_WINDOW_MINIMIZE:
+			display_window_minimize_srv(srv, &call);
 			break;
 		case DISPLAY_WINDOW_MAXIMIZE:
Index: uspace/lib/display/src/display.c
===================================================================
--- uspace/lib/display/src/display.c	(revision 29a5a9917c778c2ef39d5fcb7843fcf719c4409e)
+++ uspace/lib/display/src/display.c	(revision df54aa85251aae893ebd928df03d3714b25ea049)
@@ -508,4 +508,21 @@
 
 	return EOK;
+}
+
+/** Minimize window.
+ *
+ * @param window Window
+ * @return EOK on success or an error code
+ */
+errno_t display_window_minimize(display_window_t *window)
+{
+	async_exch_t *exch;
+	errno_t rc;
+
+	exch = async_exchange_begin(window->display->sess);
+	rc = async_req_1_0(exch, DISPLAY_WINDOW_MINIMIZE, window->id);
+	async_exchange_end(exch);
+
+	return rc;
 }
 
Index: uspace/lib/display/test/display.c
===================================================================
--- uspace/lib/display/test/display.c	(revision 29a5a9917c778c2ef39d5fcb7843fcf719c4409e)
+++ uspace/lib/display/test/display.c	(revision df54aa85251aae893ebd928df03d3714b25ea049)
@@ -66,4 +66,5 @@
 static errno_t test_window_resize(void *, sysarg_t, gfx_coord2_t *,
     gfx_rect_t *);
+static errno_t test_window_minimize(void *, sysarg_t);
 static errno_t test_window_maximize(void *, sysarg_t);
 static errno_t test_window_unmaximize(void *, sysarg_t);
@@ -84,4 +85,5 @@
 	.window_resize_req = test_window_resize_req,
 	.window_resize = test_window_resize,
+	.window_minimize = test_window_minimize,
 	.window_maximize = test_window_maximize,
 	.window_unmaximize = test_window_unmaximize,
@@ -145,4 +147,5 @@
 	sysarg_t resize_wnd_id;
 
+	bool window_minimize_called;
 	bool window_maximize_called;
 	bool window_unmaximize_called;
@@ -1050,4 +1053,100 @@
 	PCUT_ASSERT_INT_EQUALS(nrect.p1.x, resp.resize_nbound.p1.x);
 	PCUT_ASSERT_INT_EQUALS(nrect.p1.y, resp.resize_nbound.p1.y);
+
+	display_window_destroy(wnd);
+	display_close(disp);
+	rc = loc_service_unregister(sid);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
+/** display_window_minimize() with server returning error response works. */
+PCUT_TEST(window_minimize_failure)
+{
+	errno_t rc;
+	service_id_t sid;
+	display_t *disp = NULL;
+	display_wnd_params_t params;
+	display_window_t *wnd;
+	test_response_t resp;
+
+	async_set_fallback_port_handler(test_display_conn, &resp);
+
+	// FIXME This causes this test to be non-reentrant!
+	rc = loc_server_register(test_display_server);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = loc_service_register(test_display_svc, &sid);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = display_open(test_display_svc, &disp);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(disp);
+
+	resp.rc = EOK;
+	display_wnd_params_init(&params);
+	params.rect.p0.x = 0;
+	params.rect.p0.y = 0;
+	params.rect.p0.x = 100;
+	params.rect.p0.y = 100;
+
+	rc = display_window_create(disp, &params, &test_display_wnd_cb,
+	    (void *) &resp, &wnd);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(wnd);
+
+	resp.rc = EIO;
+	resp.window_minimize_called = false;
+
+	rc = display_window_minimize(wnd);
+	PCUT_ASSERT_TRUE(resp.window_minimize_called);
+	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
+
+	display_window_destroy(wnd);
+	display_close(disp);
+	rc = loc_service_unregister(sid);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
+/** display_window_minimize() with server returning success response works. */
+PCUT_TEST(window_minimize_success)
+{
+	errno_t rc;
+	service_id_t sid;
+	display_t *disp = NULL;
+	display_wnd_params_t params;
+	display_window_t *wnd;
+	test_response_t resp;
+
+	async_set_fallback_port_handler(test_display_conn, &resp);
+
+	// FIXME This causes this test to be non-reentrant!
+	rc = loc_server_register(test_display_server);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = loc_service_register(test_display_svc, &sid);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = display_open(test_display_svc, &disp);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(disp);
+
+	resp.rc = EOK;
+	display_wnd_params_init(&params);
+	params.rect.p0.x = 0;
+	params.rect.p0.y = 0;
+	params.rect.p0.x = 100;
+	params.rect.p0.y = 100;
+
+	rc = display_window_create(disp, &params, &test_display_wnd_cb,
+	    (void *) &resp, &wnd);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(wnd);
+
+	resp.rc = EOK;
+	resp.window_minimize_called = false;
+
+	rc = display_window_minimize(wnd);
+	PCUT_ASSERT_TRUE(resp.window_minimize_called);
+	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
 
 	display_window_destroy(wnd);
@@ -2103,4 +2202,13 @@
 }
 
+static errno_t test_window_minimize(void *arg, sysarg_t wnd_id)
+{
+	test_response_t *resp = (test_response_t *) arg;
+
+	resp->window_minimize_called = true;
+	resp->resize_wnd_id = wnd_id;
+	return resp->rc;
+}
+
 static errno_t test_window_maximize(void *arg, sysarg_t wnd_id)
 {
