diff --git a/src/bnetd/command.cpp b/src/bnetd/command.cpp
index aa96329..d2abc79 100644
--- a/src/bnetd/command.cpp
+++ b/src/bnetd/command.cpp
@@ -3922,7 +3922,61 @@ namespace pvpgn
 
 		static int _handle_rehash_command(t_connection * c, char const *text)
 		{
-			server_restart_wraper();
+			int mode = restart_mode_all; // all by default
+
+			text = skip_command(text);
+
+			if (text[0] == '\0')
+			{
+				message_send_text(c, message_type_info, c, "Usage:");
+				message_send_text(c, message_type_info, c, "/rehash <mode>");
+				message_send_text(c, message_type_info, c, " <mode> = all | channels | realms | autoupdate | news | versioncheck | ipbans | helpfile | banners | tracker | commandgroups | aliasfile | transfile | tournament | icons | anongame | topiclist | lua");
+				return 0;
+			}
+
+			if (!strcasecmp(text, "all"))
+				mode = restart_mode_channels;
+			else if (!strcasecmp(text, "channels"))
+				mode = restart_mode_channels;
+			else if (!strcasecmp(text, "realms"))
+				mode = restart_mode_realms;
+			else if (!strcasecmp(text, "autoupdate"))
+				mode = restart_mode_autoupdate;
+			else if (!strcasecmp(text, "news"))
+				mode = restart_mode_news;
+			else if (!strcasecmp(text, "versioncheck"))
+				mode = restart_mode_versioncheck;
+			else if (!strcasecmp(text, "ipbans"))
+				mode = restart_mode_ipbans;
+			else if (!strcasecmp(text, "helpfile"))
+				mode = restart_mode_helpfile;
+			else if (!strcasecmp(text, "banners"))
+				mode = restart_mode_banners;
+			else if (!strcasecmp(text, "tracker"))
+				mode = restart_mode_tracker;
+			else if (!strcasecmp(text, "commandgroups"))
+				mode = restart_mode_commandgroups;
+			else if (!strcasecmp(text, "aliasfile"))
+				mode = restart_mode_aliasfile;
+			else if (!strcasecmp(text, "transfile"))
+				mode = restart_mode_transfile;
+			else if (!strcasecmp(text, "tournament"))
+				mode = restart_mode_tournament;
+			else if (!strcasecmp(text, "icons"))
+				mode = restart_mode_icons;
+			else if (!strcasecmp(text, "anongame"))
+				mode = restart_mode_anongame;
+			else if (!strcasecmp(text, "topiclist"))
+				mode = restart_mode_topiclist;
+			else if (!strcasecmp(text, "lua"))
+				mode = restart_mode_lua;
+			else
+			{
+				message_send_text(c, message_type_info, c, "Invalid mode.");
+				return 0;
+			}
+
+			server_restart_wraper(mode);
 			return 0;
 		}
 
diff --git a/src/bnetd/server.cpp b/src/bnetd/server.cpp
index 56148ec..614f4c4 100644
--- a/src/bnetd/server.cpp
+++ b/src/bnetd/server.cpp
@@ -139,8 +139,8 @@ namespace pvpgn
 				sigexittime = std::time(NULL) + (std::time_t)prefs_get_shutdown_delay();
 		}
 
