Index: uspace/lib/ui/src/control.c
===================================================================
--- uspace/lib/ui/src/control.c	(revision fa01c0532bcb8f0b3291b5a02e32606e0515492b)
+++ uspace/lib/ui/src/control.c	(revision b71c0fcb07738ec42b4e693c19b1a5c1e2f329a6)
@@ -81,8 +81,11 @@
  * extended data).
  *
- * @param control Control
+ * @param control Control or @c NULL
  */
 void ui_control_destroy(ui_control_t *control)
 {
+	if (control == NULL)
+		return;
+
 	return control->ops->destroy(control->ext);
 }
Index: uspace/lib/ui/src/fixed.c
===================================================================
--- uspace/lib/ui/src/fixed.c	(revision fa01c0532bcb8f0b3291b5a02e32606e0515492b)
+++ uspace/lib/ui/src/fixed.c	(revision b71c0fcb07738ec42b4e693c19b1a5c1e2f329a6)
@@ -44,4 +44,15 @@
 #include "../private/fixed.h"
 
+static void ui_fixed_ctl_destroy(void *);
+static errno_t ui_fixed_ctl_paint(void *);
+static ui_evclaim_t ui_fixed_ctl_pos_event(void *, pos_event_t *);
+
+/** Push button control ops */
+ui_control_ops_t ui_fixed_ops = {
+	.destroy = ui_fixed_ctl_destroy,
+	.paint = ui_fixed_ctl_paint,
+	.pos_event = ui_fixed_ctl_pos_event
+};
+
 /** Create new fixed layout.
  *
@@ -52,8 +63,15 @@
 {
 	ui_fixed_t *fixed;
+	errno_t rc;
 
 	fixed = calloc(1, sizeof(ui_fixed_t));
 	if (fixed == NULL)
 		return ENOMEM;
+
+	rc = ui_control_new(&ui_fixed_ops, (void *) fixed, &fixed->control);
+	if (rc != EOK) {
+		free(fixed);
+		return rc;
+	}
 
 	list_initialize(&fixed->elem);
@@ -83,5 +101,16 @@
 	}
 
+	ui_control_delete(fixed->control);
 	free(fixed);
+}
+
+/** Get base control from fixed layout.
+ *
+ * @param fixed Fixed layout
+ * @return Control
+ */
+ui_control_t *ui_fixed_ctl(ui_fixed_t *fixed)
+{
+	return fixed->control;
 }
 
@@ -203,4 +232,40 @@
 }
 
+/** Destroy fixed layout control.
+ *
+ * @param arg Argument (ui_fixed_t *)
+ */
+void ui_fixed_ctl_destroy(void *arg)
+{
+	ui_fixed_t *fixed = (ui_fixed_t *) arg;
+
+	ui_fixed_destroy(fixed);
+}
+
+/** Paint fixed layout control.
+ *
+ * @param arg Argument (ui_fixed_t *)
+ * @return EOK on success or an error code
+ */
+errno_t ui_fixed_ctl_paint(void *arg)
+{
+	ui_fixed_t *fixed = (ui_fixed_t *) arg;
+
+	return ui_fixed_paint(fixed);
+}
+
+/** Handle fixed layout control position event.
+ *
+ * @param arg Argument (ui_fixed_t *)
+ * @param pos_event Position event
+ * @return @c ui_claimed iff the event is claimed
+ */
+ui_evclaim_t ui_fixed_ctl_pos_event(void *arg, pos_event_t *event)
+{
+	ui_fixed_t *fixed = (ui_fixed_t *) arg;
+
+	return ui_fixed_pos_event(fixed, event);
+}
+
 /** @}
  */
Index: uspace/lib/ui/src/window.c
===================================================================
--- uspace/lib/ui/src/window.c	(revision fa01c0532bcb8f0b3291b5a02e32606e0515492b)
+++ uspace/lib/ui/src/window.c	(revision b71c0fcb07738ec42b4e693c19b1a5c1e2f329a6)
@@ -42,7 +42,9 @@
 #include <mem.h>
 #include <stdlib.h>
+#include <ui/control.h>
 #include <ui/resource.h>
 #include <ui/wdecor.h>
 #include <ui/window.h>
+#include "../private/control.h"
 #include "../private/dummygc.h"
 #include "../private/resource.h"
@@ -170,4 +172,5 @@
 		return;
 
+	ui_control_destroy(window->control);
 	ui_wdecor_destroy(window->wdecor);
 	ui_resource_destroy(window->res);
@@ -177,4 +180,35 @@
 }
 
+/** Add control to window.
+ *
+ * Only one control can be added to a window. If more than one control
+ * is added, the results are undefined.
+ *
+ * @param fixed Fixed layout
+ * @param control Control
+ * @return EOK on success, ENOMEM if out of memory
+ */
+void ui_window_add(ui_window_t *window, ui_control_t *control)
+{
+	assert(window->control == NULL);
+
+	window->control = control;
+	control->elemp = (void *) window;
+}
+
+/** Remove control from window.
+ *
+ * @param window Window
+ * @param control Control
+ */
+void ui_window_remove(ui_window_t *window, ui_control_t *control)
+{
+	assert(window->control == control);
+	assert((ui_window_t *) control->elemp == window);
+
+	window->control = NULL;
+	control->elemp = NULL;
+}
+
 /** Set window callbacks.
  *
@@ -343,4 +377,6 @@
 	if (window->cb != NULL && window->cb->pos != NULL)
 		window->cb->pos(window, window->arg, pos);
+	else
+		ui_window_def_pos(window, pos);
 }
 
@@ -375,7 +411,21 @@
 		return rc;
 
+	if (window->control != NULL)
+		return ui_control_paint(window->control);
+
 	return EOK;
 }
 
+/** Default window position event routine.
+ *
+ * @param window Window
+ * @return EOK on success or an error code
+ */
+void ui_window_def_pos(ui_window_t *window, pos_event_t *pos)
+{
+	if (window->control != NULL)
+		ui_control_pos_event(window->control, pos);
+}
+
 /** @}
  */
