Index: uspace/lib/gui/button.c
===================================================================
--- uspace/lib/gui/button.c	(revision e2e9a8a280734276ae6ef93832a2855c659d5117)
+++ uspace/lib/gui/button.c	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -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 e2e9a8a280734276ae6ef93832a2855c659d5117)
+++ uspace/lib/gui/button.h	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -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 e2e9a8a280734276ae6ef93832a2855c659d5117)
+++ uspace/lib/gui/canvas.c	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -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 e2e9a8a280734276ae6ef93832a2855c659d5117)
+++ uspace/lib/gui/canvas.h	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -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 e2e9a8a280734276ae6ef93832a2855c659d5117)
+++ uspace/lib/gui/connection.c	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -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 e2e9a8a280734276ae6ef93832a2855c659d5117)
+++ uspace/lib/gui/grid.c	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -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 e2e9a8a280734276ae6ef93832a2855c659d5117)
+++ uspace/lib/gui/grid.h	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -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 e2e9a8a280734276ae6ef93832a2855c659d5117)
+++ uspace/lib/gui/label.c	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -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 e2e9a8a280734276ae6ef93832a2855c659d5117)
+++ uspace/lib/gui/label.h	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -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 e2e9a8a280734276ae6ef93832a2855c659d5117)
+++ uspace/lib/gui/minimal.c	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -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 e2e9a8a280734276ae6ef93832a2855c659d5117)
+++ uspace/lib/gui/minimal.h	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -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 e2e9a8a280734276ae6ef93832a2855c659d5117)
+++ uspace/lib/gui/terminal.c	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -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 e2e9a8a280734276ae6ef93832a2855c659d5117)
+++ uspace/lib/gui/terminal.h	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -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 e2e9a8a280734276ae6ef93832a2855c659d5117)
+++ uspace/lib/gui/widget.c	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -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 e2e9a8a280734276ae6ef93832a2855c659d5117)
+++ uspace/lib/gui/widget.h	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -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 e2e9a8a280734276ae6ef93832a2855c659d5117)
+++ uspace/lib/gui/window.c	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -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 e2e9a8a280734276ae6ef93832a2855c659d5117)
+++ uspace/lib/gui/window.h	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -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 *);
 
 /**