-		extern void server_restart_wraper(void){
-			do_restart = 1;
+		extern void server_restart_wraper(int mode){
+			do_restart = mode;
 		}
 
 		extern void server_save_wraper(void){
@@ -1352,81 +1352,136 @@ namespace pvpgn
 
 				if (do_restart)
 				{
-					eventlog(eventlog_level_info, __FUNCTION__, "reading configuration files");
-					if (cmdline_get_preffile())
+					if (do_restart == restart_mode_all)
 					{
-						if (prefs_load(cmdline_get_preffile()) < 0)
-							eventlog(eventlog_level_error, __FUNCTION__, "could not parse configuration file");
+						eventlog(eventlog_level_info, __FUNCTION__, "reading configuration files");
+						if (cmdline_get_preffile())
+						{
+							if (prefs_load(cmdline_get_preffile()) < 0)
+								eventlog(eventlog_level_error, __FUNCTION__, "could not parse configuration file");
+						}
+						else
+						if (prefs_load(BNETD_DEFAULT_CONF_FILE) < 0)
+							eventlog(eventlog_level_error, __FUNCTION__, "using default configuration");
+
+						if (eventlog_open(prefs_get_logfile()) < 0)
+							eventlog(eventlog_level_error, __FUNCTION__, "could not use the file \"%s\" for the eventlog", prefs_get_logfile());
+
+						/* FIXME: load new network settings */
+
+						/* reload server name */
+						server_set_hostname();
+
+						attrlayer_load_default();
 					}
-					else
-					if (prefs_load(BNETD_DEFAULT_CONF_FILE) < 0)
-						eventlog(eventlog_level_error, __FUNCTION__, "using default configuration");
 
-					if (eventlog_open(prefs_get_logfile()) < 0)
-						eventlog(eventlog_level_error, __FUNCTION__, "could not use the file \"%s\" for the eventlog", prefs_get_logfile());
+					if (do_restart == restart_mode_all || do_restart == restart_mode_channels)
+					{
+						channellist_reload();
+					}
 
-					/* FIXME: load new network settings */
+					if (do_restart == restart_mode_all || do_restart == restart_mode_realms)
+					{
+						if (realmlist_reload(prefs_get_realmfile()) < 0)
+							eventlog(eventlog_level_error, __FUNCTION__, "could not reload realm list");
+					}
 
-					/* reload server name */
-					server_set_hostname();
+					if (do_restart == restart_mode_all || do_restart == restart_mode_autoupdate)
+					{
+						autoupdate_unload();
+						if (autoupdate_load(prefs_get_mpqfile()) < 0)
+							eventlog(eventlog_level_error, __FUNCTION__, "could not load autoupdate list");
+					}
 
-					attrlayer_load_default();
+					if (do_restart == restart_mode_all || do_restart == restart_mode_news)
+					{
+						news_unload();
+						if (news_load(prefs_get_newsfile()) < 0)
+							eventlog(eventlog_level_error, __FUNCTION__, "could not load news list");
+					}
 
-					channellist_reload();
+					if (do_restart == restart_mode_all || do_restart == restart_mode_versioncheck)
+					{
+						versioncheck_unload();
+						if (versioncheck_load(prefs_get_versioncheck_file()) < 0)
+							eventlog(eventlog_level_error, __FUNCTION__, "could not load versioncheck list");
+					}
 
-					if (realmlist_reload(prefs_get_realmfile()) < 0)
-						eventlog(eventlog_level_error, __FUNCTION__, "could not reload realm list");
+					if (do_restart == restart_mode_all || do_restart == restart_mode_ipbans)
+					{
+						if (ipbanlist_destroy() < 0)
+							eventlog(eventlog_level_error, __FUNCTION__, "could not unload old IP ban list");
+						ipbanlist_create();
+						if (ipbanlist_load(prefs_get_ipbanfile()) < 0)
+							eventlog(eventlog_level_error, __FUNCTION__, "could not load new IP ban list");
+					}
 
-					autoupdate_unload();
-					if (autoupdate_load(prefs_get_mpqfile()) < 0)
-						eventlog(eventlog_level_error, __FUNCTION__, "could not load autoupdate list");
+					if (do_restart == restart_mode_all || do_restart == restart_mode_helpfile)
+					{
+						helpfile_unload();
+						if (helpfile_init(prefs_get_helpfile()) < 0)
+							eventlog(eventlog_level_error, __FUNCTION__, "could not load the helpfile");
+					}
 
-					news_unload();
-					if (news_load(prefs_get_newsfile()) < 0)
-						eventlog(eventlog_level_error, __FUNCTION__, "could not load news list");
+					if (do_restart == restart_mode_all || do_restart == restart_mode_banners)
+					{
+						adbannerlist.reset(new AdBannerComponent(prefs_get_adfile()));
+					}
 
-					versioncheck_unload();
-					if (versioncheck_load(prefs_get_versioncheck_file()) < 0)
-						eventlog(eventlog_level_error, __FUNCTION__, "could not load versioncheck list");
+					if (do_restart == restart_mode_all || do_restart == restart_mode_tracker)
+					{
+						if (prefs_get_track())
+							tracker_set_servers(prefs_get_trackserv_addrs());
+					}
 
-					if (ipbanlist_destroy() < 0)
-						eventlog(eventlog_level_error, __FUNCTION__, "could not unload old IP ban list");
-					ipbanlist_create();
-					if (ipbanlist_load(prefs_get_ipbanfile()) < 0)
-						eventlog(eventlog_level_error, __FUNCTION__, "could not load new IP ban list");
+					if (do_restart == restart_mode_all || do_restart == restart_mode_commandgroups)
+					{
+						if (command_groups_reload(prefs_get_command_groups_file()) < 0)
+							eventlog(eventlog_level_error, __FUNCTION__, "could not load new command_groups list");
+					}
 
-					helpfile_unload();
-					if (helpfile_init(prefs_get_helpfile()) < 0)
-						eventlog(eventlog_level_error, __FUNCTION__, "could not load the helpfile");
+					if (do_restart == restart_mode_all || do_restart == restart_mode_aliasfile)
+					{
+						aliasfile_unload();
+						aliasfile_load(prefs_get_aliasfile());
+					}
 
-					adbannerlist.reset(new AdBannerComponent(prefs_get_adfile()));
+					if (do_restart == restart_mode_all || do_restart == restart_mode_transfile)
+					{
+						if (trans_reload(prefs_get_transfile(), TRANS_BNETD) < 0)
+							eventlog(eventlog_level_error, __FUNCTION__, "could not reload trans list");
+					}
 
-					if (prefs_get_track())
-						tracker_set_servers(prefs_get_trackserv_addrs());
-					if (command_groups_reload(prefs_get_command_groups_file()) < 0)
-						eventlog(eventlog_level_error, __FUNCTION__, "could not load new command_groups list");
+					if (do_restart == restart_mode_all || do_restart == restart_mode_tournament)
+					{
+						tournament_reload(prefs_get_tournament_file());
+					}
 
-					aliasfile_unload();
-					aliasfile_load(prefs_get_aliasfile());
+					if (do_restart == restart_mode_all || do_restart == restart_mode_icons)
+					{
+						customicons_unload();
+						customicons_load(prefs_get_customicons_file());
+					}
 
-					if (trans_reload(prefs_get_transfile(), TRANS_BNETD) < 0)
-						eventlog(eventlog_level_error, __FUNCTION__, "could not reload trans list");
+					if (do_restart == restart_mode_all || do_restart == restart_mode_anongame)
+					{
+						anongame_infos_unload();
+						anongame_infos_load(prefs_get_anongame_infos_file());
+					}
 
-					tournament_reload(prefs_get_tournament_file());
-
-					customicons_unload();
-					customicons_load(prefs_get_customicons_file());
-
-					anongame_infos_unload();
-					anongame_infos_load(prefs_get_anongame_infos_file());
-
-					topiclist_unload();
-					if (topiclist_load(prefs_get_topicfile()) < 0)
-						eventlog(eventlog_level_error, __FUNCTION__, "could not load new topic list");
+					if (do_restart == restart_mode_all || do_restart == restart_mode_topiclist)
+					{
+						topiclist_unload();
+						if (topiclist_load(prefs_get_topicfile()) < 0)
+							eventlog(eventlog_level_error, __FUNCTION__, "could not load new topic list");
+					}
 
 #ifdef WITH_LUA
-					lua_unload();
-					lua_load(prefs_get_scriptdir());
+					if (do_restart == restart_mode_all || do_restart == restart_mode_lua)
+					{
+						lua_unload();
+						lua_load(prefs_get_scriptdir());
+					}
 #endif
 
 					eventlog(eventlog_level_info, __FUNCTION__, "done reconfiguring");
diff --git a/src/bnetd/server.h b/src/bnetd/server.h
index cce484f..6723efe 100644
--- a/src/bnetd/server.h
+++ b/src/bnetd/server.h
@@ -71,6 +71,29 @@ namespace pvpgn
 
 	namespace bnetd
 	{
+		enum restart_mode
+		{
+			restart_mode_none, // always first (0)
+
+			restart_mode_all,
+			restart_mode_channels,
+			restart_mode_realms,
+			restart_mode_autoupdate,
+			restart_mode_news,
+			restart_mode_versioncheck,
+			restart_mode_ipbans,
+			restart_mode_helpfile,
+			restart_mode_banners,
+			restart_mode_tracker,
+			restart_mode_commandgroups,
+			restart_mode_aliasfile,
+			restart_mode_transfile,
+			restart_mode_tournament,
+			restart_mode_icons,
+			restart_mode_anongame,
+			restart_mode_topiclist,
+			restart_mode_lua
+		};
 
 		extern unsigned int server_get_uptime(void);
 		extern unsigned int server_get_starttime(void);
@@ -81,7 +104,7 @@ namespace pvpgn
 		extern int server_process(void);
 
 		extern void server_quit_wraper(void);
-		extern void server_restart_wraper(void);
+		extern void server_restart_wraper(int mode);
 		extern void server_save_wraper(void);
 
 	}
diff --git a/src/win32/winmain.cpp b/src/win32/winmain.cpp
index bf70e56..5c4d2cc 100644
--- a/src/win32/winmain.cpp
+++ b/src/win32/winmain.cpp
@@ -287,7 +287,7 @@ namespace pvpgn
 			else if (id == IDM_SAVE)
 				server_save_wraper();
 			else if (id == IDM_RESTART)
-				server_restart_wraper();
+				server_restart_wraper(restart_mode_all);
 			else if (id == IDM_SHUTDOWN)
 				server_quit_wraper();
 			else if (id == IDM_CLEAR)