Index: uspace/app/uidemo/uidemo.c
===================================================================
--- uspace/app/uidemo/uidemo.c	(revision b8b64a813a029c8f1d40c1b17e79513d0a6aed8d)
+++ uspace/app/uidemo/uidemo.c	(revision 6186f9f9afaec0029250b9e11344ca01e86e0ea5)
@@ -287,4 +287,10 @@
 	}
 
+	rc = ui_menu_entry_sep_create(demo.mfile, &mexit);
+	if (rc != EOK) {
+		printf("Error creating menu.\n");
+		return rc;
+	}
+
 	rc = ui_menu_entry_create(demo.mfile, "Exit", "Alt-F4", &mexit);
 	if (rc != EOK) {
Index: uspace/lib/ui/include/ui/menuentry.h
===================================================================
--- uspace/lib/ui/include/ui/menuentry.h	(revision b8b64a813a029c8f1d40c1b17e79513d0a6aed8d)
+++ uspace/lib/ui/include/ui/menuentry.h	(revision 6186f9f9afaec0029250b9e11344ca01e86e0ea5)
@@ -45,4 +45,5 @@
 extern errno_t ui_menu_entry_create(ui_menu_t *, const char *, const char *,
     ui_menu_entry_t **);
+extern errno_t ui_menu_entry_sep_create(ui_menu_t *, ui_menu_entry_t **);
 extern void ui_menu_entry_destroy(ui_menu_entry_t *);
 extern void ui_menu_entry_set_cb(ui_menu_entry_t *, ui_menu_entry_cb_t,
Index: uspace/lib/ui/private/menuentry.h
===================================================================
--- uspace/lib/ui/private/menuentry.h	(revision b8b64a813a029c8f1d40c1b17e79513d0a6aed8d)
+++ uspace/lib/ui/private/menuentry.h	(revision 6186f9f9afaec0029250b9e11344ca01e86e0ea5)
@@ -53,4 +53,6 @@
 	/** Callbacks */
 	ui_menu_entry_cb_t cb;
+	/** This entry is a separator entry */
+	bool separator;
 	/** Menu entry is currently held down */
 	bool held;
Index: uspace/lib/ui/src/menuentry.c
===================================================================
--- uspace/lib/ui/src/menuentry.c	(revision b8b64a813a029c8f1d40c1b17e79513d0a6aed8d)
+++ uspace/lib/ui/src/menuentry.c	(revision 6186f9f9afaec0029250b9e11344ca01e86e0ea5)
@@ -55,7 +55,9 @@
 	menu_entry_vpad = 4,
 	menu_entry_column_pad = 8,
+	menu_entry_sep_height = 2,
 	menu_entry_hpad_text = 1,
 	menu_entry_vpad_text = 0,
-	menu_entry_column_pad_text = 2
+	menu_entry_column_pad_text = 2,
+	menu_entry_sep_height_text = 1
 };
 
@@ -107,4 +109,28 @@
 }
 
+/** Create new separator menu entry.
+ *
+ * @param menu Menu
+ * @param rmentry Place to store pointer to new menu entry
+ * @return EOK on success, ENOMEM if out of memory
+ */
+errno_t ui_menu_entry_sep_create(ui_menu_t *menu, ui_menu_entry_t **rmentry)
+{
+	ui_menu_entry_t *mentry;
+	errno_t rc;
+
+	rc = ui_menu_entry_create(menu, "", "", &mentry);
+	if (rc != EOK)
+		return rc;
+
+	/* Need to adjust menu height when changing to separator */
+	menu->total_h -= ui_menu_entry_height(mentry);
+	mentry->separator = true;
+	menu->total_h += ui_menu_entry_height(mentry);
+
+	*rmentry = mentry;
+	return EOK;
+}
+
 /** Destroy menu entry.
  *
@@ -238,6 +264,16 @@
 	}
 
-	gfx_font_get_metrics(res->font, &metrics);
-	height = metrics.ascent + metrics.descent + 1;
+	if (mentry->separator) {
+		/* Separator menu entry */
+		if (res->textmode)
+			height = menu_entry_sep_height_text;
+		else
+			height = menu_entry_sep_height;
+	} else {
+		/* Normal menu entry */
+		gfx_font_get_metrics(res->font, &metrics);
+		height = metrics.ascent + metrics.descent + 1;
+	}
+
 	return height + 2 * vpad;
 }
