Index: src/base.tab
===================================================================
--- src/base.tab	(revisión: 10985)
+++ src/base.tab	(copia de trabajo)
@@ -4249,6 +4249,46 @@
 name=Load script tool
 note=mouseover and dialoque title
 --
+obj=button_text
+name=Tutorial
+note=Button in the banner window
+--
+obj=tooltip_text
+name=Tutorial not available for this pakset. Please try loading Pak128.
+note=Tooltip text for the button in the banner window
+--
+obj=button_text
+name=Continue
+note=Button in the banner window
+--
+obj=button_text
+name=Return to menu
+note=Button to return to banner menu
+--
+obj=program_text
+name=Welcome to Simutrans
+note=Text in banner. It may be followed by a version string (i.e. "Nightly")
+--
+obj=program_text
+name=Developed by the Simutrans Team
+note=Text in banner
+--
+obj=program_text
+name=under the Artistic License
+note=Text in banner
+--
+obj=program_text
+name=based on Simutrans 84.22.1
+note=Text in banner
+--
+obj=program_text
+name=Selling of the program is forbidden.
+note=Text in banner
+--
+obj=program_text
+name=For questions and support please visit:
+note=Text in banner
+--
 
 #obj=help_text
 #name=Lower values mean more local sounds
Index: src/simutrans/dataobj/environment.cc
===================================================================
--- src/simutrans/dataobj/environment.cc	(revisión: 10980)
+++ src/simutrans/dataobj/environment.cc	(copia de trabajo)
@@ -97,6 +97,7 @@
 uint16 env_t::specific_volume[MAX_SOUND_TYPES];
 
 std::string env_t::soundfont_filename = "";
+std::string env_t::pakset_tutorial_dir = "tutorial_pak128";
 bool env_t::global_mute_sound = false;
 bool env_t::mute_midi = false;
 bool env_t::shuffle_midi = true;
Index: src/simutrans/dataobj/environment.h
===================================================================
--- src/simutrans/dataobj/environment.h	(revisión: 10980)
+++ src/simutrans/dataobj/environment.h	(copia de trabajo)
@@ -511,6 +511,8 @@
 	 * @see simmain.cc
 	 */
 	static void rdwr(loadsave_t *file);
+
+	static std::string pakset_tutorial_dir;
 };
 
 #endif
Index: src/simutrans/dataobj/settings.cc
===================================================================
--- src/simutrans/dataobj/settings.cc	(revisión: 10980)
+++ src/simutrans/dataobj/settings.cc	(copia de trabajo)
@@ -1600,6 +1600,8 @@
 	if(  *contents.get("soundfont_filename")  ) {
 		env_t::soundfont_filename = ltrim(contents.get("soundfont_filename"));
 	}
+
+	env_t::pakset_tutorial_dir = ltrim( contents.get_string("pakset_tutorial_dir", env_t::pakset_tutorial_dir.c_str()) );
 }
 
 // colour stuff can only be parsed when the graphic system has already started
Index: src/simutrans/gui/banner.cc
===================================================================
--- src/simutrans/gui/banner.cc	(revisión: 10980)
+++ src/simutrans/gui/banner.cc	(copia de trabajo)
@@ -14,19 +14,22 @@
 #include "../macros.h"
 #include "../descriptor/skin_desc.h"
 #include "../dataobj/environment.h"
+#include "../tool/simmenu.h"
 
 #include "simwin.h"
 #include "banner.h"
+#include "welt.h"
 #include "loadsave_frame.h"
 #include "scenario_frame.h"
 #include "server_frame.h"
 #include "components/gui_image.h"
 #include "optionen.h"
+#include "pakinstaller.h"
 
 
 // Local adjustments
-#define L_BANNER_ROWS        ( 5 )                             // Rows of scroll text
-#define L_BANNER_TEXT_INDENT ( 4 )                             // Scroll text padding (left/right)
+#define L_BANNER_ROWS        ( 6 )                             // Rows of scroll text
+#define L_BANNER_TEXT_INDENT ( 5 )                             // Scroll text padding (left/right)
 #define L_BANNER_HEIGHT      ( L_BANNER_ROWS * LINESPACE + 2 ) // Banner control height in pixels
 
 // colors
