diff --git a/src/bnetd/luainterface.cpp b/src/bnetd/luainterface.cpp
index 103600f..76f1ce8 100644
--- a/src/bnetd/luainterface.cpp
+++ b/src/bnetd/luainterface.cpp
@@ -82,6 +82,7 @@ namespace pvpgn
 
 			try
 			{
+				// init lua virtual machine
 				vm.initialize();
 
 				std::vector<std::string> files = dir_getfiles(scriptdir, ".lua", true);
@@ -108,6 +109,9 @@ namespace pvpgn
 			{
 				eventlog(eventlog_level_error, __FUNCTION__, "lua exception\n");
 			}
+
+			// handle start event
+			lua_handle_server(0, luaevent_server_start);
 		}
 
 
@@ -146,137 +150,136 @@ namespace pvpgn
 			g.update("PVPGN_SOFTWARE", PVPGN_SOFTWARE);
 			g.update("PVPGN_VERSION", PVPGN_VERSION);
 
-
 			// config variables from bnetd.conf
 			lua::transaction bind(vm);
 			bind.lookup("config");
 			{
-				lua::table bnetd = bind.table();
-				g.update("filedir", prefs_get_filedir());
-				g.update("scriptdir", prefs_get_scriptdir());
-				g.update("reportdir", prefs_get_reportdir());
-				g.update("chanlogdir", prefs_get_chanlogdir());
-				g.update("motdfile", prefs_get_motdfile());
-				g.update("motdw3file", prefs_get_motdw3file());
-				g.update("issuefile", prefs_get_issuefile());
-				g.update("channelfile", prefs_get_channelfile());
-				g.update("newsfile", prefs_get_newsfile());
-				g.update("adfile", prefs_get_adfile());
-				g.update("topicfile", prefs_get_topicfile());
-				g.update("ipbanfile", prefs_get_ipbanfile());
-				g.update("helpfile", prefs_get_helpfile());
-				g.update("mpqfile", prefs_get_mpqfile());
-				g.update("logfile", prefs_get_logfile());
-				g.update("realmfile", prefs_get_realmfile());
-				g.update("maildir", prefs_get_maildir());
-				g.update("versioncheck_file", prefs_get_versioncheck_file());
-				g.update("mapsfile", prefs_get_mapsfile());
-				g.update("xplevelfile", prefs_get_xplevel_file());
-				g.update("xpcalcfile", prefs_get_xpcalc_file());
-				g.update("ladderdir", prefs_get_ladderdir());
-				g.update("command_groups_file", prefs_get_command_groups_file());
-				g.update("tournament_file", prefs_get_tournament_file());
-				g.update("statusdir", prefs_get_outputdir());
-				g.update("aliasfile", prefs_get_aliasfile());
-				g.update("anongame_infos_file", prefs_get_anongame_infos_file());
-				g.update("DBlayoutfile", prefs_get_DBlayoutfile());
-				g.update("supportfile", prefs_get_supportfile());
-				g.update("transfile", prefs_get_transfile());
-				g.update("customicons_file", prefs_get_customicons_file());
-				g.update("loglevels", prefs_get_loglevels());
-				g.update("d2cs_version", prefs_get_d2cs_version());
-				g.update("allow_d2cs_setname", prefs_allow_d2cs_setname());
-				g.update("iconfile", prefs_get_iconfile());
-				g.update("war3_iconfile", prefs_get_war3_iconfile());
-				g.update("star_iconfile", prefs_get_star_iconfile());
-				g.update("tosfile", prefs_get_tosfile());
-				g.update("allowed_clients", prefs_get_allowed_clients());
-				g.update("skip_versioncheck", prefs_get_skip_versioncheck());
-				g.update("allow_bad_version", prefs_get_allow_bad_version());
-				g.update("allow_unknown_version", prefs_get_allow_unknown_version());
-				g.update("version_exeinfo_match", prefs_get_version_exeinfo_match());
-				g.update("version_exeinfo_maxdiff", prefs_get_version_exeinfo_maxdiff());
-				g.update("usersync", prefs_get_user_sync_timer());
-				g.update("userflush", prefs_get_user_flush_timer());
-				g.update("userstep", prefs_get_user_step());
-				g.update("latency", prefs_get_latency());
-				g.update("nullmsg", prefs_get_nullmsg());
-				g.update("shutdown_delay", prefs_get_shutdown_delay());
-				g.update("shutdown_decr", prefs_get_shutdown_decr());
-				g.update("ipban_check_int", prefs_get_ipban_check_int());
-				g.update("new_accounts", prefs_get_allow_new_accounts());
-				g.update("max_accounts", prefs_get_max_accounts());
-				g.update("kick_old_login", prefs_get_kick_old_login());
-				g.update("ask_new_channel", prefs_get_ask_new_channel());
-				g.update("report_all_games", prefs_get_report_all_games());
-				g.update("report_diablo_games", prefs_get_report_diablo_games());
-				g.update("hide_pass_games", prefs_get_hide_pass_games());
-				g.update("hide_started_games", prefs_get_hide_started_games());
-				g.update("hide_temp_channels", prefs_get_hide_temp_channels());
-				g.update("extra_commands", prefs_get_extra_commands());
-				g.update("disc_is_loss", prefs_get_discisloss());
-				g.update("ladder_games", prefs_get_ladder_games());
-				g.update("ladder_prefix", prefs_get_ladder_prefix());
-				g.update("enable_conn_all", prefs_get_enable_conn_all());
-				g.update("hide_addr", prefs_get_hide_addr());
-				g.update("chanlog", prefs_get_chanlog());
-				g.update("quota", prefs_get_quota());
-				g.update("quota_lines", prefs_get_quota_lines());
-				g.update("quota_time", prefs_get_quota_time());
-				g.update("quota_wrapline", prefs_get_quota_wrapline());
-				g.update("quota_maxline", prefs_get_quota_maxline());
-				g.update("quota_dobae", prefs_get_quota_dobae());
-				g.update("mail_support", prefs_get_mail_support());
-				g.update("mail_quota", prefs_get_mail_quota());
-				g.update("log_notice", prefs_get_log_notice());
-				g.update("passfail_count", prefs_get_passfail_count());
-				g.update("passfail_bantime", prefs_get_passfail_bantime());
-				g.update("maxusers_per_channel", prefs_get_maxusers_per_channel());
-				g.update("savebyname", prefs_get_savebyname());
-				g.update("sync_on_logoff", prefs_get_sync_on_logoff());
-				g.update("hashtable_size", prefs_get_hashtable_size());
-				g.update("account_allowed_symbols", prefs_get_account_allowed_symbols());
-				g.update("account_force_username", prefs_get_account_force_username());
-				g.update("max_friends", prefs_get_max_friends());
-				g.update("track", prefs_get_track());
-				g.update("trackaddrs", prefs_get_trackserv_addrs());
-				g.update("location", prefs_get_location());
-				g.update("description", prefs_get_description());
-				g.update("url", prefs_get_url());
-				g.update("contact_name", prefs_get_contact_name());
-				g.update("contact_email", prefs_get_contact_email());
-				g.update("servername", prefs_get_servername());
-				g.update("max_connections", prefs_get_max_connections());
-				g.update("max_concurrent_logins", prefs_get_max_concurrent_logins());
-				g.update("use_keepalive", prefs_get_use_keepalive());
-				g.update("max_conns_per_IP", prefs_get_max_conns_per_IP());
-				g.update("servaddrs", prefs_get_bnetdserv_addrs());
-				g.update("udptest_port", prefs_get_udptest_port());
-				g.update("w3routeaddr", prefs_get_w3route_addr());
-				g.update("initkill_timer", prefs_get_initkill_timer());
-				g.update("wolv1addrs", prefs_get_wolv1_addrs());
-				g.update("wolv2addrs", prefs_get_wolv2_addrs());
-				g.update("wgameresaddrs", prefs_get_wgameres_addrs());
-				g.update("apiregaddrs", prefs_get_apireg_addrs());
-				g.update("woltimezone", prefs_get_wol_timezone());
-				g.update("wollongitude", prefs_get_wol_longitude());
-				g.update("wollatitude", prefs_get_wol_latitude());
-				g.update("wol_autoupdate_serverhost", prefs_get_wol_autoupdate_serverhost());
-				g.update("wol_autoupdate_username", prefs_get_wol_autoupdate_username());
-				g.update("wol_autoupdate_password", prefs_get_wol_autoupdate_password());
-				g.update("ircaddrs", prefs_get_irc_addrs());
-				g.update("irc_network_name", prefs_get_irc_network_name());
-				g.update("hostname", prefs_get_hostname());
-				g.update("irc_latency", prefs_get_irc_latency());
-				g.update("telnetaddrs", prefs_get_telnet_addrs());
-				g.update("war3_ladder_update_secs", prefs_get_war3_ladder_update_secs());
-				g.update("XML_output_ladder", prefs_get_XML_output_ladder());
-				g.update("output_update_secs", prefs_get_output_update_secs());
-				g.update("XML_status_output", prefs_get_XML_status_output());
-				g.update("clan_newer_time", prefs_get_clan_newer_time());
-				g.update("clan_max_members", prefs_get_clan_max_members());
-				g.update("clan_channel_default_private", prefs_get_clan_channel_default_private());
-				g.update("clan_min_invites", prefs_get_clan_min_invites());
+				lua::table config = bind.table();
+				config.update("filedir", prefs_get_filedir());
+				config.update("scriptdir", prefs_get_scriptdir());
+				config.update("reportdir", prefs_get_reportdir());
+				config.update("chanlogdir", prefs_get_chanlogdir());
+				config.update("motdfile", prefs_get_motdfile());
+				config.update("motdw3file", prefs_get_motdw3file());
+				config.update("issuefile", prefs_get_issuefile());
+				config.update("channelfile", prefs_get_channelfile());
+				config.update("newsfile", prefs_get_newsfile());
+				config.update("adfile", prefs_get_adfile());
+				config.update("topicfile", prefs_get_topicfile());
+				config.update("ipbanfile", prefs_get_ipbanfile());
+				config.update("helpfile", prefs_get_helpfile());
+				config.update("mpqfile", prefs_get_mpqfile());
+				config.update("logfile", prefs_get_logfile());
+				config.update("realmfile", prefs_get_realmfile());
+				config.update("maildir", prefs_get_maildir());
+				config.update("versioncheck_file", prefs_get_versioncheck_file());
+				config.update("mapsfile", prefs_get_mapsfile());
+				config.update("xplevelfile", prefs_get_xplevel_file());
+				config.update("xpcalcfile", prefs_get_xpcalc_file());
+				config.update("ladderdir", prefs_get_ladderdir());
+				config.update("command_groups_file", prefs_get_command_groups_file());
+				config.update("tournament_file", prefs_get_tournament_file());
+				config.update("statusdir", prefs_get_outputdir());
+				config.update("aliasfile", prefs_get_aliasfile());
+				config.update("anongame_infos_file", prefs_get_anongame_infos_file());
+				config.update("DBlayoutfile", prefs_get_DBlayoutfile());
+				config.update("supportfile", prefs_get_supportfile());
+				config.update("transfile", prefs_get_transfile());
+				config.update("customicons_file", prefs_get_customicons_file());
+				config.update("loglevels", prefs_get_loglevels());
+				config.update("d2cs_version", prefs_get_d2cs_version());
+				config.update("allow_d2cs_setname", prefs_allow_d2cs_setname());
+				config.update("iconfile", prefs_get_iconfile());
+				config.update("war3_iconfile", prefs_get_war3_iconfile());
+				config.update("star_iconfile", prefs_get_star_iconfile());
+				config.update("tosfile", prefs_get_tosfile());
+				config.update("allowed_clients", prefs_get_allowed_clients());
+				config.update("skip_versioncheck", prefs_get_skip_versioncheck());
+				config.update("allow_bad_version", prefs_get_allow_bad_version());
+				config.update("allow_unknown_version", prefs_get_allow_unknown_version());
+				config.update("version_exeinfo_match", prefs_get_version_exeinfo_match());
+				config.update("version_exeinfo_maxdiff", prefs_get_version_exeinfo_maxdiff());
+				config.update("usersync", prefs_get_user_sync_timer());
+				config.update("userflush", prefs_get_user_flush_timer());
+				config.update("userstep", prefs_get_user_step());
+				config.update("latency", prefs_get_latency());
+				config.update("nullmsg", prefs_get_nullmsg());
+				config.update("shutdown_delay", prefs_get_shutdown_delay());
+				config.update("shutdown_decr", prefs_get_shutdown_decr());
+				config.update("ipban_check_int", prefs_get_ipban_check_int());
+				config.update("new_accounts", prefs_get_allow_new_accounts());
+				config.update("max_accounts", prefs_get_max_accounts());
+				config.update("kick_old_login", prefs_get_kick_old_login());
+				config.update("ask_new_channel", prefs_get_ask_new_channel());
+				config.update("report_all_games", prefs_get_report_all_games());
+				config.update("report_diablo_games", prefs_get_report_diablo_games());
+				config.update("hide_pass_games", prefs_get_hide_pass_games());
+				config.update("hide_started_games", prefs_get_hide_started_games());
+				config.update("hide_temp_channels", prefs_get_hide_temp_channels());
+				config.update("extra_commands", prefs_get_extra_commands());
+				config.update("disc_is_loss", prefs_get_discisloss());
+				config.update("ladder_games", prefs_get_ladder_games());
+				config.update("ladder_prefix", prefs_get_ladder_prefix());
+				config.update("enable_conn_all", prefs_get_enable_conn_all());
+				config.update("hide_addr", prefs_get_hide_addr());
+				config.update("chanlog", prefs_get_chanlog());
+				config.update("quota", prefs_get_quota());
+				config.update("quota_lines", prefs_get_quota_lines());
+				config.update("quota_time", prefs_get_quota_time());
+				config.update("quota_wrapline", prefs_get_quota_wrapline());
+				config.update("quota_maxline", prefs_get_quota_maxline());
+				config.update("quota_dobae", prefs_get_quota_dobae());
+				config.update("mail_support", prefs_get_mail_support());
+				config.update("mail_quota", prefs_get_mail_quota());
+				config.update("log_notice", prefs_get_log_notice());
+				config.update("passfail_count", prefs_get_passfail_count());
+				config.update("passfail_bantime", prefs_get_passfail_bantime());
+				config.update("maxusers_per_channel", prefs_get_maxusers_per_channel());
+				config.update("savebyname", prefs_get_savebyname());
+				config.update("sync_on_logoff", prefs_get_sync_on_logoff());
+				config.update("hashtable_size", prefs_get_hashtable_size());
+				config.update("account_allowed_symbols", prefs_get_account_allowed_symbols());
+				config.update("account_force_username", prefs_get_account_force_username());
+				config.update("max_friends", prefs_get_max_friends());
+				config.update("track", prefs_get_track());
+				config.update("trackaddrs", prefs_get_trackserv_addrs());
+				config.update("location", prefs_get_location());
+				config.update("description", prefs_get_description());
+				config.update("url", prefs_get_url());
+				config.update("contact_name", prefs_get_contact_name());
+				config.update("contact_email", prefs_get_contact_email());
+				config.update("servername", prefs_get_servername());
+				config.update("max_connections", prefs_get_max_connections());
+				config.update("max_concurrent_logins", prefs_get_max_concurrent_logins());
+				config.update("use_keepalive", prefs_get_use_keepalive());
+				config.update("max_conns_per_IP", prefs_get_max_conns_per_IP());
+				config.update("servaddrs", prefs_get_bnetdserv_addrs());
+				config.update("udptest_port", prefs_get_udptest_port());
+				config.update("w3routeaddr", prefs_get_w3route_addr());
+				config.update("initkill_timer", prefs_get_initkill_timer());
+				config.update("wolv1addrs", prefs_get_wolv1_addrs());
+				config.update("wolv2addrs", prefs_get_wolv2_addrs());
+				config.update("wgameresaddrs", prefs_get_wgameres_addrs());
+				config.update("apiregaddrs", prefs_get_apireg_addrs());
+				config.update("woltimezone", prefs_get_wol_timezone());
+				config.update("wollongitude", prefs_get_wol_longitude());
+				config.update("wollatitude", prefs_get_wol_latitude());
+				config.update("wol_autoupdate_serverhost", prefs_get_wol_autoupdate_serverhost());
+				config.update("wol_autoupdate_username", prefs_get_wol_autoupdate_username());
+				config.update("wol_autoupdate_password", prefs_get_wol_autoupdate_password());
+				config.update("ircaddrs", prefs_get_irc_addrs());
+				config.update("irc_network_name", prefs_get_irc_network_name());
+				config.update("hostname", prefs_get_hostname());
+				config.update("irc_latency", prefs_get_irc_latency());
+				config.update("telnetaddrs", prefs_get_telnet_addrs());
+				config.update("war3_ladder_update_secs", prefs_get_war3_ladder_update_secs());
+				config.update("XML_output_ladder", prefs_get_XML_output_ladder());
+				config.update("output_update_secs", prefs_get_output_update_secs());
+				config.update("XML_status_output", prefs_get_XML_status_output());
+				config.update("clan_newer_time", prefs_get_clan_newer_time());
+				config.update("clan_max_members", prefs_get_clan_max_members());
+				config.update("clan_channel_default_private", prefs_get_clan_channel_default_private());
+				config.update("clan_min_invites", prefs_get_clan_min_invites());
 			}
 
 		}
