Index: uspace/app/taskbar-cfg/meson.build
===================================================================
--- uspace/app/taskbar-cfg/meson.build	(revision 44e85413b5db9e8d690890c835ecbdf8ec078d8e)
+++ uspace/app/taskbar-cfg/meson.build	(revision dcd821423a6084e9e2ec7fc7a6a9ae5065d0fd07)
@@ -31,4 +31,5 @@
 	'taskbar-cfg.c',
 	'main.c',
+	'smeedit.c',
 	'startmenu.c'
 )
Index: uspace/app/taskbar-cfg/smeedit.c
===================================================================
--- uspace/app/taskbar-cfg/smeedit.c	(revision dcd821423a6084e9e2ec7fc7a6a9ae5065d0fd07)
+++ uspace/app/taskbar-cfg/smeedit.c	(revision dcd821423a6084e9e2ec7fc7a6a9ae5065d0fd07)
@@ -0,0 +1,306 @@
+/*
+ * Copyright (c) 2023 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup taskbar-cfg
+ * @{
+ */
+/** @file Start menu entry edit dialog
+ */
+
+#include <gfx/coord.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <ui/fixed.h>
+#include <ui/resource.h>
+#include <ui/window.h>
+#include "taskbar-cfg.h"
+#include "smeedit.h"
+
+static void wnd_close(ui_window_t *, void *);
+
+static ui_window_cb_t window_cb = {
+	.close = wnd_close
+};
+
+/** Window close button was clicked.
+ *
+ * @param window Window
+ * @param arg Argument (tbcfg)
+ */
+static void wnd_close(ui_window_t *window, void *arg)
+{
+	smeedit_t *smee = (smeedit_t *)arg;
+
+	(void)window;
+	smeedit_destroy(smee);
+}
+
+/** Create start menu entry edit dialog.
+ *
+ * @param smenu Start menu
+ * @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)
+{
+	ui_wnd_params_t params;
+	ui_t *ui;
+	ui_window_t *window = NULL;
+	smeedit_t *smee = NULL;
+	gfx_rect_t rect;
+	ui_resource_t *res;
+	errno_t rc;
+
+	ui = smenu->tbarcfg->ui;
+
+	smee = calloc(1, sizeof(smeedit_t));
+	if (smee == NULL) {
+		printf("Out of memory.\n");
+		return ENOMEM;
+	}
+
+	ui_wnd_params_init(&params);
+	params.caption = "Edit Start Menu Entry";
+	if (ui_is_textmode(ui)) {
+		params.rect.p0.x = 0;
+		params.rect.p0.y = 0;
+		params.rect.p1.x = 50;
+		params.rect.p1.y = 12;
+	} else {
+		params.rect.p0.x = 0;
+		params.rect.p0.y = 0;
+		params.rect.p1.x = 370;
+		params.rect.p1.y = 200;
+	}
+
+	rc = ui_window_create(ui, &params, &window);
+	if (rc != EOK) {
+		printf("Error creating window.\n");
+		goto error;
+	}
+
+	ui_window_set_cb(window, &window_cb, (void *)smee);
+	smee->window = window;
+
+	res = ui_window_get_res(window);
+
+	rc = ui_fixed_create(&smee->fixed);
+	if (rc != EOK) {
+		printf("Error creating fixed layout.\n");
+		goto error;
+	}
+
+	/* Command to run label */
+
+	rc = ui_label_create(res, "Command to run:", &smee->lcmd);
+	if (rc != EOK)
+		goto error;
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		rect.p0.x = 3;
+		rect.p0.y = 2;
+		rect.p1.x = 48;
+		rect.p1.y = 3;
+	} else {
+		rect.p0.x = 10;
+		rect.p0.y = 35;
+		rect.p1.x = 190;
+		rect.p1.y = 50;
+	}
+
+	ui_label_set_rect(smee->lcmd, &rect);
+
+	rc = ui_fixed_add(smee->fixed, ui_label_ctl(smee->lcmd));
+	if (rc != EOK) {
+		printf("Error adding control to layout.\n");
+		goto error;
+	}
+
+	/* Command entry */
+
+	rc = ui_entry_create(window, "foo", &smee->ecmd);
+	if (rc != EOK)
+		goto error;
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		rect.p0.x = 3;
+		rect.p0.y = 3;
+		rect.p1.x = 48;
+		rect.p1.y = 4;
+	} else {
+		rect.p0.x = 10;
+		rect.p0.y = 50;
+		rect.p1.x = 360;
+		rect.p1.y = 75;
+	}
+
+	ui_entry_set_rect(smee->ecmd, &rect);
+
+	rc = ui_fixed_add(smee->fixed, ui_entry_ctl(smee->ecmd));
+	if (rc != EOK) {
+		printf("Error adding control to layout.\n");
+		goto error;
+	}
+
+	/* Caption label */
+
+	rc = ui_label_create(res, "Caption:", &smee->lcaption);
+	if (rc != EOK)
+		goto error;
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		rect.p0.x = 3;
+		rect.p0.y = 5;
+		rect.p1.x = 20;
+		rect.p1.y = 6;
+	} else {
+		rect.p0.x = 10;
+		rect.p0.y = 95;
+		rect.p1.x = 190;
+		rect.p1.y = 110;
+	}
+
+	ui_label_set_rect(smee->lcaption, &rect);
+
+	rc = ui_fixed_add(smee->fixed, ui_label_ctl(smee->lcaption));
+	if (rc != EOK) {
+		printf("Error adding control to layout.\n");
+		goto error;
+	}
+
+	/* Caption entry */
+
+	rc = ui_entry_create(window, "bar", &smee->ecaption);
+	if (rc != EOK)
+		goto error;
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		rect.p0.x = 3;
+		rect.p0.y = 6;
+		rect.p1.x = 48;
+		rect.p1.y = 7;
+	} else {
+		rect.p0.x = 10;
+		rect.p0.y = 110;
+		rect.p1.x = 360;
+		rect.p1.y = 135;
+	}
+
+	ui_entry_set_rect(smee->ecaption, &rect);
+
+	rc = ui_fixed_add(smee->fixed, ui_entry_ctl(smee->ecaption));
+	if (rc != EOK) {
+		printf("Error adding control to layout.\n");
+		goto error;
+	}
+
+	/* OK button */
+
+	rc = ui_pbutton_create(res, "OK", &smee->bok);
+	if (rc != EOK)
+		goto error;
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		rect.p0.x = 23;
+		rect.p0.y = 9;
+		rect.p1.x = 35;
+		rect.p1.y = 10;
+	} else {
+		rect.p0.x = 190;
+		rect.p0.y = 155;
+		rect.p1.x = 270;
+		rect.p1.y = 180;
+	}
+
+	ui_pbutton_set_rect(smee->bok, &rect);
+	ui_pbutton_set_default(smee->bok, true);
+
+	rc = ui_fixed_add(smee->fixed, ui_pbutton_ctl(smee->bok));
+	if (rc != EOK) {
+		printf("Error adding control to layout.\n");
+		goto error;
+	}
+
+	/* Cancel button */
+
+	rc = ui_pbutton_create(res, "Cancel", &smee->bcancel);
+	if (rc != EOK)
+		goto error;
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		rect.p0.x = 36;
+		rect.p0.y = 9;
+		rect.p1.x = 48;
+		rect.p1.y = 10;
+	} else {
+		rect.p0.x = 280;
+		rect.p0.y = 155;
+		rect.p1.x = 360;
+		rect.p1.y = 180;
+	}
+
+	ui_pbutton_set_rect(smee->bcancel, &rect);
+
+	rc = ui_fixed_add(smee->fixed, ui_pbutton_ctl(smee->bcancel));
+	if (rc != EOK) {
+		printf("Error adding control to layout.\n");
+		goto error;
+	}
+
+	ui_window_add(window, ui_fixed_ctl(smee->fixed));
+
+	rc = ui_window_paint(window);
+	if (rc != EOK)
+		goto error;
+
+	*rsmee = smee;
+	return EOK;
+error:
+	if (smee->window != NULL)
+		ui_window_destroy(smee->window);
+	free(smee);
+	return rc;
+}
+
+/** Destroy Taskbar configuration window.
+ *
+ * @param smee Start menu entry edit dialog
+ */
+void smeedit_destroy(smeedit_t *smee)
+{
+	ui_window_destroy(smee->window);
+}
+
+/** @}
+ */
Index: uspace/app/taskbar-cfg/smeedit.h
===================================================================
--- uspace/app/taskbar-cfg/smeedit.h	(revision dcd821423a6084e9e2ec7fc7a6a9ae5065d0fd07)
+++ uspace/app/taskbar-cfg/smeedit.h	(revision dcd821423a6084e9e2ec7fc7a6a9ae5065d0fd07)
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2023 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup taskbar-cfg
+ * @{
+ */
+/**
+ * @file Start menu entry edit dialog
+ */
+
+#ifndef SMEEDIT_H
+#define SMEEDIT_H
+
+#include "types/smeedit.h"
+#include "types/startmenu.h"
+
+extern errno_t smeedit_create(startmenu_t *, smeedit_t **);
+extern void smeedit_destroy(smeedit_t *);
+
+#endif
+
+/** @}
+ */
Index: uspace/app/taskbar-cfg/startmenu.c
===================================================================
--- uspace/app/taskbar-cfg/startmenu.c	(revision 44e85413b5db9e8d690890c835ecbdf8ec078d8e)
+++ uspace/app/taskbar-cfg/startmenu.c	(revision dcd821423a6084e9e2ec7fc7a6a9ae5065d0fd07)
@@ -46,4 +46,5 @@
 #include <ui/tab.h>
 #include <ui/window.h>
+#include "smeedit.h"
 #include "startmenu.h"
 #include "taskbar-cfg.h"
@@ -52,4 +53,5 @@
 static void startmenu_new_entry_clicked(ui_pbutton_t *, void *);
 static void startmenu_delete_entry_clicked(ui_pbutton_t *, void *);
+static void startmenu_edit_entry_clicked(ui_pbutton_t *, void *);
 
 /** Entry list callbacks */
@@ -63,7 +65,12 @@
 };
 
