diff --git a/hw/source/master.c b/hw/source/master.c
index 5d5871d07..f01f141c8 100644
--- a/hw/source/master.c
+++ b/hw/source/master.c
@@ -15,9 +15,14 @@
 #include "netchan.h"
 #include "defs.h"
 
+int         sv_mode;
+
 qboolean is_server = true;
+
 static cbuf_t *mst_cbuf;
+
 cvar_t     *sv_console_plugin;
+
 SERVER_PLUGIN_PROTOS
 static plugin_list_t server_plugin_list[] = {
 	SERVER_PLUGIN_LIST
@@ -158,7 +163,7 @@ SVL_Remove (server_t *sv)
 	sv->previous = NULL;
 }
 
-server_t   *
+server_t *
 SVL_Find (netadr_t adr)
 {
 	server_t   *sv;
@@ -201,13 +206,11 @@ SV_InitNet (void)
 	int         port;
 	int         p;
 
-	mst_cbuf = Cbuf_New (&id_interp);
-
 	port = PORT_MASTER;
 	p = COM_CheckParm ("-port");
 	if (p && p < com_argc) {
 		port = atoi (com_argv[p + 1]);
-		printf ("Port: %i\n", port);
+		Con_Printf ("Port: %i\n", port);
 	}
 	NET_Init (port);
 
@@ -242,37 +245,37 @@ AnalysePacket (void)
 	byte       *p;
 	int         i;
 
-	printf ("%s sending packet:\n", NET_AdrToString (net_from));
+	Con_Printf ("%s sending packet:\n", NET_AdrToString (net_from));
 	p = net_message->message->data;
 	for (i = 0; i < net_message->message->cursize; i++, p++) {
 		c = p[0];
-		printf (" %3i ", c);
+		Con_Printf (" %3i ", c);
 		if (i % 8 == 7)
-			printf ("\n");
+			Con_Printf ("\n");
 	}
-	printf ("\n");
-	printf ("\n");
+	Con_Printf ("\n");
+	Con_Printf ("\n");
 	p = net_message->message->data;
 	for (i = 0; i < net_message->message->cursize; i++, p++) {
 		c = p[0];
 		if (c == '\n')
-			printf ("  \\n ");
+			Con_Printf ("  \\n ");
 
 		else if (c >= 32 && c <= 127)
-			printf ("   %c ", c);
+			Con_Printf ("   %c ", c);
 
 		else if (c < 10)
-			printf ("  \\%1i ", c);
+			Con_Printf ("  \\%1i ", c);
 
 		else if (c < 100)
-			printf (" \\%2i ", c);
+			Con_Printf (" \\%2i ", c);
 
 		else
-			printf ("\\%3i ", c);
+			Con_Printf ("\\%3i ", c);
 		if (i % 8 == 7)
-			printf ("\n");
+			Con_Printf ("\n");
 	}
-	printf ("\n");
+	Con_Printf ("\n");
 }
 
 static void