@@ -53,50 +56,16 @@
 
 banner_t::banner_t() : gui_frame_t("")
 {
-	set_table_layout(1,0);
+	set_table_layout(3,0);
 
-	new_component<gui_label_t>("This is Simutrans" SIM_VERSION_BUILD_STRING, SYSCOL_TEXT_TITLE, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
+	add_table(1, 0); {
+		// Continue game button
+		contin.init( button_t::roundbox | button_t::flexible, "Continue");
+		contin.add_listener( this );
+		add_component( &contin );
 
-	new_component<gui_label_t>(get_version(), SYSCOL_TEXT_HIGHLIGHT, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
+		new_component<gui_divider_t>();
 
-	add_table(5,0);
-	{
-		new_component_span<gui_label_t>("The version is developed by", SYSCOL_TEXT_TITLE, gui_label_t::left, 5)->set_shadow(SYSCOL_TEXT_SHADOW, true);
-		new_component<gui_fill_t>();
-
-		add_table(1,0);
-		new_component<gui_label_t>("the simutrans team", SYSCOL_TEXT_HIGHLIGHT, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
-		new_component<gui_label_t>("under the Artistic Licence", SYSCOL_TEXT_HIGHLIGHT, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
-		new_component<gui_label_t>("based on Simutrans 84.22.1", SYSCOL_TEXT_HIGHLIGHT, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
-		end_table();
-
-		new_component<gui_fill_t>();
-		new_component<gui_image_t>()->set_image(skinverwaltung_t::logosymbol->get_image_id(0), true);
-		new_component<gui_fill_t>();
-	}
-	end_table();
-
-	new_component<gui_label_t>("Selling of the program is forbidden.", color_idx_to_rgb(COL_ORANGE), gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
-	new_component<gui_label_t>("For questions and support please visit:", SYSCOL_TEXT_TITLE, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
-
-	add_table(3,0);
-	{
-		new_component<gui_fill_t>();
-		add_table(1,0);
-		new_component<gui_label_t>("https://www.simutrans.com", SYSCOL_TEXT_HIGHLIGHT, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
-		new_component<gui_label_t>("https://forum.simutrans.com", SYSCOL_TEXT_HIGHLIGHT, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
-		new_component<gui_label_t>("https://wiki.simutrans.com", SYSCOL_TEXT_HIGHLIGHT, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
-		end_table();
-		new_component<gui_fill_t>();
-	}
-
-	end_table();
-
-	// scrolling text ...
-	new_component<banner_text_t>();
-
-	add_table(3,2)->set_force_equal_columns(true);;
-	{
 		// New game button
 		new_map.init( button_t::roundbox | button_t::flexible, "Neue Karte");
 		new_map.add_listener( this );
@@ -107,21 +76,39 @@
 		load_map.add_listener( this );
 		add_component( &load_map );
 
+
+		// Play Tutorial
+		play_tutorial.init( button_t::roundbox | button_t::flexible, "Tutorial");
+		play_tutorial.add_listener( this );
+		if(  !(scenario_frame->check_file(pakset_tutorial.c_str(), ""))  ) {
+			play_tutorial.disable();
+			play_tutorial.set_tooltip("Scenario Tutorial is not available for this pakset. Please try loading Pak128.");
+		}
+		add_component( &play_tutorial );
+
 		// Load scenario button
 		load_scenario.init( button_t::roundbox | button_t::flexible, "Load scenario");
 		load_scenario.add_listener( this );
 		add_component( &load_scenario );
 
+		// Play online button
+		join_map.init( button_t::roundbox | button_t::flexible, "join game");
+		join_map.add_listener( this );
+		add_component( &join_map );
+
 		// Options button
 		options.init( button_t::roundbox | button_t::flexible, "Optionen");
 		options.add_listener( this );
 		add_component( &options );
 
-		// Play online button
-		join_map.init( button_t::roundbox | button_t::flexible, "join game");
-		join_map.add_listener( this );
-		add_component( &join_map );
+		// Install button
+		install.init( button_t::roundbox | button_t::flexible, "Install");
+		install.add_listener( this );
+		add_component( &install );
 
+		new_component<gui_fill_t>(false, true);
+		new_component<gui_divider_t>();
+
 		// Quit button
 		quit.init( button_t::roundbox | button_t::flexible, "Beenden");
 		quit.add_listener( this );
@@ -129,6 +116,64 @@
 	}
 	end_table();
 
+	add_table(1, 0)->set_margin(scr_size(10,0), scr_size()); 
+	{
+		add_table(3,0);
+		{
+			add_table(1,0);
+			{
+				add_table(2,0)->set_spacing(scr_size(0,0));{
+					new_component<gui_label_t>("Welcome to Simutrans", SYSCOL_TEXT_TITLE, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
+					new_component<gui_label_t>(SIM_VERSION_BUILD_STRING, SYSCOL_TEXT_TITLE, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
+				}
+				end_table();
+				new_component<gui_fill_t>(true, true);
+				add_table(3,0);
+				{
+					new_component<gui_fill_t>();
+					add_table(1,0);
+						new_component<gui_label_t>("Developed by the Simutrans Team", SYSCOL_TEXT_HIGHLIGHT, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
+						new_component<gui_label_t>("under the Artistic Licence ", SYSCOL_TEXT_HIGHLIGHT, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
+						new_component<gui_label_t>("based on Simutrans 84.22.1", SYSCOL_TEXT_HIGHLIGHT, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
+					end_table();
+					new_component<gui_fill_t>();
+				}
+				end_table();
+			}
+			end_table();
+			new_component<gui_fill_t>();
+			new_component<gui_image_t>()->set_image(skinverwaltung_t::logosymbol->get_image_id(0), true);
+		}
+		end_table();
+
+		new_component<gui_fill_t>(true, true);
+
+		add_table(1,0);
+		{
+		new_component<gui_label_t>("Selling of the program is forbidden.", color_idx_to_rgb(COL_RED), gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
+		new_component<gui_label_t>("For questions and support please visit:", SYSCOL_TEXT_TITLE, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
+		}
+		end_table();
+
+		add_table(3,0);
+		{
+			new_component<gui_fill_t>();
+			add_table(1,0);
+			new_component<gui_label_t>("https://www.simutrans.com", SYSCOL_TEXT_HIGHLIGHT, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
+			new_component<gui_label_t>("https://forum.simutrans.com", SYSCOL_TEXT_HIGHLIGHT, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
+			new_component<gui_label_t>("https://wiki.simutrans.com", SYSCOL_TEXT_HIGHLIGHT, gui_label_t::left)->set_shadow(SYSCOL_TEXT_SHADOW, true);
+			end_table();
+			new_component<gui_fill_t>();
+		}
+		end_table();
+
+		new_component<gui_fill_t>(false, true);
+		new_component<banner_text_t>();
+		new_component<gui_fill_t>(false, true);
+		new_component<gui_label_t>(get_version(), SYSCOL_TEXT_HIGHLIGHT, gui_label_t::right)->set_shadow(SYSCOL_TEXT_SHADOW, true);
+	}
+	end_table();
+
 	reset_min_windowsize();
 }
 
@@ -148,29 +193,51 @@
 		env_t::quit_simutrans = true;
 		destroy_all_win(true);
 	}
+	else if(  comp == &contin  ) {
+		destroy_all_win(true);
+	}
 	else if(  comp == &new_map  ) {
 		destroy_all_win(true);
+		create_win( new welt_gui_t(&env_t::default_settings), w_info, magic_welt_gui_t );
 	}
+	else if(  comp == &play_tutorial  ) {
+		destroy_all_win(true);
+		scenario_frame->load_scenario(pakset_tutorial.c_str());
+	}
 	else if(  comp == &load_map  ) {
 		destroy_all_win(true);
-		create_win( new loadsave_frame_t(true), w_info, magic_load_t);
+		create_win( new loadsave_frame_t(true, true), w_info, magic_load_t );
 	}
 	else if(  comp == &load_scenario  ) {
 		destroy_all_win(true);
-		create_win( new scenario_frame_t(), w_info, magic_load_t );
+		create_win( scenario_frame, w_info, magic_load_t );
 	}
+	else if(  comp == &join_map  ) {
+		destroy_all_win(true);
+		create_win( new server_frame_t(), w_info, magic_server_frame_t );
+	}
 	else if(  comp == &options  ) {
 		destroy_all_win(true);
 		create_win( new optionen_gui_t(), w_info, magic_optionen_gui_t );
 	}
-	else if(  comp == &join_map  ) {
+	else if (comp == &install) {
+#if !defined(USE_OWN_PAKINSTALL)  &&  defined(_WIN32)
+		dr_download_pakset(env_t::base_dir, env_t::base_dir == env_t::user_dir);  // windows
+#else
 		destroy_all_win(true);
-		create_win( new server_frame_t(), w_info, magic_server_frame_t );
+		create_win( new pakinstaller_t(), w_info, magic_pakinstall );
+#endif
 	}
 	return true;
 }
 
+void banner_t::show_banner() {
+	tool_t::simple_tool[TOOL_QUIT]->set_default_param("n");
+	welt->set_tool(tool_t::simple_tool[TOOL_QUIT], NULL);
+	tool_t::simple_tool[TOOL_QUIT]->set_default_param(0);
+}
 
+
 void banner_text_t::draw(scr_coord offset)
 {
 	// now the scrolling
@@ -184,8 +251,8 @@
 	scr_coord cursor(get_pos() + offset);
 	const scr_coord_val text_line = (line / LINESPACE) * 2;
 	const scr_coord_val text_offset = line % LINESPACE;
-	const scr_coord_val left = cursor.x + D_MARGIN_LEFT;
-	const scr_coord_val width = size.w - D_MARGIN_LEFT - D_MARGIN_RIGHT;
+	const scr_coord_val left = cursor.x;
+	const scr_coord_val width = size.w;
 	const scr_coord_val height = size.h;
 
 
@@ -216,7 +283,7 @@
 	POP_CLIP();
 
 	// scroll on every 70 ms
-	if(dr_time()>last_ms+70u) {
+	if(  dr_time() > (last_ms + 70u)  ) {
 		last_ms += 70u;
 		line ++;
 	}
Index: src/simutrans/gui/banner.h
===================================================================
--- src/simutrans/gui/banner.h	(revisión: 10980)
+++ src/simutrans/gui/banner.h	(copia de trabajo)
@@ -6,7 +6,7 @@
 #ifndef GUI_BANNER_H
 #define GUI_BANNER_H
 
-
+#include "scenario_frame.h"
 #include "../dataobj/environment.h"
 #include "components/gui_button.h"
 #include "gui_frame.h"
@@ -21,13 +21,21 @@
 {
 private:
 	button_t
+		contin,
 		new_map,
 		load_map,
+		play_tutorial,
 		load_scenario,
+		join_map,
 		options,
-		join_map,
+		install,
+		credits,
 		quit;
 
+	scenario_frame_t *scenario_frame = new scenario_frame_t();
+
+	std::string pakset_tutorial = env_t::pak_dir + "scenario/" + env_t::pakset_tutorial_dir;
+
 public:
 	banner_t();
 
@@ -46,11 +54,12 @@
 	*/
 	FLAGGED_PIXVAL get_titlecolor() const OVERRIDE {return env_t::default_window_title_color; }
 
-	bool is_hit(int, int) OVERRIDE { return true; }
-
 	bool infowin_event(event_t const*) OVERRIDE;
 
 	bool action_triggered(gui_action_creator_t*, value_t) OVERRIDE;
+
+	static void show_banner();
+
 };
 
 #endif
Index: src/simutrans/gui/loadsave_frame.cc
===================================================================
--- src/simutrans/gui/loadsave_frame.cc	(revisión: 10980)
+++ src/simutrans/gui/loadsave_frame.cc	(copia de trabajo)
@@ -107,7 +107,7 @@
 
 
 
-loadsave_frame_t::loadsave_frame_t(bool do_load) : savegame_frame_t(".sve",false,"save/",env_t::show_delete_buttons)
+loadsave_frame_t::loadsave_frame_t(bool do_load, bool back_to_menu) : savegame_frame_t(".sve",false,"save/",env_t::show_delete_buttons, back_to_menu)
 {
 	this->do_load = do_load;
 
Index: src/simutrans/gui/loadsave_frame.h
===================================================================
--- src/simutrans/gui/loadsave_frame.h	(revisión: 10980)
+++ src/simutrans/gui/loadsave_frame.h	(copia de trabajo)
@@ -56,7 +56,7 @@
 	*/
 	const char *get_help_filename() const OVERRIDE;
 
-	loadsave_frame_t(bool do_load);
+	loadsave_frame_t(bool do_load, bool back_to_menu = false);
 
 	/**
 	 * save hashtable to xml file
Index: src/simutrans/gui/optionen.cc
===================================================================
--- src/simutrans/gui/optionen.cc	(revisión: 10980)
+++ src/simutrans/gui/optionen.cc	(copia de trabajo)
@@ -18,7 +18,7 @@
 #include "kennfarbe.h"
 #include "sound_frame.h"
 #include "scenario_info.h"
-#include "pakinstaller.h"
+#include "banner.h"
 #include "../dataobj/scenario.h"
 #include "../dataobj/translator.h"
 #include "../dataobj/environment.h"
@@ -26,26 +26,26 @@
 
 enum BUTTONS {
 	BUTTON_LANGUAGE = 0,
-	BUTTON_NEW_GAME,
 	BUTTON_PLAYERS,
-	BUTTON_LOAD_GAME,
+	BUTTON_DISPLAY,
 	BUTTON_PLAYER_COLORS,
+	BUTTON_SOUND,
 	BUTTON_SAVE_GAME,
-	BUTTON_DISPLAY,
-	BUTTON_LOAD_SCENARIO,
-	BUTTON_SOUND,
 	BUTTON_SCENARIO_INFO,
-	BUTTON_INSTALL,
+	BUTTON_MENU,
 	BUTTON_QUIT
 };
 
 static char const *const option_buttons_text[] =
 {
-	"Sprache", "Neue Karte",
-	"Spieler(mz)", "Load game",
-	"Farbe", "Speichern",
-	"Display settings", "Load scenario",
-	"Sound", "Scenario", "Install",
+	"Sprache",
+	"Spieler(mz)",
+	"Display",
+	"Farbe",
+	"Sound",
+	"Save",
+	"Scenario information",
+	"Return to menu",
 	"Beenden"
 };
 
@@ -61,7 +61,6 @@
 
 	for(  uint i=0;  i<lengthof(option_buttons);  i++  ) {
 
-		add_component(option_buttons + i);
 		option_buttons[i].init(button_t::roundbox | button_t::flexible, option_buttons_text[i]);
 		option_buttons[i].add_listener(this);
 
@@ -71,8 +70,10 @@
 				option_buttons[BUTTON_SCENARIO_INFO].disable();
 			}
 			// Squeeze in divider
+			new_component<gui_fill_t>();
+			add_component(option_buttons + i);
 			new_component_span<gui_divider_t>(2);
-		}
+		} else add_component(option_buttons + i);
 	}
 
 	reset_min_windowsize();
@@ -104,20 +105,6 @@
 	else if(  comp == option_buttons + BUTTON_SCENARIO_INFO  ) {
 		create_win(new scenario_info_t(), w_info, magic_scenario_info);
 	}
-	else if(  comp == option_buttons + BUTTON_LOAD_GAME  ) {
-		destroy_win(this);
-		tool_t *tmp_tool = create_tool( DIALOG_LOAD | DIALOGE_TOOL );
-		welt->set_tool( tmp_tool, welt->get_active_player() );
-		// since init always returns false, it is safe to delete immediately
-		delete tmp_tool;
-	}
-	else if(  comp == option_buttons + BUTTON_LOAD_SCENARIO  ) {
-		destroy_win(this);
-		tool_t *tmp_tool = create_tool( DIALOG_SCENARIO | DIALOGE_TOOL );
-		welt->set_tool( tmp_tool, welt->get_active_player() );
-		// since init always returns false, it is safe to delete immediately
-		delete tmp_tool;
-	}
 	else if(  comp == option_buttons + BUTTON_SAVE_GAME  ) {
 		destroy_win(this);
 		tool_t *tmp_tool = create_tool( DIALOG_SAVE | DIALOGE_TOOL );
@@ -125,19 +112,10 @@
 		// since init always returns false, it is safe to delete immediately
 		delete tmp_tool;
 	}
-	else if (comp == option_buttons + BUTTON_NEW_GAME) {
-		// create new world
-		tool_t::simple_tool[TOOL_QUIT]->set_default_param("n");
-		welt->set_tool(tool_t::simple_tool[TOOL_QUIT], NULL);
-		tool_t::simple_tool[TOOL_QUIT]->set_default_param(0);
+	else if (comp == option_buttons + BUTTON_MENU) {
+		// return to menu
+		banner_t::show_banner();
 	}
-	else if (comp == option_buttons + BUTTON_INSTALL) {
-#if !defined(USE_OWN_PAKINSTALL)  &&  defined(_WIN32)
-		dr_download_pakset(env_t::base_dir, env_t::base_dir == env_t::user_dir);  // windows
-#else
-		create_win(new pakinstaller_t(), w_info, magic_pakinstall);
-#endif
-	}
 	else if(  comp == option_buttons + BUTTON_QUIT  ) {
 		// we call the proper tool for quitting
 		welt->set_tool(tool_t::simple_tool[TOOL_QUIT], NULL);
Index: src/simutrans/gui/optionen.h
===================================================================
--- src/simutrans/gui/optionen.h	(revisión: 10980)
+++ src/simutrans/gui/optionen.h	(copia de trabajo)
@@ -21,7 +21,7 @@
 class optionen_gui_t : public gui_frame_t, action_listener_t
 {
 	private:
-		button_t option_buttons[12];
+		button_t option_buttons[9];
 
 	public:
 		optionen_gui_t();
Index: src/simutrans/gui/savegame_frame.cc
===================================================================
--- src/simutrans/gui/savegame_frame.cc	(revisión: 10980)
+++ src/simutrans/gui/savegame_frame.cc	(copia de trabajo)
@@ -16,6 +16,7 @@
 #include "../utils/searchfolder.h"
 #include "../dataobj/environment.h"
 #include "../dataobj/translator.h"
+#include "banner.h"
 
 #define L_DEFAULT_ROWS       (12)   // Number of file entries to show as default
 #define L_SHORTENED_SIZE   (48)
@@ -49,7 +50,7 @@
  * @param delete_enabled    Show (true) or hide (false) the delete buttons.
  *                          This is an optional parameter with a default value of true;
  */
-savegame_frame_t::savegame_frame_t(const char *suffix, bool only_directories, const char *path, const bool delete_enabled) : gui_frame_t( translator::translate("Load/Save") ),
+savegame_frame_t::savegame_frame_t(const char *suffix, bool only_directories, const char *path, const bool delete_enabled, bool back_to_menu) : gui_frame_t( translator::translate("Load/Save") ),
 	suffix(suffix),
 	in_action(false),
 	only_directories(only_directories),
@@ -60,6 +61,7 @@
 	num_sections(0),
 	delete_enabled(delete_enabled)
 {
+	is_back_to_menu = back_to_menu;
 	set_table_layout(1,0);
 	label_enabled = true;
 
@@ -509,6 +511,9 @@
 		// Cancel-button pressed
 		//----------------------------
 		cancel_action(buf);
+		if(is_back_to_menu) {
+			banner_t::show_banner();
+		}
 		destroy_win(this);
 	}
 	else {
Index: src/simutrans/gui/savegame_frame.h
===================================================================
--- src/simutrans/gui/savegame_frame.h	(revisión: 10980)
+++ src/simutrans/gui/savegame_frame.h	(copia de trabajo)
@@ -40,6 +40,7 @@
 	bool        in_action;             //@< To avoid double mouse action
 	bool        only_directories;      //@< Search for directories (used in pak_selector)
 	bool        searchpath_defined;    //@< Is default path defined?
+	bool        is_back_to_menu;       //@< Open the banner menu on cancel
 
 	void add_section(std::string &name);
 
@@ -133,7 +134,7 @@
 
 public:
 
-	savegame_frame_t(const char *suffix, bool only_directorie, const char *path, const bool delete_enabled );
+	savegame_frame_t(const char *suffix, bool only_directorie, const char *path, const bool delete_enabled, const bool back_to_menu = false );
 //	savegame_frame_t(const char *suffix = NULL, bool only_directories = false, const char *path = NULL, const bool delete_enabled = true);
 	virtual ~savegame_frame_t();
 
Index: src/simutrans/gui/scenario_frame.cc
===================================================================
--- src/simutrans/gui/scenario_frame.cc	(revisión: 10980)
+++ src/simutrans/gui/scenario_frame.cc	(copia de trabajo)
@@ -24,7 +24,7 @@
 #include "../utils/cbuffer.h"
 
 
-scenario_frame_t::scenario_frame_t() : savegame_frame_t(NULL, true, NULL, false)
+scenario_frame_t::scenario_frame_t() : savegame_frame_t(NULL, true, NULL, false, true)
 {
 	static cbuffer_t pakset_scenario;
 	static cbuffer_t addons_scenario;
@@ -47,19 +47,23 @@
 	set_focus(NULL);
 }
 
-
-/**
- * Action, started after button pressing.
- */
-bool scenario_frame_t::item_action(const char *fullpath)
+void scenario_frame_t::load_scenario(const char *fullpath, bool is_easy_server)
 {
 	cbuffer_t param;
 
-	param.printf("%i,%s", easy_server.pressed, fullpath);
+	param.printf("%i,%s", is_easy_server, fullpath);
 	tool_t::simple_tool[TOOL_LOAD_SCENARIO]->set_default_param(param);
 	welt->set_tool(tool_t::simple_tool[TOOL_LOAD_SCENARIO], NULL);
 	tool_t::simple_tool[TOOL_LOAD_SCENARIO]->set_default_param(0);
+}
 
+
+/**
+ * Action, started after button pressing.
+ */
+bool scenario_frame_t::item_action(const char *fullpath)
+{
+	scenario_frame_t::load_scenario(fullpath, easy_server.pressed);
 	return true;
 }
 
Index: src/simutrans/gui/scenario_frame.h
===================================================================
--- src/simutrans/gui/scenario_frame.h	(revisión: 10980)
+++ src/simutrans/gui/scenario_frame.h	(copia de trabajo)
@@ -31,10 +31,10 @@
 	// returns extra file info
 	const char *get_info(const char *fname) OVERRIDE;
 
+public:
 	// true, if valid
 	bool check_file( const char *filename, const char *suffix ) OVERRIDE;
 
-public:
 	/**
 	* Set the window associated helptext
 	* @return the filename for the helptext, or NULL
@@ -41,6 +41,8 @@
 	*/
 	const char * get_help_filename() const OVERRIDE { return "scenario.txt"; }
 
+	void load_scenario(const char *fullpath, bool is_easy_server = false);
+
 	scenario_frame_t();
 };
 
Index: src/simutrans/gui/simwin.cc
===================================================================
--- src/simutrans/gui/simwin.cc	(revisión: 10980)
+++ src/simutrans/gui/simwin.cc	(copia de trabajo)
@@ -2140,7 +2140,7 @@
 
 
 // shows a modal dialoge
-void modal_dialogue(gui_frame_t* gui, ptrdiff_t magic, karte_t* welt, bool (*quit)())
+void modal_dialogue(gui_frame_t* gui, ptrdiff_t magic, karte_t* welt, bool (*quit)(), bool dismissible)
 {
 	if (display_get_width() == 0) {
 		dbg->error("modal_dialogue", "called without a display driver => nothing will be shown!");
@@ -2190,6 +2190,15 @@
 						}
 					}
 				}
+				
+				if(dismissible){
+					if (
+						(ev.ev_class == EVENT_KEYBOARD) ||
+						(ev.ev_class == EVENT_CLICK && !gui->is_hit(ev.click_pos.x - pos.x, ev.click_pos.y - pos.y))
+					) {
+						destroy_win(gui);
+					}
+				}
 
 				DBG_DEBUG4("modal_dialogue", "calling check_pos_win");
 				check_pos_win(&ev, true);
Index: src/simutrans/gui/simwin.h
===================================================================
--- src/simutrans/gui/simwin.h	(revisión: 10980)
+++ src/simutrans/gui/simwin.h	(copia de trabajo)
@@ -219,6 +219,6 @@
 void win_set_static_tooltip(const char *text);
 
 // shows a modal dialoge (blocks other interaction)
-void modal_dialogue(gui_frame_t* gui, ptrdiff_t magic, karte_t* welt, bool (*quit)());
+void modal_dialogue(gui_frame_t* gui, ptrdiff_t magic, karte_t* welt, bool (*quit)(), bool dismissible = false);
 
 #endif
Index: src/simutrans/gui/welt.cc
===================================================================
--- src/simutrans/gui/welt.cc	(revisión: 10980)
+++ src/simutrans/gui/welt.cc	(copia de trabajo)
@@ -43,13 +43,13 @@
 
 #include "components/gui_divider.h"
 
+
+#include "banner.h"
 #include "sprachen.h"
 #include "climates.h"
 #include "settings_frame.h"
-#include "loadsave_frame.h"
 #include "load_relief_frame.h"
 #include "messagebox.h"
-#include "scenario_frame.h"
 
 
 // Local adjustment
@@ -233,27 +233,17 @@
 
 	new_component<gui_divider_t>();
 
-	add_table(2,2)->set_force_equal_columns(true);
+	add_table(2,0)->set_force_equal_columns(true);
 	{
-		// load game
-		load_game.init(button_t::roundbox | button_t::flexible, "Load game");
-		load_game.add_listener( this );
-		add_component( &load_game );
-
-		// load scenario
-		load_scenario.init(button_t::roundbox | button_t::flexible,"Load scenario");
-		load_scenario.add_listener( this );
-		add_component( &load_scenario );
-
 		// start game
 		start_game.init(button_t::roundbox | button_t::flexible, "Starte Spiel");
 		start_game.add_listener( this );
 		add_component( &start_game );
 
-		// quit game
-		quit_game.init(button_t::roundbox | button_t::flexible,"Beenden");
-		quit_game.add_listener( this );
-		add_component( &quit_game );
+		// return to menu
+		return_menu.init(button_t::roundbox | button_t::flexible,"Return to menu");
+		return_menu.add_listener( this );
+		add_component( &return_menu );
 	}
 	end_table();
 
@@ -507,15 +497,6 @@
 			open_climate_gui.pressed = true;
 		}
 	}
-	else if(comp==&load_game) {
-		welt->get_message()->clear();
-		create_win( new loadsave_frame_t(true), w_info, magic_load_t);
-	}
-	else if(comp==&load_scenario) {
-		destroy_all_win(true);
-		welt->get_message()->clear();
-		create_win( new scenario_frame_t(), w_info, magic_load_t );
-	}
 	else if(comp==&start_game) {
 		destroy_all_win(true);
 		welt->get_message()->clear();
@@ -538,9 +519,9 @@
 			file.close();
 		}
 	}
-	else if(comp==&quit_game) {
+	else if(comp==&return_menu) {
 		destroy_all_win(true);
-		env_t::quit_simutrans = true;
+		banner_t::show_banner();
 	}
 
 	if(knr>=0) {
Index: src/simutrans/gui/welt.h
===================================================================
--- src/simutrans/gui/welt.h	(revisión: 10980)
+++ src/simutrans/gui/welt.h	(copia de trabajo)
@@ -66,10 +66,8 @@
 		use_beginner_mode,
 		open_climate_gui,
 		open_setting_gui,
-		load_game,
-		load_scenario,
 		start_game,
-		quit_game;
+		return_menu;
 
 	/**
 	 * Calculates preview from height map
Index: src/simutrans/simmain.cc
===================================================================
--- src/simutrans/simmain.cc	(revisión: 10980)
+++ src/simutrans/simmain.cc	(copia de trabajo)
@@ -1271,8 +1271,6 @@
 	bool old_restore_UI = env_t::restore_UI;
 	if(  new_world  &&  env_t::reload_and_save_on_quit  ) {
 		// construct from pak name an autosave if requested
-		loadsave_t file;
-
 		std::string pak_name( "autosave-" );
 		pak_name.append( env_t::pak_name );
 		pak_name.erase( pak_name.length()-1 );
@@ -1560,16 +1558,13 @@
 		// play next tune?
 		check_midi();
 
-		if(  !env_t::networkmode  &&  new_world  ) {
+		if(  new_world  ) {
 			dbg->message("simu_main()", "Show banner ... " );
 			ticker::add_msg("Welcome to Simutrans", koord3d::invalid, PLAYER_FLAG | color_idx_to_rgb(COL_SOFT_BLUE));
-			modal_dialogue( new banner_t(), magic_none, welt, never_quit );
+			modal_dialogue( new banner_t(), magic_none, welt, never_quit, true );
 			// only show new world, if no other dialogue is active ...
 			new_world = win_get_open_count()==0;
 		}
-		if(  env_t::quit_simutrans  ) {
-			break;
-		}
 
 		// to purge all previous old messages
 		welt->get_message()->set_message_flags(env_t::message_flags[0], env_t::message_flags[1], env_t::message_flags[2], env_t::message_flags[3]);
@@ -1583,12 +1578,6 @@
 			pause_after_load = false;
 		}
 
-		if(  new_world  ) {
-			modal_dialogue( new welt_gui_t(&env_t::default_settings), magic_welt_gui_t, welt, never_quit );
-			if(  env_t::quit_simutrans  ) {
-				break;
-			}
-		}
 		dbg->message("simu_main()", "Running world, pause=%i, fast forward=%i ... ", welt->is_paused(), welt->is_fast_forward() );
 		loadgame = ""; // only first time
 
Index: src/simutrans/world/simworld.cc
===================================================================
--- src/simutrans/world/simworld.cc	(revisión: 10980)
+++ src/simutrans/world/simworld.cc	(copia de trabajo)
@@ -3800,7 +3800,6 @@
 					// no sync => finish network mode
 					dbg->warning("karte_t::load","finished network mode");
 					network_disconnect();
-					finish_loop = false; // do not trigger intro screen
 					// closing the socket will tell the server, I am away too
 				}
 			}