-/** Remove seat button callbacks */
+/** Delete entry button callbacks */
 ui_pbutton_cb_t startmenu_delete_entry_button_cb = {
 	.clicked = startmenu_delete_entry_clicked
+};
+
+/** Edit entry button callbacks */
+ui_pbutton_cb_t startmenu_edit_entry_button_cb = {
+	.clicked = startmenu_edit_entry_clicked
 };
 
@@ -163,5 +170,5 @@
 	    (void *)smenu);
 
-	/* 'New Entry' button */
+	/* New entry button */
 
 	rc = ui_pbutton_create(ui_res, "New...", &smenu->new_entry);
@@ -194,5 +201,5 @@
 	    (void *)smenu);
 
-	/* 'Delete Entry' button */
+	/* Delete entry button */
 
 	rc = ui_pbutton_create(ui_res, "Delete", &smenu->delete_entry);
@@ -224,4 +231,35 @@
 	ui_pbutton_set_cb(smenu->delete_entry,
 	    &startmenu_delete_entry_button_cb, (void *)smenu);
+
+	/* Edit entry button */
+
+	rc = ui_pbutton_create(ui_res, "Edit...", &smenu->edit_entry);
+	if (rc != EOK) {
+		printf("Error creating button.\n");
+		goto error;
+	}
+
+	if (ui_resource_is_textmode(ui_res)) {
+		rect.p0.x = 58;
+		rect.p0.y = 9;
+		rect.p1.x = 68;
+		rect.p1.y = 10;
+	} else {
+		rect.p0.x = 370;
+		rect.p0.y = 140;
+		rect.p1.x = 450;
+		rect.p1.y = 165;
+	}
+
+	ui_pbutton_set_rect(smenu->edit_entry, &rect);
+
+	rc = ui_fixed_add(smenu->fixed, ui_pbutton_ctl(smenu->edit_entry));
+	if (rc != EOK) {
+		printf("Error adding control to layout.\n");
+		goto error;
+	}
+
+	ui_pbutton_set_cb(smenu->edit_entry,
+	    &startmenu_edit_entry_button_cb, (void *)smenu);
 
 	ui_tab_add(smenu->tab, ui_fixed_ctl(smenu->fixed));
