diff --git src/simutrans/gui/components/gui_combobox.cc src/simutrans/gui/components/gui_combobox.cc
index 55bc586e4..7a95d63e3 100644
--- src/simutrans/gui/components/gui_combobox.cc
+++ src/simutrans/gui/components/gui_combobox.cc
@@ -20,6 +20,7 @@
 #include "../simwin.h"
 #include "../../dataobj/loadsave.h"
 #include "../../utils/simstring.h"
+#include "../../dataobj/translator.h"
 
 
 gui_combobox_t::gui_combobox_t(gui_scrolled_list_t::item_compare_func cmp) :
@@ -43,6 +44,7 @@ gui_combobox_t::gui_combobox_t(gui_scrolled_list_t::item_compare_func cmp) :
 	first_call = true;
 	wrapping = true;
 	force_selection = false;
+	allow_search = false;
 	selection_when_open = -1;
 	droplist.set_visible(false);
 	droplist.add_listener(this);
@@ -187,7 +189,11 @@ DBG_MESSAGE("event","HOWDY!");
 			droplist.show_selection(sel);
 			search_str[0] = 0;
 			old_searchstr[0] = 0;
-			rename_selected_item();
+			if (allow_search) {
+				textinp.set_text(NULL, 0);
+				textinp.set_text(search_str, lengthof(search_str));
+				textinp.set_placeholder_text(translator::translate("Type to search..."));
+			}
 		}
 		else if (droplist.is_visible()) {
 
@@ -219,39 +225,22 @@ DBG_MESSAGE("gui_combobox_t::infowin_event()","close");
 	else {
 		// finally handle textinput
 		gui_scrolled_list_t::scrollitem_t *item = droplist.get_selected_item();
-		if (droplist.is_visible()) {
-			if (!IS_KEYBOARD(ev) || ev->ev_code == 0) {
-				return false;
-			}
+		if (droplist.is_visible() && allow_search) {
 			// we are searching, not renaming
 			int first_match = -1;
 			event_t ev2 = *ev;
 			ev2.move_origin(textinp.get_pos());
-			if (search_str[0] == 0 && IS_KEYBOARD(&ev2) && ev2.ev_code) {
-				textinp.set_text(NULL, 0);
-				textinp.set_text(search_str, lengthof(search_str));
-				textinp.set_color(SYSCOL_TEXT_STRONG);
-			}
-			strcpy(old_searchstr, search_str);
 			if (textinp.infowin_event(&ev2)) {
 				if (strcmp(search_str,old_searchstr)!=0) {
 					for (int i = 0; i < droplist.get_count(); i++) {
-						if (search_str[0] == 0) {
-							droplist.get_element(i)->set_visible(strstr(droplist.get_element(i)->get_text(), search_str));
-						}
-						else {
-							droplist.get_element(i)->set_visible(strstr(droplist.get_element(i)->get_text(), search_str));
-						}
-						if (droplist.get_element(i)->is_visible() &&  (first_match==-1  ||  first_match < droplist.get_selection()) ) {
+						droplist.get_element(i)->set_visible(strcasestr(droplist.get_element(i)->get_text(), search_str));
+						if (droplist.get_element(i)->is_visible() && first_match <= droplist.get_selection()) {
 							first_match = i;
 						}
 					}
 					droplist.show_selection(first_match);
 					droplist.set_selection(first_match);
-					if (search_str[0] == 0  &&  first_match>=0) {
-						// show name of selection instead empty string
-						reset_selected_item_name();
-					}
+					strcpy(old_searchstr, search_str);
 				}
 				return true;
 			}
@@ -407,14 +396,14 @@ void gui_combobox_t::close_box()
 		p.i = droplist.get_selection();
 		call_listeners(p);
 	}
-
-	// reset filter: set all visible again
-	search_str[0] = 0;
-	for (int i = 0; i < droplist.get_count(); i++) {
-		droplist.get_element(i)->set_visible(true);
-	}
-	if (selection_changed) {
+	if (allow_search && (search_str[0] || selection_changed)) {
+		// reset filter: set all visible again
+		search_str[0] = 0;
+		for (int i = 0; i < droplist.get_count(); i++) {
+			droplist.get_element(i)->set_visible(true);
+		}
 		textinp.set_text(NULL, 0);  // also to reset cursor position
+		textinp.set_placeholder_text(NULL);
 	}
 
 	textinp.set_text(editstr, lengthof(editstr) );
diff --git src/simutrans/gui/components/gui_combobox.h src/simutrans/gui/components/gui_combobox.h
index 7eb8df9a0..2707edd3b 100644
--- src/simutrans/gui/components/gui_combobox.h
+++ src/simutrans/gui/components/gui_combobox.h
@@ -39,20 +39,23 @@ private:
 	 * the drop box list
 	 */
 	gui_scrolled_list_t droplist;
-	bool opened_above:1;
+	bool opened_above : 1;
 
 	// flag for first call
-	bool first_call:1;
+	bool first_call : 1;
 
 	// true to allow buttons to wrap around selection
-	bool wrapping:1;
+	bool wrapping : 1;
 
 	// try to shrink to minimum size even if there is more space
-	bool minimize:1;
+	bool minimize : 1;
 
-	// force always a vlid selection; if nothing is selected, select element 0
+	// force always a valid selection; if nothing is selected, select element 0
 	bool force_selection : 1;
 
+	// whether to hide contents and allow searching when opened
+	bool allow_search : 1;
+
 	// offset of last draw call, needed to decide, where to open droplist
 	scr_coord last_draw_offset;
 
@@ -145,6 +148,7 @@ public:
 
 	void set_wrapping(const bool wrap) { wrapping = wrap; }
 	void set_force_selection(const bool force) { force_selection = force; }
+	void set_allow_search(const bool search) { allow_search = search; }
 
 	bool is_dropped() const { return droplist.is_visible(); }
 
diff --git src/simutrans/gui/components/gui_textinput.cc src/simutrans/gui/components/gui_textinput.cc
index 5844af603..861ff59ab 100644
--- src/simutrans/gui/components/gui_textinput.cc
+++ src/simutrans/gui/components/gui_textinput.cc
@@ -16,6 +16,7 @@
 gui_textinput_t::gui_textinput_t() :
 	gui_component_t(true),
 	text(NULL),
+	placeholder_text(NULL),
 	composition(),
 	composition_target_start(0),
 	composition_target_length(0),
@@ -589,17 +590,22 @@ void gui_textinput_t::display_with_cursor(scr_coord offset, bool cursor_active,
 		display_img_stretch(gui_theme_t::editfield, scr_rect(pos + offset, size));
 	}
 
-	if(  text  ) {
-
-		if (head_cursor_pos == 0xFFFF) {
+	if (head_cursor_pos == 0xFFFF) {
+		if ( text ) {
 			// since before the first draw, the text was likely not set correctly
 			head_cursor_pos = strlen(text);
+		} else {
+			head_cursor_pos = 0;
 		}
+	}
 
+	const char *display_text = (text && text[0]) ? text : placeholder_text;
+	PIXVAL display_color = display_text == placeholder_text ? SYSCOL_EDIT_TEXT_DISABLED : (enabled ? textcol : SYSCOL_EDIT_TEXT_DISABLED);
+	if(  display_text  ) {
 		// recalculate scroll offset
-		const int text_width = proportional_string_width(text);
+		const int text_width = proportional_string_width(display_text);
 		const scr_coord_val view_width = size.w - 3;
-		const int cursor_offset = cursor_active ? proportional_string_len_width(text, head_cursor_pos) : 0;
+		const int cursor_offset = cursor_active ? proportional_string_len_width(display_text, head_cursor_pos) : 0;
 		if(  text_width<=view_width  ) {
 			// case : text is shorter than displayable width of the text input
 			//        -> the only case where left and right alignments differ
@@ -641,18 +647,18 @@ void gui_textinput_t::display_with_cursor(scr_coord offset, bool cursor_active,
 		const int y_offset = pos.y+offset.y+D_GET_CENTER_ALIGN_OFFSET(LINESPACE,size.h);
 
 		// display text (before composition)
-		display_text_proportional_len_clip_rgb(x_base_offset, y_offset, text, ALIGN_LEFT | DT_CLIP, enabled ? textcol : SYSCOL_EDIT_TEXT_DISABLED, true, head_cursor_pos);
+		display_text_proportional_len_clip_rgb(x_base_offset, y_offset, display_text, ALIGN_LEFT | DT_CLIP, display_color, true, head_cursor_pos);
 		int x_offset = proportional_string_len_width(text, head_cursor_pos);
 
 		// IME text to display?
 		if(  composition.len()  ) {
 //			assert(head_cursor_pos==tail_cursor_pos);
 
-			display_proportional_clip_rgb(x_base_offset+x_offset, y_offset, composition.get_str(), ALIGN_LEFT | DT_CLIP, enabled ? textcol : SYSCOL_EDIT_TEXT_DISABLED, true);
+			display_proportional_clip_rgb(x_base_offset+x_offset, y_offset, composition.get_str(), ALIGN_LEFT | DT_CLIP, display_color, true);
 
 			// draw underline
 			int composition_width = proportional_string_width(composition.get_str());
-			display_direct_line_rgb(x_base_offset+x_offset, y_offset+LINESPACE, x_base_offset+x_offset+composition_width, y_offset+LINESPACE-1, textcol);
+			display_direct_line_rgb(x_base_offset+x_offset, y_offset+LINESPACE, x_base_offset+x_offset+composition_width, y_offset+LINESPACE-1, display_color);
 
 			// mark targeted part in a similar manner to selected text
 			int start_offset = proportional_string_len_width(composition.get_str(), composition_target_start);
@@ -664,17 +670,17 @@ void gui_textinput_t::display_with_cursor(scr_coord offset, bool cursor_active,
 		}
 
 		// display text (after composition)
-		display_proportional_clip_rgb(x_base_offset+x_offset, y_offset, text+head_cursor_pos, ALIGN_LEFT | DT_CLIP, enabled ? textcol : SYSCOL_EDIT_TEXT_DISABLED, true);
+		display_proportional_clip_rgb(x_base_offset+x_offset, y_offset, display_text+head_cursor_pos, ALIGN_LEFT | DT_CLIP, display_color, true);
 
 		if(  cursor_active  &&  enabled  ) {
 			// display selected text block with light grey text on charcoal bounding box
 			if(  head_cursor_pos!= tail_cursor_pos  ) {
 				const size_t start_pos = min(head_cursor_pos, tail_cursor_pos);
 				size_t end_pos = ::max(head_cursor_pos, tail_cursor_pos);
-				const scr_coord_val start_offset = proportional_string_len_width(text, start_pos);
-				const scr_coord_val highlight_width = proportional_string_len_width(text+start_pos, end_pos-start_pos);
+				const scr_coord_val start_offset = proportional_string_len_width(display_text, start_pos);
+				const scr_coord_val highlight_width = proportional_string_len_width(display_text+start_pos, end_pos-start_pos);
 				display_fillbox_wh_clip_rgb(x_base_offset+start_offset, y_offset, highlight_width, LINESPACE, SYSCOL_EDIT_BACKGROUND_SELECTED, true);
-				display_text_proportional_len_clip_rgb(x_base_offset+start_offset, y_offset, text+start_pos, ALIGN_LEFT|DT_CLIP, SYSCOL_EDIT_TEXT_SELECTED, false, end_pos-start_pos);
+				display_text_proportional_len_clip_rgb(x_base_offset+start_offset, y_offset, display_text+start_pos, ALIGN_LEFT|DT_CLIP, SYSCOL_EDIT_TEXT_SELECTED, false, end_pos-start_pos);
 			}
 
 			// display blinking cursor
@@ -713,7 +719,7 @@ void gui_textinput_t::set_text(char *t, size_t max)
 bool gui_hidden_textinput_t::infowin_event(const event_t *ev)
 {
 	if(  IS_LEFTRELEASE(ev)  ) {
-		// since now the focus could be received while the mouse  no there, we must release it
+		// since now the focus could be received while the mouse no there, we must release it
 		scr_rect this_comp( get_size() );
 		if(  !this_comp.contains(scr_coord(ev->click_pos.x,ev->click_pos.y) )  ) {
 			// not us, just in old focus from previous selection or tab
diff --git src/simutrans/gui/components/gui_textinput.h src/simutrans/gui/components/gui_textinput.h
index 8dd211c31..fa72c2b9d 100644
--- src/simutrans/gui/components/gui_textinput.h
+++ src/simutrans/gui/components/gui_textinput.h
@@ -29,6 +29,12 @@ protected:
 	 */
 	char *text;
 
+	/**
+	 * Placeholder text to be displayed when no text has been typed
+	 * if NULL, nothing will be shown
+	 */
+	const char *placeholder_text;
+
 	// text, which has not yet inputted (i.e. by an IME)
 	cbuffer_t composition;
 	size_t composition_target_start;
@@ -110,6 +116,8 @@ public:
 	 */
 	void set_text(char *text, size_t max);
 
+	void set_placeholder_text(const char *ptext) { placeholder_text = ptext; };
+
 	// text which is not yet inputed (i.e. for east asian text), assuming either native or utf8 encoding
 	void set_composition_status( char *composition, int target_start, int target_length );
 
diff --git src/simutrans/gui/depot_frame.cc src/simutrans/gui/depot_frame.cc
index fa58165c7..15f363484 100644
--- src/simutrans/gui/depot_frame.cc
+++ src/simutrans/gui/depot_frame.cc
@@ -199,6 +199,7 @@ void depot_frame_t::init(depot_t *dep)
 	add_component(&lb_convois, 2);
 
 	convoy_selector.add_listener(this);
+	convoy_selector.set_allow_search(true);
 	add_component(&convoy_selector, 2);
 
 	// Bolt image for electrified depots:
@@ -219,6 +220,7 @@ void depot_frame_t::init(depot_t *dep)
 	*/
 	line_selector.add_listener(this);
 	line_selector.set_wrapping(false);
+	line_selector.set_allow_search(true);
 	add_component(&line_selector);
 
 	cbuffer_t tip_nearby_lines;
