Index: uspace/lib/tbarcfg/include/tbarcfg/tbarcfg.h
===================================================================
--- uspace/lib/tbarcfg/include/tbarcfg/tbarcfg.h	(revision 8a43f0183ea262b1d2745eafe4461bc09f21a33e)
+++ uspace/lib/tbarcfg/include/tbarcfg/tbarcfg.h	(revision cad7b7e39ca70d44e5a6c1bbca2a247c8ce1010d)
@@ -38,6 +38,8 @@
 
 #include <errno.h>
+#include <sif.h>
 #include <types/tbarcfg/tbarcfg.h>
 
+extern errno_t tbarcfg_create(const char *, tbarcfg_t **);
 extern errno_t tbarcfg_open(const char *, tbarcfg_t **);
 extern void tbarcfg_close(tbarcfg_t *);
@@ -49,4 +51,6 @@
 extern errno_t smenu_entry_set_cmd(smenu_entry_t *, const char *);
 extern errno_t smenu_entry_save(smenu_entry_t *);
+extern errno_t smenu_entry_create(tbarcfg_t *, const char *, const char *);
+extern errno_t smenu_entry_destroy(smenu_entry_t *);
 
 #endif
Index: uspace/lib/tbarcfg/private/tbarcfg.h
===================================================================
--- uspace/lib/tbarcfg/private/tbarcfg.h	(revision 8a43f0183ea262b1d2745eafe4461bc09f21a33e)
+++ uspace/lib/tbarcfg/private/tbarcfg.h	(revision cad7b7e39ca70d44e5a6c1bbca2a247c8ce1010d)
@@ -48,4 +48,6 @@
 	/** List of start menu entries (smenu_entry_t) */
 	list_t entries;
+	/** Entries SIF node */
+	sif_node_t *nentries;
 };
 
Index: uspace/lib/tbarcfg/src/tbarcfg.c
===================================================================
--- uspace/lib/tbarcfg/src/tbarcfg.c	(revision 8a43f0183ea262b1d2745eafe4461bc09f21a33e)
+++ uspace/lib/tbarcfg/src/tbarcfg.c	(revision cad7b7e39ca70d44e5a6c1bbca2a247c8ce1010d)
@@ -41,4 +41,58 @@
 #include "../private/tbarcfg.h"
 
+/** Create taskbar configuration.
+ *
+ * @param repopath Pathname of the new menu repository
+ * @param rtbcfg Place to store pointer to taskbar configuration
+ * @return EOK on success or an error code
+ */
+errno_t tbarcfg_create(const char *repopath, tbarcfg_t **rtbcfg)
+{
+	tbarcfg_t *tbcfg;
+	sif_sess_t *repo = NULL;
+	sif_node_t *rnode;
+	errno_t rc;
+	sif_trans_t *trans = NULL;
+
+	tbcfg = calloc(1, sizeof(tbarcfg_t));
+	if (tbcfg == NULL) {
+		rc = ENOMEM;
+		goto error;
+	}
+
+	list_initialize(&tbcfg->entries);
+
+	rc = sif_create(repopath, &repo);
+	if (rc != EOK)
+		goto error;
+
+	tbcfg->repo = repo;
+
+	rnode = sif_get_root(repo);
+
+	rc = sif_trans_begin(repo, &trans);
+	if (rc != EOK)
+		goto error;
+
+	rc = sif_node_append_child(trans, rnode, "entries", &tbcfg->nentries);
+	if (rc != EOK)
+		goto error;
+
+	rc = sif_trans_end(trans);
+	if (rc != EOK)
+		goto error;
+
+	*rtbcfg = tbcfg;
+	return EOK;
+error:
+	if (trans != NULL)
+		sif_trans_abort(trans);
+	if (repo != NULL)
+		sif_close(repo);
+	if (tbcfg != NULL)
+		free(tbcfg);
+	return rc;
+}
+
 /** Open taskbar configuration.
  *
@@ -52,5 +106,4 @@
 	sif_sess_t *repo = NULL;
 	sif_node_t *rnode;
-	sif_node_t *nentries;
 	sif_node_t *nentry;
 	const char *ntype;
@@ -74,6 +127,6 @@
 
 	rnode = sif_get_root(repo);
-	nentries = sif_node_first_child(rnode);
-	ntype = sif_node_get_type(nentries);
+	tbcfg->nentries = sif_node_first_child(rnode);
+	ntype = sif_node_get_type(tbcfg->nentries);
 	if (str_cmp(ntype, "entries") != 0) {
 		rc = EIO;
@@ -81,5 +134,5 @@
 	}
 
-	nentry = sif_node_first_child(nentries);
+	nentry = sif_node_first_child(tbcfg->nentries);
 	while (nentry != NULL) {
 		ntype = sif_node_get_type(nentry);
@@ -238,5 +291,5 @@
 errno_t smenu_entry_save(smenu_entry_t *entry)
 {
-	sif_trans_t *trans;
+	sif_trans_t *trans = NULL;
 	errno_t rc;
 
@@ -329,4 +382,69 @@
 }
 
+/** Create new start menu entry.
+ *
+ * @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)
+{
+	sif_node_t *nentry;
+	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 = smenu_entry_new(smenu, nentry, caption, cmd);
+	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;
+}
+
+/** Destroy start menu entry..
+ *
+ * @param entry Start menu entry
+ * @return EOK on success or an error code
+ */
+errno_t smenu_entry_destroy(smenu_entry_t *entry)
+{
+	errno_t rc;
+	sif_trans_t *trans = NULL;
+
+	rc = sif_trans_begin(entry->smenu->repo, &trans);
+	if (rc != EOK)
+		goto error;
+
+	sif_node_destroy(trans, entry->nentry);
+
+	rc = sif_trans_end(trans);
+	if (rc != EOK)
+		goto error;
+
+	smenu_entry_delete(entry);
+error:
+	if (trans != NULL)
+		sif_trans_abort(trans);
+	return rc;
+}
+
 /** @}
  */
