Index: uspace/app/edit/edit.c
===================================================================
--- uspace/app/edit/edit.c	(revision a330f2e749f1b6601ff0ded39e986b215833f55d)
+++ uspace/app/edit/edit.c	(revision 448c4488f6297e742f234a4f376d1a4d2baa958e)
@@ -210,4 +210,6 @@
 static void selection_delete(void);
 static void selection_copy(void);
+static void edit_cut(void);
+static void edit_paste(void);
 static void insert_clipboard_data(void);
 
@@ -242,7 +244,16 @@
 };
 
+static void edit_file_save(ui_menu_entry_t *, void *);
+static void edit_file_save_as(ui_menu_entry_t *, void *);
 static void edit_file_exit(ui_menu_entry_t *, void *);
+static void edit_edit_cut(ui_menu_entry_t *, void *);
 static void edit_edit_copy(ui_menu_entry_t *, void *);
 static void edit_edit_paste(ui_menu_entry_t *, void *);
+static void edit_edit_delete(ui_menu_entry_t *, void *);
+static void edit_edit_select_all(ui_menu_entry_t *, void *);
+static void edit_search_find(ui_menu_entry_t *, void *);
+static void edit_search_reverse_find(ui_menu_entry_t *, void *);
+static void edit_search_find_next(ui_menu_entry_t *, void *);
+static void edit_search_go_to_line(ui_menu_entry_t *, void *);
 
 static void pane_ctl_destroy(void *);
@@ -368,7 +379,20 @@
 	ui_menu_t *mfile = NULL;
 	ui_menu_t *medit = NULL;
+	ui_menu_entry_t *msave = NULL;
+	ui_menu_entry_t *msaveas = NULL;
+	ui_menu_entry_t *mfsep = NULL;
 	ui_menu_entry_t *mexit = NULL;
+	ui_menu_entry_t *mcut = NULL;
 	ui_menu_entry_t *mcopy = NULL;
 	ui_menu_entry_t *mpaste = NULL;
+	ui_menu_entry_t *mdelete = NULL;
+	ui_menu_entry_t *mesep = NULL;
+	ui_menu_entry_t *mselall = NULL;
+	ui_menu_t *msearch = NULL;
+	ui_menu_entry_t *mfind = NULL;
+	ui_menu_entry_t *mfindr = NULL;
+	ui_menu_entry_t *mfindn = NULL;
+	ui_menu_entry_t *mssep = NULL;
+	ui_menu_entry_t *mgoto = NULL;
 	gfx_rect_t arect;
 	gfx_rect_t rect;
@@ -414,5 +438,5 @@
 	}
 
-	rc = ui_menu_entry_create(mfile, "Exit", "Alt-F4", &mexit);
+	rc = ui_menu_entry_create(mfile, "Save", "Ctrl-S", &msave);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -420,4 +444,26 @@
 	}
 
+	ui_menu_entry_set_cb(msave, edit_file_save, (void *) edit);
+
+	rc = ui_menu_entry_create(mfile, "Save As", "Ctrl-E", &msaveas);
+	if (rc != EOK) {
+		printf("Error creating menu.\n");
+		return rc;
+	}
+
+	ui_menu_entry_set_cb(msaveas, edit_file_save_as, (void *) edit);
+
+	rc = ui_menu_entry_sep_create(mfile, &mfsep);
+	if (rc != EOK) {
+		printf("Error creating menu.\n");
+		return rc;
+	}
+
+	rc = ui_menu_entry_create(mfile, "Exit", "Ctrl-Q", &mexit);
+	if (rc != EOK) {
+		printf("Error creating menu.\n");
+		return rc;
+	}
+
 	ui_menu_entry_set_cb(mexit, edit_file_exit, (void *) edit);
 
@@ -428,4 +474,12 @@
 	}
 