@@ -322,7 +325,7 @@ Mst_Packet (void)
 	msg = net_message->message->data[1];
 	if (msg == A2A_PING) {
 		NET_Filter ();
-		printf ("%s >> A2A_PING\n", NET_AdrToString (net_from));
+		Con_Printf ("%s >> A2A_PING\n", NET_AdrToString (net_from));
 		if (!(sv = SVL_Find (net_from))) {
 			sv = SVL_New (&net_from);
 			SVL_Add (sv);
@@ -332,7 +335,7 @@ Mst_Packet (void)
 
 	else if (msg == S2M_HEARTBEAT) {
 		NET_Filter ();
-		printf ("%s >> S2M_HEARTBEAT\n", NET_AdrToString (net_from));
+		Con_Printf ("%s >> S2M_HEARTBEAT\n", NET_AdrToString (net_from));
 		if (!(sv = SVL_Find (net_from))) {
 			sv = SVL_New (&net_from);
 			SVL_Add (sv);
@@ -342,7 +345,7 @@ Mst_Packet (void)
 
 	else if (msg == S2M_SHUTDOWN) {
 		NET_Filter ();
-		printf ("%s >> S2M_SHUTDOWN\n", NET_AdrToString (net_from));
+		Con_Printf ("%s >> S2M_SHUTDOWN\n", NET_AdrToString (net_from));
 		if ((sv = SVL_Find (net_from))) {
 			SVL_Remove (sv);
 			free (sv);
@@ -350,8 +353,8 @@ Mst_Packet (void)
 	}
 
 	else if (msg == 'c') {
-		printf ("%s >> ", NET_AdrToString (net_from));
-		printf ("Gamespy server list request\n");
+		Con_Printf ("%s >> ", NET_AdrToString (net_from));
+		Con_Printf ("Gamespy server list request\n");
 		Mst_SendList ();
 	}
 
@@ -359,15 +362,15 @@ Mst_Packet (void)
 		byte       *p;
 
 		p = net_message->message->data;
-		printf ("%s >> ", NET_AdrToString (net_from));
-		printf ("Pingtool server list request\n");
+		Con_Printf ("%s >> ", NET_AdrToString (net_from));
+		Con_Printf ("Pingtool server list request\n");
 		if (p[0] == 0 && p[1] == 'y') {
 			Mst_SendList ();
 		}
 
 		else {
-			printf ("%s >> ", NET_AdrToString (net_from));
-			printf ("%c\n", net_message->message->data[1]);
+			Con_Printf ("%s >> ", NET_AdrToString (net_from));
+			Con_Printf ("%c\n", net_message->message->data[1]);
 			AnalysePacket ();
 		}
 	}
@@ -384,7 +387,7 @@ SV_ReadPackets (void)
 void
 SV_ConnectionlessPacket (void)
 {
-	printf ("%s>>%s\n", NET_AdrToString (net_from), net_message->message->data);
+	Con_Printf ("%s>>%s\n", NET_AdrToString (net_from), net_message->message->data);
 }
 
 int         argv_index_add;
@@ -396,7 +399,7 @@ Cmd_FilterAdd (void)
 	netadr_t    to, from;
 
 	if (Cmd_Argc () < 4 + argv_index_add) {
-		printf
+		Con_Printf
 			("Invalid command parameters. Usage:\nfilter add x.x.x.x:port x.x.x.x:port\n\n");
 		return;
 	}
@@ -407,14 +410,14 @@ Cmd_FilterAdd (void)
 	if (from.port == 0)
 		from.port = BigShort (PORT_SERVER);
 	if (!(filter = FL_Find (from))) {
-		printf ("Added filter %s\t\t%s\n", Cmd_Argv (2 + argv_index_add),
+		Con_Printf ("Added filter %s\t\t%s\n", Cmd_Argv (2 + argv_index_add),
 				Cmd_Argv (3 + argv_index_add));
 		filter = FL_New (&from, &to);
 		FL_Add (filter);
 	}
 
 	else
-		printf ("%s already defined\n\n", Cmd_Argv (2 + argv_index_add));
+		Con_Printf ("%s already defined\n\n", Cmd_Argv (2 + argv_index_add));
 }
 
 static void
@@ -424,19 +427,19 @@ Cmd_FilterRemove (void)
 	netadr_t    from;
 
 	if (Cmd_Argc () < 3 + argv_index_add) {
-		printf
+		Con_Printf
 			("Invalid command parameters. Usage:\nfilter remove x.x.x.x:port\n\n");
 		return;
 	}
 	NET_StringToAdr (Cmd_Argv (2 + argv_index_add), &from);
 	if ((filter = FL_Find (from))) {
-		printf ("Removed %s\n\n", Cmd_Argv (2 + argv_index_add));
+		Con_Printf ("Removed %s\n\n", Cmd_Argv (2 + argv_index_add));
 		FL_Remove (filter);
 		free (filter);
 	}
 
 	else
-		printf ("Cannot find %s\n\n", Cmd_Argv (2 + argv_index_add));
+		Con_Printf ("Cannot find %s\n\n", Cmd_Argv (2 + argv_index_add));
 }
 
 static void
@@ -445,18 +448,18 @@ Cmd_FilterList (void)
 	filter_t   *filter;
 
 	for (filter = filter_list; filter; filter = filter->next) {
-		printf ("%s", NET_AdrToString (filter->from));
-		printf ("\t\t%s\n", NET_AdrToString (filter->to));
+		Con_Printf ("%s", NET_AdrToString (filter->from));
+		Con_Printf ("\t\t%s\n", NET_AdrToString (filter->to));
 	}
 	if (filter_list == NULL)
-		printf ("No filter\n");
-	printf ("\n");
+		Con_Printf ("No filter\n");
+	Con_Printf ("\n");
 }
 
 static void
 Cmd_FilterClear (void)
 {
-	printf ("Removed all filters\n\n");
+	Con_Printf ("Removed all filters\n\n");
 	FL_Clear ();
 }
 
@@ -507,8 +510,6 @@ SV_WriteFilterList (void)
 	}
 }
 
