Index: uspace/lib/ui/include/types/ui/control.h
===================================================================
--- uspace/lib/ui/include/types/ui/control.h	(revision 0262f16cd6fd99d09676d2a482e14a1225a4ef09)
+++ uspace/lib/ui/include/types/ui/control.h	(revision 62223ec4ecd7ed2de2744dc2b41d1183c548223c)
@@ -52,4 +52,6 @@
 	/** Position event */
 	ui_evclaim_t (*pos_event)(void *, pos_event_t *);
+	/** Unfocus */
+	void (*unfocus)(void *);
 } ui_control_ops_t;
 
Index: uspace/lib/ui/include/ui/control.h
===================================================================
--- uspace/lib/ui/include/ui/control.h	(revision 0262f16cd6fd99d09676d2a482e14a1225a4ef09)
+++ uspace/lib/ui/include/ui/control.h	(revision 62223ec4ecd7ed2de2744dc2b41d1183c548223c)
@@ -47,4 +47,5 @@
 extern errno_t ui_control_paint(ui_control_t *);
 extern ui_evclaim_t ui_control_pos_event(ui_control_t *, pos_event_t *);
+extern void ui_control_unfocus(ui_control_t *);
 
 #endif
Index: uspace/lib/ui/include/ui/fixed.h
===================================================================
--- uspace/lib/ui/include/ui/fixed.h	(revision 0262f16cd6fd99d09676d2a482e14a1225a4ef09)
+++ uspace/lib/ui/include/ui/fixed.h	(revision 62223ec4ecd7ed2de2744dc2b41d1183c548223c)
@@ -50,4 +50,5 @@
 extern errno_t ui_fixed_paint(ui_fixed_t *);
 extern ui_evclaim_t ui_fixed_pos_event(ui_fixed_t *, pos_event_t *);
+extern void ui_fixed_unfocus(ui_fixed_t *);
 
 #endif
Index: uspace/lib/ui/include/ui/menubar.h
===================================================================
--- uspace/lib/ui/include/ui/menubar.h	(revision 0262f16cd6fd99d09676d2a482e14a1225a4ef09)
+++ uspace/lib/ui/include/ui/menubar.h	(revision 62223ec4ecd7ed2de2744dc2b41d1183c548223c)
@@ -52,4 +52,5 @@
 extern errno_t ui_menu_bar_paint(ui_menu_bar_t *);
 extern ui_evclaim_t ui_menu_bar_pos_event(ui_menu_bar_t *, pos_event_t *);
+extern void ui_menu_bar_unfocus(ui_menu_bar_t *);
 
 #endif
Index: uspace/lib/ui/include/ui/window.h
===================================================================
--- uspace/lib/ui/include/ui/window.h	(revision 0262f16cd6fd99d09676d2a482e14a1225a4ef09)
+++ uspace/lib/ui/include/ui/window.h	(revision 62223ec4ecd7ed2de2744dc2b41d1183c548223c)
@@ -61,4 +61,5 @@
 extern errno_t ui_window_def_paint(ui_window_t *);
 extern void ui_window_def_pos(ui_window_t *, pos_event_t *);
+extern void ui_window_def_unfocus(ui_window_t *);
 
 #endif
Index: uspace/lib/ui/src/control.c
===================================================================
--- uspace/lib/ui/src/control.c	(revision 0262f16cd6fd99d09676d2a482e14a1225a4ef09)
+++ uspace/lib/ui/src/control.c	(revision 62223ec4ecd7ed2de2744dc2b41d1183c548223c)
@@ -112,4 +112,14 @@
 }
 
+/** Inform UI control that window has been unfocused.
+ *
+ * @param control Control
+ */
+void ui_control_unfocus(ui_control_t *control)
+{
+	if (control->ops->unfocus != NULL)
+		control->ops->unfocus(control->ext);
+}
+
 /** @}
  */
Index: uspace/lib/ui/src/fixed.c
===================================================================
--- uspace/lib/ui/src/fixed.c	(revision 0262f16cd6fd99d09676d2a482e14a1225a4ef09)
+++ uspace/lib/ui/src/fixed.c	(revision 62223ec4ecd7ed2de2744dc2b41d1183c548223c)
@@ -47,4 +47,5 @@
 static errno_t ui_fixed_ctl_paint(void *);
 static ui_evclaim_t ui_fixed_ctl_pos_event(void *, pos_event_t *);
+static void ui_fixed_ctl_unfocus(void *);
 
 /** Push button control ops */
@@ -52,5 +53,6 @@
 	.destroy = ui_fixed_ctl_destroy,
 	.paint = ui_fixed_ctl_paint,
-	.pos_event = ui_fixed_ctl_pos_event
+	.pos_event = ui_fixed_ctl_pos_event,
+	.unfocus = ui_fixed_ctl_unfocus
 };
 
@@ -232,4 +234,20 @@
 }
 