@@ -346,4 +384,20 @@
 }
 
+/** Edit selected menu entry.
+ *
+ * @param smenu Start menu
+ */
+void startmenu_edit(startmenu_t *smenu)
+{
+	smeedit_t *smee;
+	errno_t rc;
+
+	rc = smeedit_create(smenu, &smee);
+	if (rc != EOK)
+		return;
+
+	(void)smee;
+}
+
 /** Entry in entry list is selected.
  *
@@ -357,8 +411,8 @@
 }
 
-/** New Entry' button clicked.
+/** New entry button clicked.
  *
  * @param pbutton Push button
- * @param arg Argument (dcfg_seats_entry_t *)
+ * @param arg Argument (startmenu_t *)
  */
 static void startmenu_new_entry_clicked(ui_pbutton_t *pbutton, void *arg)
@@ -368,8 +422,8 @@
 }
 
-/** "Delete Entry' button clicked.
+/** Delete entry button clicked.
  *
  * @param pbutton Push button
- * @param arg Argument (dcfg_seats_entry_t *)
+ * @param arg Argument (startmenu_t *)
  */
 static void startmenu_delete_entry_clicked(ui_pbutton_t *pbutton, void *arg)
@@ -379,4 +433,17 @@
 }
 
+/** Edit entry button clicked.
+ *
+ * @param pbutton Push button
+ * @param arg Argument (startmenu_t *)
+ */
+static void startmenu_edit_entry_clicked(ui_pbutton_t *pbutton, void *arg)
+{
+	startmenu_t *smenu = (startmenu_t *)arg;
+
+	(void)pbutton;
+	startmenu_edit(smenu);
+}
+
 /** @}
  */
