Index: uspace/lib/tbarcfg/include/tbarcfg/tbarcfg.h
===================================================================
--- uspace/lib/tbarcfg/include/tbarcfg/tbarcfg.h	(revision 28ca31edbe1636231b006df50ab0d40aec06f59d)
+++ uspace/lib/tbarcfg/include/tbarcfg/tbarcfg.h	(revision e63e74a596d3dab316c056385061a0ffc336c62b)
@@ -52,4 +52,5 @@
 extern const char *smenu_entry_get_cmd(smenu_entry_t *);
 extern bool smenu_entry_get_terminal(smenu_entry_t *);
+extern bool smenu_entry_get_separator(smenu_entry_t *);
 extern errno_t smenu_entry_set_caption(smenu_entry_t *, const char *);
 extern errno_t smenu_entry_set_cmd(smenu_entry_t *, const char *);
@@ -58,4 +59,5 @@
 extern errno_t smenu_entry_create(tbarcfg_t *, const char *, const char *,
     bool, smenu_entry_t **);
+extern errno_t smenu_entry_sep_create(tbarcfg_t *, smenu_entry_t **);
 extern errno_t smenu_entry_destroy(smenu_entry_t *);
 extern errno_t smenu_entry_move_up(smenu_entry_t *);
Index: uspace/lib/tbarcfg/private/tbarcfg.h
===================================================================
--- uspace/lib/tbarcfg/private/tbarcfg.h	(revision 28ca31edbe1636231b006df50ab0d40aec06f59d)
+++ uspace/lib/tbarcfg/private/tbarcfg.h	(revision e63e74a596d3dab316c056385061a0ffc336c62b)
@@ -61,4 +61,6 @@
 	/** SIF node (persistent storage) */
 	sif_node_t *nentry;
+	/** Is this a separator entry */
+	bool separator;
 	/** Entry caption (with accelerator markup) */
 	char *caption;
@@ -71,4 +73,5 @@
 extern errno_t smenu_entry_new(tbarcfg_t *, sif_node_t *, const char *,
     const char *, bool, smenu_entry_t **);
+extern errno_t smenu_entry_sep_new(tbarcfg_t *, sif_node_t *, smenu_entry_t **);
 extern void smenu_entry_delete(smenu_entry_t *);
 
Index: uspace/lib/tbarcfg/src/tbarcfg.c
===================================================================
--- uspace/lib/tbarcfg/src/tbarcfg.c	(revision 28ca31edbe1636231b006df50ab0d40aec06f59d)
+++ uspace/lib/tbarcfg/src/tbarcfg.c	(revision e63e74a596d3dab316c056385061a0ffc336c62b)
@@ -108,4 +108,5 @@
 	sif_node_t *nentry;
 	const char *ntype;
+	const char *separator;
 	const char *caption;
 	const char *cmd;
@@ -143,24 +144,36 @@
 		}
 