+/** Handle fixed layout window unfocus notification.
+ *
+ * @param fixed Fixed layout
+ */
+void ui_fixed_unfocus(ui_fixed_t *fixed)
+{
+	ui_fixed_elem_t *elem;
+
+	elem = ui_fixed_first(fixed);
+	while (elem != NULL) {
+		ui_control_unfocus(elem->control);
+
+		elem = ui_fixed_next(elem);
+	}
+}
+
 /** Destroy fixed layout control.
  *
@@ -268,4 +286,15 @@
 }
 
+/** Handle fixed layout control window unfocus notification.
+ *
+ * @param arg Argument (ui_fixed_t *)
+ */
+void ui_fixed_ctl_unfocus(void *arg)
+{
+	ui_fixed_t *fixed = (ui_fixed_t *) arg;
+
+	ui_fixed_unfocus(fixed);
+}
+
 /** @}
  */
Index: uspace/lib/ui/src/menubar.c
===================================================================
--- uspace/lib/ui/src/menubar.c	(revision 0262f16cd6fd99d09676d2a482e14a1225a4ef09)
+++ uspace/lib/ui/src/menubar.c	(revision 62223ec4ecd7ed2de2744dc2b41d1183c548223c)
@@ -60,4 +60,5 @@
 static errno_t ui_menu_bar_ctl_paint(void *);
 static ui_evclaim_t ui_menu_bar_ctl_pos_event(void *, pos_event_t *);
+static void ui_menu_bar_ctl_unfocus(void *);
 
 /** Menu bar control ops */
@@ -65,5 +66,6 @@
 	.destroy = ui_menu_bar_ctl_destroy,
 	.paint = ui_menu_bar_ctl_paint,
-	.pos_event = ui_menu_bar_ctl_pos_event
+	.pos_event = ui_menu_bar_ctl_pos_event,
+	.unfocus = ui_menu_bar_ctl_unfocus
 };
 
@@ -328,4 +330,13 @@
 }
 
+/** Handle menu bar window unfocus notification.
+ *
+ * @param mbar Menu bar
+ */
+void ui_menu_bar_unfocus(ui_menu_bar_t *mbar)
+{
+	ui_menu_bar_select(mbar, NULL, NULL);
+}
+
 /** Destroy menu bar control.
  *
@@ -364,4 +375,15 @@
 }
 
+/** Handle menu bar control window unfocus notification.
+ *
+ * @param arg Argument (ui_menu_bar_t *)
+ */
+void ui_menu_bar_ctl_unfocus(void *arg)
+{
+	ui_menu_bar_t *mbar = (ui_menu_bar_t *) arg;
+
+	ui_menu_bar_unfocus(mbar);
+}
+
 /** @}
  */
Index: uspace/lib/ui/src/window.c
===================================================================
--- uspace/lib/ui/src/window.c	(revision 0262f16cd6fd99d09676d2a482e14a1225a4ef09)
+++ uspace/lib/ui/src/window.c	(revision 62223ec4ecd7ed2de2744dc2b41d1183c548223c)
@@ -815,4 +815,6 @@
 	if (window->cb != NULL && window->cb->unfocus != NULL)
 		window->cb->unfocus(window, window->arg);
+	else
+		return ui_window_def_unfocus(window);
 }
 
@@ -850,5 +852,4 @@
  *
  * @param window Window
- * @return EOK on success or an error code
  */
 void ui_window_def_pos(ui_window_t *window, pos_event_t *pos)
@@ -856,4 +857,15 @@
 	if (window->control != NULL)
 		ui_control_pos_event(window->control, pos);
+}
+
+/** Default window unfocus routine.
+ *
+ * @param window Window
+ * @return EOK on success or an error code
+ */
+void ui_window_def_unfocus(ui_window_t *window)
+{
+	if (window->control != NULL)
+		ui_control_unfocus(window->control);
 }
 
Index: uspace/lib/ui/test/control.c
===================================================================
--- uspace/lib/ui/test/control.c	(revision 0262f16cd6fd99d09676d2a482e14a1225a4ef09)
+++ uspace/lib/ui/test/control.c	(revision 62223ec4ecd7ed2de2744dc2b41d1183c548223c)
@@ -42,9 +42,11 @@
 static errno_t test_ctl_paint(void *);
 static ui_evclaim_t test_ctl_pos_event(void *, pos_event_t *);
+static void test_ctl_unfocus(void *);
 
 static ui_control_ops_t test_ctl_ops = {
 	.destroy = test_ctl_destroy,
 	.paint = test_ctl_paint,
-	.pos_event = test_ctl_pos_event
+	.pos_event = test_ctl_pos_event,
+	.unfocus = test_ctl_unfocus
 };
 
@@ -66,4 +68,7 @@
 	/** Position event that was sent */
 	pos_event_t pevent;
+
+	/** @c true iff unfocus was called */
+	bool unfocus;
 } test_resp_t;
 
@@ -166,4 +171,23 @@
 }
 
+/** Test sending unfocus to control */
+PCUT_TEST(unfocus)
+{
+	ui_control_t *control = NULL;
+	test_resp_t resp;
+	errno_t rc;
+
+	rc = ui_control_new(&test_ctl_ops, &resp, &control);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(control);
+
+	resp.unfocus = false;
+
+	ui_control_unfocus(control);
+	PCUT_ASSERT_TRUE(resp.unfocus);
+
+	ui_control_delete(control);
+}
+
 static void test_ctl_destroy(void *arg)
 {
@@ -191,3 +215,10 @@
 }
 
