Index: uspace/lib/display/include/types/display/wndparams.h
===================================================================
--- uspace/lib/display/include/types/display/wndparams.h	(revision d8ddf7a17eaf0cf4fee87a5efb1faca4bb6562b2)
+++ uspace/lib/display/include/types/display/wndparams.h	(revision 554a5f13c2cf8a985e4fe7d3cbeac4597ef4033f)
@@ -41,5 +41,5 @@
  *
  * The window's dimensions are determined by the bounding rectangle,
- * the position of which does not relate to its positon on the display,
+ * the position of which does not relate to its position on the display,
  * it just determines which range of logical coordinates is used
  * by the window.
Index: uspace/lib/ui/include/types/ui/cursor.h
===================================================================
--- uspace/lib/ui/include/types/ui/cursor.h	(revision 554a5f13c2cf8a985e4fe7d3cbeac4597ef4033f)
+++ uspace/lib/ui/include/types/ui/cursor.h	(revision 554a5f13c2cf8a985e4fe7d3cbeac4597ef4033f)
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2020 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup libui
+ * @{
+ */
+/** @file
+ */
+
+#ifndef _LIBUI_TYPES_CURSOR_H_
+#define _LIBUI_TYPES_CURSOR_H_
+
+/** Stock cursor types */
+typedef enum {
+	/** Standard arrow */
+	ui_curs_arrow,
+	/** Double arrow pointing up and down */
+	ui_curs_size_ud,
+	/** Double arrow pointing left and right */
+	ui_curs_size_lr,
+	/** Double arrow pointing up-left and down-right */
+	ui_curs_size_uldr,
+	/** Double arrow pointing up-right nad down-left */
+	ui_curs_size_urdl
+} ui_stock_cursor_t;
+
+enum {
+	/** Number of stock cursor types */
+	ui_curs_limit = ui_curs_size_urdl + 1
+};
+
+#endif
+
+/** @}
+ */
Index: uspace/lib/ui/include/types/ui/wdecor.h
===================================================================
--- uspace/lib/ui/include/types/ui/wdecor.h	(revision d8ddf7a17eaf0cf4fee87a5efb1faca4bb6562b2)
+++ uspace/lib/ui/include/types/ui/wdecor.h	(revision 554a5f13c2cf8a985e4fe7d3cbeac4597ef4033f)
@@ -38,7 +38,29 @@
 
 #include <gfx/coord.h>
+#include <types/ui/cursor.h>
 
 struct ui_wdecor;
 typedef struct ui_wdecor ui_wdecor_t;
+
+/** Window decoration style */
+typedef enum {
+	ui_wds_none = 0x0,
+	ui_wds_resizable = 0x1
+} ui_wdecor_style_t;
+
+/** Window resize type */
+typedef enum {
+	ui_wr_none = 0,
+
+	ui_wr_top = 0x1,
+	ui_wr_left = 0x2,
+	ui_wr_bottom = 0x4,
+	ui_wr_right = 0x8,
+
+	ui_wr_top_left = ui_wr_top | ui_wr_left,
+	ui_wr_bottom_left = ui_wr_bottom | ui_wr_left,
+	ui_wr_bottom_right = ui_wr_bottom | ui_wr_right,
+	ui_wr_top_right = ui_wr_top | ui_wr_right
+} ui_wdecor_rsztype_t;
 
 /** Window decoration callbacks */
@@ -46,4 +68,7 @@
 	void (*close)(ui_wdecor_t *, void *);
 	void (*move)(ui_wdecor_t *, void *, gfx_coord2_t *);
+	void (*resize)(ui_wdecor_t *, void *, ui_wdecor_rsztype_t,
+	    gfx_coord2_t *);
+	void (*set_cursor)(ui_wdecor_t *, void *, ui_stock_cursor_t);
 } ui_wdecor_cb_t;
 
Index: uspace/lib/ui/include/types/ui/window.h
===================================================================
--- uspace/lib/ui/include/types/ui/window.h	(revision d8ddf7a17eaf0cf4fee87a5efb1faca4bb6562b2)
+++ uspace/lib/ui/include/types/ui/window.h	(revision 554a5f13c2cf8a985e4fe7d3cbeac4597ef4033f)
@@ -40,4 +40,5 @@
 #include <io/kbd_event.h>
 #include <io/pos_event.h>