Index: uspace/lib/tbarcfg/test/tbarcfg.c
===================================================================
--- uspace/lib/tbarcfg/test/tbarcfg.c	(revision 8a43f0183ea262b1d2745eafe4461bc09f21a33e)
+++ uspace/lib/tbarcfg/test/tbarcfg.c	(revision cad7b7e39ca70d44e5a6c1bbca2a247c8ce1010d)
@@ -36,25 +36,27 @@
 PCUT_TEST_SUITE(tbarcfg);
 
-/** Opening and closing taskbar configuration */
-PCUT_TEST(open_close)
-{
-	errno_t rc;
-	tbarcfg_t *tbcfg;
-	FILE *f;
-	int rv;
-
-	f = fopen("/tmp/test", "wt");
-	PCUT_ASSERT_NOT_NULL(f);
-
-	rv = fputs("[sif](){[entries](){}}", f);
-	PCUT_ASSERT_TRUE(rv >= 0);
-
-	rv = fclose(f);
-	PCUT_ASSERT_INT_EQUALS(0, rv);
-
-	rc = tbarcfg_open("/tmp/test", &tbcfg);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-
-	tbarcfg_close(tbcfg);
+/** Creating, opening and closing taskbar configuration */
+PCUT_TEST(create_open_close)
+{
+	errno_t rc;
+	tbarcfg_t *tbcfg;
+	char fname[L_tmpnam], *p;
+
+	p = tmpnam(fname);
+	PCUT_ASSERT_NOT_NULL(p);
+
+	/* Create new repository */
+	rc = tbarcfg_create(fname, &tbcfg);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	tbarcfg_close(tbcfg);
+
+	/* Re-open the repository */
+
+	rc = tbarcfg_open(fname, &tbcfg);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	tbarcfg_close(tbcfg);
+	remove(fname);
 }
 
@@ -64,21 +66,17 @@
 	errno_t rc;
 	tbarcfg_t *tbcfg;
-	smenu_entry_t *e;
-	FILE *f;
-	int rv;
-
-	f = fopen("/tmp/test", "wt");
-	PCUT_ASSERT_NOT_NULL(f);
-
-	rv = fputs("[sif](){[entries](){"
-	    "[entry]([caption]=[A][cmd]=[a]){}"
-	    "[entry]([caption]=[B][cmd]=[b]){}"
-	    "}}", f);
-	PCUT_ASSERT_TRUE(rv >= 0);
-
-	rv = fclose(f);
-	PCUT_ASSERT_INT_EQUALS(0, rv);
-
-	rc = tbarcfg_open("/tmp/test", &tbcfg);
+	char fname[L_tmpnam], *p;
+	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");
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = smenu_entry_create(tbcfg, "B", "b");
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -91,4 +89,5 @@
 
 	tbarcfg_close(tbcfg);
+	remove(fname);
 }
 
@@ -98,22 +97,16 @@
 	errno_t rc;
 	tbarcfg_t *tbcfg;
+	char fname[L_tmpnam], *p;
 	smenu_entry_t *e;
 	const char *caption;
 	const char *cmd;
-	FILE *f;
-	int rv;
-
-	f = fopen("/tmp/test", "wt");
-	PCUT_ASSERT_NOT_NULL(f);
-
-	rv = fputs("[sif](){[entries](){"
-	    "[entry]([caption]=[A][cmd]=[a]){}"
-	    "}}", f);
-	PCUT_ASSERT_TRUE(rv >= 0);
-
-	rv = fclose(f);
-	PCUT_ASSERT_INT_EQUALS(0, rv);
-
-	rc = tbarcfg_open("/tmp/test", &tbcfg);
+
+	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");
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -127,4 +120,98 @@
 
 	tbarcfg_close(tbcfg);
+	remove(fname);
+}
+
+/** Setting menu entry properties */
+PCUT_TEST(set_caption_cmd)
+{
+	errno_t rc;
+	tbarcfg_t *tbcfg;
+	char fname[L_tmpnam], *p;
+	smenu_entry_t *e;
+	const char *caption;
+	const char *cmd;
+
+	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");
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	e = tbarcfg_smenu_first(tbcfg);
+	PCUT_ASSERT_NOT_NULL(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);
+
+	/* Set properties */
+	rc = smenu_entry_set_caption(e, "B");
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	rc = smenu_entry_set_cmd(e, "b");
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = smenu_entry_save(e);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Check that properties have been set */
+	caption = smenu_entry_get_caption(e);
+	PCUT_ASSERT_STR_EQUALS("B", caption);
+	cmd = smenu_entry_get_cmd(e);
+	PCUT_ASSERT_STR_EQUALS("b", cmd);
+
+	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 */
+	caption = smenu_entry_get_caption(e);
+	PCUT_ASSERT_STR_EQUALS("B", caption);
+	cmd = smenu_entry_get_cmd(e);
+	PCUT_ASSERT_STR_EQUALS("b", cmd);
+
+	tbarcfg_close(tbcfg);
+	remove(fname);
+}
+
+/** Create start menu entry */
+PCUT_TEST(entry_create)
+{
+	errno_t rc;
+	tbarcfg_t *tbcfg;
+	char fname[L_tmpnam], *p;
+	smenu_entry_t *e;
+	const char *caption;
+	const char *cmd;
+
+	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");
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	e = tbarcfg_smenu_first(tbcfg);
+	PCUT_ASSERT_NOT_NULL(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);
+
+	tbarcfg_close(tbcfg);
+	remove(fname);
 }
 