-		caption = sif_node_get_attr(nentry, "caption");
-		if (caption == NULL) {
+		separator = sif_node_get_attr(nentry, "separator");
+		if (separator != NULL && str_cmp(separator, "y") != 0) {
 			rc = EIO;
 			goto error;
 		}
 
-		cmd = sif_node_get_attr(nentry, "cmd");
-		if (cmd == NULL) {
-			rc = EIO;
-			goto error;
+		if (separator == NULL) {
+			caption = sif_node_get_attr(nentry, "caption");
+			if (caption == NULL) {
+				rc = EIO;
+				goto error;
+			}
+
+			cmd = sif_node_get_attr(nentry, "cmd");
+			if (cmd == NULL) {
+				rc = EIO;
+				goto error;
+			}
+
+			terminal = sif_node_get_attr(nentry, "terminal");
+			if (terminal == NULL)
+				terminal = "n";
+
+			rc = smenu_entry_new(tbcfg, nentry, caption, cmd,
+			    str_cmp(terminal, "y") == 0, NULL);
+			if (rc != EOK)
+				goto error;
+		} else {
+			rc = smenu_entry_sep_new(tbcfg, nentry, NULL);
+			if (rc != EOK)
+				goto error;
 		}
-
-		terminal = sif_node_get_attr(nentry, "terminal");
-		if (terminal == NULL)
-			terminal = "n";
-
-		rc = smenu_entry_new(tbcfg, nentry, caption, cmd,
-		    str_cmp(terminal, "y") == 0, NULL);
-		if (rc != EOK)
-			goto error;
 
 		nentry = sif_node_next_child(nentry);
@@ -266,4 +279,5 @@
 const char *smenu_entry_get_caption(smenu_entry_t *entry)
 {
+	assert(!entry->separator);
 	return entry->caption;
 }
@@ -276,8 +290,9 @@
 const char *smenu_entry_get_cmd(smenu_entry_t *entry)
 {
+	assert(!entry->separator);
 	return entry->cmd;
 }
 
-/** Get start menu start in terminal flag.
+/** Get start menu entry start in terminal flag.
  *
  * @param entry Start menu entry
@@ -286,5 +301,16 @@
 bool smenu_entry_get_terminal(smenu_entry_t *entry)
 {
+	assert(!entry->separator);
 	return entry->terminal;
+}
+
+/** Get start menu entry separator flag.
+ *
+ * @param entry Start menu entry
+ * @return Separator flag
+ */
+bool smenu_entry_get_separator(smenu_entry_t *entry)
+{
+	return entry->separator;
 }
 
@@ -301,4 +327,6 @@
 {
 	char *dcap;
+
+	assert(!entry->separator);
 
 	dcap = str_dup(caption);
@@ -324,4 +352,6 @@
 	char *dcmd;
 
+	assert(!entry->separator);
+
 	dcmd = str_dup(cmd);
 	if (dcmd == NULL)
@@ -343,4 +373,5 @@
 void smenu_entry_set_terminal(smenu_entry_t *entry, bool terminal)
 {
+	assert(!entry->separator);
 	entry->terminal = terminal;
 }
@@ -355,16 +386,25 @@
 	errno_t rc;
 
-	rc = sif_node_set_attr(trans, entry->nentry, "cmd", entry->cmd);
-	if (rc != EOK)
-		goto error;
-
-	rc = sif_node_set_attr(trans, entry->nentry, "caption", entry->caption);
-	if (rc != EOK)
-		goto error;
-
-	rc = sif_node_set_attr(trans, entry->nentry, "terminal",
-	    entry->terminal ? "y" : "n");
-	if (rc != EOK)
-		goto error;
+	if (entry->separator) {
+		rc = sif_node_set_attr(trans, entry->nentry, "separator", "y");
+		if (rc != EOK)
+			goto error;
+	} else {
+		sif_node_unset_attr(trans, entry->nentry, "separator");
+
+		rc = sif_node_set_attr(trans, entry->nentry, "cmd", entry->cmd);
+		if (rc != EOK)
+			goto error;
+
+		rc = sif_node_set_attr(trans, entry->nentry, "caption",
+		    entry->caption);
+		if (rc != EOK)
+			goto error;
+
+		rc = sif_node_set_attr(trans, entry->nentry, "terminal",
+		    entry->terminal ? "y" : "n");
+		if (rc != EOK)
+			goto error;
+	}
 
 	return EOK;
@@ -457,4 +497,38 @@
 }
 
+/** Allocate a start menu separator entry and append it to the start menu
+ * (internal).
+ *
+ * This only creates the entry in memory, but does not update the repository.
+ *
+ * @param smenu Start menu
+ * @param nentry Backing SIF node
+ * @param rentry Place to store pointer to new entry or @c NULL
+ */
+errno_t smenu_entry_sep_new(tbarcfg_t *smenu, sif_node_t *nentry,
+    smenu_entry_t **rentry)
+{
+	smenu_entry_t *entry;
+	errno_t rc;
+
+	entry = calloc(1, sizeof(smenu_entry_t));
+	if (entry == NULL) {
+		rc = ENOMEM;
+		goto error;
+	}
+
+	entry->nentry = nentry;
+	entry->separator = true;
+
+	entry->smenu = smenu;
+	list_append(&entry->lentries, &smenu->entries);
+	if (rentry != NULL)
+		*rentry = entry;
+
+	return EOK;
+error:
+	return rc;
+}
+
 /** Delete start menu entry.
  *
@@ -467,6 +541,8 @@
 {
 	list_remove(&entry->lentries);
-	free(entry->caption);
-	free(entry->cmd);
+	if (entry->caption != NULL)
+		free(entry->caption);
+	if (entry->cmd != NULL)
+		free(entry->cmd);
 	free(entry);
 }
@@ -527,4 +603,47 @@
 }
 
+/** Create new start menu separator entry.
+ *
+ * @param smenu Start menu
+ * @param nentry Backing SIF node
+ * @param rentry Place to store pointer to new entry or @c NULL
+ */
+errno_t smenu_entry_sep_create(tbarcfg_t *smenu, smenu_entry_t **rentry)
+{
+	sif_node_t *nentry;
+	smenu_entry_t *entry;
+	errno_t rc;
+	sif_trans_t *trans = NULL;
+
+	rc = sif_trans_begin(smenu->repo, &trans);
+	if (rc != EOK)
+		goto error;
+
+	rc = sif_node_append_child(trans, smenu->nentries, "entry",
+	    &nentry);
+	if (rc != EOK)
+		goto error;
+
+	rc = sif_node_set_attr(trans, nentry, "separator", "y");
+	if (rc != EOK)
+		goto error;
+
+	rc = smenu_entry_sep_new(smenu, nentry, &entry);
+	if (rc != EOK)
+		goto error;
+
+	rc = sif_trans_end(trans);
+	if (rc != EOK)
+		goto error;
+
+	if (rentry != NULL)
+		*rentry = entry;
+	return EOK;
+error:
+	if (trans != NULL)
+		sif_trans_abort(trans);
+	return rc;
+}
+
 /** Destroy start menu entry.
  *
Index: uspace/lib/tbarcfg/test/tbarcfg.c
===================================================================
--- uspace/lib/tbarcfg/test/tbarcfg.c	(revision 28ca31edbe1636231b006df50ab0d40aec06f59d)
+++ uspace/lib/tbarcfg/test/tbarcfg.c	(revision e63e74a596d3dab316c056385061a0ffc336c62b)
@@ -135,4 +135,58 @@
 }
 
+/** Separator entry */
+PCUT_TEST(separator)
+{
+	errno_t rc;
+	tbarcfg_t *tbcfg;
+	char fname[L_tmpnam], *p;
+	const char *caption;
+	const char *cmd;
+	smenu_entry_t *e1 = NULL, *e2 = NULL;
+	smenu_entry_t *e;
+
+	p = tmpnam(fname);
+	PCUT_ASSERT_NOT_NULL(p);
+
+	rc = tbarcfg_create(fname, &tbcfg);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = smenu_entry_create(tbcfg, "A", "a", false, &e1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(e1);
+
+	rc = smenu_entry_sep_create(tbcfg, &e2);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(e2);
+
+	PCUT_ASSERT_FALSE(smenu_entry_get_separator(e1));
+	PCUT_ASSERT_TRUE(smenu_entry_get_separator(e2));
+
+	tbarcfg_close(tbcfg);
+
+	/* Re-open repository */
+
+	rc = tbarcfg_open(fname, &tbcfg);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	e = tbarcfg_smenu_first(tbcfg);
+	PCUT_ASSERT_NOT_NULL(e);
+
+	/* Check that new values of properties have persisted */
+	PCUT_ASSERT_FALSE(smenu_entry_get_separator(e));
+	caption = smenu_entry_get_caption(e);
+	PCUT_ASSERT_STR_EQUALS("A", caption);
+	cmd = smenu_entry_get_cmd(e);
+	PCUT_ASSERT_STR_EQUALS("a", cmd);
+
+	e = tbarcfg_smenu_next(e);
+
+	/* Check that entry is still a separator */
+	PCUT_ASSERT_TRUE(smenu_entry_get_separator(e));
+
+	tbarcfg_close(tbcfg);
+	remove(fname);
+}
+
 /** Getting menu entry properties */
 PCUT_TEST(get_caption_cmd_term)
