Index: uspace/lib/display/src/disp_srv.c
===================================================================
--- uspace/lib/display/src/disp_srv.c	(revision 552b69f240ec8edc47b2b988d0b23e54621bbde0)
+++ uspace/lib/display/src/disp_srv.c	(revision 03fc3a9bf3639c419bd0eab4618ffe992633e9c8)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2021 Jiri Svoboda
+ * Copyright (c) 2022 Jiri Svoboda
  * All rights reserved.
  *
@@ -230,4 +230,48 @@
 }
 
+static void display_window_get_max_rect_srv(display_srv_t *srv,
+    ipc_call_t *icall)
+{
+	sysarg_t wnd_id;
+	ipc_call_t call;
+	gfx_rect_t rect;
+	size_t size;
+	errno_t rc;
+
+	wnd_id = ipc_get_arg1(icall);
+
+	if (srv->ops->window_get_max_rect == NULL) {
+		async_answer_0(icall, ENOTSUP);
+		return;
+	}
+
+	if (!async_data_read_receive(&call, &size)) {
+		async_answer_0(icall, EREFUSED);
+		return;
+	}
+
+	rc = srv->ops->window_get_max_rect(srv->arg, wnd_id, &rect);
+	if (rc != EOK) {
+		async_answer_0(&call, rc);
+		async_answer_0(icall, rc);
+		return;
+	}
+
+	if (size != sizeof(gfx_rect_t)) {
+		async_answer_0(&call, EINVAL);
+		async_answer_0(icall, EINVAL);
+		return;
+	}
+
+	rc = async_data_read_finalize(&call, &rect, size);
+	if (rc != EOK) {
+		async_answer_0(&call, rc);
+		async_answer_0(icall, rc);
+		return;
+	}
+
+	async_answer_0(icall, EOK);
+}
+
 static void display_window_resize_req_srv(display_srv_t *srv, ipc_call_t *icall)
 {
@@ -306,4 +350,36 @@
 	rc = srv->ops->window_resize(srv->arg, wnd_id, &wresize.offs,
 	    &wresize.nrect);
+	async_answer_0(icall, rc);
+}
+
+static void display_window_maximize_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_maximize == NULL) {
+		async_answer_0(icall, ENOTSUP);
+		return;
+	}
+
+	rc = srv->ops->window_maximize(srv->arg, wnd_id);
+	async_answer_0(icall, rc);
+}
+
+static void display_window_unmaximize_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_unmaximize == NULL) {
+		async_answer_0(icall, ENOTSUP);
+		return;
+	}
+
+	rc = srv->ops->window_unmaximize(srv->arg, wnd_id);
 	async_answer_0(icall, rc);
 }
@@ -445,4 +521,7 @@
 			display_window_get_pos_srv(srv, &call);
 			break;
+		case DISPLAY_WINDOW_GET_MAX_RECT:
+			display_window_get_max_rect_srv(srv, &call);
+			break;
 		case DISPLAY_WINDOW_RESIZE_REQ:
 			display_window_resize_req_srv(srv, &call);
@@ -450,4 +529,10 @@
 		case DISPLAY_WINDOW_RESIZE:
 			display_window_resize_srv(srv, &call);
+			break;
+		case DISPLAY_WINDOW_MAXIMIZE:
+			display_window_maximize_srv(srv, &call);
+			break;
+		case DISPLAY_WINDOW_UNMAXIMIZE:
+			display_window_unmaximize_srv(srv, &call);
 			break;
 		case DISPLAY_WINDOW_SET_CURSOR:
Index: uspace/lib/display/src/display.c
===================================================================
--- uspace/lib/display/src/display.c	(revision 552b69f240ec8edc47b2b988d0b23e54621bbde0)
+++ uspace/lib/display/src/display.c	(revision 03fc3a9bf3639c419bd0eab4618ffe992633e9c8)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2021 Jiri Svoboda
+ * Copyright (c) 2022 Jiri Svoboda
  * All rights reserved.
  *
@@ -350,4 +350,36 @@
 }
 
+/** Get display window maximized rectangle.
+ *
+ * Get the rectangle to which a window would be maximized.
+ *
+ * @param window Window
+ * @param rect Place to store maximized rectangle
+ * @return EOK on success or an error code
+ */
+errno_t display_window_get_max_rect(display_window_t *window, gfx_rect_t *rect)
+{
+	async_exch_t *exch;
+	aid_t req;
+	ipc_call_t answer;
+	errno_t rc;
+
+	exch = async_exchange_begin(window->display->sess);
+	req = async_send_1(exch, DISPLAY_WINDOW_GET_MAX_RECT, window->id,
+	    &answer);
+	rc = async_data_read_start(exch, rect, sizeof (gfx_rect_t));
+	async_exchange_end(exch);
+	if (rc != EOK) {
+		async_forget(req);
+		return rc;
+	}
+
+	async_wait_for(req, &rc);
+	if (rc != EOK)
+		return rc;
+
+	return EOK;
+}
+
 /** Request a window resize.
  *
@@ -453,4 +485,38 @@
 
 	return EOK;
+}
+
+/** Maximize window.
+ *
+ * @param window Window
+ * @return EOK on success or an error code
+ */
+errno_t display_window_maximize(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_MAXIMIZE, window->id);
+	async_exchange_end(exch);
+
+	return rc;
+}
+
+/** Unmaximize window.
+ *
+ * @param window Window
+ * @return EOK on success or an error code
+ */
+errno_t display_window_unmaximize(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_UNMAXIMIZE, window->id);
+	async_exchange_end(exch);
+
+	return rc;
 }
 
