Index: uspace/app/barber/barber.c
===================================================================
--- uspace/app/barber/barber.c	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/app/barber/barber.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -308,5 +308,5 @@
 	
 	winreg = argv[1];
-	window_t *main_window = window_open(argv[1],
+	window_t *main_window = window_open(argv[1], NULL,
 	    WINDOW_MAIN | WINDOW_DECORATED, "barber");
 	if (!main_window) {
@@ -315,5 +315,5 @@
 	}
 	
-	frame_canvas = create_canvas(window_root(main_window),
+	frame_canvas = create_canvas(window_root(main_window), NULL,
 	    FRAME_WIDTH, FRAME_HEIGHT, frames[frame]);
 	
Index: uspace/app/fontviewer/fontviewer.c
===================================================================
--- uspace/app/fontviewer/fontviewer.c	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/app/fontviewer/fontviewer.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -260,5 +260,5 @@
 	}
 	
-	main_window = window_open(argv[1], WINDOW_MAIN, "fontviewer");
+	main_window = window_open(argv[1], NULL, WINDOW_MAIN, "fontviewer");
 	if (!main_window) {
 		printf("Cannot open main window.\n");
@@ -282,5 +282,5 @@
 	}
 	
-	canvas = create_canvas(window_root(main_window),
+	canvas = create_canvas(window_root(main_window), NULL,
 	    WINDOW_WIDTH, WINDOW_HEIGHT, surface);
 	if (canvas == NULL) {
Index: uspace/app/vdemo/vdemo.c
===================================================================
--- uspace/app/vdemo/vdemo.c	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/app/vdemo/vdemo.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -85,6 +85,6 @@
 	lbl->confirm = on_confirm;
 	lbl->cancel = on_cancel;
-	bool initialized = init_label(
-	    &lbl->label, parent, caption, points, background, foreground);
+	bool initialized = init_label(&lbl->label, parent, NULL, caption,
+	    points, background, foreground);
 	lbl->label.widget.destroy = my_label_destroy;
 	return initialized;
@@ -110,5 +110,5 @@
 {
 	if (argc >= 2) {
-		window_t *main_window = window_open(argv[1],
+		window_t *main_window = window_open(argv[1], NULL,
 		    WINDOW_MAIN | WINDOW_DECORATED | WINDOW_RESIZEABLE, "vdemo");
 		if (!main_window) {
@@ -128,9 +128,10 @@
 		my_label_t *lbl_action = create_my_label(NULL, "Hello there!", 16,
 		    lbl_bg, lbl_text);
-		button_t *btn_confirm = create_button(NULL, "Confirm", 16, btn_bg,
-		    btn_fg, btn_text);
-		button_t *btn_cancel = create_button(NULL, "Cancel", 16, btn_bg,
-		    btn_fg, btn_text);
-		grid_t *grid = create_grid(window_root(main_window), 2, 2, grd_bg);
+		button_t *btn_confirm = create_button(NULL, NULL, "Confirm", 16,
+		    btn_bg, btn_fg, btn_text);
+		button_t *btn_cancel = create_button(NULL, NULL, "Cancel", 16,
+		    btn_bg, btn_fg, btn_text);
+		grid_t *grid = create_grid(window_root(main_window), NULL, 2, 2,
+		    grd_bg);
 		if (!lbl_action || !btn_confirm || !btn_cancel || !grid) {
 			window_close(main_window);
Index: uspace/app/viewer/viewer.c
===================================================================
--- uspace/app/viewer/viewer.c	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/app/viewer/viewer.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -157,5 +157,5 @@
 		}
 	} else {
-		canvas = create_canvas(window_root(main_window),
+		canvas = create_canvas(window_root(main_window), NULL,
 		    img_width, img_height, local_surface);
 		if (canvas == NULL) {
@@ -219,5 +219,5 @@
 		flags |= WINDOW_DECORATED;
 
-	main_window = window_open(argv[1], flags, "viewer");
+	main_window = window_open(argv[1], NULL, flags, "viewer");
 	if (!main_window) {
 		printf("Cannot open main window.\n");
Index: uspace/app/vlaunch/vlaunch.c
===================================================================
--- uspace/app/vlaunch/vlaunch.c	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/app/vlaunch/vlaunch.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -85,17 +85,8 @@
 }
 
-static void on_vterm(widget_t *widget, void *data)
+static void on_btn_click(widget_t *widget, void *data)
 {
-	app_launch("/app/vterm");
-}
-
-static void on_vdemo(widget_t *widget, void *data)
-{
-	app_launch("/app/vdemo");
-}
-
-static void on_vlaunch(widget_t *widget, void *data)
-{
-	app_launch("/app/vlaunch");
+	const char *app = (const char *) widget_get_data(widget);
+	app_launch(app);
 }
 
@@ -114,5 +105,5 @@
 	
 	winreg = argv[1];
-	window_t *main_window = window_open(argv[1],
+	window_t *main_window = window_open(argv[1], NULL,
 	    WINDOW_MAIN | WINDOW_DECORATED | WINDOW_RESIZEABLE, "vlaunch");
 	if (!main_window) {
@@ -130,15 +121,15 @@
 	pixel_t lbl_text = PIXEL(255, 0, 0, 0);
 	
-	canvas_t *logo_canvas = create_canvas(NULL, LOGO_WIDTH, LOGO_HEIGHT,
+	canvas_t *logo_canvas = create_canvas(NULL, NULL, LOGO_WIDTH, LOGO_HEIGHT,
 	    logo);
-	label_t *lbl_caption = create_label(NULL, "Launch application:", 16,
-	    lbl_bg, lbl_text);
-	button_t *btn_vterm = create_button(NULL, "vterm", 16, btn_bg,
-	    btn_fg, btn_text);
-	button_t *btn_vdemo = create_button(NULL, "vdemo", 16, btn_bg,
-	    btn_fg, btn_text);
-	button_t *btn_vlaunch = create_button(NULL, "vlaunch", 16, btn_bg,
-	    btn_fg, btn_text);
-	grid_t *grid = create_grid(window_root(main_window), 1, 5, grd_bg);
+	label_t *lbl_caption = create_label(NULL, NULL, "Launch application:",
+	    16, lbl_bg, lbl_text);
+	button_t *btn_vterm = create_button(NULL, "/app/vterm", "vterm",
+	    16, btn_bg, btn_fg, btn_text);
+	button_t *btn_vdemo = create_button(NULL, "/app/vdemo", "vdemo",
+	    16, btn_bg, btn_fg, btn_text);
+	button_t *btn_vlaunch = create_button(NULL, "/app/vlaunch", "vlaunch",
+	    16, btn_bg, btn_fg, btn_text);
+	grid_t *grid = create_grid(window_root(main_window), NULL, 1, 5, grd_bg);
 	
 	if ((!logo_canvas) || (!lbl_caption) || (!btn_vterm) ||
@@ -149,7 +140,7 @@
 	}
 	
-	sig_connect(&btn_vterm->clicked, NULL, on_vterm);
-	sig_connect(&btn_vdemo->clicked, NULL, on_vdemo);
-	sig_connect(&btn_vlaunch->clicked, NULL, on_vlaunch);
+	sig_connect(&btn_vterm->clicked, &btn_vterm->widget, on_btn_click);
+	sig_connect(&btn_vdemo->clicked, &btn_vdemo->widget, on_btn_click);
+	sig_connect(&btn_vlaunch->clicked, &btn_vlaunch->widget, on_btn_click);
 	
 	grid->add(grid, &logo_canvas->widget, 0, 0, 1, 1);
Index: uspace/app/vterm/vterm.c
===================================================================
--- uspace/app/vterm/vterm.c	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/app/vterm/vterm.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -49,5 +49,5 @@
 	}
 	
-	window_t *main_window = window_open(argv[1],
+	window_t *main_window = window_open(argv[1], NULL,
 	    WINDOW_MAIN | WINDOW_DECORATED, "vterm");
 	if (!main_window) {
@@ -58,5 +58,5 @@
 	window_resize(main_window, 0, 0, 648, 508, WINDOW_PLACEMENT_ANY);
 	terminal_t *terminal_widget =
-	    create_terminal(window_root(main_window), 640, 480);
+	    create_terminal(window_root(main_window), NULL, 640, 480);
 	if (!terminal_widget) {
 		window_close(main_window);
Index: uspace/lib/gui/button.c
===================================================================
--- uspace/lib/gui/button.c	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/lib/gui/button.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -147,8 +147,9 @@
 }
 
-bool init_button(button_t *btn, widget_t *parent, const char *caption,
-    uint16_t points, pixel_t background, pixel_t foreground, pixel_t text)
-{
-	widget_init(&btn->widget, parent);
+bool init_button(button_t *btn, widget_t *parent, const void *data,
+    const char *caption, uint16_t points, pixel_t background,
+    pixel_t foreground, pixel_t text)
+{
+	widget_init(&btn->widget, parent, data);
 	
 	btn->widget.destroy = button_destroy;
@@ -191,6 +192,6 @@
 }
 
-button_t *create_button(widget_t *parent, const char *caption, uint16_t points,
-    pixel_t background, pixel_t foreground, pixel_t text)
+button_t *create_button(widget_t *parent, const void *data, const char *caption,
+    uint16_t points, pixel_t background, pixel_t foreground, pixel_t text)
 {
 	button_t *btn = (button_t *) malloc(sizeof(button_t));
@@ -198,5 +199,5 @@
 		return NULL;
 	
-	if (init_button(btn, parent, caption, points, background, foreground,
+	if (init_button(btn, parent, data, caption, points, background, foreground,
 	    text))
 		return btn;
Index: uspace/lib/gui/button.h
===================================================================
--- uspace/lib/gui/button.h	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/lib/gui/button.h	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -56,8 +56,8 @@
 } button_t;
 
-extern bool init_button(button_t *, widget_t *, const char *, uint16_t, pixel_t,
-    pixel_t, pixel_t);
-extern button_t *create_button(widget_t *, const char *, uint16_t, pixel_t,
-    pixel_t, pixel_t);
+extern bool init_button(button_t *, widget_t *, const void *, const char *,
+    uint16_t, pixel_t, pixel_t, pixel_t);
+extern button_t *create_button(widget_t *, const void *, const char *, uint16_t,
+    pixel_t, pixel_t, pixel_t);
 extern void deinit_button(button_t *);
 
Index: uspace/lib/gui/canvas.c
===================================================================
--- uspace/lib/gui/canvas.c	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/lib/gui/canvas.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -123,8 +123,8 @@
 }
 
-bool init_canvas(canvas_t *canvas, widget_t *parent, sysarg_t width,
-    sysarg_t height, surface_t *surface)
+bool init_canvas(canvas_t *canvas, widget_t *parent, const void *data,
+    sysarg_t width, sysarg_t height, surface_t *surface)
 {
-	widget_init(&canvas->widget, parent);
+	widget_init(&canvas->widget, parent, data);
 	
 	canvas->widget.width = width;
@@ -161,6 +161,6 @@
 }
 
-canvas_t *create_canvas(widget_t *parent, sysarg_t width, sysarg_t height,
-    surface_t *surface)
+canvas_t *create_canvas(widget_t *parent, const void *data, sysarg_t width,
+    sysarg_t height, surface_t *surface)
 {
 	canvas_t *canvas = (canvas_t *) malloc(sizeof(canvas_t));
@@ -168,5 +168,5 @@
 		return NULL;
 	
-	if (init_canvas(canvas, parent, width, height, surface))
+	if (init_canvas(canvas, parent, data, width, height, surface))
 		return canvas;
 	
Index: uspace/lib/gui/canvas.h
===================================================================
--- uspace/lib/gui/canvas.h	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/lib/gui/canvas.h	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -53,7 +53,8 @@
 } canvas_t;
 
-extern bool init_canvas(canvas_t *, widget_t *, sysarg_t, sysarg_t,
+extern bool init_canvas(canvas_t *, widget_t *, const void *, sysarg_t,
+    sysarg_t, surface_t *);
+extern canvas_t *create_canvas(widget_t *, const void *, sysarg_t, sysarg_t,
     surface_t *);
-extern canvas_t *create_canvas(widget_t *, sysarg_t, sysarg_t, surface_t *);
 extern bool update_canvas(canvas_t *, surface_t *);
 extern void deinit_canvas(canvas_t *);
Index: uspace/lib/gui/connection.c
===================================================================
--- uspace/lib/gui/connection.c	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/lib/gui/connection.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -198,13 +198,13 @@
 	list_foreach(sig_node->slots, link, slot_node_t, cur) {
 		void *data_copy = NULL;
-		if (data != NULL) {
+		if (data != NULL)
 			data_copy = malloc(data_size);
-		}
-		if (data_copy != NULL) {
+		
+		if (data_copy != NULL)
 			memcpy(data_copy, data, data_size);
-		}
+		
 		window_event_t *event =
-			(window_event_t *) malloc(sizeof(window_event_t));
-
+		    (window_event_t *) malloc(sizeof(window_event_t));
+		
 		if (event) {
 			link_initialize(&event->link);
@@ -215,7 +215,6 @@
 			prodcons_produce(&cur->widget->window->events, &event->link);
 		} else {
-			if (data_copy != NULL) {
+			if (data_copy != NULL)
 				free(data_copy);
-			}
 		}
 	}
Index: uspace/lib/gui/grid.c
===================================================================
--- uspace/lib/gui/grid.c	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/lib/gui/grid.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -363,6 +363,6 @@
 }
 
-bool init_grid(grid_t *grid, widget_t *parent, size_t cols, size_t rows,
-    pixel_t background)
+bool init_grid(grid_t *grid, widget_t *parent, const void *data, size_t cols,
+    size_t rows, pixel_t background)
 {
 	if ((cols == 0) || (rows == 0))
@@ -376,5 +376,5 @@
 	memset(grid->layout, 0, cols * rows * sizeof(grid_cell_t));
 	
-	widget_init(&grid->widget, parent);
+	widget_init(&grid->widget, parent, data);
 	
 	grid->widget.destroy = grid_destroy;
@@ -393,5 +393,6 @@
 }
 
-grid_t *create_grid(widget_t *parent, size_t cols, size_t rows, pixel_t background)
+grid_t *create_grid(widget_t *parent, const void *data, size_t cols,
+    size_t rows, pixel_t background)
 {
 	grid_t *grid = (grid_t *) malloc(sizeof(grid_t));
@@ -399,5 +400,5 @@
 		return NULL;
 	
-	if (init_grid(grid, parent, cols, rows, background))
+	if (init_grid(grid, parent, data, cols, rows, background))
 		return grid;
 	
Index: uspace/lib/gui/grid.h
===================================================================
--- uspace/lib/gui/grid.h	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/lib/gui/grid.h	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -56,6 +56,7 @@
 } grid_t;
 
-extern bool init_grid(grid_t *, widget_t *, size_t, size_t, pixel_t);
-extern grid_t *create_grid(widget_t *, size_t, size_t, pixel_t);
+extern bool init_grid(grid_t *, widget_t *, const void *, size_t, size_t,
+    pixel_t);
+extern grid_t *create_grid(widget_t *, const void *, size_t, size_t, pixel_t);
 extern void deinit_grid(grid_t *);
 
Index: uspace/lib/gui/label.c
===================================================================
--- uspace/lib/gui/label.c	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/lib/gui/label.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -140,8 +140,8 @@
 }
 
-bool init_label(label_t *lbl, widget_t *parent, const char *caption,
-    uint16_t points, pixel_t background, pixel_t text)
-{
-	widget_init(&lbl->widget, parent);
+bool init_label(label_t *lbl, widget_t *parent, const void *data,
+    const char *caption, uint16_t points, pixel_t background, pixel_t text)
+{
+	widget_init(&lbl->widget, parent, data);
 	
 	lbl->widget.destroy = label_destroy;
@@ -184,6 +184,6 @@
 }
 
-label_t *create_label(widget_t *parent, const char *caption, uint16_t points,
-    pixel_t background, pixel_t text)
+label_t *create_label(widget_t *parent, const void *data, const char *caption,
+    uint16_t points, pixel_t background, pixel_t text)
 {
 	label_t *lbl = (label_t *) malloc(sizeof(label_t));
@@ -191,5 +191,5 @@
 		return NULL;
 	
-	if (init_label(lbl, parent, caption, points, background, text))
+	if (init_label(lbl, parent, data, caption, points, background, text))
 		return lbl;
 	
Index: uspace/lib/gui/label.h
===================================================================
--- uspace/lib/gui/label.h	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/lib/gui/label.h	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -55,8 +55,8 @@
 } label_t;
 
-extern bool init_label(label_t *, widget_t *, const char *, uint16_t, pixel_t,
-    pixel_t);
-extern label_t *create_label(widget_t *, const char *, uint16_t, pixel_t,
-    pixel_t);
+extern bool init_label(label_t *, widget_t *, const void *, const char *,
+    uint16_t, pixel_t, pixel_t);
+extern label_t *create_label(widget_t *, const void *, const char *, uint16_t,
+    pixel_t, pixel_t);
 extern void deinit_label(label_t *);
 
Index: uspace/lib/gui/minimal.c
===================================================================
--- uspace/lib/gui/minimal.c	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/lib/gui/minimal.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -112,7 +112,8 @@
 }
 
-bool init_minimal(minimal_t *min, widget_t *parent, pixel_t a, pixel_t b)
+bool init_minimal(minimal_t *min, widget_t *parent, const void *data, pixel_t a,
+    pixel_t b)
 {
-	widget_init(&min->widget, parent);
+	widget_init(&min->widget, parent, data);
 
 	min->widget.destroy = minimal_destroy;
@@ -129,5 +130,6 @@
 }
 
-minimal_t *create_minimal(widget_t *parent, pixel_t a, pixel_t b)
+minimal_t *create_minimal(widget_t *parent, const void *data, pixel_t a,
+    pixel_t b)
 {
 	minimal_t *min = (minimal_t *) malloc(sizeof(minimal_t));
@@ -136,5 +138,5 @@
 	}
 
-	if (init_minimal(min, parent, a, b)) {
+	if (init_minimal(min, parent, data, a, b)) {
 		return min;
 	} else {
Index: uspace/lib/gui/minimal.h
===================================================================
--- uspace/lib/gui/minimal.h	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/lib/gui/minimal.h	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -49,6 +49,7 @@
 } minimal_t;
 
-extern bool init_minimal(minimal_t *, widget_t *, pixel_t, pixel_t);
-extern minimal_t *create_minimal(widget_t *, pixel_t, pixel_t);
+extern bool init_minimal(minimal_t *, widget_t *, const void *, pixel_t,
+    pixel_t);
+extern minimal_t *create_minimal(widget_t *, const void *, pixel_t, pixel_t);
 extern void deinit_minimal(minimal_t *);
 
@@ -57,3 +58,2 @@
 /** @}
  */
-
Index: uspace/lib/gui/terminal.c
===================================================================
--- uspace/lib/gui/terminal.c	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/lib/gui/terminal.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -696,8 +696,8 @@
 }
 
-bool init_terminal(terminal_t *term, widget_t *parent, sysarg_t width,
-    sysarg_t height)
-{
-	widget_init(&term->widget, parent);
+bool init_terminal(terminal_t *term, widget_t *parent, const void *data,
+    sysarg_t width, sysarg_t height)
+{
+	widget_init(&term->widget, parent, data);
 	
 	link_initialize(&term->link);
@@ -771,5 +771,6 @@
 }
 
-terminal_t *create_terminal(widget_t *parent, sysarg_t width, sysarg_t height)
+terminal_t *create_terminal(widget_t *parent, const void *data, sysarg_t width,
+    sysarg_t height)
 {
 	terminal_t *term = (terminal_t *) malloc(sizeof(terminal_t));
@@ -777,5 +778,5 @@
 		return NULL;
 	
-	bool ret = init_terminal(term, parent, width, height);
+	bool ret = init_terminal(term, parent, data, width, height);
 	if (!ret) {
 		free(term);
Index: uspace/lib/gui/terminal.h
===================================================================
--- uspace/lib/gui/terminal.h	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/lib/gui/terminal.h	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -70,6 +70,8 @@
 } terminal_t;
 
-extern bool init_terminal(terminal_t *, widget_t *, sysarg_t, sysarg_t);
-extern terminal_t *create_terminal(widget_t *, sysarg_t, sysarg_t);
+extern bool init_terminal(terminal_t *, widget_t *, const void *, sysarg_t,
+    sysarg_t);
+extern terminal_t *create_terminal(widget_t *, const void *, sysarg_t,
+    sysarg_t);
 extern void deinit_terminal(terminal_t *);
 
Index: uspace/lib/gui/widget.c
===================================================================
--- uspace/lib/gui/widget.c	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/lib/gui/widget.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -36,8 +36,10 @@
 #include "widget.h"
 
-void widget_init(widget_t *widget, widget_t *parent)
+/** Link widget with parent and initialize default position and size. */
+void widget_init(widget_t *widget, widget_t *parent, const void *data)
 {
 	link_initialize(&widget->link);
 	list_initialize(&widget->children);
+	
 	if (parent) {
 		widget->parent = parent;
@@ -48,10 +50,12 @@
 		widget->window = NULL;
 	}
-
+	
+	widget->data = data;
+	
 	widget->hpos = 0;
 	widget->vpos = 0;
 	widget->width = 0;
 	widget->height = 0;
-
+	
 	widget->width_min = 0;
 	widget->height_min = 0;
@@ -62,4 +66,5 @@
 }
 
+/** Change position and size of the widget. */
 void widget_modify(widget_t *widget, sysarg_t hpos, sysarg_t vpos,
     sysarg_t width, sysarg_t height)
@@ -71,9 +76,15 @@
 }
 
+/** Get custom client data */
+const void *widget_get_data(widget_t *widget)
+{
+	return widget->data;
+}
+
+/** Unlink widget from its parent. */
 void widget_deinit(widget_t *widget)
 {
-	if (widget->parent) {
+	if (widget->parent)
 		list_remove(&widget->link);
-	}
 }
 
Index: uspace/lib/gui/widget.h
===================================================================
--- uspace/lib/gui/widget.h	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/lib/gui/widget.h	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -53,8 +53,9 @@
 struct widget {
 	link_t link;
-	widget_t *parent; /**< Parent widget of this widget. NULL for root widget. */
-	list_t children; /**< Children widgets of this widget. */
-	window_t *window; /**< Window into which this widget belongs. */
-
+	widget_t *parent;  /**< Parent widget of this widget. NULL for root widget. */
+	list_t children;   /**< Children widgets of this widget. */
+	window_t *window;  /**< Window into which this widget belongs. */
+	const void *data;  /**< Custom client data. */
+	
 	sysarg_t hpos; /**< Horizontal position in window coordinates. */
 	sysarg_t vpos; /**< Vertical position in window coordinates. */
@@ -128,9 +129,7 @@
  */
 
-/** Link widget with parent and initialize default position and size. */
-extern void widget_init(widget_t *, widget_t *);
-/** Just convenience function to change position and size of the widget. */
+extern void widget_init(widget_t *, widget_t *, const void *);
 extern void widget_modify(widget_t *, sysarg_t, sysarg_t, sysarg_t, sysarg_t);
-/** Unlink widget from its parent. */
+extern const void *widget_get_data(widget_t *);
 extern void widget_deinit(widget_t *);
 
Index: uspace/lib/gui/window.c
===================================================================
--- uspace/lib/gui/window.c	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/lib/gui/window.c	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -591,6 +591,6 @@
 }
 
-window_t *window_open(const char *winreg, window_flags_t flags,
-    const char *caption)
+window_t *window_open(const char *winreg, const void *data,
+    window_flags_t flags, const char *caption)
 {
 	window_t *win = (window_t *) malloc(sizeof(window_t));
@@ -604,5 +604,5 @@
 	fibril_mutex_initialize(&win->guard);
 	
-	widget_init(&win->root, NULL);
+	widget_init(&win->root, NULL, data);
 	win->root.window = win;
 	win->root.destroy = root_destroy;
Index: uspace/lib/gui/window.h
===================================================================
--- uspace/lib/gui/window.h	(revision 585635856440deab73ad5891daab8fa87901aa68)
+++ uspace/lib/gui/window.h	(revision 10cb47eaa0c19e8c686b3c5e3d3e6084e07b901c)
@@ -67,5 +67,6 @@
  * whole application. Note that opened window does not have any surface yet.
  */
-extern window_t *window_open(const char *, window_flags_t, const char *);
+extern window_t *window_open(const char *, const void *, window_flags_t,
+    const char *);
 
 /**
