Index: uspace/app/taskbar-cfg/smeedit.c
===================================================================
--- uspace/app/taskbar-cfg/smeedit.c	(revision 40eab9fdcc5233a31ae07d23360a0b5fc2e5c701)
+++ uspace/app/taskbar-cfg/smeedit.c	(revision b1397ab53bc6bd57626e42c92953b27cad139528)
@@ -48,4 +48,17 @@
 };
 
+static void smeedit_ok_clicked(ui_pbutton_t *, void *);
+static void smeedit_cancel_clicked(ui_pbutton_t *, void *);
+
+/** OK button callbacks */
+ui_pbutton_cb_t smeedit_ok_button_cb = {
+	.clicked = smeedit_ok_clicked
+};
+
+/** Cancel button callbacks */
+ui_pbutton_cb_t smeedit_cancel_button_cb = {
+	.clicked = smeedit_cancel_clicked
+};
+
 /** Window close button was clicked.
  *
@@ -64,8 +77,11 @@
  *
  * @param smenu Start menu
+ * @param smentry Start menu entry to edit or @c NULL if creating
+ *                a new entry
  * @param rsmee Place to store pointer to new start menu entry edit window
  * @return EOK on success or an error code
  */
-errno_t smeedit_create(startmenu_t *smenu, smeedit_t **rsmee)
+errno_t smeedit_create(startmenu_t *smenu, startmenu_entry_t *smentry,
+    smeedit_t **rsmee)
 {
 	ui_wnd_params_t params;
@@ -75,7 +91,17 @@
 	gfx_rect_t rect;
 	ui_resource_t *res;
+	const char *cmd;
+	const char *caption;
 	errno_t rc;
 
 	ui = smenu->tbarcfg->ui;
+
+	if (smentry != NULL) {
+		cmd = smenu_entry_get_cmd(smentry->entry);
+		caption = smenu_entry_get_caption(smentry->entry);
+	} else {
+		cmd = "";
+		caption = "";
+	}
 
 	smee = calloc(1, sizeof(smeedit_t));
@@ -85,4 +111,6 @@
 	}
 
+	smee->smentry = smentry;
+
 	ui_wnd_params_init(&params);
 	params.caption = "Edit Start Menu Entry";
@@ -145,5 +173,5 @@
 	/* Command entry */
 
-	rc = ui_entry_create(window, "foo", &smee->ecmd);
+	rc = ui_entry_create(window, cmd, &smee->ecmd);
 	if (rc != EOK)
 		goto error;
@@ -199,5 +227,5 @@
 	/* Caption entry */
 
-	rc = ui_entry_create(window, "bar", &smee->ecaption);
+	rc = ui_entry_create(window, caption, &smee->ecaption);
 	if (rc != EOK)
 		goto error;
@@ -243,4 +271,5 @@
 	}
 
+	ui_pbutton_set_cb(smee->bok, &smeedit_ok_button_cb, (void *)smee);
 	ui_pbutton_set_rect(smee->bok, &rect);
 	ui_pbutton_set_default(smee->bok, true);
@@ -271,4 +300,6 @@
 	}
 
+	ui_pbutton_set_cb(smee->bcancel, &smeedit_cancel_button_cb,
+	    (void *)smee);
 	ui_pbutton_set_rect(smee->bcancel, &rect);
 
@@ -303,4 +334,49 @@
 }
 
+/** OK button clicked.
+ *
+ * @params bok OK button
+ * @params arg Argument (smeedit_t *)
+ */
+static void smeedit_ok_clicked(ui_pbutton_t *bok, void *arg)
+{
+	smeedit_t *smee;
+	const char *cmd;
+	const char *caption;
+	errno_t rc;
+
+	(void)bok;
+	smee = (smeedit_t *)arg;
+
+	cmd = ui_entry_get_text(smee->ecmd);
+	caption = ui_entry_get_text(smee->ecaption);
+
+	rc = smenu_entry_set_cmd(smee->smentry->entry, cmd);
+	if (rc != EOK)
+		return;
+
+	smenu_entry_set_caption(smee->smentry->entry, caption);
+	if (rc != EOK)
+		return;
+
+	(void)smenu_entry_save(smee->smentry->entry);
+
+	smeedit_destroy(smee);
+}
+
+/** Cancel button clicked.
+ *
+ * @params bok OK button
+ * @params arg Argument (smeedit_t *)
+ */
+static void smeedit_cancel_clicked(ui_pbutton_t *bcancel, void *arg)
+{
+	smeedit_t *smee;
+
+	(void)bcancel;
+	smee = (smeedit_t *)arg;
+	smeedit_destroy(smee);
+}
+
 /** @}
  */