+#include <types/ui/wdecor.h>
 
 struct ui_window;
@@ -64,4 +65,6 @@
 	/** Window caption */
 	const char *caption;
+	/** Window decoration style */
+	ui_wdecor_style_t style;
 	/** Window placement */
 	ui_wnd_placement_t placement;
Index: uspace/lib/ui/include/ui/wdecor.h
===================================================================
--- uspace/lib/ui/include/ui/wdecor.h	(revision d8ddf7a17eaf0cf4fee87a5efb1faca4bb6562b2)
+++ uspace/lib/ui/include/ui/wdecor.h	(revision 554a5f13c2cf8a985e4fe7d3cbeac4597ef4033f)
@@ -45,5 +45,5 @@
 
 extern errno_t ui_wdecor_create(ui_resource_t *, const char *,
-    ui_wdecor_t **);
+    ui_wdecor_style_t, ui_wdecor_t **);
 extern void ui_wdecor_destroy(ui_wdecor_t *);
 extern void ui_wdecor_set_cb(ui_wdecor_t *, ui_wdecor_cb_t *, void *);
Index: uspace/lib/ui/private/wdecor.h
===================================================================
--- uspace/lib/ui/private/wdecor.h	(revision d8ddf7a17eaf0cf4fee87a5efb1faca4bb6562b2)
+++ uspace/lib/ui/private/wdecor.h	(revision 554a5f13c2cf8a985e4fe7d3cbeac4597ef4033f)
@@ -39,5 +39,7 @@
 
 #include <gfx/coord.h>
+#include <io/pos_event.h>
 #include <stdbool.h>
+#include <types/ui/cursor.h>
 #include <types/ui/wdecor.h>
 
@@ -55,4 +57,6 @@
 	/** Window decoration rectangle */
 	gfx_rect_t rect;
+	/** Style */
+	ui_wdecor_style_t style;
 	/** Caption */
 	char *caption;
@@ -80,5 +84,12 @@
 extern void ui_wdecor_close(ui_wdecor_t *);
 extern void ui_wdecor_move(ui_wdecor_t *, gfx_coord2_t *);
+extern void ui_wdecor_resize(ui_wdecor_t *, ui_wdecor_rsztype_t,
+    gfx_coord2_t *);
+extern void ui_wdecor_set_cursor(ui_wdecor_t *, ui_stock_cursor_t);
 extern void ui_wdecor_get_geom(ui_wdecor_t *, ui_wdecor_geom_t *);
+extern void ui_wdecor_frame_pos_event(ui_wdecor_t *, pos_event_t *);
+extern ui_wdecor_rsztype_t ui_wdecor_get_rsztype(ui_wdecor_t *,
+    gfx_coord2_t *);
+extern ui_stock_cursor_t ui_wdecor_cursor_from_rsztype(ui_wdecor_rsztype_t);
 
 #endif
Index: uspace/lib/ui/private/window.h
===================================================================
--- uspace/lib/ui/private/window.h	(revision d8ddf7a17eaf0cf4fee87a5efb1faca4bb6562b2)
+++ uspace/lib/ui/private/window.h	(revision 554a5f13c2cf8a985e4fe7d3cbeac4597ef4033f)
@@ -59,4 +59,6 @@
 	/** Window GC */
 	gfx_context_t *gc;
+	/** Window rectangle */
+	gfx_rect_t rect;
 	/** Application area bitmap */
 	gfx_bitmap_t *app_bmp;
@@ -69,4 +71,6 @@
 	/** Top-level control in the application area */
 	struct ui_control *control;
+	/** Current cursor */
+	ui_stock_cursor_t cursor;
 };
 
Index: uspace/lib/ui/src/wdecor.c
===================================================================
--- uspace/lib/ui/src/wdecor.c	(revision d8ddf7a17eaf0cf4fee87a5efb1faca4bb6562b2)
+++ uspace/lib/ui/src/wdecor.c	(revision 554a5f13c2cf8a985e4fe7d3cbeac4597ef4033f)
@@ -34,4 +34,5 @@
  */
 