@@ -255,4 +291,5 @@
 	gfx_color_t *bg_color;
 	ui_menu_entry_geom_t geom;
+	gfx_rect_t rect;
 	errno_t rc;
 
@@ -292,4 +329,14 @@
 		goto error;
 
+	if (mentry->separator) {
+		rect.p0 = geom.caption_pos;
+		rect.p1.x = geom.shortcut_pos.x;
+		rect.p1.y = rect.p0.y + 2;
+		rc = ui_paint_bevel(res->gc, &rect, res->wnd_shadow_color,
+		    res->wnd_highlight_color, 1, NULL);
+		if (rc != EOK)
+			goto error;
+	}
+
 	rc = gfx_update(res->gc);
 	if (rc != EOK)
@@ -309,4 +356,7 @@
 {
 	if (mentry->held)
+		return;
+
+	if (mentry->separator)
 		return;
 
Index: uspace/lib/ui/test/menuentry.c
===================================================================
--- uspace/lib/ui/test/menuentry.c	(revision b8b64a813a029c8f1d40c1b17e79513d0a6aed8d)
+++ uspace/lib/ui/test/menuentry.c	(revision 6186f9f9afaec0029250b9e11344ca01e86e0ea5)
@@ -51,15 +51,80 @@
 static void test_entry_cb(ui_menu_entry_t *, void *);
 
-/** Create and destroy menu bar */
+/** Create and destroy menu entry */
 PCUT_TEST(create_destroy)
 {
-	ui_menu_bar_t *mbar = NULL;
-	errno_t rc;
-
-	rc = ui_menu_bar_create(NULL, &mbar);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-	PCUT_ASSERT_NOT_NULL(mbar);
-
-	ui_menu_bar_destroy(mbar);
+	dummy_gc_t *dgc;
+	gfx_context_t *gc;
+	ui_resource_t *resource = NULL;
+	ui_menu_bar_t *mbar = NULL;
+	ui_menu_t *menu = NULL;
+	ui_menu_entry_t *mentry = NULL;
+	errno_t rc;
+
+	rc = dummygc_create(&dgc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gc = dummygc_get_ctx(dgc);
+
+	rc = ui_resource_create(gc, false, &resource);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(resource);
+
+	rc = ui_menu_bar_create(resource, &mbar);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(mbar);
+
+	rc = ui_menu_create(mbar, "Test", &menu);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(menu);
+
+	rc = ui_menu_entry_create(menu, "Foo", "F1", &mentry);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(mentry);
+
+	/* Just for sake of test. Menu entry is destroyed along with menu */
+	ui_menu_entry_destroy(mentry);
+
+	ui_menu_bar_destroy(mbar);
+	dummygc_destroy(dgc);
+}
+
+/** Create and destroy separator menu entry */
+PCUT_TEST(create_sep_destroy)
+{
+	dummy_gc_t *dgc;
+	gfx_context_t *gc;
+	ui_resource_t *resource = NULL;
+	ui_menu_bar_t *mbar = NULL;
+	ui_menu_t *menu = NULL;
+	ui_menu_entry_t *mentry = NULL;
+	errno_t rc;
+
+	rc = dummygc_create(&dgc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gc = dummygc_get_ctx(dgc);
+
+	rc = ui_resource_create(gc, false, &resource);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(resource);
+
+	rc = ui_menu_bar_create(resource, &mbar);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(mbar);
+
+	rc = ui_menu_create(mbar, "Test", &menu);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(menu);
+
+	rc = ui_menu_entry_sep_create(menu, &mentry);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(mentry);
+
+	/* Just for sake of test. Menu entry is destroyed along with menu */
+	ui_menu_entry_destroy(mentry);
+
+	ui_menu_bar_destroy(mbar);
+	dummygc_destroy(dgc);
 }
 
