Index: uspace/lib/display/include/types/display/wndparams.h
===================================================================
--- uspace/lib/display/include/types/display/wndparams.h	(revision 03c80816a7b2b05b2d52bbcacb5b362122cfb329)
+++ uspace/lib/display/include/types/display/wndparams.h	(revision 9b502dd01610145805c5b392b518532d1ba9b0cf)
@@ -48,4 +48,6 @@
 	/** Bounding rectangle */
 	gfx_rect_t rect;
+	/** Minimum size (when being resized) */
+	gfx_coord2_t min_size;
 } display_wnd_params_t;
 
Index: uspace/lib/display/test/display.c
===================================================================
--- uspace/lib/display/test/display.c	(revision 03c80816a7b2b05b2d52bbcacb5b362122cfb329)
+++ uspace/lib/display/test/display.c	(revision 9b502dd01610145805c5b392b518532d1ba9b0cf)
@@ -97,4 +97,5 @@
 	bool window_create_called;
 	gfx_rect_t create_rect;
+	gfx_coord2_t create_min_size;
 	bool window_destroy_called;
 	sysarg_t destroy_wnd_id;
@@ -183,4 +184,6 @@
 	params.rect.p0.x = 100;
 	params.rect.p0.y = 100;
+	params.min_size.x = 11;
+	params.min_size.y = 12;
 
 	rc = display_window_create(disp, &params, &test_display_wnd_cb,
@@ -191,4 +194,6 @@
 	PCUT_ASSERT_EQUALS(params.rect.p1.x, resp.create_rect.p1.x);
 	PCUT_ASSERT_EQUALS(params.rect.p1.y, resp.create_rect.p1.y);
+	PCUT_ASSERT_EQUALS(params.min_size.x, resp.create_min_size.x);
+	PCUT_ASSERT_EQUALS(params.min_size.y, resp.create_min_size.y);
 	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
 	PCUT_ASSERT_NULL(wnd);
@@ -1238,4 +1243,5 @@
 	resp->window_create_called = true;
 	resp->create_rect = params->rect;
+	resp->create_min_size = params->min_size;
 	if (resp->rc == EOK)
 		*rwnd_id = resp->wnd_id;
Index: uspace/lib/gui/window.c
===================================================================
--- uspace/lib/gui/window.c	(revision 03c80816a7b2b05b2d52bbcacb5b362122cfb329)
+++ uspace/lib/gui/window.c	(revision 9b502dd01610145805c5b392b518532d1ba9b0cf)
@@ -645,4 +645,6 @@
 	wparams.rect.p1.x = 100;
 	wparams.rect.p1.y = 100;
+	wparams.min_size.x = 2 * border_thickness + header_min_width;
+	wparams.min_size.y = 2 * border_thickness + header_height;
 
 	rc = display_window_create(win->display, &wparams, &window_cb,
Index: uspace/srv/hid/display/types/display/window.h
===================================================================
--- uspace/srv/hid/display/types/display/window.h	(revision 03c80816a7b2b05b2d52bbcacb5b362122cfb329)
+++ uspace/srv/hid/display/types/display/window.h	(revision 9b502dd01610145805c5b392b518532d1ba9b0cf)
@@ -70,4 +70,6 @@
 	/** Display position */
 	gfx_coord2_t dpos;
+	/** Minimum size */
+	gfx_coord2_t min_size;
 	/** Window ID */
 	ds_wnd_id_t id;
Index: uspace/srv/hid/display/window.c
===================================================================
--- uspace/srv/hid/display/window.c	(revision 03c80816a7b2b05b2d52bbcacb5b362122cfb329)
+++ uspace/srv/hid/display/window.c	(revision 9b502dd01610145805c5b392b518532d1ba9b0cf)
@@ -43,4 +43,5 @@
 #include <io/log.h>
 #include <io/pixelmap.h>
+#include <macros.h>
 #include <stdlib.h>
 #include "client.h"
@@ -302,4 +303,5 @@
 
 	wnd->rect = params->rect;
+	wnd->min_size = params->min_size;
 	wnd->gc = gc;
 	*rgc = wnd;
@@ -750,14 +752,31 @@
     gfx_rect_t *nrect)
 {
-	*nrect = wnd->rect;
-
-	if ((wnd->rsztype & display_wr_top) != 0)
-		nrect->p0.y += dresize->y;
-	if ((wnd->rsztype & display_wr_left) != 0)
-		nrect->p0.x += dresize->x;
-	if ((wnd->rsztype & display_wr_bottom) != 0)
-		nrect->p1.y += dresize->y;
-	if ((wnd->rsztype & display_wr_right) != 0)
-		nrect->p1.x += dresize->x;
+	if ((wnd->rsztype & display_wr_top) != 0) {
+		nrect->p0.y = min(wnd->rect.p0.y + dresize->y,
+		    wnd->rect.p1.y - wnd->min_size.y);
+	} else {
+		nrect->p0.y = wnd->rect.p0.y;
+	}
+
+	if ((wnd->rsztype & display_wr_left) != 0) {
+		nrect->p0.x = min(wnd->rect.p0.x + dresize->x,
+		    wnd->rect.p1.x - wnd->min_size.x);
+	} else {
+		nrect->p0.x = wnd->rect.p0.x;
+	}
+
+	if ((wnd->rsztype & display_wr_bottom) != 0) {
+		nrect->p1.y = max(wnd->rect.p1.y + dresize->y,
+		    wnd->rect.p0.y + wnd->min_size.y);
+	} else {
+		nrect->p1.y = wnd->rect.p1.y;
+	}
+
+	if ((wnd->rsztype & display_wr_right) != 0) {
+		nrect->p1.x = max(wnd->rect.p1.x + dresize->x,
+		    wnd->rect.p0.x + wnd->min_size.x);
+	} else {
+		nrect->p1.x = wnd->rect.p1.x;
+	}
 }
 