+#include <assert.h>
 #include <errno.h>
 #include <gfx/color.h>
@@ -54,13 +55,21 @@
 };
 
+enum {
+	wdecor_corner_w = 24,
+	wdecor_corner_h = 24,
+	wdecor_edge_w = 4,
+	wdecor_edge_h = 4
+};
+
 /** Create new window decoration.
  *
  * @param resource UI resource
  * @param caption Window caption
+ * @param style Style
  * @param rwdecor Place to store pointer to new window decoration
  * @return EOK on success, ENOMEM if out of memory
  */
 errno_t ui_wdecor_create(ui_resource_t *resource, const char *caption,
-    ui_wdecor_t **rwdecor)
+    ui_wdecor_style_t style, ui_wdecor_t **rwdecor)
 {
 	ui_wdecor_t *wdecor;
@@ -89,4 +98,5 @@
 	wdecor->res = resource;
 	wdecor->active = true;
+	wdecor->style = style;
 	*rwdecor = wdecor;
 	return EOK;
@@ -244,4 +254,28 @@
 }
 
+/** Send decoration resize event.
+ *
+ * @param wdecor Window decoration
+ * @param rsztype Resize type
+ * @param pos Position where the button was pressed
+ */
+void ui_wdecor_resize(ui_wdecor_t *wdecor, ui_wdecor_rsztype_t rsztype,
+    gfx_coord2_t *pos)
+{
+	if (wdecor->cb != NULL && wdecor->cb->resize != NULL)
+		wdecor->cb->resize(wdecor, wdecor->arg, rsztype, pos);
+}
+
+/** Send cursor change event.
+ *
+ * @param wdecor Window decoration
+ * @param cursor Cursor
+ */
+void ui_wdecor_set_cursor(ui_wdecor_t *wdecor, ui_stock_cursor_t cursor)
+{
+	if (wdecor->cb != NULL && wdecor->cb->set_cursor != NULL)
+		wdecor->cb->set_cursor(wdecor, wdecor->arg, cursor);
+}
+
 /** Get window decoration geometry.
  *
@@ -287,4 +321,138 @@
 }
 
+/** Get resize type for pointer at the specified position.
+ *
+ * @param wdecor Window decoration
+ * @param pos Pointer position
+ * @return Resize type
+ */
+ui_wdecor_rsztype_t ui_wdecor_get_rsztype(ui_wdecor_t *wdecor,
+    gfx_coord2_t *pos)
+{
+	bool eleft, eright;
+	bool etop, ebottom;
+	bool edge;
+	bool cleft, cright;
+	bool ctop, cbottom;
+
+	/* Window not resizable? */
+	if ((wdecor->style & ui_wds_resizable) == 0)
+		return ui_wr_none;
+
+	/* Position not inside window? */
+	if (!gfx_pix_inside_rect(pos, &wdecor->rect))
+		return ui_wr_none;
+
+	/* Position is within edge width from the outside */
+	eleft = (pos->x < wdecor->rect.p0.x + wdecor_edge_w);
+	eright = (pos->x >= wdecor->rect.p1.x - wdecor_edge_w);
+	etop = (pos->y < wdecor->rect.p0.y + wdecor_edge_h);
+	ebottom = (pos->y >= wdecor->rect.p1.y - wdecor_edge_h);
+
+	/* Position is on one of the four edges */
+	edge = eleft || eright || etop || ebottom;
+
+	/* Position is within resize-corner distance from the outside */
+	cleft = (pos->x < wdecor->rect.p0.x + wdecor_corner_w);
+	cright = (pos->x >= wdecor->rect.p1.x - wdecor_corner_w);
+	ctop = (pos->y < wdecor->rect.p0.y + wdecor_corner_h);
+	cbottom = (pos->y >= wdecor->rect.p1.y - wdecor_corner_h);
+
+	/* Top-left corner */
+	if (edge && cleft && ctop)
+		return ui_wr_top_left;
+
+	/* Top-right corner */
+	if (edge && cright && ctop)
+		return ui_wr_top_right;
+
+	/* Bottom-left corner */
+	if (edge && cleft && cbottom)
+		return ui_wr_bottom_left;
+
+	/* Bottom-right corner */
+	if (edge && cright && cbottom)
+		return ui_wr_bottom_right;
+
+	/* Left edge */
+	if (eleft)
+		return ui_wr_left;
+
+	/* Right edge */
+	if (eright)
+		return ui_wr_right;
+
+	/* Top edge */
+	if (etop)
+		return ui_wr_top;
+
+	/* Bottom edge */
+	if (ebottom)
+		return ui_wr_bottom;
+
+	return ui_wr_none;
+}
+
+/** Get stock cursor to use for the specified window resize type.
+ *
+ * The resize type must be valid, otherwise behavior is undefined.
+ *
+ * @param rsztype Resize type
+ * @return Cursor to use for this resize type
+ */
+ui_stock_cursor_t ui_wdecor_cursor_from_rsztype(ui_wdecor_rsztype_t rsztype)
+{
+	switch (rsztype) {
+	case ui_wr_none:
+		return ui_curs_arrow;
+
+	case ui_wr_top:
+	case ui_wr_bottom:
+		return ui_curs_size_ud;
+
+	case ui_wr_left:
+	case ui_wr_right:
+		return ui_curs_size_lr;
+
+	case ui_wr_top_left:
+	case ui_wr_bottom_right:
+		return ui_curs_size_uldr;
+
+	case ui_wr_top_right:
+	case ui_wr_bottom_left:
+		return ui_curs_size_urdl;
+
+	default:
+		assert(false);
+		return ui_curs_arrow;
+	}
+}
+
+/** Handle window frame position event.
+ *
+ * @param wdecor Window decoration
+ * @param pos_event Position event
+ */
+void ui_wdecor_frame_pos_event(ui_wdecor_t *wdecor, pos_event_t *event)
+{
+	gfx_coord2_t pos;
+	ui_wdecor_rsztype_t rsztype;
+	ui_stock_cursor_t cursor;
+
+	pos.x = event->hpos;
+	pos.y = event->vpos;
+
+	/* Set appropriate resizing cursor, or set arrow cursor */
+
+	rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
+	cursor = ui_wdecor_cursor_from_rsztype(rsztype);
+
+	ui_wdecor_set_cursor(wdecor, cursor);
+
+	/* Press on window border? */
+	if (rsztype != ui_wr_none && event->type == POS_PRESS)
+		ui_wdecor_resize(wdecor, rsztype, &pos);
+}
+
 /** Handle window decoration position event.
  *
@@ -307,4 +475,6 @@
 		return;
 
+	ui_wdecor_frame_pos_event(wdecor, event);
+
 	if (event->type == POS_PRESS &&
 	    gfx_pix_inside_rect(&pos, &geom.title_bar_rect))
Index: uspace/lib/ui/src/window.c
===================================================================
--- uspace/lib/ui/src/window.c	(revision d8ddf7a17eaf0cf4fee87a5efb1faca4bb6562b2)
+++ uspace/lib/ui/src/window.c	(revision 554a5f13c2cf8a985e4fe7d3cbeac4597ef4033f)
@@ -59,4 +59,5 @@
 static void dwnd_kbd_event(void *, kbd_event_t *);
 static void dwnd_pos_event(void *, pos_event_t *);
+static void dwnd_resize_event(void *, gfx_rect_t *);
 static void dwnd_unfocus_event(void *);
 
@@ -66,4 +67,5 @@
 	.kbd_event = dwnd_kbd_event,
 	.pos_event = dwnd_pos_event,
+	.resize_event = dwnd_resize_event,
 	.unfocus_event = dwnd_unfocus_event
 };
@@ -71,8 +73,13 @@
 static void wd_close(ui_wdecor_t *, void *);
 static void wd_move(ui_wdecor_t *, void *, gfx_coord2_t *);
+static void wd_resize(ui_wdecor_t *, void *, ui_wdecor_rsztype_t,
+    gfx_coord2_t *);
+static void wd_set_cursor(ui_wdecor_t *, void *, ui_stock_cursor_t);
 
 static ui_wdecor_cb_t wdecor_cb = {
 	.close = wd_close,
-	.move = wd_move
+	.move = wd_move,
+	.resize = wd_resize,
+	.set_cursor = wd_set_cursor
 };
 
@@ -118,4 +125,6 @@
 	display_wnd_params_init(&dparams);
 	dparams.rect = params->rect;
+	/* Only allow making the window larger */
+	gfx_rect_dims(&params->rect, &dparams.min_size);
 
 	if (ui->display != NULL) {
@@ -175,5 +184,5 @@
 		goto error;
 
-	rc = ui_wdecor_create(res, params->caption, &wdecor);
+	rc = ui_wdecor_create(res, params->caption, params->style, &wdecor);
 	if (rc != EOK)
 		goto error;
@@ -185,7 +194,9 @@
 	window->ui = ui;
 	window->dwindow = dwindow;
+	window->rect = params->rect;
 	window->gc = gc;
 	window->res = res;
 	window->wdecor = wdecor;
+	window->cursor = ui_curs_arrow;
 	*rwindow = window;
 	return EOK;
@@ -435,4 +446,20 @@
 }
 