+	rc = ui_menu_entry_create(medit, "Cut", "Ctrl-X", &mcut);
+	if (rc != EOK) {
+		printf("Error creating menu.\n");
+		return rc;
+	}
+
+	ui_menu_entry_set_cb(mcut, edit_edit_cut, (void *) edit);
+
 	rc = ui_menu_entry_create(medit, "Copy", "Ctrl-C", &mcopy);
 	if (rc != EOK) {
@@ -443,4 +497,70 @@
 
 	ui_menu_entry_set_cb(mpaste, edit_edit_paste, (void *) edit);
+
+	rc = ui_menu_entry_create(medit, "Delete", "Del", &mdelete);
+	if (rc != EOK) {
+		printf("Error creating menu.\n");
+		return rc;
+	}
+
+	ui_menu_entry_set_cb(mdelete, edit_edit_delete, (void *) edit);
+
+	rc = ui_menu_entry_sep_create(medit, &mesep);
+	if (rc != EOK) {
+		printf("Error creating menu.\n");
+		return rc;
+	}
+
+	rc = ui_menu_entry_create(medit, "Select All", "Ctrl-A", &mselall);
+	if (rc != EOK) {
+		printf("Error creating menu.\n");
+		return rc;
+	}
+
+	ui_menu_entry_set_cb(mselall, edit_edit_select_all, (void *) edit);
+
+	rc = ui_menu_create(edit->menubar, "Search", &msearch);
+	if (rc != EOK) {
+		printf("Error creating menu.\n");
+		return rc;
+	}
+
+	rc = ui_menu_entry_create(msearch, "Find", "Ctrl-F", &mfind);
+	if (rc != EOK) {
+		printf("Error creating menu.\n");
+		return rc;
+	}
+
+	ui_menu_entry_set_cb(mfind, edit_search_find, (void *) edit);
+
+	rc = ui_menu_entry_create(msearch, "Reverse Find", "Ctrl-Shift-F", &mfindr);
+	if (rc != EOK) {
+		printf("Error creating menu.\n");
+		return rc;
+	}
+
+	ui_menu_entry_set_cb(mfindr, edit_search_reverse_find, (void *) edit);
+
+	rc = ui_menu_entry_create(msearch, "Find Next", "Ctrl-N", &mfindn);
+	if (rc != EOK) {
+		printf("Error creating menu.\n");
+		return rc;
+	}
+
+	ui_menu_entry_set_cb(mfindn, edit_search_find_next, (void *) edit);
+
+	rc = ui_menu_entry_sep_create(msearch, &mssep);
+	if (rc != EOK) {
+		printf("Error creating menu.\n");
+		return rc;
+	}
+
+	rc = ui_menu_entry_create(msearch, "Go To Line", "Ctrl-L", &mgoto);
+	if (rc != EOK) {
+		printf("Error creating menu.\n");
+		return rc;
+	}
+
+	ui_menu_entry_set_cb(mgoto, edit_search_go_to_line, (void *) edit);
 
 	ui_window_get_app_rect(edit->window, &arect);
@@ -621,14 +741,8 @@
 		break;
 	case KC_V:
-		selection_delete();
-		insert_clipboard_data();
-		pane.rflags |= REDRAW_TEXT;
-		caret_update();
+		edit_paste();
 		break;
 	case KC_X:
-		selection_copy();
-		selection_delete();
-		pane.rflags |= REDRAW_TEXT;
-		caret_update();
+		edit_cut();
 		break;
 	case KC_A:
@@ -1858,4 +1972,20 @@
 	}
 	free(str);
+}
+
+static void edit_paste(void)
+{
+	selection_delete();
+	insert_clipboard_data();
+	pane.rflags |= (REDRAW_TEXT | REDRAW_CARET);
+	pane_update(&pane);
+}
+
+static void edit_cut(void)
+{
+	selection_copy();
+	selection_delete();
+	pane.rflags |= (REDRAW_TEXT | REDRAW_CARET);
+	pane_update(&pane);
 }
 
@@ -2096,34 +2226,157 @@
 }
 
-/** File / Exit menu entry selected.
+/** File / Save menu entry selected.
  *
  * @param mentry Menu entry
  * @param arg Argument (edit_t *)
  */
-static void edit_file_exit(ui_menu_entry_t *mentry, void *arg)
+static void edit_file_save(ui_menu_entry_t *mentry, void *arg)
 {
 	edit_t *edit = (edit_t *) arg;
 
-	ui_quit(edit->ui);
-}
-
-/** Edit / Copy menu entry selected.
+	(void)edit;
+
+	if (doc.file_name != NULL)
+		file_save(doc.file_name);
+	else
+		file_save_as();
+}
+
+/** File / Save As menu entry selected.
  *
  * @param mentry Menu entry
  * @param arg Argument (edit_t *)
  */