Index: uspace/app/taskbar-cfg/smeedit.h
===================================================================
--- uspace/app/taskbar-cfg/smeedit.h	(revision 40eab9fdcc5233a31ae07d23360a0b5fc2e5c701)
+++ uspace/app/taskbar-cfg/smeedit.h	(revision b1397ab53bc6bd57626e42c92953b27cad139528)
@@ -40,5 +40,5 @@
 #include "types/startmenu.h"
 
-extern errno_t smeedit_create(startmenu_t *, smeedit_t **);
+extern errno_t smeedit_create(startmenu_t *, startmenu_entry_t *, smeedit_t **);
 extern void smeedit_destroy(smeedit_t *);
 
Index: uspace/app/taskbar-cfg/startmenu.c
===================================================================
--- uspace/app/taskbar-cfg/startmenu.c	(revision 40eab9fdcc5233a31ae07d23360a0b5fc2e5c701)
+++ uspace/app/taskbar-cfg/startmenu.c	(revision b1397ab53bc6bd57626e42c92953b27cad139528)
@@ -292,14 +292,9 @@
 	smenu_entry_t *entry;
 	startmenu_entry_t *smentry;
-	const char *caption;
-	const char *cmd;
 	errno_t rc;
 
 	entry = tbarcfg_smenu_first(tbarcfg);
 	while (entry != NULL) {
-		caption = smenu_entry_get_caption(entry);
-		cmd = smenu_entry_get_cmd(entry);
-
-		rc = startmenu_insert(smenu, caption, cmd, &smentry);
+		rc = startmenu_insert(smenu, entry, &smentry);
 		if (rc != EOK)
 			return rc;
@@ -323,6 +318,4 @@
 	while (lentry != NULL) {
 		entry = (startmenu_entry_t *)ui_list_entry_get_arg(lentry);
-		free(entry->caption);
-		free(entry->cmd);
 		free(entry);
 		ui_list_entry_delete(lentry);
@@ -338,50 +331,51 @@
  *
  * @param smenu Start menu configuration tab
- * @param caption Entry caption
- * @param cmd Command to run
- * @param rentry Place to store pointer to new entry or NULL
+ * @param entry Backing entry
+ * @param rsmentry Place to store pointer to new entry or NULL
  * @return EOK on success or an error code
  */
-errno_t startmenu_insert(startmenu_t *smenu, const char *caption,
-    const char *cmd, startmenu_entry_t **rentry)
-{
-	startmenu_entry_t *entry;
+errno_t startmenu_insert(startmenu_t *smenu, smenu_entry_t *entry,
+    startmenu_entry_t **rsmentry)
+{
+	startmenu_entry_t *smentry;
 	ui_list_entry_attr_t attr;
 	errno_t rc;
 
-	entry = calloc(1, sizeof(startmenu_entry_t));
-	if (entry == NULL)
+	smentry = calloc(1, sizeof(startmenu_entry_t));
+	if (smentry == NULL)
 		return ENOMEM;
 
-	entry->startmenu = smenu;
-	entry->caption = str_dup(caption);
-	if (entry->caption == NULL) {
-		free(entry);
-		return ENOMEM;
-	}
-
-	entry->cmd = str_dup(cmd);
-	if (entry->caption == NULL) {
-		free(entry->caption);
-		free(entry);
-		return ENOMEM;
-	}
-
+	smentry->startmenu = smenu;
+	smentry->entry = entry;
+
+	printf("startmenu_insert: smentry=%p entry=%p\n",
+	    smentry, entry);
 	ui_list_entry_attr_init(&attr);
-	attr.caption = caption;
-	attr.arg = (void *)entry;
-	rc = ui_list_entry_append(smenu->entries_list, &attr, &entry->lentry);
-	if (rc != EOK) {
-		free(entry->caption);
-		free(entry->cmd);
-		free(entry);
+	attr.caption = smenu_entry_get_caption(entry);
+	attr.arg = (void *)smentry;
+	rc = ui_list_entry_append(smenu->entries_list, &attr, &smentry->lentry);
+	if (rc != EOK) {
+		free(smentry);
 		return rc;
 	}
 
-	if (rentry != NULL)
-		*rentry = entry;
+	if (rsmentry != NULL)
+		*rsmentry = smentry;
 	return EOK;
 }
 
+/** Get selected start menu entry.
+ *
+ * @param smenu Start menu
+ * @return Selected entry
+ */
+startmenu_entry_t *startmenu_get_selected(startmenu_t *smenu)
+{
+	ui_list_entry_t *entry;
+
+	entry = ui_list_get_cursor(smenu->entries_list);
+	return (startmenu_entry_t *)ui_list_entry_get_arg(entry);
+}
+
 /** Edit selected menu entry.
  *
@@ -391,7 +385,11 @@
 {
 	smeedit_t *smee;
+	startmenu_entry_t *smentry;
 	errno_t rc;
 
-	rc = smeedit_create(smenu, &smee);
+	smentry = startmenu_get_selected(smenu);
+
+	printf("smeedit_create:entry=%p\n", smentry);
+	rc = smeedit_create(smenu, smentry, &smee);
 	if (rc != EOK)
 		return;
Index: uspace/app/taskbar-cfg/startmenu.h
===================================================================
--- uspace/app/taskbar-cfg/startmenu.h	(revision 40eab9fdcc5233a31ae07d23360a0b5fc2e5c701)
+++ uspace/app/taskbar-cfg/startmenu.h	(revision b1397ab53bc6bd57626e42c92953b27cad139528)
@@ -44,6 +44,7 @@
 extern errno_t startmenu_populate(startmenu_t *, tbarcfg_t *);
 extern void startmenu_destroy(startmenu_t *);
-extern errno_t startmenu_insert(startmenu_t *, const char *, const char *,
+extern errno_t startmenu_insert(startmenu_t *, smenu_entry_t *,
     startmenu_entry_t **);
+extern startmenu_entry_t *startmenu_get_selected(startmenu_t *);
 extern void startmenu_edit(startmenu_t *);
 
Index: uspace/app/taskbar-cfg/types/smeedit.h
===================================================================
--- uspace/app/taskbar-cfg/types/smeedit.h	(revision 40eab9fdcc5233a31ae07d23360a0b5fc2e5c701)
+++ uspace/app/taskbar-cfg/types/smeedit.h	(revision b1397ab53bc6bd57626e42c92953b27cad139528)
@@ -47,4 +47,6 @@
 	/** Containing start menu configuration tab */
 	struct startmenu *startmenu;
+	/** Start menu entry or @c NULL if creating a new entry */
+	struct startmenu_entry *smentry;
 	/** Window */
 	ui_window_t *window;
Index: uspace/app/taskbar-cfg/types/startmenu.h
===================================================================
--- uspace/app/taskbar-cfg/types/startmenu.h	(revision 40eab9fdcc5233a31ae07d23360a0b5fc2e5c701)
+++ uspace/app/taskbar-cfg/types/startmenu.h	(revision b1397ab53bc6bd57626e42c92953b27cad139528)
@@ -37,4 +37,5 @@
 #define TYPES_STARTMENU_H
 
+#include <tbarcfg/tbarcfg.h>
 #include <ui/fixed.h>
 #include <ui/label.h>
@@ -64,13 +65,11 @@
 
 /** Start menu entry */
-typedef struct {
+typedef struct startmenu_entry {
 	/** Containing start menu configuration tab */
 	struct startmenu *startmenu;
+	/** Backing entry */
+	smenu_entry_t *entry;
 	/** List entry */
 	ui_list_entry_t *lentry;
-	/** Caption */
-	char *caption;
-	/** Command */
-	char *cmd;
 } startmenu_entry_t;
 
Index: uspace/lib/tbarcfg/include/tbarcfg/tbarcfg.h
===================================================================
--- uspace/lib/tbarcfg/include/tbarcfg/tbarcfg.h	(revision 40eab9fdcc5233a31ae07d23360a0b5fc2e5c701)
+++ uspace/lib/tbarcfg/include/tbarcfg/tbarcfg.h	(revision b1397ab53bc6bd57626e42c92953b27cad139528)
@@ -46,4 +46,7 @@
 extern const char *smenu_entry_get_caption(smenu_entry_t *);
 extern const char *smenu_entry_get_cmd(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 *);
+extern errno_t smenu_entry_save(smenu_entry_t *);
 
 #endif
Index: uspace/lib/tbarcfg/private/tbarcfg.h
===================================================================
--- uspace/lib/tbarcfg/private/tbarcfg.h	(revision 40eab9fdcc5233a31ae07d23360a0b5fc2e5c701)
+++ uspace/lib/tbarcfg/private/tbarcfg.h	(revision b1397ab53bc6bd57626e42c92953b27cad139528)
@@ -44,4 +44,6 @@
 /** Taskbar configuration */
 struct tbarcfg {
+	/** Repository session */
+	sif_sess_t *repo;
 	/** List of start menu entries (smenu_entry_t) */
 	list_t entries;
@@ -54,4 +56,6 @@
 	/** Link to @c smenu->entries */
 	link_t lentries;
+	/** SIF node (persistent storage) */
+	sif_node_t *nentry;
 	/** Entry caption (with accelerator markup) */
 	char *caption;
@@ -60,5 +64,5 @@
 };
 
-extern errno_t smenu_entry_create(tbarcfg_t *, const char *,
+extern errno_t smenu_entry_create(tbarcfg_t *, sif_node_t *, const char *,
     const char *);
 
Index: uspace/lib/tbarcfg/src/tbarcfg.c
===================================================================
--- uspace/lib/tbarcfg/src/tbarcfg.c	(revision 40eab9fdcc5233a31ae07d23360a0b5fc2e5c701)
+++ uspace/lib/tbarcfg/src/tbarcfg.c	(revision b1397ab53bc6bd57626e42c92953b27cad139528)
@@ -71,4 +71,6 @@
 		goto error;
 
+	tbcfg->repo = repo;
+
 	rnode = sif_get_root(repo);
 	nentries = sif_node_first_child(rnode);
@@ -99,5 +101,5 @@
 		}
 
-		rc = smenu_entry_create(tbcfg, caption, cmd);
+		rc = smenu_entry_create(tbcfg, nentry, caption, cmd);
 		if (rc != EOK)
 			goto error;
@@ -122,4 +124,5 @@
 void tbarcfg_close(tbarcfg_t *tbcfg)
 {
+	(void)sif_close(tbcfg->repo);
 }
 
@@ -176,4 +179,80 @@
 }
 
+/** Set start menu entry caption.
+ *
+ * Note: To make the change visible to others and persistent,
+ * you must call @c smenu_entry_save()
+ *
+ * @param entry Start menu entry
+ * @param caption New caption
+ * @return EOK on success, ENOMEM if out of memory
+ */
+errno_t smenu_entry_set_caption(smenu_entry_t *entry, const char *caption)
+{
+	char *dcap;
+
+	dcap = str_dup(caption);
+	if (dcap == NULL)
+		return ENOMEM;
+
+	free(entry->caption);
+	entry->caption = dcap;
+	return EOK;
+}
+
+/** Set start menu entry command.
+ *
+ * Note: To make the change visible to others and persistent,
+ * you must call @c smenu_entry_save()
+ *
+ * @param entry Start menu entry
+ * @param cmd New command
+ * @return EOK on success, ENOMEM if out of memory
+ */
+errno_t smenu_entry_set_cmd(smenu_entry_t *entry, const char *cmd)
+{
+	char *dcmd;
+
+	dcmd = str_dup(cmd);
+	if (dcmd == NULL)
+		return ENOMEM;
+
+	free(entry->cmd);
+	entry->cmd = dcmd;
+	return EOK;
+}
+
+/** Save any changes to start menu entry.
+ *
+ * @param entry Start menu entry
+ */
+errno_t smenu_entry_save(smenu_entry_t *entry)
+{
+	sif_trans_t *trans;
+	errno_t rc;
+
+	rc = sif_trans_begin(entry->smenu->repo, &trans);
+	if (rc != EOK)
+		goto error;
+
+	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_trans_end(trans);
+	if (rc != EOK)
+		goto error;
+
+	return EOK;
+error:
+	if (trans != NULL)
+		sif_trans_abort(trans);
+	return rc;
+}
+
 /** Create a start menu entry and append it to the start menu (internal).
  *
@@ -181,9 +260,10 @@
  *
  * @param smenu Start menu
+ * @param nentry Backing SIF node
  * @param caption Caption
  * @param cmd Command to run
  */
-errno_t smenu_entry_create(tbarcfg_t *smenu, const char *caption,
-    const char *cmd)
+errno_t smenu_entry_create(tbarcfg_t *smenu, sif_node_t *nentry,
+    const char *caption, const char *cmd)
 {
 	smenu_entry_t *entry;
@@ -195,4 +275,6 @@
 		goto error;
 	}
+
+	entry->nentry = nentry;
 
 	entry->caption = str_dup(caption);