+/** Handle window resize event */
+static void dwnd_resize_event(void *arg, gfx_rect_t *rect)
+{
+	ui_window_t *window = (ui_window_t *) arg;
+
+	/* Make sure we don't process events until fully initialized */
+	if (window->wdecor == NULL)
+		return;
+
+	if ((window->wdecor->style & ui_wds_resizable) == 0)
+		return;
+
+	(void) ui_window_resize(window, rect);
+	(void) ui_window_paint(window);
+}
+
 /** Handle window unfocus event. */
 static void dwnd_unfocus_event(void *arg)
@@ -451,5 +478,5 @@
  *
  * @param wdecor Window decoration
- * @param arg Argument (demo)
+ * @param arg Argument (window)
  */
 static void wd_close(ui_wdecor_t *wdecor, void *arg)
@@ -463,5 +490,5 @@
  *
  * @param wdecor Window decoration
- * @param arg Argument (demo)
+ * @param arg Argument (window)
  * @param pos Position where the title bar was pressed
  */
@@ -471,4 +498,58 @@
 
 	(void) display_window_move_req(window->dwindow, pos);
+}
+
+/** Window decoration requested window resize.
+ *
+ * @param wdecor Window decoration
+ * @param arg Argument (window)
+ * @param rsztype Resize type
+ * @param pos Position where the button was pressed
+ */
+static void wd_resize(ui_wdecor_t *wdecor, void *arg,
+    ui_wdecor_rsztype_t rsztype, gfx_coord2_t *pos)
+{
+	ui_window_t *window = (ui_window_t *) arg;
+
+	(void) display_window_resize_req(window->dwindow, rsztype, pos);
+}
+
+/** Window decoration requested changing cursor.
+ *
+ * @param wdecor Window decoration
+ * @param arg Argument (window)
+ * @param cursor Cursor to set
+ */
+static void wd_set_cursor(ui_wdecor_t *wdecor, void *arg,
+    ui_stock_cursor_t cursor)
+{
+	ui_window_t *window = (ui_window_t *) arg;
+	display_stock_cursor_t dcursor;
+
+	if (cursor == window->cursor)
+		return;
+
+	dcursor = dcurs_arrow;
+
+	switch (cursor) {
+	case ui_curs_arrow:
+		dcursor = dcurs_arrow;
+		break;
+	case ui_curs_size_ud:
+		dcursor = dcurs_size_ud;
+		break;
+	case ui_curs_size_lr:
+		dcursor = dcurs_size_lr;
+		break;
+	case ui_curs_size_uldr:
+		dcursor = dcurs_size_uldr;
+		break;
+	case ui_curs_size_urdl:
+		dcursor = dcurs_size_urdl;
+		break;
+	}
+
+	(void) display_window_set_cursor(window->dwindow, dcursor);
+	window->cursor = cursor;
 }
 