@@ -475,6 +478,9 @@ namespace pvpgn
 			const char * func_name;
 			switch (luaevent)
 			{
+			case luaevent_server_start:
+				func_name = "main";
+				break;
 			case luaevent_server_mainloop:
 				func_name = "handle_server_mainloop"; // one time per second
 				break;
diff --git a/src/bnetd/luainterface.h b/src/bnetd/luainterface.h
index 5db3475..d9348c3 100644
--- a/src/bnetd/luainterface.h
+++ b/src/bnetd/luainterface.h
@@ -52,6 +52,7 @@ namespace pvpgn
 			luaevent_user_login,
 			luaevent_user_disconnect,
 
+			luaevent_server_start,
 			luaevent_server_mainloop
 
 		} t_luaevent_type;
diff --git a/src/compat/pdir.cpp b/src/compat/pdir.cpp
index eccf935..04b7e08 100644
--- a/src/compat/pdir.cpp
+++ b/src/compat/pdir.cpp
@@ -156,7 +156,7 @@ namespace pvpgn
 	/* Returns a list of files in a directory (except the ones that begin with a dot) */
 	extern std::vector<std::string> dir_getfiles(const char * directory, const char* ext, bool recursive)
 	{
-		std::vector<std::string> files;
+		std::vector<std::string> files, dfiles;
 		const char* _ext;
 
 		DIR *dir;
@@ -166,7 +166,8 @@ namespace pvpgn
 		if (!dir)
 			return files;
 
-		while ((ent = readdir(dir)) != NULL) {
+		while ((ent = readdir(dir)) != NULL)
+		{
 			const std::string file_name = ent->d_name;
 			const std::string full_file_name = std::string(directory) + "/" + file_name;
 
@@ -181,7 +182,7 @@ namespace pvpgn
 					std::vector<std::string> subfiles = dir_getfiles(full_file_name.c_str(), ext, recursive);
 
 					for (int i = 0; i < subfiles.size(); ++i)
-						files.push_back(subfiles[i]);
+						dfiles.push_back(subfiles[i]);
 				}
 				continue;
 			}
@@ -196,6 +197,10 @@ namespace pvpgn
 		}
 		closedir(dir);
 
+		// merge files and files from directories, so we will receive directories at begin, files at the end
+		//  (otherwise files and directories are read alphabetically - as is)
+		files.insert(files.begin(), dfiles.begin(), dfiles.end());
+
 		return files;
 	}