-int         sv_mode;
-
 void
 SV_Shutdown (void)
 {
@@ -516,19 +517,7 @@ SV_Shutdown (void)
 
 	// write filter list
 	SV_WriteFilterList ();
-}
-
-void
-SV_GetConsoleCommands (void)
-{
-	const char *cmd;
-
-	while (1) {
-		cmd = Sys_ConsoleInput ();
-		if (!cmd)
-			break;
-		Cbuf_AddText (mst_cbuf, cmd);
-	}
+	Con_Shutdown ();
 }
 
 #define SV_TIMEOUT 450
@@ -546,7 +535,7 @@ SV_TimeOut (void)
 	for (sv = sv_list; sv;) {
 		if (sv->timeout + SV_TIMEOUT < time) {
 			next = sv->next;
-			printf ("%s timed out\n", NET_AdrToString (sv->ip));
+			Con_Printf ("%s timed out\n", NET_AdrToString (sv->ip));
 			SVL_Remove (sv);
 			free (sv);
 			sv = next;
@@ -556,18 +545,45 @@ SV_TimeOut (void)
 			sv = sv->next;
 	}
 }
+
 void
 SV_Frame ()
 {
-	SV_GetConsoleCommands ();
+	Sys_CheckInput (1, net_socket);
+	Con_ProcessInput ();
 	Cbuf_Execute_Stack (mst_cbuf);
 	SV_TimeOut ();
 	SV_ReadPackets ();
 }
 
+static void
+MST_Quit_f (void)
+{
+	Con_Printf ("HW master shutdown\n");
+	Sys_Quit ();
+}
+
 int
 main (int argc, const char **argv)
 {
+	COM_InitArgv (argc, argv);
+
+	mst_cbuf = Cbuf_New (&id_interp);
+
+	Sys_RegisterShutdown (SV_Shutdown);
+
+	Cvar_Init_Hash ();
+	Cmd_Init_Hash ();
+	Cvar_Init ();
+	Sys_Init_Cvars ();
+	Sys_Init ();
+	Cmd_Init ();
+
+	Cmd_AddCommand ("quit", MST_Quit_f, "Shut down the master server");
+
+	Cmd_StuffCmds (mst_cbuf);
+	Cbuf_Execute_Sets (mst_cbuf);
+
 	PI_Init ();
 
 	sv_console_plugin = Cvar_Get ("sv_console_plugin", "server",
@@ -578,11 +594,9 @@ main (int argc, const char **argv)
 		con_module->data->console->cbuf = mst_cbuf;
 	con_list_print = Sys_Printf;
 
-	COM_InitArgv (argc, argv);
-	Cmd_Init ();
 	SV_InitNet ();
-	printf ("Exe: " __TIME__ " " __DATE__ "\n");
-	printf ("======== HW master initialized ========\n\n");
+	Con_Printf ("Exe: " __TIME__ " " __DATE__ "\n");
+	Con_Printf ("======== HW master initialized ========\n\n");
 	while (1) {
 		SV_Frame ();
 	}