Index: uspace/lib/ui/src/menu.c
===================================================================
--- uspace/lib/ui/src/menu.c	(revision f2416ec391ac369528050cff9c61a6bf2eff5dbc)
+++ uspace/lib/ui/src/menu.c	(revision 6baab83ddb6d4e0ab2dc838329e4cf738b3f0d38)
@@ -245,4 +245,5 @@
 	ui_popup_params_init(&params);
 	params.rect = geom.outer_rect;
+	params.place = *prect;
 
 	rc = ui_popup_create(menu->mbar->ui, menu->mbar->window, &params,
Index: uspace/lib/ui/src/popup.c
===================================================================
--- uspace/lib/ui/src/popup.c	(revision f2416ec391ac369528050cff9c61a6bf2eff5dbc)
+++ uspace/lib/ui/src/popup.c	(revision 6baab83ddb6d4e0ab2dc838329e4cf738b3f0d38)
@@ -78,4 +78,5 @@
 	ui_window_t *window = NULL;
 	ui_wnd_params_t wparams;
+	gfx_coord2_t parent_pos;
 	errno_t rc;
 
@@ -83,4 +84,8 @@
 	if (popup == NULL)
 		return ENOMEM;
+
+	rc = ui_window_get_pos(parent, &parent_pos);
+	if (rc != EOK)
+		goto error;
 
 	ui_wnd_params_init(&wparams);
@@ -88,4 +93,8 @@
 	wparams.caption = "";
 	wparams.style &= ~ui_wds_decorated;
+	wparams.placement = ui_wnd_place_popup;
+
+	/* Compute position of parent rectangle relative to the screen */
+	gfx_rect_translate(&parent_pos, &params->place, &wparams.prect);
 
 	rc = ui_window_create(ui, &wparams, &window);
Index: uspace/lib/ui/src/window.c
===================================================================
--- uspace/lib/ui/src/window.c	(revision f2416ec391ac369528050cff9c61a6bf2eff5dbc)
+++ uspace/lib/ui/src/window.c	(revision 6baab83ddb6d4e0ab2dc838329e4cf738b3f0d38)
@@ -109,4 +109,50 @@
 }
 
+static errno_t ui_window_place(ui_window_t *window, display_t *display,
+    display_info_t *info, ui_wnd_params_t *params)
+{
+	gfx_coord2_t pos;
+	errno_t rc;
+
+	assert(params->placement != ui_wnd_place_default);
+
+	pos.x = 0;
+	pos.y = 0;
+	switch (params->placement) {
+	case ui_wnd_place_default:
+		assert(false);
+	case ui_wnd_place_top_left:
+	case ui_wnd_place_full_screen:
+		pos.x = info->rect.p0.x - params->rect.p0.x;
+		pos.y = info->rect.p0.y - params->rect.p0.y;
+		break;
+	case ui_wnd_place_top_right:
+		pos.x = info->rect.p1.x - params->rect.p1.x;
+		pos.y = info->rect.p0.y - params->rect.p0.y;
+		break;
+	case ui_wnd_place_bottom_left:
+		pos.x = info->rect.p0.x - params->rect.p0.x;
+		pos.y = info->rect.p1.y - params->rect.p1.y;
+		break;
+	case ui_wnd_place_bottom_right:
+		pos.x = info->rect.p1.x - params->rect.p1.x;
+		pos.y = info->rect.p1.y - params->rect.p1.y;
+		break;
+	case ui_wnd_place_popup:
+		/* Place popup window below parent rectangle */
+		pos.x = params->prect.p0.x;
+		pos.y = params->prect.p1.y;
+		break;
+	}
+
+	rc = display_window_move(window->dwindow, &pos);
+	if (rc != EOK)
+		goto error;
+
+	return EOK;
+error:
+	return rc;
+}
+
 /** Create new window.
  *
@@ -121,8 +167,6 @@
 	ui_window_t *window;
 	display_info_t info;
-	gfx_coord2_t pos;
 	gfx_coord2_t scr_dims;
 	display_wnd_params_t dparams;
-	display_window_t *dwindow = NULL;
 	gfx_context_t *gc = NULL;
 	ui_resource_t *res = NULL;
@@ -159,40 +203,16 @@
 
 		rc = display_window_create(ui->display, &dparams, &dwnd_cb,
-		    (void *) window, &dwindow);
+		    (void *) window, &window->dwindow);
 		if (rc != EOK)
 			goto error;
 
 		if (params->placement != ui_wnd_place_default) {
-			pos.x = 0;
-			pos.y = 0;
-
-			switch (params->placement) {
-			case ui_wnd_place_default:
-				assert(false);
-			case ui_wnd_place_top_left:
-			case ui_wnd_place_full_screen:
-				pos.x = info.rect.p0.x - params->rect.p0.x;
-				pos.y = info.rect.p0.y - params->rect.p0.y;
-				break;
-			case ui_wnd_place_top_right:
-				pos.x = info.rect.p1.x - params->rect.p1.x;
-				pos.y = info.rect.p0.y - params->rect.p0.y;
-				break;
-			case ui_wnd_place_bottom_left:
-				pos.x = info.rect.p0.x - params->rect.p0.x;
-				pos.y = info.rect.p1.y - params->rect.p1.y;
-				break;
-			case ui_wnd_place_bottom_right:
-				pos.x = info.rect.p1.x - params->rect.p1.x;
-				pos.y = info.rect.p1.y - params->rect.p1.y;
-				break;
-			}
-
-			rc = display_window_move(dwindow, &pos);
+			rc = ui_window_place(window, ui->display, &info,
+			    params);
 			if (rc != EOK)
 				goto error;
 		}
 
-		rc = display_window_get_gc(dwindow, &gc);
+		rc = display_window_get_gc(window->dwindow, &gc);
 		if (rc != EOK)
 			goto error;
@@ -265,5 +285,4 @@
 
 	window->ui = ui;
-	window->dwindow = dwindow;
 	window->rect = dparams.rect;
 
@@ -286,6 +305,4 @@
 	if (dgc != NULL)
 		dummygc_destroy(dgc);
-	if (dwindow != NULL)
-		display_window_destroy(dwindow);
 	free(window);
 	return rc;
@@ -536,4 +553,26 @@
 {
 	return window->gc;
+}
+
+/** Get window position.
+ *
+ * @param window Window
+ * @param pos Place to store position
+ * @return EOK on success or an error code
+ */
+errno_t ui_window_get_pos(ui_window_t *window, gfx_coord2_t *pos)
+{
+	errno_t rc;
+
+	if (window->dwindow != NULL) {
+		rc = display_window_get_pos(window->dwindow, pos);
+		if (rc != EOK)
+			return rc;
+	} else {
+		pos->x = 0;
+		pos->y = 0;
+	}
+
+	return EOK;
 }
 