Index: uspace/lib/ui/test/wdecor.c
===================================================================
--- uspace/lib/ui/test/wdecor.c	(revision d8ddf7a17eaf0cf4fee87a5efb1faca4bb6562b2)
+++ uspace/lib/ui/test/wdecor.c	(revision 554a5f13c2cf8a985e4fe7d3cbeac4597ef4033f)
@@ -60,8 +60,13 @@
 static void test_wdecor_close(ui_wdecor_t *, void *);
 static void test_wdecor_move(ui_wdecor_t *, void *, gfx_coord2_t *);
+static void test_wdecor_resize(ui_wdecor_t *, void *, ui_wdecor_rsztype_t,
+    gfx_coord2_t *);
+static void test_wdecor_set_cursor(ui_wdecor_t *, void *, ui_stock_cursor_t);
 
 static ui_wdecor_cb_t test_wdecor_cb = {
 	.close = test_wdecor_close,
-	.move = test_wdecor_move
+	.move = test_wdecor_move,
+	.resize = test_wdecor_resize,
+	.set_cursor = test_wdecor_set_cursor
 };
 
@@ -90,4 +95,8 @@
 	bool move;
 	gfx_coord2_t pos;
+	bool resize;
+	ui_wdecor_rsztype_t rsztype;
+	bool set_cursor;
+	ui_stock_cursor_t cursor;
 } test_cb_resp_t;
 