Index: uspace/app/taskbar-cfg/startmenu.h
===================================================================
--- uspace/app/taskbar-cfg/startmenu.h	(revision 44e85413b5db9e8d690890c835ecbdf8ec078d8e)
+++ uspace/app/taskbar-cfg/startmenu.h	(revision dcd821423a6084e9e2ec7fc7a6a9ae5065d0fd07)
@@ -46,4 +46,5 @@
 extern errno_t startmenu_insert(startmenu_t *, const char *, const char *,
     startmenu_entry_t **);
+extern void startmenu_edit(startmenu_t *);
 
 #endif
Index: uspace/app/taskbar-cfg/types/smeedit.h
===================================================================
--- uspace/app/taskbar-cfg/types/smeedit.h	(revision dcd821423a6084e9e2ec7fc7a6a9ae5065d0fd07)
+++ uspace/app/taskbar-cfg/types/smeedit.h	(revision dcd821423a6084e9e2ec7fc7a6a9ae5065d0fd07)
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2023 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup taskbar-cfg
+ * @{
+ */
+/**
+ * @file Start menu entry edit dialog
+ */
+
+#ifndef TYPES_SMEEDIT_H
+#define TYPES_SMEEDIT_H
+
+#include <ui/fixed.h>
+#include <ui/label.h>
+#include <ui/entry.h>
+#include <ui/pbutton.h>
+#include <ui/window.h>
+
+/** Start menu entry edit dialog */
+typedef struct smeedit {
+	/** Containing start menu configuration tab */
+	struct startmenu *startmenu;
+	/** Window */
+	ui_window_t *window;
+	/** Fixed layout */
+	ui_fixed_t *fixed;
+	/** 'Caption' label */
+	ui_label_t *lcaption;
+	/** Caption entry */
+	ui_entry_t *ecaption;
+	/** 'Command' label */
+	ui_label_t *lcmd;
+	/** Command entry */
+	ui_entry_t *ecmd;
+	/** OK buttion */
+	ui_pbutton_t *bok;
+	/** Cancel button */
+	ui_pbutton_t *bcancel;
+} smeedit_t;
+
+#endif
+
+/** @}
+ */
