Index: gtk2_ardour/startup.cc
===================================================================
--- gtk2_ardour/startup.cc	(revision 11623)
+++ gtk2_ardour/startup.cc	(working copy)
@@ -39,6 +39,7 @@
 #include "ardour/session_state_utils.h"
 #include "ardour/template_utils.h"
 
+#include "ardour_ui.h"
 #include "startup.h"
 #include "opts.h"
 #include "engine_dialog.h"
@@ -584,6 +585,7 @@
 
 		existing_session_chooser.set_title (_("Select session file"));
 		existing_session_chooser.signal_file_set().connect (sigc::mem_fun (*this, &ArdourStartup::existing_session_selected));
+		existing_session_chooser.set_current_folder(poor_mans_glob (Config->get_default_session_parent_dir()));
 			
 #ifdef GTKOSX
 		existing_session_chooser.add_shortcut_folder ("/Volumes");
@@ -786,9 +788,16 @@
 
 		if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
 			new_folder_chooser.set_current_folder (poor_mans_glob (Glib::path_get_dirname (ARDOUR_COMMAND_LINE::session_name)));
+		} else if (ARDOUR_UI::instance()->session_loaded) {
+			// point the new session file chooser at the parent directory of the current session
+			string session_parent_dir = Glib::path_get_dirname(ARDOUR_UI::instance()->the_session()->path());
+			string::size_type last_dir_sep = session_parent_dir.rfind(G_DIR_SEPARATOR);
+			session_parent_dir = session_parent_dir.substr(0, last_dir_sep);
+			new_folder_chooser.set_current_folder (session_parent_dir);
 		} else {
 			new_folder_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
 		}
+		new_folder_chooser.add_shortcut_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
 		new_folder_chooser.set_title (_("Select folder for session"));
 
 #ifdef GTKOSX
Index: gtk2_ardour/ardour_ui.cc
===================================================================
--- gtk2_ardour/ardour_ui.cc	(revision 11623)
+++ gtk2_ardour/ardour_ui.cc	(working copy)
@@ -1348,7 +1348,18 @@
 		open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
 		open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
 		open_session_selector->set_default_response(Gtk::RESPONSE_ACCEPT);
+		
+		if (_session) {
+			string session_parent_dir = Glib::path_get_dirname(_session->path());
+			string::size_type last_dir_sep = session_parent_dir.rfind(G_DIR_SEPARATOR);
+			session_parent_dir = session_parent_dir.substr(0, last_dir_sep);
+			open_session_selector->set_current_folder(session_parent_dir);
+		} else {
+			open_session_selector->set_current_folder(Config->get_default_session_parent_dir());
+		}
 
+		open_session_selector->add_shortcut_folder (Config->get_default_session_parent_dir());
+
 		FileFilter session_filter;
 		session_filter.add_pattern ("*.ardour");
 		session_filter.set_name (string_compose (_("%1 sessions"), PROGRAM_NAME));
@@ -2584,24 +2595,15 @@
 				continue;
 			}
 
-			if (session_name.find ('/') != std::string::npos) {
-				MessageDialog msg (*_startup,
-				                   _("To ensure compatibility with various systems\n"
-				                     "session names may not contain a '/' character"));
+			char illegal = Session::session_name_is_legal(session_name);
+			if (illegal) {
+				MessageDialog msg (*_startup, string_compose(_("To ensure compatibility with various systems\n"
+				                     "session names may not contain a '%1' character"), illegal));
 				msg.run ();
 				ARDOUR_COMMAND_LINE::session_name = ""; // cancel that
 				continue;
 			}
 
-			if (session_name.find ('\\') != std::string::npos) {
-				MessageDialog msg (*_startup,
-				                   _("To ensure compatibility with various systems\n"
-				                     "session names may not contain a '\\' character"));
-				msg.run ();
-				ARDOUR_COMMAND_LINE::session_name = ""; // cancel that
-				continue;
-			}
-
 			_session_is_new = true;
 		}
 