@@ -98,5 +107,5 @@
 	errno_t rc;
 
-	rc = ui_wdecor_create(NULL, "Hello", &wdecor);
+	rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_NOT_NULL(wdecor);
@@ -118,5 +127,5 @@
 	errno_t rc;
 
-	rc = ui_wdecor_create(NULL, "Hello", &wdecor);
+	rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -141,5 +150,5 @@
 	errno_t rc;
 
-	rc = ui_wdecor_create(NULL, "Hello", &wdecor);
+	rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -172,5 +181,5 @@
 	PCUT_ASSERT_NOT_NULL(resource);
 
-	rc = ui_wdecor_create(resource, "Hello", &wdecor);
+	rc = ui_wdecor_create(resource, "Hello", ui_wds_none, &wdecor);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -192,5 +201,5 @@
 	test_cb_resp_t resp;
 
-	rc = ui_wdecor_create(NULL, "Hello", &wdecor);
+	rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -219,5 +228,5 @@
 	gfx_coord2_t pos;
 
-	rc = ui_wdecor_create(NULL, "Hello", &wdecor);
+	rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -245,4 +254,73 @@
 }
 
+/** Test ui_wdecor_resize() */
+PCUT_TEST(resize)
+{
+	errno_t rc;
+	ui_wdecor_t *wdecor;
+	test_cb_resp_t resp;
+	ui_wdecor_rsztype_t rsztype;
+	gfx_coord2_t pos;
+
+	rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rsztype = ui_wr_bottom;
+	pos.x = 3;
+	pos.y = 4;
+
+	/* Resize callback with no callbacks set */
+	ui_wdecor_resize(wdecor, rsztype, &pos);
+
+	/* Resize callback with move callback not implemented */
+	ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
+	ui_wdecor_resize(wdecor, rsztype, &pos);
+
+	/* Resize callback with real callback set */
+	resp.resize = false;
+	resp.rsztype = ui_wr_none;
+	resp.pos.x = 0;
+	resp.pos.y = 0;
+	ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
+	ui_wdecor_resize(wdecor, rsztype, &pos);
+	PCUT_ASSERT_TRUE(resp.resize);
+	PCUT_ASSERT_INT_EQUALS(rsztype, resp.rsztype);
+	PCUT_ASSERT_INT_EQUALS(pos.x, resp.pos.x);
+	PCUT_ASSERT_INT_EQUALS(pos.y, resp.pos.y);
+
+	ui_wdecor_destroy(wdecor);
+}
+
+/** Test ui_wdecor_set_cursor() */
+PCUT_TEST(set_cursor)
+{
+	errno_t rc;
+	ui_wdecor_t *wdecor;
+	test_cb_resp_t resp;
+	ui_stock_cursor_t cursor;
+
+	rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	cursor = ui_curs_size_uldr;
+
+	/* Set cursor callback with no callbacks set */
+	ui_wdecor_set_cursor(wdecor, cursor);
+
+	/* Set cursor callback with move callback not implemented */
+	ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
+	ui_wdecor_set_cursor(wdecor, cursor);
+
+	/* Set cursor callback with real callback set */
+	resp.set_cursor = false;
+	resp.cursor = ui_curs_arrow;
+	ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
+	ui_wdecor_set_cursor(wdecor, cursor);
+	PCUT_ASSERT_TRUE(resp.set_cursor);
+	PCUT_ASSERT_INT_EQUALS(cursor, resp.cursor);
+
+	ui_wdecor_destroy(wdecor);
+}
+
 /** Clicking the close button generates close callback */
 PCUT_TEST(close_btn_clicked)