+static void test_ctl_unfocus(void *arg)
+{
+	test_resp_t *resp = (test_resp_t *) arg;
+
+	resp->unfocus = true;
+}
+
 PCUT_EXPORT(control);
Index: uspace/lib/ui/test/fixed.c
===================================================================
--- uspace/lib/ui/test/fixed.c	(revision 0262f16cd6fd99d09676d2a482e14a1225a4ef09)
+++ uspace/lib/ui/test/fixed.c	(revision 62223ec4ecd7ed2de2744dc2b41d1183c548223c)
@@ -41,9 +41,11 @@
 static errno_t test_ctl_paint(void *);
 static ui_evclaim_t test_ctl_pos_event(void *, pos_event_t *);
+static void test_ctl_unfocus(void *);
 
 static ui_control_ops_t test_ctl_ops = {
 	.destroy = test_ctl_destroy,
 	.paint = test_ctl_paint,
-	.pos_event = test_ctl_pos_event
+	.pos_event = test_ctl_pos_event,
+	.unfocus = test_ctl_unfocus
 };
 
@@ -62,4 +64,6 @@
 	/** Position event that was sent */
 	pos_event_t pevent;
+	/** @c true iff unfocus was called */
+	bool unfocus;
 } test_resp_t;
 
@@ -230,4 +234,29 @@
 }
 
+/** ui_fixed_unfocus() delivers unfocus notification to control */
+PCUT_TEST(unfocus)
+{
+	ui_fixed_t *fixed = NULL;
+	ui_control_t *control;
+	test_resp_t resp;
+	errno_t rc;
+
+	rc = ui_fixed_create(&fixed);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ui_control_new(&test_ctl_ops, (void *) &resp, &control);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ui_fixed_add(fixed, control);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	resp.unfocus = false;
+
+	ui_fixed_unfocus(fixed);
+	PCUT_ASSERT_TRUE(resp.unfocus);
+
+	ui_fixed_destroy(fixed);
+}
+
 static void test_ctl_destroy(void *arg)
 {
@@ -255,3 +284,10 @@
 }
 
+static void test_ctl_unfocus(void *arg)
+{
+	test_resp_t *resp = (test_resp_t *) arg;
+
+	resp->unfocus = true;
+}
+
 PCUT_EXPORT(fixed);
Index: uspace/lib/ui/test/window.c
===================================================================
--- uspace/lib/ui/test/window.c	(revision 0262f16cd6fd99d09676d2a482e14a1225a4ef09)
+++ uspace/lib/ui/test/window.c	(revision 62223ec4ecd7ed2de2744dc2b41d1183c548223c)
@@ -66,8 +66,10 @@
 static errno_t test_ctl_paint(void *);
 static ui_evclaim_t test_ctl_pos_event(void *, pos_event_t *);
+static void test_ctl_unfocus(void *);
 
 static ui_control_ops_t test_ctl_ops = {
 	.paint = test_ctl_paint,
-	.pos_event = test_ctl_pos_event
+	.pos_event = test_ctl_pos_event,
+	.unfocus = test_ctl_unfocus
 };
 
@@ -90,4 +92,5 @@
 	bool pos;
 	pos_event_t pos_event;
+	bool unfocus;
 } test_ctl_resp_t;
 
@@ -388,4 +391,40 @@
 	PCUT_ASSERT_INT_EQUALS(event.hpos, resp.pos_event.hpos);
 	PCUT_ASSERT_INT_EQUALS(event.vpos, resp.pos_event.vpos);
+
+	/* Need to remove first because we didn't implement the destructor */
+	ui_window_remove(window, control);
+
+	ui_window_destroy(window);
+	ui_destroy(ui);
+}
+
+/** ui_window_def_unfocus() delivers unfocus event to control in window */
+PCUT_TEST(def_unfocus)
+{
+	errno_t rc;
+	ui_t *ui = NULL;
+	ui_wnd_params_t params;
+	ui_window_t *window = NULL;
+	ui_control_t *control = NULL;
+	test_ctl_resp_t resp;
+
+	rc = ui_create_disp(NULL, &ui);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_wnd_params_init(&params);
+	params.caption = "Hello";
+
+	rc = ui_window_create(ui, &params, &window);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ui_control_new(&test_ctl_ops, &resp, &control);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_window_add(window, control);
+
+	resp.unfocus = false;
+
+	ui_window_def_unfocus(window);
+	PCUT_ASSERT_TRUE(resp.unfocus);
 
 	/* Need to remove first because we didn't implement the destructor */
@@ -701,3 +740,10 @@
 }
 
+static void test_ctl_unfocus(void *arg)
+{
+	test_ctl_resp_t *resp = (test_ctl_resp_t *) arg;
+
+	resp->unfocus = true;
+}
+
 PCUT_EXPORT(window);
