Index: uspace/lib/ui/src/control.c
===================================================================
--- uspace/lib/ui/src/control.c	(revision 4df6607cfca7bfd6049896be621a9b2b967d22db)
+++ uspace/lib/ui/src/control.c	(revision 4ac11fff5b1d1159c3e41e2d439af21bf785bdfe)
@@ -64,4 +64,6 @@
 /** Delete UI control.
  *
+ * Deletes the base control (not the extended data).
+ *
  * @param control UI control or @c NULL
  */
@@ -74,7 +76,19 @@
 }
 
+/** Destroy UI control.
+ *
+ * Run the virtual control destructor (destroy complete control including
+ * extended data).
+ *
+ * @param control Control
+ */
+void ui_control_destroy(ui_control_t *control)
+{
+	return control->ops->destroy(control->ext);
+}
+
 /** Paint UI control.
  *
- * @param control Push button
+ * @param control Control
  * @return EOK on success or an error code
  */
@@ -86,5 +100,5 @@
 /** Deliver position event to UI control.
  *
- * @param control Push button
+ * @param control Control
  * @param pos_event Position event
  * @return @c ui_claimed iff the event is claimed
Index: uspace/lib/ui/src/fixed.c
===================================================================
--- uspace/lib/ui/src/fixed.c	(revision 4df6607cfca7bfd6049896be621a9b2b967d22db)
+++ uspace/lib/ui/src/fixed.c	(revision 4ac11fff5b1d1159c3e41e2d439af21bf785bdfe)
@@ -68,8 +68,19 @@
 void ui_fixed_destroy(ui_fixed_t *fixed)
 {
+	ui_fixed_elem_t *elem;
+	ui_control_t *control;
+
 	if (fixed == NULL)
 		return;
 
-	assert(list_empty(&fixed->elem));
+	elem = ui_fixed_first(fixed);
+	while (elem != NULL) {
+		control = elem->control;
+		ui_fixed_remove(fixed, control);
+		ui_control_destroy(control);
+
+		elem = ui_fixed_first(fixed);
+	}
+
 	free(fixed);
 }
Index: uspace/lib/ui/src/label.c
===================================================================
--- uspace/lib/ui/src/label.c	(revision 4df6607cfca7bfd6049896be621a9b2b967d22db)
+++ uspace/lib/ui/src/label.c	(revision 4ac11fff5b1d1159c3e41e2d439af21bf785bdfe)
@@ -46,4 +46,5 @@
 #include "../private/resource.h"
 
+static void ui_label_ctl_destroy(void *);
 static errno_t ui_label_ctl_paint(void *);
 static ui_evclaim_t ui_label_ctl_pos_event(void *, pos_event_t *);
@@ -51,4 +52,5 @@
 /** Label control ops */
 ui_control_ops_t ui_label_ops = {
+	.destroy = ui_label_ctl_destroy,
 	.paint = ui_label_ctl_paint,
 	.pos_event = ui_label_ctl_pos_event
@@ -207,5 +209,16 @@
 }
 
-/** Paint lable control.
+/** Destroy label control.
+ *
+ * @param arg Argument (ui_label_t *)
+ */
+void ui_label_ctl_destroy(void *arg)
+{
+	ui_label_t *label = (ui_label_t *) arg;
+
+	ui_label_destroy(label);
+}
+
+/** Paint label control.
  *
  * @param arg Argument (ui_label_t *)
Index: uspace/lib/ui/src/pbutton.c
===================================================================
--- uspace/lib/ui/src/pbutton.c	(revision 4df6607cfca7bfd6049896be621a9b2b967d22db)
+++ uspace/lib/ui/src/pbutton.c	(revision 4ac11fff5b1d1159c3e41e2d439af21bf785bdfe)
@@ -54,4 +54,5 @@
 };
 
+static void ui_pbutton_ctl_destroy(void *);
 static errno_t ui_pbutton_ctl_paint(void *);
 static ui_evclaim_t ui_pbutton_ctl_pos_event(void *, pos_event_t *);
@@ -59,4 +60,5 @@
 /** Push button control ops */
 ui_control_ops_t ui_pbutton_ops = {
+	.destroy = ui_pbutton_ctl_destroy,
 	.paint = ui_pbutton_ctl_paint,
 	.pos_event = ui_pbutton_ctl_pos_event
@@ -418,4 +420,15 @@
 }
 
+/** Destroy push button control.
+ *
+ * @param arg Argument (ui_pbutton_t *)
+ */
+void ui_pbutton_ctl_destroy(void *arg)
+{
+	ui_pbutton_t *pbutton = (ui_pbutton_t *) arg;
+
+	ui_pbutton_destroy(pbutton);
+}
+
 /** Paint push button control.
  *