@@ -253,5 +331,5 @@
 	errno_t rc;
 
-	rc = ui_wdecor_create(NULL, "Hello", &wdecor);
+	rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -282,5 +360,5 @@
 	errno_t rc;
 
-	rc = ui_wdecor_create(NULL, "Hello", &wdecor);
+	rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -318,5 +396,5 @@
 	errno_t rc;
 
-	rc = ui_wdecor_create(NULL, "Hello", &wdecor);
+	rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -369,4 +447,181 @@
 	PCUT_ASSERT_INT_EQUALS(100, rect.p1.x);
 	PCUT_ASSERT_INT_EQUALS(200, rect.p1.y);
+}
+
+/** Test ui_wdecor_get_rsztype() */
+PCUT_TEST(get_rsztype)
+{
+	ui_wdecor_t *wdecor;
+	gfx_rect_t rect;
+	ui_wdecor_rsztype_t rsztype;
+	gfx_coord2_t pos;
+	errno_t rc;
+
+	rc = ui_wdecor_create(NULL, "Hello", ui_wds_resizable, &wdecor);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rect.p0.x = 10;
+	rect.p0.y = 20;
+	rect.p1.x = 100;
+	rect.p1.y = 200;
+
+	ui_wdecor_set_rect(wdecor, &rect);
+
+	/* Outside of the window */
+	pos.x = 0;
+	pos.y = -1;
+	rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
+	PCUT_ASSERT_EQUALS(ui_wr_none, rsztype);
+
+	/* Middle of the window */
+	pos.x = 50;
+	pos.y = 100;
+	rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
+	PCUT_ASSERT_EQUALS(ui_wr_none, rsztype);
+
+	/* Top-left corner, but not on edge */
+	pos.x = 20;
+	pos.y = 30;
+	rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
+	PCUT_ASSERT_EQUALS(ui_wr_none, rsztype);
+
+	/* Top-left corner on top edge */
+	pos.x = 20;
+	pos.y = 20;
+	rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
+	PCUT_ASSERT_EQUALS(ui_wr_top_left, rsztype);
+
+	/* Top-left corner on left edge */
+	pos.x = 10;
+	pos.y = 30;
+	rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
+	PCUT_ASSERT_EQUALS(ui_wr_top_left, rsztype);
+
+	/* Top-right corner on top edge */
+	pos.x = 90;
+	pos.y = 20;
+	rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
+	PCUT_ASSERT_EQUALS(ui_wr_top_right, rsztype);
+
+	/* Top-right corner on right edge */
+	pos.x = 99;
+	pos.y = 30;
+	rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
+	PCUT_ASSERT_EQUALS(ui_wr_top_right, rsztype);
+
+	/* Top edge */
+	pos.x = 50;
+	pos.y = 20;
+	rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
+	PCUT_ASSERT_EQUALS(ui_wr_top, rsztype);
+
+	/* Bottom edge */
+	pos.x = 50;
+	pos.y = 199;
+	rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
+	PCUT_ASSERT_EQUALS(ui_wr_bottom, rsztype);
+
+	/* Left edge */
+	pos.x = 10;
+	pos.y = 100;
+	rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
+	PCUT_ASSERT_EQUALS(ui_wr_left, rsztype);
+
+	/* Right edge */
+	pos.x = 99;
+	pos.y = 100;
+	rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
+	PCUT_ASSERT_EQUALS(ui_wr_right, rsztype);
+
+	ui_wdecor_destroy(wdecor);
+
+	/* Non-resizable window */
+
+	rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rect.p0.x = 10;
+	rect.p0.y = 20;
+	rect.p1.x = 100;
+	rect.p1.y = 200;
+
+	ui_wdecor_set_rect(wdecor, &rect);
+
+	pos.x = 10;
+	pos.y = 20;
+	rsztype = ui_wdecor_get_rsztype(wdecor, &pos);
+	PCUT_ASSERT_EQUALS(ui_wr_none, rsztype);
+
+	ui_wdecor_destroy(wdecor);
+}
+
+/** Test ui_wdecor_cursor_from_rsztype() */
+PCUT_TEST(cursor_from_rsztype)
+{
+	PCUT_ASSERT_EQUALS(ui_curs_arrow,
+	    ui_wdecor_cursor_from_rsztype(ui_wr_none));
+	PCUT_ASSERT_EQUALS(ui_curs_size_ud,
+	    ui_wdecor_cursor_from_rsztype(ui_wr_top));
+	PCUT_ASSERT_EQUALS(ui_curs_size_ud,
+	    ui_wdecor_cursor_from_rsztype(ui_wr_bottom));
+	PCUT_ASSERT_EQUALS(ui_curs_size_lr,
+	    ui_wdecor_cursor_from_rsztype(ui_wr_left));
+	PCUT_ASSERT_EQUALS(ui_curs_size_lr,
+	    ui_wdecor_cursor_from_rsztype(ui_wr_right));
+	PCUT_ASSERT_EQUALS(ui_curs_size_uldr,
+	    ui_wdecor_cursor_from_rsztype(ui_wr_top_left));
+	PCUT_ASSERT_EQUALS(ui_curs_size_uldr,
+	    ui_wdecor_cursor_from_rsztype(ui_wr_bottom_right));
+	PCUT_ASSERT_EQUALS(ui_curs_size_urdl,
+	    ui_wdecor_cursor_from_rsztype(ui_wr_top_right));
+	PCUT_ASSERT_EQUALS(ui_curs_size_urdl,
+	    ui_wdecor_cursor_from_rsztype(ui_wr_bottom_left));
+}
+
+/** Test ui_wdecor_frame_pos_event() */
+PCUT_TEST(frame_pos_event)
+{
+	ui_wdecor_t *wdecor;
+	gfx_rect_t rect;
+	test_cb_resp_t resp;
+	pos_event_t event;
+	errno_t rc;
+
+	rc = ui_wdecor_create(NULL, "Hello", ui_wds_resizable, &wdecor);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rect.p0.x = 10;
+	rect.p0.y = 20;
+	rect.p1.x = 100;
+	rect.p1.y = 200;
+
+	ui_wdecor_set_rect(wdecor, &rect);
+	ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
+
+	/* Release on window border should do nothing */
+	resp.resize = false;
+	event.type = POS_RELEASE;
+	event.hpos = 10;
+	event.vpos = 10;
+	ui_wdecor_frame_pos_event(wdecor, &event);
+	PCUT_ASSERT_FALSE(resp.resize);
+
+	/* Press in the middle of the window should do nothing */
+	resp.resize = false;
+	event.type = POS_PRESS;
+	event.hpos = 50;
+	event.vpos = 100;
+	ui_wdecor_frame_pos_event(wdecor, &event);
+	PCUT_ASSERT_FALSE(resp.resize);
+
+	/* Press on window border should cause resize to be called */
+	resp.resize = false;
+	event.type = POS_PRESS;
+	event.hpos = 10;
+	event.vpos = 20;
+	ui_wdecor_frame_pos_event(wdecor, &event);
+	PCUT_ASSERT_TRUE(resp.resize);
+
+	ui_wdecor_destroy(wdecor);
 }
 
@@ -462,3 +717,22 @@
 }
 
+static void test_wdecor_resize(ui_wdecor_t *wdecor, void *arg,
+    ui_wdecor_rsztype_t rsztype, gfx_coord2_t *pos)
+{
+	test_cb_resp_t *resp = (test_cb_resp_t *) arg;
+
+	resp->resize = true;
+	resp->rsztype = rsztype;
+	resp->pos = *pos;
+}
+
+static void test_wdecor_set_cursor(ui_wdecor_t *wdecor, void *arg,
+    ui_stock_cursor_t cursor)
+{
+	test_cb_resp_t *resp = (test_cb_resp_t *) arg;
+
+	resp->set_cursor = true;
+	resp->cursor = cursor;
+}
+
 PCUT_EXPORT(wdecor);