-static void edit_edit_copy(ui_menu_entry_t *mentry, void *arg)
-{
-	(void) arg;
-}
-
-/** Edit / Paste menu entry selected.
+static void edit_file_save_as(ui_menu_entry_t *mentry, void *arg)
+{
+	edit_t *edit = (edit_t *) arg;
+
+	(void)edit;
+	file_save_as();
+}
+
+/** File / Exit menu entry selected.
  *
  * @param mentry Menu entry
  * @param arg Argument (edit_t *)
  */
+static void edit_file_exit(ui_menu_entry_t *mentry, void *arg)
+{
+	edit_t *edit = (edit_t *) arg;
+
+	ui_quit(edit->ui);
+}
+
+/** Edit / Cut menu entry selected.
+ *
+ * @param mentry Menu entry
+ * @param arg Argument (edit_t *)
+ */
+static void edit_edit_cut(ui_menu_entry_t *mentry, void *arg)
+{
+	(void) arg;
+	edit_cut();
+	(void) gfx_update(ui_window_get_gc(edit.window));
+}
+
+/** Edit / Copy menu entry selected.
+ *
+ * @param mentry Menu entry
+ * @param arg Argument (edit_t *)
+ */
+static void edit_edit_copy(ui_menu_entry_t *mentry, void *arg)
+{
+	(void) arg;
+	selection_copy();
+}
+
+/** Edit / Paste menu entry selected.
+ *
+ * @param mentry Menu entry
+ * @param arg Argument (edit_t *)
+ */
 static void edit_edit_paste(ui_menu_entry_t *mentry, void *arg)
 {
 	(void) arg;
+	edit_paste();
+	(void) gfx_update(ui_window_get_gc(edit.window));
+}
+
+/** Edit / Delete menu entry selected.
+ *
+ * @param mentry Menu entry
+ * @param arg Argument (edit_t *)
+ */
+static void edit_edit_delete(ui_menu_entry_t *mentry, void *arg)
+{
+	(void) arg;
+
+	if (selection_active())
+		selection_delete();
+
+	pane.rflags |= REDRAW_CARET;
+	(void) pane_update(&pane);
+	(void) gfx_update(ui_window_get_gc(edit.window));
+}
+
+/** Edit / Select All menu entry selected.
+ *
+ * @param mentry Menu entry
+ * @param arg Argument (edit_t *)
+ */
+static void edit_edit_select_all(ui_menu_entry_t *mentry, void *arg)
+{
+	(void) arg;
+
+	selection_sel_all();
+	pane.rflags |= (REDRAW_CARET | REDRAW_TEXT | REDRAW_STATUS);
+	pane_update(&pane);
+	(void) gfx_update(ui_window_get_gc(edit.window));
+}
+
+/** Search / Find menu entry selected.
+ *
+ * @param mentry Menu entry
+ * @param arg Argument (edit_t *)
+ */
+static void edit_search_find(ui_menu_entry_t *mentry, void *arg)
+{
+	(void) arg;
+	search_prompt(false);
+}
+
+/** Search / Reverse Find menu entry selected.
+ *
+ * @param mentry Menu entry
+ * @param arg Argument (edit_t *)
+ */
+static void edit_search_reverse_find(ui_menu_entry_t *mentry, void *arg)
+{
+	(void) arg;
+	search_prompt(true);
+}
+
+/** Search / Find Next menu entry selected.
+ *
+ * @param mentry Menu entry
+ * @param arg Argument (edit_t *)
+ */
+static void edit_search_find_next(ui_menu_entry_t *mentry, void *arg)
+{
+	(void) arg;
+	search_repeat();
+	(void) pane_update(&pane);
+	(void) gfx_update(ui_window_get_gc(edit.window));
+}
+
+/** Search / Go To Line menu entry selected.
+ *
+ * @param mentry Menu entry
+ * @param arg Argument (edit_t *)
+ */
+static void edit_search_go_to_line(ui_menu_entry_t *mentry, void *arg)
+{
+	(void) arg;
+	caret_go_to_line_ask();
 }
 
