diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c
index 5d9c539e8..7ea157c05 100644
--- a/engine/client/cl_main.c
+++ b/engine/client/cl_main.c
@@ -480,7 +480,7 @@ void CL_SendConnectPacket (int mtu,
 
 	if (!NET_StringToAdr (cls.servername, PORT_QWSERVER, &adr))
 	{
-		Con_TPrintf (TLC_BADSERVERADDRESS);
+		Con_TPrintf ("Bad server address\n");
 		connect_time = -1;
 		return;
 	}
@@ -490,7 +490,7 @@ void CL_SendConnectPacket (int mtu,
 
 	if (!NET_IsClientLegal(&adr))
 	{
-		Con_TPrintf (TLC_ILLEGALSERVERADDRESS);
+		Con_TPrintf ("Illegal server address\n");
 		connect_time = -1;
 		return;
 	}
@@ -724,7 +724,7 @@ void CL_CheckForResend (void)
 		{
 			if (!NET_StringToAdr (cls.servername, connect_defaultport, &adr))
 			{
-				Con_TPrintf (TLC_BADSERVERADDRESS);
+				Con_TPrintf ("Bad server address\n");
 				connect_time = -1;
 				SCR_EndLoadingPlaque();
 				return;
@@ -794,14 +794,14 @@ void CL_CheckForResend (void)
 	t1 = Sys_DoubleTime ();
 	if (!NET_StringToAdr (cls.servername, connect_defaultport, &adr))
 	{
-		Con_TPrintf (TLC_BADSERVERADDRESS);
+		Con_TPrintf ("Bad server address\n");
 		connect_time = -1;
 		SCR_EndLoadingPlaque();
 		return;
 	}
 	if (!NET_IsClientLegal(&adr))
 	{
-		Con_TPrintf (TLC_ILLEGALSERVERADDRESS);
+		Con_TPrintf ("Illegal server address\n");
 		SCR_EndLoadingPlaque();
 		connect_time = -1;
 		return;
@@ -822,7 +822,7 @@ void CL_CheckForResend (void)
 	CLQ3_SendAuthPacket(&adr);
 #endif
 
-	Con_TPrintf (TLC_CONNECTINGTO, cls.servername);
+	Con_TPrintf ("Connecting to %s...\n", cls.servername);
 
 	if (connect_tries == 0)
 		if (!NET_EnsureRoute(cls.sockets, "conn", cls.servername, false))
@@ -895,7 +895,7 @@ void CL_BeginServerReconnect(void)
 #ifndef CLIENTONLY
 	if (isDedicated)
 	{
-		Con_TPrintf (TLC_DEDICATEDCANNOTCONNECT);
+		Con_TPrintf ("Connect ignored - dedicated. set a renderer first\n");
 		return;
 	}
 #endif
@@ -914,7 +914,7 @@ void CL_Connect_f (void)
 
 	if (Cmd_Argc() != 2)
 	{
-		Con_TPrintf (TLC_SYNTAX_CONNECT);
+		Con_TPrintf ("usage: connect <server>\n");
 		return;
 	}
 
@@ -989,7 +989,7 @@ void CLNQ_Connect_f (void)
 
 	if (Cmd_Argc() != 2)
 	{
-		Con_TPrintf (TLC_SYNTAX_CONNECT);
+		Con_TPrintf ("usage: connect <server>\n");
 		return;
 	}
 
@@ -1047,8 +1047,8 @@ void CL_Rcon_f (void)
 	{
 		if (Cmd_Argc() < 3)
 		{
-			Con_TPrintf (TLC_NORCONPASSWORD);
-			Con_Printf("usage: rcon (password) <command>\n");
+			Con_TPrintf ("'rcon_password' is not set.\n");
+			Con_TPrintf("usage: rcon (password) <command>\n");
 			return;
 		}
 		password = Cmd_Argv(1);
@@ -1085,7 +1085,7 @@ void CL_Rcon_f (void)
 	{
 		if (!strlen(rcon_address.string))
 		{
-			Con_TPrintf (TLC_NORCONDEST);
+			Con_TPrintf ("You must either be connected,\nor set the 'rcon_address' cvar\nto issue rcon commands\n");
 
 			return;
 		}
@@ -1392,7 +1392,7 @@ void CL_User_f (void)
 
 	if (Cmd_Argc() != 2)
 	{
-		Con_TPrintf (TLC_SYNTAX_USER);
+		Con_TPrintf ("Usage: user <username / userid>\n");
 		return;
 	}
 
@@ -1413,7 +1413,7 @@ void CL_User_f (void)
 		}
 	}
 	if (!found)
-		Con_TPrintf (TLC_USER_NOUSER);
+		Con_TPrintf ("User not in server.\n");
 }
 
 /*
@@ -1429,18 +1429,18 @@ void CL_Users_f (void)
 	int		c;
 
 	c = 0;
-	Con_TPrintf (TLC_USERBANNER);
-	Con_TPrintf (TLC_USERBANNER2);
+	Con_TPrintf ("userid frags name\n");
+	Con_TPrintf ("------ ----- ----\n");
 	for (i=0 ; i<MAX_CLIENTS ; i++)
 	{
 		if (cl.players[i].name[0])
 		{
-			Con_TPrintf (TLC_USERLINE, cl.players[i].userid, cl.players[i].frags, cl.players[i].name);
+			Con_TPrintf ("%6i %4i %s\n", cl.players[i].userid, cl.players[i].frags, cl.players[i].name);
 			c++;
 		}
 	}
 
-	Con_TPrintf (TLC_USERTOTAL, c);
+	Con_TPrintf ("%i total users\n", c);
 }
 
 int CL_ParseColour(char *colt)
@@ -1469,10 +1469,10 @@ void CL_Color_f (void)
 
 	if (Cmd_Argc() == 1)
 	{
-		Con_TPrintf (TLC_COLOURCURRENT,
+		Con_TPrintf ("\"color\" is \"%s %s\"\n",
 			Info_ValueForKey (cls.userinfo[pnum], "topcolor"),
 			Info_ValueForKey (cls.userinfo[pnum], "bottomcolor") );
-		Con_TPrintf (TLC_SYNTAX_COLOUR);
+		Con_TPrintf ("usage: color <0xRRGGBB> [0xRRGGBB]\n");
 		return;
 	}
 
@@ -1752,7 +1752,7 @@ void CL_FullServerinfo_f (void)
 
 	if (Cmd_Argc() != 2)
 	{
-		Con_TPrintf (TLC_SYNTAX_FULLSERVERINFO);
+		Con_TPrintf ("usage: fullserverinfo <complete info string>\n");
 		return;
 	}
 
@@ -1762,7 +1762,7 @@ void CL_FullServerinfo_f (void)
 		v = Q_atof(p);
 		if (v) {
 			if (!server_version)
-				Con_TPrintf (TLC_SERVER_VERSION, v);
+				Con_TPrintf ("Version %1.2f Server\n", v);
 			server_version = v;
 		}
 	}
@@ -1788,7 +1788,7 @@ void CL_FullInfo_f (void)
 
 	if (Cmd_Argc() != 2)
 	{
-		Con_TPrintf (TLC_SYNTAX_FULLINFO);
+		Con_TPrintf ("fullinfo <complete info string>\n");
 		return;
 	}
 
@@ -1871,7 +1871,7 @@ void CL_SetInfo_f (void)
 	}
 	if (Cmd_Argc() != 3)
 	{
-		Con_TPrintf (TLC_SYNTAX_SETINFO);
+		Con_TPrintf ("usage: setinfo [ <key> <value> ]\n");
 		return;
 	}
 	if (!stricmp(Cmd_Argv(1), pmodel_name) || !strcmp(Cmd_Argv(1), emodel_name))
@@ -1939,7 +1939,7 @@ void CL_Packet_f (void)
 
 	if (Cmd_Argc() != 3)
 	{
-		Con_TPrintf (TLC_PACKET_SYNTAX);
+		Con_TPrintf ("usage: packet <destination> <contents>\n");
 		return;
 	}
 
@@ -2159,7 +2159,7 @@ void CL_Changing_f (void)
 	if (cls.state)
 	{
 		cls.state = ca_connected;	// not active anymore, but not disconnected
-		Con_TPrintf (TLC_CHANGINGMAP);
+		Con_TPrintf ("\nChanging map...\n");
 	}
 	else
 		Con_Printf("Changing while not connected\n");
@@ -2192,14 +2192,14 @@ void CL_Reconnect_f (void)
 
 	if (cls.state == ca_connected)
 	{
-		Con_TPrintf (TLC_RECONNECTING);
+		Con_TPrintf ("reconnecting...\n");
 		CL_SendClientCommand(true, "new");
 		return;
 	}
 
 	if (!*cls.servername)
 	{
-		Con_TPrintf (TLC_RECONNECT_NOSERVER);
+		Con_TPrintf ("No server to reconnect to...\n");
 		return;
 	}
 
@@ -2292,7 +2292,7 @@ void CL_ConnectionlessPacket (void)
 	}
 
 	if (cls.demoplayback == DPB_NONE && net_from.type != NA_LOOPBACK)
-		Con_TPrintf (TL_ST_COLON, NET_AdrToString (adr, sizeof(adr), &net_from));
+		Con_Printf ("%s: ", NET_AdrToString (adr, sizeof(adr), &net_from));
 //	Con_DPrintf ("%s", net_message.data + 4);
 
 	if (c == S2C_CHALLENGE)
@@ -2300,7 +2300,7 @@ void CL_ConnectionlessPacket (void)
 		static unsigned int lasttime = 0xdeadbeef;
 		unsigned int curtime = Sys_Milliseconds();
 		unsigned long pext = 0, pext2 = 0, huffcrc=0, mtu=0;
-		Con_TPrintf (TLC_S2C_CHALLENGE);
+		Con_TPrintf ("challenge\n");
 
 		s = MSG_ReadString ();
 		COM_Parse(s);
@@ -2453,7 +2453,7 @@ void CL_ConnectionlessPacket (void)
 
 		if (!strcmp(s, "print"))
 		{
-			Con_TPrintf (TLC_A2C_PRINT);
+			Con_TPrintf ("print\n");
 
 			s = MSG_ReadString ();
 			Con_Printf ("%s", s);
@@ -2480,7 +2480,7 @@ void CL_ConnectionlessPacket (void)
 		}
 		else
 		{
-			Con_TPrintf (TLC_Q2CONLESSPACKET_UNKNOWN, s);
+			Con_TPrintf ("unknown connectionless packet for q2:  %s\n", s);
 			msg_readcount = c;
 			c = MSG_ReadByte();
 		}
@@ -2535,11 +2535,11 @@ void CL_ConnectionlessPacket (void)
 client_connect:	//fixme: make function
 #endif
 		if (net_from.type != NA_LOOPBACK)
-			Con_TPrintf (TLC_GOTCONNECTION);
+			Con_TPrintf ("connection\n");
 		if (cls.state >= ca_connected)
 		{
 			if (cls.demoplayback == DPB_NONE)
-				Con_TPrintf (TLC_DUPCONNECTION);
+				Con_TPrintf ("Dup connect received.  Ignored.\n");
 			return;
 		}
 		compress = cls.netchan.compress;
@@ -2554,7 +2554,7 @@ client_connect:	//fixme: make function
 			CL_SendClientCommand(true, "new");
 		cls.state = ca_connected;
 		if (cls.netchan.remote_address.type != NA_LOOPBACK)
-			Con_TPrintf (TLC_CONNECTED);
+			Con_TPrintf ("Connected.\n");
 		allowremotecmd = false; // localid required now for remote cmds
 
 		total_loading_size = 100;
@@ -2570,11 +2570,10 @@ client_connect:	//fixme: make function
 	{
 		char	cmdtext[2048];
 
-		Con_TPrintf (TLC_CONLESS_CONCMD);
 		if (net_from.type != net_local_cl_ipadr.type || net_from.type != NA_IP
 			|| ((*(unsigned *)net_from.address.ip != *(unsigned *)net_local_cl_ipadr.address.ip) && (*(unsigned *)net_from.address.ip != htonl(INADDR_LOOPBACK))))
 		{
-			Con_TPrintf (TLC_CMDFROMREMOTE);
+			Con_TPrintf ("Command packet from remote host.  Ignored.\n");
 			return;
 		}
 #ifdef _WIN32
@@ -2583,6 +2582,8 @@ client_connect:	//fixme: make function
 #endif
 		s = MSG_ReadString ();
 
+		Con_TPrintf ("client command: %s\n", s);
+
 		Q_strncpyz(cmdtext, s, sizeof(cmdtext));
 
 		s = MSG_ReadString ();
@@ -2592,12 +2593,14 @@ client_connect:	//fixme: make function
 		while (*s && isspace(s[strlen(s) - 1]))
 			s[strlen(s) - 1] = 0;
 
-		if (!allowremotecmd && (!*localid.string || strcmp(localid.string, s))) {
-			if (!*localid.string) {
-				Con_TPrintf (TLC_LOCALID_NOTSET);
+		if (!allowremotecmd && (!*localid.string || strcmp(localid.string, s)))
+		{
+			if (!*localid.string)
+			{
+				Con_TPrintf ("^&C0Command packet received from local host, but no localid has been set.  You may need to upgrade your server browser.\n");
 				return;
 			}
-			Con_TPrintf (TLC_LOCALID_BAD,
+			Con_TPrintf ("^&C0Invalid localid on command packet received from local host. \n|%s| != |%s|\nYou may need to reload your server browser and QuakeWorld.\n",
 				s, localid.string);
 			Cvar_Set(&localid, "");
 			return;
@@ -2612,14 +2615,14 @@ client_connect:	//fixme: make function
 	{
 		if (!strncmp(net_message.data+4, "print\n", 6))
 		{
-			Con_TPrintf (TLC_A2C_PRINT);
+			Con_TPrintf ("print\n");
 			Con_Printf ("%s", net_message.data+10);
 			return;
 		}
 	}
 	if (c == A2C_PRINT)
 	{
-		Con_TPrintf (TLC_A2C_PRINT);
+		Con_TPrintf ("print\n");
 
 		s = MSG_ReadString ();
 		Con_Printf ("%s", s);
@@ -2639,7 +2642,7 @@ client_connect:	//fixme: make function
 		return;
 	}
 
-	Con_TPrintf (TLC_CONLESSPACKET_UNKNOWN, c);
+	Con_TPrintf ("unknown connectionless packet:  %c\n", c);
 }
 
 #ifdef NQPROT
@@ -2663,7 +2666,7 @@ void CLNQ_ConnectionlessPacket(void)
 		if (cls.state >= ca_connected)
 		{
 			if (cls.demoplayback == DPB_NONE)
-				Con_TPrintf (TLC_DUPCONNECTION);
+				Con_TPrintf ("Dup connect received.  Ignored.\n");
 			return;
 		}
 		port = htons((unsigned short)MSG_ReadLong());
@@ -2696,7 +2699,7 @@ void CLNQ_ConnectionlessPacket(void)
 		cls.netchan.compress = 0;
 		cls.protocol = CP_NETQUAKE;
 		cls.state = ca_connected;
-		Con_TPrintf (TLC_CONNECTED);
+		Con_TPrintf ("Connected.\n");
 
 		total_loading_size = 100;
 		current_loading_size = 0;
@@ -2769,7 +2772,7 @@ void CL_ReadPackets (void)
 
 		if (net_message.cursize < 6 && (cls.demoplayback != DPB_MVD && cls.demoplayback != DPB_EZTV)) //MVDs don't have the whole sequence header thing going on
 		{
-			Con_TPrintf (TL_RUNTPACKET,NET_AdrToString(adr, sizeof(adr), &net_from));
+			Con_TPrintf ("%s: Runt packet\n", NET_AdrToString(adr, sizeof(adr), &net_from));
 			continue;
 		}
 
@@ -2867,7 +2870,7 @@ void CL_ReadPackets (void)
 		if (!sv.state)
 #endif
 		{
-			Con_TPrintf (TLC_SERVERTIMEOUT);
+			Con_TPrintf ("\nServer connection timed out.\n");
 			CL_Disconnect ();
 			return;
 		}
@@ -2937,19 +2940,19 @@ void CL_Download_f (void)
 
 	if ((cls.state == ca_disconnected || cls.demoplayback) && cls.demoplayback != DPB_EZTV)
 	{
-		Con_TPrintf (TLC_CONNECTFIRST);
+		Con_TPrintf ("Must be connected.\n");
 		return;
 	}
 
 	if (cls.netchan.remote_address.type == NA_LOOPBACK)
 	{
-		Con_TPrintf (TLC_CONNECTFIRST);
+		Con_TPrintf ("Must be connected.\n");
 		return;
 	}
 
 	if (Cmd_Argc() != 2)
 	{
-		Con_TPrintf (TLC_SYNTAX_DOWNLOAD);
+		Con_TPrintf ("Usage: download <datafile>\n");
 		return;
 	}
 
@@ -3457,7 +3460,7 @@ void VARGS Host_EndGame (char *message, ...)
 	va_start (argptr,message);
 	vsnprintf (string,sizeof(string)-1, message,argptr);
 	va_end (argptr);
-	Con_TPrintf (TLC_CLIENTCON_ERROR_ENDGAME, string);
+	Con_TPrintf ("^&C0Host_EndGame: %s\n", string);
 	Con_Printf ("\n");
 
 	SCR_EndLoadingPlaque();
@@ -3491,7 +3494,7 @@ void VARGS Host_Error (char *error, ...)
 	va_start (argptr,error);
 	vsnprintf (string,sizeof(string)-1, error,argptr);
 	va_end (argptr);
-	Con_TPrintf (TLC_HOSTFATALERROR, string);
+	Con_TPrintf ("Host_Error: %s\n", string);
 
 	CL_Disconnect ();
 	cls.demonum = -1;
@@ -3520,7 +3523,7 @@ void Host_WriteConfiguration (void)
 	{
 		if (strchr(cfg_save_name.string, '.'))
 		{
-			Con_TPrintf (TLC_CONFIGCFG_WRITEFAILED);
+			Con_TPrintf ("Couldn't write config.cfg.\n");
 			return;
 		}
 
@@ -3529,7 +3532,7 @@ void Host_WriteConfiguration (void)
 		f = FS_OpenVFS(savename, "wb", FS_GAMEONLY);
 		if (!f)
 		{
-			Con_TPrintf (TLC_CONFIGCFG_WRITEFAILED);
+			Con_TPrintf ("Couldn't write config.cfg.\n");
 			return;
 		}
 
@@ -4317,7 +4320,7 @@ void CL_StartCinematicOrMenu(void)
 	UI_Start();
 #endif
 
-	Con_TPrintf (TLC_QUAKEWORLD_INITED, *fs_gamename.string?fs_gamename.string:"Nothing");
+	Con_TPrintf ("^Ue080^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081 %s Initialized ^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue082\n", *fs_gamename.string?fs_gamename.string:"Nothing");
 
 	//there might be some console command or somesuch waiting for the renderer to begin (demos or map command or whatever all need model support).
 	realtime+=1;
@@ -4509,6 +4512,7 @@ void Host_Init (quakeparms_t *parms)
 	host_parms = *parms;
 
 	Cvar_Init();
+	TranslateInit();
 	Memory_Init ();
 
 	/*memory is working, its safe to printf*/
@@ -4548,7 +4552,6 @@ void Host_Init (quakeparms_t *parms)
 	PF_Common_RegisterCvars();
 #endif
 
-	TranslateInit();
 #ifndef CLIENTONLY
 	SV_Init(parms);
 #endif
@@ -4572,7 +4575,7 @@ void Host_Init (quakeparms_t *parms)
 #endif
 
 	//	Con_Printf ("Exe: "__TIME__" "__DATE__"\n");
-	//Con_TPrintf (TL_HEAPSIZE, parms->memsize/ (1024*1024.0));
+	//Con_Printf ("%4.1f megs RAM available.\n", parms->memsize/ (1024*1024.0));
 
 	R_SetRenderer(NULL);//set the renderer stuff to unset...
 
diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c
index bd62eac67..9ddf4d907 100644
--- a/engine/client/cl_parse.c
+++ b/engine/client/cl_parse.c
@@ -582,7 +582,7 @@ void CL_SendDownloadStartRequest(char *filename, char *localname, unsigned int f
 	strcpy (cls.downloadremotename, filename);
 	strcpy (cls.downloadlocalname, localname);
 	if (!(flags & DLLF_TEMPORARY))
-		Con_TPrintf (TL_DOWNLOADINGFILE, cls.downloadlocalname);
+		Con_TPrintf ("Downloading %s...\n", cls.downloadlocalname);
 
 	// download to a temp name, and only rename
 	// to the real name when done, so if interrupted
@@ -737,7 +737,7 @@ qboolean CL_CheckFile(char *filename)
 {
 	if (strstr (filename, ".."))
 	{
-		Con_TPrintf (TL_NORELATIVEPATHS);
+		Con_TPrintf ("Refusing to download a path with ..\n");
 		return true;
 	}
 
@@ -803,7 +803,7 @@ qboolean	CL_CheckOrEnqueDownloadFile (char *filename, char *localname, unsigned
 	//ZOID - can't download when recording
 	if (cls.demorecording)
 	{
-		Con_TPrintf (TL_NODOWNLOADINDEMO, filename);
+		Con_TPrintf ("Unable to download %s in record mode.\n", filename);
 		return true;
 	}
 	//ZOID - can't download when playback
@@ -1936,7 +1936,7 @@ void CL_ParseDownload (void)
 		/*quakeforge http download redirection*/
 		if (cls.downloadqw)
 		{
-			Con_TPrintf (TL_CLS_DOWNLOAD_ISSET);
+			Con_Printf ("cls.download shouldn't have been set\n");
 			VFS_CLOSE (cls.downloadqw);
 			cls.downloadqw = NULL;
 		}
@@ -1964,10 +1964,10 @@ void CL_ParseDownload (void)
 
 	if (size < 0)
 	{
-		Con_TPrintf (TL_FILENOTFOUND);
+		Con_TPrintf ("File not found.\n");
 		if (cls.downloadqw)
 		{
-			Con_TPrintf (TL_CLS_DOWNLOAD_ISSET);
+			Con_Printf ("cls.download shouldn't have been set\n");
 			VFS_CLOSE (cls.downloadqw);
 			cls.downloadqw = NULL;
 		}
@@ -1994,7 +1994,7 @@ void CL_ParseDownload (void)
 		if (!cls.downloadqw)
 		{
 			msg_readcount += size;
-			Con_TPrintf (TL_FAILEDTOOPEN, cls.downloadtempname);
+			Con_TPrintf ("Failed to open %s\n", cls.downloadtempname);
 			CL_DownloadFailed(cls.downloadremotename, true);
 			CL_RequestNextDownload ();
 			return;
@@ -2257,7 +2257,7 @@ Con_DPrintf ("UPLOAD: %6d: %d written\n", upload_pos - r, r);
 	if (upload_pos != upload_size)
 		return;
 
-	Con_TPrintf (TL_UPLOADCOMPLEATE);
+	Con_TPrintf ("Upload completed\n");
 
 	CL_StopUpload();
 }
@@ -2443,7 +2443,7 @@ void CLQW_ParseServerData (void)
 
 	if (cls.fteprotocolextensions2||cls.fteprotocolextensions)
 		if (developer.ival || cl_shownet.ival)
-			Con_TPrintf (TL_FTEEXTENSIONS, cls.fteprotocolextensions2, cls.fteprotocolextensions);
+			Con_TPrintf ("Using FTE extensions 0x%x%08x\n", cls.fteprotocolextensions2, cls.fteprotocolextensions);
 
 	if (cls.fteprotocolextensions & PEXT_FLOATCOORDS)
 	{
@@ -2609,8 +2609,8 @@ void CLQW_ParseServerData (void)
 	Con_Printf ("\n\n");
 	Con_Printf ("\1%s\n", str);
 #else
-	Con_TPrintf (TLC_LINEBREAK_NEWLEVEL);
-	Con_TPrintf (TLC_PC_PS_NL, 2, str);
+	Con_TPrintf ("\n\n^Ue01d^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01f\n\n");
+	Con_Printf ("%c%s\n", 2, str);
 #endif
 
 	if (CL_RemoveClientCommands("new"))	//mvdsv is really appaling some times.
@@ -2745,8 +2745,8 @@ void CLQ2_ParseServerData (void)
 	else
 	{
 		// seperate the printfs so the server message can have a color
-		Con_TPrintf (TLC_LINEBREAK_NEWLEVEL);
-		Con_TPrintf (TLC_PC_PS_NL, 2, str);
+		Con_TPrintf ("\n\n^Ue01d^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01f\n\n");
+		Con_Printf ("%c%s\n", 2, str);
 
 		Media_StopFilm(true);
 
@@ -2890,7 +2890,7 @@ void CLNQ_ParseServerData(void)		//Doesn't change gamedir - use with caution.
 	char	*str;
 	int gametype;
 	if (developer.ival)
-		Con_TPrintf (TLC_GOTSVDATAPACKET);
+		Con_TPrintf ("Serverdata packet received.\n");
 	SCR_SetLoadingStage(LS_CLIENT);
 	CL_ClearState ();
 	Stats_NewMap();
@@ -2917,8 +2917,8 @@ void CLNQ_ParseServerData(void)		//Doesn't change gamedir - use with caution.
 	Con_Printf ("\n\n");
 	Con_Printf ("\1%s\n", str);
 #else
-	Con_TPrintf (TLC_LINEBREAK_NEWLEVEL);
-	Con_TPrintf (TLC_PC_PS_NL, 2, str);
+	Con_TPrintf ("\n\n^Ue01d^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01e^Ue01f\n\n");
+	Con_Printf ("%c%s\n", 2, str);
 #endif
 
 	SCR_BeginLoadingPlaque();
@@ -2934,7 +2934,7 @@ void CLNQ_ParseServerData(void)		//Doesn't change gamedir - use with caution.
 			break;
 		if (nummodels==MAX_MODELS)
 		{
-			Con_TPrintf (TLC_TOOMANYMODELPRECACHES);
+			Con_TPrintf ("Server sent too many model precaches\n");
 			return;
 		}
 		strcpy (cl.model_name[nummodels], str);
@@ -2951,7 +2951,7 @@ void CLNQ_ParseServerData(void)		//Doesn't change gamedir - use with caution.
 			break;
 		if (numsounds==MAX_SOUNDS)
 		{
-			Con_TPrintf (TLC_TOOMANYSOUNDPRECACHES);
+			Con_TPrintf ("Server sent too many sound precaches\n");
 			return;
 		}
 		strcpy (cl.sound_name[numsounds], str);
@@ -3724,7 +3724,7 @@ void CL_ParseStatic (int version)
 
 	if (!cl.worldmodel || cl.worldmodel->needload)
 	{
-		Con_TPrintf (TLC_PARSESTATICWITHNOMAP);
+		Con_TPrintf ("Warning: Parsestatic and no map loaded yet\n");
 		return;
 	}
 	if (ent->model)
@@ -5384,9 +5384,9 @@ void CLQW_ParseServerMessage (void)
 
 	//
 	if (cl_shownet.value == 1)
-		Con_TPrintf (TL_INT_SPACE,net_message.cursize);
+		Con_Printf ("%i ",net_message.cursize);
 	else if (cl_shownet.value >= 2)
-		Con_TPrintf (TLC_LINEBREAK_MINUS);
+		Con_Printf ("------------------\n");
 
 
 	CL_ParseClientdata ();
@@ -5907,9 +5907,9 @@ void CLQ2_ParseServerMessage (void)
 // if recording demos, copy the message out
 //
 	if (cl_shownet.value == 1)
-		Con_TPrintf (TL_INT_SPACE,net_message.cursize);
+		Con_Printf ("%i ",net_message.cursize);
 	else if (cl_shownet.value == 2)
-		Con_TPrintf (TLC_LINEBREAK_MINUS);
+		Con_Printf ("------------------\n");
 
 
 	CL_ParseClientdata ();
@@ -5976,7 +5976,7 @@ void CLQ2_ParseServerMessage (void)
 				Host_EndGame ("Server disconnected");
 			return;
 		case svcq2_reconnect:	//8
-			Con_TPrintf (TLC_RECONNECTING);
+			Con_TPrintf ("reconnecting...\n");
 			CL_SendClientCommand(true, "new");
 			break;
 		case svcq2_sound:		//9			// <see code>
@@ -6207,9 +6207,9 @@ void CLNQ_ParseServerMessage (void)
 // if recording demos, copy the message out
 //
 	if (cl_shownet.value == 1)
-		Con_TPrintf (TL_INT_SPACE,net_message.cursize);
+		Con_Printf ("%i ",net_message.cursize);
 	else if (cl_shownet.value == 2)
-		Con_TPrintf (TLC_LINEBREAK_MINUS);
+		Con_Printf ("------------------\n");
 
 
 	CL_ParseClientdata ();
diff --git a/engine/client/client.h b/engine/client/client.h
index 25c98aa63..e3320072e 100644
--- a/engine/client/client.h
+++ b/engine/client/client.h
@@ -440,7 +440,7 @@ typedef struct
 #ifdef NQPROT
 	int signon;
 #endif
-	translation_t language;
+	int language;
 
 	colourised_t *colourised;
 } client_static_t;
diff --git a/engine/client/clq3_parse.c b/engine/client/clq3_parse.c
index 27a453f6b..92362047d 100644
--- a/engine/client/clq3_parse.c
+++ b/engine/client/clq3_parse.c
@@ -634,9 +634,9 @@ void CLQ3_ParseServerMessage (void)
 		return;	//was a fragment.
 
 	if (cl_shownet.value == 1)
-		Con_TPrintf (TL_INT_SPACE,net_message.cursize);
+		Con_Printf ("%i ",net_message.cursize);
 	else if (cl_shownet.value == 2)
-		Con_TPrintf (TLC_LINEBREAK_MINUS);
+		Con_Printf ("------------------\n");
 
 	net_message.packing = SZ_RAWBYTES;
 	MSG_BeginReading(msg_nullnetprim);
diff --git a/engine/client/console.c b/engine/client/console.c
index 0493af2b2..42ea822f0 100644
--- a/engine/client/console.c
+++ b/engine/client/console.c
@@ -65,6 +65,8 @@ cvar_t		cl_chatmode = SCVAR("cl_chatmode", "2");
 cvar_t		con_numnotifylines_chat = CVAR("con_numnotifylines_chat", "8");
 cvar_t		con_notifytime_chat = CVAR("con_notifytime_chat", "8");
 cvar_t		con_separatechat = CVAR("con_separatechat", "0");
+cvar_t		con_timestamps = CVAR("con_timestamps", "0");
+cvar_t		con_timeformat = CVAR("con_timeformat", "(%H:%M:%S) ");
 
 #define	NUM_CON_TIMES 24
 
@@ -570,7 +572,7 @@ void Con_Init (void)
 	Q_strncpyz(con_main.title, "MAIN", sizeof(con_main.title));
 
 	con_initialized = true;
-	Con_Printf ("Console initialized.\n");
+	Con_TPrintf ("Console initialized.\n");
 
 //
 // register our commands
@@ -584,6 +586,8 @@ void Con_Init (void)
 	Cvar_Register (&con_numnotifylines_chat, "Console controls");
 	Cvar_Register (&con_notifytime_chat, "Console controls");
 	Cvar_Register (&con_separatechat, "Console controls");
+	Cvar_Register (&con_timestamps, "Console controls");
+	Cvar_Register (&con_timeformat, "Console controls");
 
 	Cmd_AddCommand ("toggleconsole", Con_ToggleConsole_f);
 	Cmd_AddCommand ("messagemode", Con_MessageMode_f);
@@ -632,6 +636,35 @@ If no console is visible, the notify window will pop up.
 ================
 */
 
+void Con_PrintConChars (console_t *con, conchar_t *c, int len)
+{
+	conline_t *oc;
+	conchar_t *o;
+	if (con->selstartline == con->current)
+		con->selstartline = NULL;
+	if (con->selendline == con->current)
+		con->selendline = NULL;
+
+	oc = con->current;
+	if (oc->length+len > oc->maxlength)
+	{
+		oc->maxlength = (oc->length+len)+8;
+		if (oc->maxlength < oc->length)
+			oc->length = 0;	//don't crash from console line overflows.
+		con->current = BZ_Realloc(con->current, sizeof(*con->current)+(oc->maxlength)*sizeof(conchar_t));
+	}
+	if (con->display == oc)
+		con->display = con->current;
+	if (con->oldest == oc)
+		con->oldest = con->current;
+
+	if (con->current->older)
+		con->current->older->newer = con->current;
+	o = (conchar_t *)(con->current+1)+con->current->length;
+	memcpy(o, c, sizeof(*o) * len);
+	con->current->length+=len;
+}
+
 void Con_PrintCon (console_t *con, char *txt)
 {
 	conchar_t expanded[4096];
@@ -648,7 +681,7 @@ void Con_PrintCon (console_t *con, char *txt)
 	{
 		conchar_t *o;
 
-		switch (*c & (CON_CHARMASK|CON_HIDDEN))
+		switch (*c & (CON_CHARMASK|CON_HIDDEN))	//include hidden so we don't do \r or \n on hidden chars, allowing them to be embedded in links and stuff.
 		{
 		case '\r':
 			con->cr = true;
@@ -702,8 +735,6 @@ void Con_PrintCon (console_t *con, char *txt)
 			con->current->newer = reuse;
 			con->current = reuse;
 			con->current->length = 0;
-			o = (conchar_t *)(con->current+1)+con->current->length;
-			*o = 0;
 			if (con->display == con->current->older)
 				con->display = con->current;
 			break;
@@ -714,15 +745,26 @@ void Con_PrintCon (console_t *con, char *txt)
 				con->cr = false;
 			}
 
+			if (!con->current->length && con_timestamps.ival)
+			{
+				char timeasc[64];
+				conchar_t timecon[64], *timeconend;
+				time_t rawtime;
+				time (&rawtime);
+				strftime(timeasc, sizeof(timeasc), con_timeformat.string, localtime (&rawtime));
+				timeconend = COM_ParseFunString(con->defaultcharbits, timeasc, timecon, sizeof(timecon), false);
+				Con_PrintConChars(con, timecon, timeconend-timecon);
+			}
+
 			if (con->selstartline == con->current)
 				con->selstartline = NULL;
 			if (con->selendline == con->current)
 				con->selendline = NULL;
 
 			oc = con->current;
-			if (oc->length+2 > oc->maxlength)
+			if (oc->length+1 > oc->maxlength)
 			{
-				oc->maxlength = (oc->length+2)+8;
+				oc->maxlength = (oc->length+1)+8;
 				if (oc->maxlength < oc->length)
 					oc->length = 0;	//don't crash from console line overflows.
 				con->current = BZ_Realloc(con->current, sizeof(*con->current)+(oc->maxlength)*sizeof(conchar_t));
@@ -736,7 +778,6 @@ void Con_PrintCon (console_t *con, char *txt)
 				con->current->older->newer = con->current;
 			o = (conchar_t *)(con->current+1)+con->current->length;
 			*o = *c;
-			o[1] = 0;
 			con->current->length+=1;
 			break;
 		}
@@ -832,7 +873,7 @@ void VARGS Con_TPrintf (translation_t text, ...)
 {
 	va_list		argptr;
 	char		msg[MAXPRINTMSG];
-	char *fmt = languagetext[text][cls.language];
+	const char *fmt = langtext(text, cls.language);
 
 	va_start (argptr,text);
 	vsnprintf (msg,sizeof(msg), fmt,argptr);
@@ -846,7 +887,7 @@ void VARGS Con_SafeTPrintf (translation_t text, ...)
 {
 	va_list		argptr;
 	char		msg[MAXPRINTMSG];
-	char *fmt = languagetext[text][cls.language];
+	const char *fmt = langtext(text, cls.language);
 
 	va_start (argptr,text);
 	vsnprintf (msg,sizeof(msg), fmt,argptr);
diff --git a/engine/client/renderer.c b/engine/client/renderer.c
index 533a7cdfc..00257a1e3 100644
--- a/engine/client/renderer.c
+++ b/engine/client/renderer.c
@@ -999,7 +999,7 @@ qboolean R_ApplyRenderer_Load (rendererstate_t *newr)
 		isDedicated = false;
 #endif
 		if (newr)
-			Con_Printf("Setting mode %i*%i*%i*%i %s\n", newr->width, newr->height, newr->bpp, newr->rate, newr->renderer->description);
+			Con_TPrintf("Setting mode %i*%i*%i*%i %s\n", newr->width, newr->height, newr->bpp, newr->rate, newr->renderer->description);
 
 		if (host_basepal)
 			BZ_Free(host_basepal);
@@ -1313,7 +1313,7 @@ TRACE(("dbg: R_ApplyRenderer: efrags\n"));
 
 	if (newr && qrenderer != QR_NONE)
 	{
-		Con_Printf("%s renderer initialized\n", newr->renderer->description);
+		Con_TPrintf("%s renderer initialized\n", newr->renderer->description);
 	}
 
 	TRACE(("dbg: R_ApplyRenderer: S_Restart_f\n"));
diff --git a/engine/client/sys_win.c b/engine/client/sys_win.c
index aa87f508f..fa1ce12aa 100644
--- a/engine/client/sys_win.c
+++ b/engine/client/sys_win.c
@@ -2702,6 +2702,7 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin
 		*COM_SkipPath(bindir) = 0;
 		parms.argv = (const char **)argv;
 
+		host_parms.binarydir = bindir;
 		COM_InitArgv (parms.argc, parms.argv);
 
 		if (Sys_CheckUpdated())
diff --git a/engine/client/teamplay.c b/engine/client/teamplay.c
index 9e082f58c..a31d9bf49 100644
--- a/engine/client/teamplay.c
+++ b/engine/client/teamplay.c
@@ -208,7 +208,7 @@ void CL_Say_f (void)
 			SV_ConSay_f();
 		else
 #endif
-			Con_TPrintf (TL_CANTXNOTCONNECTED, Cmd_Argv(0));
+			Con_TPrintf ("Can't \"%s\", not connected\n", Cmd_Argv(0));
 		return;
 	}
 
@@ -216,7 +216,7 @@ void CL_Say_f (void)
 	{
 		if (strcmp(Info_ValueForKey(cl.serverinfo, "*distrib"), DISTRIBUTION) || atoi(Info_ValueForKey(cl.serverinfo, "*ver")) < PRE_SAYONE)
 		{
-			Con_TPrintf (TLC_REQUIRESSERVERMOD, Cmd_Argv(0));
+			Con_Printf ("%s is only available with server support\n", Cmd_Argv(0));
 			return;
 		}
 	}
diff --git a/engine/common/cmd.c b/engine/common/cmd.c
index f263ea6e7..5d34cea87 100644
--- a/engine/common/cmd.c
+++ b/engine/common/cmd.c
@@ -214,7 +214,7 @@ void Cbuf_AddText (const char *text, int level)
 
 		if (newmax > cmd_maxbuffersize.ival && cmd_maxbuffersize.ival)
 		{
-			Con_TPrintf (TL_FUNCOVERFLOW, "Cbuf_AddText");
+			Con_TPrintf ("%s: overflow\n", "Cbuf_AddText");
 			return;
 		}
 		while (newmax < cmd_text[level].buf.cursize + l)
@@ -509,7 +509,7 @@ void Cmd_Exec_f (void)
 
 	if (Cmd_Argc () != 2)
 	{
-		Con_TPrintf (TL_EXECCOMMANDUSAGE);
+		Con_TPrintf ("exec <filename> : execute a script file\n");
 		return;
 	}
 
@@ -531,11 +531,11 @@ void Cmd_Exec_f (void)
 		;
 	else
 	{
-		Con_TPrintf (TL_EXECFAILED,name);
+		Con_TPrintf ("couldn't exec %s\n",name);
 		return;
 	}
 	if (cl_warncmd.ival || developer.ival)
-		Con_TPrintf (TL_EXECING,name);
+		Con_TPrintf ("execing %s\n",name);
 
 	s = f;
 	if (s[0] == '\xef' && s[1] == '\xbb' && s[2] == '\xbf')
@@ -656,7 +656,7 @@ void Cmd_Alias_f (void)
 		{
 			if (Cmd_ExecLevel==RESTRICT_SERVER)
 			{
-				Con_TPrintf (TL_CURRENTALIASCOMMANDS);
+				Con_TPrintf ("Current alias commands:\n");
 				for (a = cmd_alias ; a ; a=a->next)
 				{
 					if (a->flags & ALIAS_FROMSERVER)
@@ -666,7 +666,7 @@ void Cmd_Alias_f (void)
 		}
 		else
 		{
-			Con_TPrintf (TL_CURRENTALIASCOMMANDS);
+			Con_TPrintf ("Current alias commands:\n");
 			for (a = cmd_alias ; a ; a=a->next)
 			{
 	/*			extern int con_linewidth;
@@ -682,7 +682,7 @@ void Cmd_Alias_f (void)
 	s = Cmd_Argv(1);
 	if (strlen(s) >= MAX_ALIAS_NAME || !strcmp(s, "say"))	//reject aliasing the say command. We use it as an easy way to warn that our player is cheating.
 	{
-		Con_TPrintf (TL_ALIASNAMETOOLONG);
+		Con_TPrintf ("Alias name is too long\n");
 		return;
 	}
 
@@ -727,7 +727,7 @@ void Cmd_Alias_f (void)
 		{
 			if ((a->restriction?a->restriction:rcon_level.ival) > Cmd_ExecLevel)
 			{
-				Con_TPrintf (TL_ALIASRESTRICTIONLEVELERROR);
+				Con_TPrintf ("Alias is already bound with a higher restriction\n");
 				return;
 			}
 
@@ -869,7 +869,7 @@ void Cmd_AliasLevel_f (void)
 	int level;
 	if (Cmd_Argc() < 2 || Cmd_Argc() > 3)
 	{
-		Con_TPrintf(TL_ALIASLEVELCOMMANDUSAGE);
+		Con_TPrintf("aliaslevel <var> [execlevel]\n");
 		return;
 	}
 
@@ -882,7 +882,7 @@ void Cmd_AliasLevel_f (void)
 	}
 	if (!a)
 	{
-		Con_TPrintf(TL_ALIASNOTFOUND);
+		Con_TPrintf("Alias not found\n");
 		return;
 	}
 
@@ -898,17 +898,17 @@ void Cmd_AliasLevel_f (void)
 
 		if (level > Cmd_ExecLevel || (a->restriction?a->restriction:rcon_level.ival) > Cmd_ExecLevel)
 		{
-			Con_TPrintf(TL_ALIASRAISELEVELERROR);
+			Con_TPrintf("You arn't allowed to raise a command above your own level\n");
 			return;
 		}
 
 		a->execlevel = level;
 
 		if (a->restriction == 1)
-			Con_TPrintf(TL_ALIASRESTRICTIONLEVELWARN, a->name);
+			Con_TPrintf("WARNING: %s is available to all clients, any client will be able to use it at the new level.\n", a->name);
 	}
 	else
-		Con_TPrintf(TL_ALIASRESTRICTLEVEL, s, a->execlevel);
+		Con_TPrintf("alias %s is set to run at the user level of %i\n", s, a->execlevel);
 }
 
 //lists commands, also prints restriction level
@@ -930,7 +930,7 @@ void Cmd_AliasList_f (void)
 		if (flags && !(cmd->flags & flags))
 			continue;
 		if (!num)
-			Con_TPrintf(TL_ALIASLIST);
+			Con_TPrintf("Alias list:\n");
 		if (cmd->execlevel)
 			Con_Printf("(%2i)(%2i) %s\n", (int)(cmd->restriction?cmd->restriction:rcon_level.ival), cmd->execlevel, cmd->name);
 		else
@@ -1569,7 +1569,7 @@ void Cmd_RestrictCommand_f (void)
 			level = RESTRICT_MAX;
 			if (level > Cmd_ExecLevel)
 			{
-				Con_TPrintf(TL_RESTRICTCOMMANDRAISE);
+				Con_TPrintf("You arn't allowed to raise a command above your own level\n");
 				return;
 			}
 		}
@@ -1585,12 +1585,12 @@ void Cmd_RestrictCommand_f (void)
 			if (Cmd_Argc() == 2)
 			{
 				if (cmd->restriction)
-					Con_TPrintf (TL_RESTRICTCURRENTLEVEL, cmd_name, (int)cmd->restriction);
+					Con_TPrintf ("%s is restricted to %i\n", cmd_name, (int)cmd->restriction);
 				else
-					Con_TPrintf (TL_RESTRICTCURRENTLEVELDEFAULT, cmd_name, rcon_level.ival);
+					Con_TPrintf ("%s is restricted to rcon_level (%i)\n", cmd_name, rcon_level.ival);
 			}
 			else if ((cmd->restriction?cmd->restriction:rcon_level.ival) > Cmd_ExecLevel)
-				Con_TPrintf(TL_RESTRICTCOMMANDTOOHIGH);
+				Con_TPrintf("You arn't allowed to alter a level above your own\n");
 			else
 				cmd->restriction = level;
 			return;
@@ -1604,12 +1604,12 @@ void Cmd_RestrictCommand_f (void)
 		if (Cmd_Argc() == 2)
 		{
 			if (v->restriction)
-				Con_TPrintf (TL_RESTRICTCURRENTLEVEL, cmd_name, (int)v->restriction);
+				Con_TPrintf ("%s is restricted to %i\n", cmd_name, (int)v->restriction);
 			else
-				Con_TPrintf (TL_RESTRICTCURRENTLEVELDEFAULT, cmd_name, rcon_level.ival);
+				Con_TPrintf ("%s is restricted to rcon_level (%i)\n", cmd_name, rcon_level.ival);
 		}
 		else if ((v->restriction?v->restriction:rcon_level.ival) > Cmd_ExecLevel)
-			Con_TPrintf(TL_RESTRICTCOMMANDTOOHIGH);
+			Con_TPrintf("You arn't allowed to alter a level above your own\n");
 		else
 			v->restriction = level;
 
@@ -1624,19 +1624,19 @@ void Cmd_RestrictCommand_f (void)
 			if (Cmd_Argc() == 2)
 			{
 				if (a->restriction)
-					Con_TPrintf (TL_RESTRICTCURRENTLEVEL, cmd_name, (int)a->restriction);
+					Con_TPrintf ("%s is restricted to %i\n", cmd_name, (int)a->restriction);
 				else
-					Con_TPrintf (TL_RESTRICTCURRENTLEVELDEFAULT, cmd_name, rcon_level.ival);
+					Con_TPrintf ("%s is restricted to rcon_level (%i)\n", cmd_name, rcon_level.ival);
 			}
 			else if ((a->restriction?a->restriction:rcon_level.ival) > Cmd_ExecLevel)
-				Con_TPrintf(TL_RESTRICTCOMMANDTOOHIGH);
+				Con_TPrintf("You arn't allowed to alter a level above your own\n");
 			else
 				a->restriction = level;
 			return;
 		}
 	}
 
-	Con_TPrintf (TL_RESTRICTNOTDEFINED, cmd_name);
+	Con_TPrintf ("restrict: %s not defined\n", cmd_name);
 	return;
 }
 
@@ -1833,7 +1833,7 @@ void Cmd_List_f (void)
 		if ((cmd->restriction?cmd->restriction:rcon_level.ival) > Cmd_ExecLevel)
 			continue;
 		if (!num)
-			Con_TPrintf(TL_COMMANDLISTHEADER);
+			Con_TPrintf("Command list:\n");
 		Con_Printf("(%2i) %s\n", (int)(cmd->restriction?cmd->restriction:rcon_level.ival), cmd->name);
 		num++;
 	}
@@ -1858,7 +1858,7 @@ void Cmd_ForwardToServer (void)
 	if (cls.state == ca_disconnected)
 	{
 		if (cl_warncmd.ival)
-			Con_TPrintf (TL_CANTXNOTCONNECTED, Cmd_Argv(0));
+			Con_TPrintf ("Can't \"%s\", not connected\n", Cmd_Argv(0));
 		return;
 	}
 
@@ -1895,7 +1895,7 @@ void Cmd_ForwardToServer_f (void)
 {
 	if (cls.state == ca_disconnected)
 	{
-		Con_TPrintf (TL_CANTXNOTCONNECTED, Cmd_Argv(0));
+		Con_TPrintf ("Can't \"%s\", not connected\n", Cmd_Argv(0));
 		return;
 	}
 
@@ -1969,7 +1969,7 @@ void	Cmd_ExecuteString (char *text, int level)
 				break;	//yes, I know we found it... (but it's the wrong case, go for an alias or cvar instead FIRST)
 
 			if ((cmd->restriction?cmd->restriction:rcon_level.ival) > level)
-				Con_TPrintf(TL_WASRESTIRCTED, cmd_argv[0]);
+				Con_TPrintf("%s was restricted.\n", cmd_argv[0]);
 			else if (!cmd->function)
 			{
 #ifdef VM_CG
@@ -2010,7 +2010,7 @@ void	Cmd_ExecuteString (char *text, int level)
 
 			if ((a->restriction?a->restriction:rcon_level.ival) > level)
 			{
-				Con_TPrintf(TL_WASRESTIRCTED, cmd_argv[0]);
+				Con_TPrintf("%s was restricted.\n", cmd_argv[0]);
 				return;
 			}
 			if (a->execlevel)
@@ -2045,7 +2045,7 @@ void	Cmd_ExecuteString (char *text, int level)
 	if (cmd)	//go for skipped ones
 	{
 		if ((cmd->restriction?cmd->restriction:rcon_level.ival) > level)
-			Con_TPrintf(TL_WASRESTIRCTED, cmd_argv[0]);
+			Con_TPrintf("%s was restricted.\n", cmd_argv[0]);
 		else if (!cmd->function)
 			Cmd_ForwardToServer ();
 		else
@@ -2094,7 +2094,7 @@ void	Cmd_ExecuteString (char *text, int level)
 	}
 #endif
 	if (cl_warncmd.value || developer.value)
-		Con_TPrintf (TL_COMMANDNOTDEFINED, Cmd_Argv(0));
+		Con_TPrintf ("Unknown command \"%s\"\n", Cmd_Argv(0));
 }
 
 
@@ -2532,7 +2532,7 @@ void Cmd_if_f(void)
 
 	if (Cmd_Argc()==1)
 	{
-		Con_TPrintf(TL_IFSYNTAX);
+		Con_TPrintf("if <condition> <statement> [elseif <condition> <statement>] [...] [else <statement>]\n");
 		return;
 	}
 
@@ -2544,7 +2544,7 @@ elseif:
 	for(ret = If_Token(text, (const char **)&end); *ret; ret++) {if (*ret != '0' && *ret != '.')break;}
 	if (!end)
 	{
-		Con_TPrintf(TL_IFSYNTAXERROR);
+		Con_TPrintf("Not terminated\n");
 		If_Token_Clear(ts);
 		return;
 	}
@@ -2668,7 +2668,7 @@ void Cmd_set_f(void)
 
 	if (Cmd_Argc()<3)
 	{
-		Con_TPrintf(TL_SETSYNTAX);
+		Con_TPrintf("set <var> <equation>\n");
 		return;
 	}
 
diff --git a/engine/common/common.c b/engine/common/common.c
index ce600e486..973e3ed1b 100644
--- a/engine/common/common.c
+++ b/engine/common/common.c
@@ -2062,7 +2062,7 @@ unsigned int utf8_decode(int *error, const void *in, char **out)
 			if (*error == 4)
 			{
 				*out = lowend;
-				uc = (((uc&0x3ff) << 10) || (lowsur&0x3ff)) + 0x10000;
+				uc = (((uc&0x3ffu) << 10) || (lowsur&0x3ffu)) + 0x10000;
 				*error = false;
 			}
 			else
@@ -2075,7 +2075,7 @@ unsigned int utf8_decode(int *error, const void *in, char **out)
 			*error = 4;	//bad - tail surrogate
 
 		//these are meant to be illegal too
-		if (uc == 0xfffeu || uc == 0xffffu || uc > 0x10ffff)
+		if (uc == 0xfffeu || uc == 0xffffu || uc > 0x10ffffu)
 			*error = 2;	//illegal code
 	}
 
@@ -3871,7 +3871,7 @@ void COM_CheckRegistered (void)
 		registered.defaultstr = newdef;
 		Cvar_ForceSet(&registered, newdef);
 		if (static_registered)
-			Con_TPrintf (TL_REGISTEREDVERSION);
+			Con_TPrintf ("Playing registered version.\n");
 	}
 }
 
@@ -3984,7 +3984,7 @@ void COM_Version_f (void)
 {
 	Con_Printf("%s\n", version_string());
 
-	Con_TPrintf (TL_EXEDATETIME, __DATE__, __TIME__);
+	Con_TPrintf ("Exe: %s %s\n", __DATE__, __TIME__);
 
 #ifdef SVNREVISION
 	if (strcmp(STRINGIFY(SVNREVISION), "-"))
@@ -4278,7 +4278,7 @@ varargs versions of all text functions.
 FIXME: make this buffer size safe someday
 ============
 */
-char	*VARGS va(char *format, ...)
+char	*VARGS va(const char *format, ...)
 {
 #define VA_BUFFERS 2 //power of two
 	va_list		argptr;
diff --git a/engine/common/common.h b/engine/common/common.h
index 02a1d4daf..f48866357 100644
--- a/engine/common/common.h
+++ b/engine/common/common.h
@@ -321,7 +321,7 @@ void COM_DefaultExtension (char *path, char *extension, int maxlen);
 char *COM_FileExtension (const char *in);
 void COM_CleanUpPath(char *str);
 
-char	*VARGS va(char *format, ...) LIKEPRINTF(1);
+char	*VARGS va(const char *format, ...) LIKEPRINTF(1);
 // does a varargs printf into a temp buffer
 
 //============================================================================
diff --git a/engine/common/cvar.c b/engine/common/cvar.c
index e874e65c5..e35259162 100644
--- a/engine/common/cvar.c
+++ b/engine/common/cvar.c
@@ -345,7 +345,7 @@ void Cvar_List_f (void)
 
 			// print cvar list header
 			if (!(listflags & CLF_RAW) && !num)
-				Con_TPrintf(TL_CVARLISTHEADER);
+				Con_TPrintf("CVar list:\n");
 
 			// print group header
 			if (!(listflags & CLF_RAW) && !gnum)
diff --git a/engine/common/fs.c b/engine/common/fs.c
index b7c4d46d5..303f0a2e7 100644
--- a/engine/common/fs.c
+++ b/engine/common/fs.c
@@ -484,7 +484,7 @@ void COM_Path_f (void)
 {
 	searchpath_t	*s;
 
-	Con_TPrintf (TL_CURRENTSEARCHPATH);
+	Con_TPrintf ("Current search path:\n");
 
 	if (com_purepaths || fs_puremode)
 	{
@@ -1259,6 +1259,11 @@ vfsfile_t *FS_OpenVFS(const char *filename, const char *mode, enum fs_relative r
 	case FS_SKINS:	//load from paks in preference to system paths. overwriting be damned.
 		FS_NativePath(filename, relativeto, fullname, sizeof(fullname));
 		break;
+	case FS_BINARYPATH:
+		if (*mode == 'w')
+			COM_CreatePath(fullname);
+		FS_NativePath(filename, relativeto, fullname, sizeof(fullname));
+		return VFSOS_Open(fullname, mode);
 	case FS_ROOT:	//always bypass packs and gamedirs
 		if (*com_homedir)
 		{
@@ -1966,6 +1971,15 @@ void COM_Gamedir (const char *dir)
 	if (!fs_manifest)
 		FS_ChangeGame(NULL, true);
 
+	//don't allow leading dots, hidden files are evil.
+	//don't allow complex paths. those are evil too.
+	if (!*dir || *dir == '.' || !strcmp(dir, ".") || strstr(dir, "..") || strstr(dir, "/")
+		|| strstr(dir, "\\") || strstr(dir, ":") )
+	{
+		Con_Printf ("Gamedir should be a single filename, not a path\n");
+		return;
+	}
+
 	man = FS_Manifest_Clone(fs_manifest);
 	FS_Manifest_PurgeGamedirs(man);
 	if (*dir)
@@ -2342,10 +2356,20 @@ void FS_ReloadPackFilesFlags(unsigned int reloadflags)
 
 	for (i = 0; i < sizeof(fs_manifest->gamepath) / sizeof(fs_manifest->gamepath[0]); i++)
 	{
-		if (fs_manifest->gamepath[i].path && fs_manifest->gamepath[i].base)
+		char *dir = fs_manifest->gamepath[i].path;
+		if (dir && fs_manifest->gamepath[i].base)
 		{
+			//don't allow leading dots, hidden files are evil.
+			//don't allow complex paths. those are evil too.
+			if (!*dir || *dir == '.' || !strcmp(dir, ".") || strstr(dir, "..") || strstr(dir, "/")
+				|| strstr(dir, "\\") || strstr(dir, ":") )
+			{
+				Con_Printf ("Gamedir should be a single filename, not a path\n");
+				continue;
+			}
+
 			//paths with '*' actually result in loading packages without an actual gamedir. note that this does not imply that we can write anything.
-			if (*fs_manifest->gamepath[i].path == '*')
+			if (*dir == '*')
 			{
 				int j;
 				searchpathfuncs_t *handle = VFSOS_OpenPath(NULL, com_quakedir);
@@ -2369,25 +2393,35 @@ void FS_ReloadPackFilesFlags(unsigned int reloadflags)
 			}
 			else
 			{
-				FS_AddGameDirectory(&oldpaths, fs_manifest->gamepath[i].path, va("%s%s", com_quakedir, fs_manifest->gamepath[i].path), reloadflags);
+				FS_AddGameDirectory(&oldpaths, dir, va("%s%s", com_quakedir, dir), reloadflags);
 				if (*com_homedir)
-					FS_AddGameDirectory(&oldpaths, fs_manifest->gamepath[i].path, va("%s%s", com_homedir, fs_manifest->gamepath[i].path), reloadflags);
+					FS_AddGameDirectory(&oldpaths, dir, va("%s%s", com_homedir, dir), reloadflags);
 			}
 		}
 	}
 	com_base_searchpaths = com_searchpaths;
 	for (i = 0; i < sizeof(fs_manifest->gamepath) / sizeof(fs_manifest->gamepath[0]); i++)
 	{
-		if (fs_manifest->gamepath[i].path && !fs_manifest->gamepath[i].base)
+		char *dir = fs_manifest->gamepath[i].path;
+		if (dir && !fs_manifest->gamepath[i].base)
 		{
-			if (*fs_manifest->gamepath[i].path == '*')
+			//don't allow leading dots, hidden files are evil.
+			//don't allow complex paths. those are evil too.
+			if (!*dir || *dir == '.' || !strcmp(dir, ".") || strstr(dir, "..") || strstr(dir, "/")
+				|| strstr(dir, "\\") || strstr(dir, ":") )
+			{
+				Con_Printf ("Gamedir should be a single filename, not a path\n");
+				continue;
+			}
+
+			if (*dir == '*')
 			{
 			}
 			else
 			{
-				FS_AddGameDirectory(&oldpaths, fs_manifest->gamepath[i].path, va("%s%s", com_quakedir, fs_manifest->gamepath[i].path), reloadflags);
+				FS_AddGameDirectory(&oldpaths, dir, va("%s%s", com_quakedir, dir), reloadflags);
 				if (*com_homedir)
-					FS_AddGameDirectory(&oldpaths, fs_manifest->gamepath[i].path, va("%s%s", com_homedir, fs_manifest->gamepath[i].path), reloadflags);
+					FS_AddGameDirectory(&oldpaths, dir, va("%s%s", com_homedir, dir), reloadflags);
 			}
 		}
 	}
@@ -3652,7 +3686,7 @@ void COM_InitFilesystem (void)
 		*com_homedir = '\0';
 
 	if (*com_homedir)
-		Con_Printf("Using home directory \"%s\"\n", com_homedir);
+		Con_TPrintf("Using home directory \"%s\"\n", com_homedir);
 
 #ifdef PLUGINS
 	Plug_Initialise(false);
diff --git a/engine/common/fs_pak.c b/engine/common/fs_pak.c
index 08670b93f..a415a1950 100644
--- a/engine/common/fs_pak.c
+++ b/engine/common/fs_pak.c
@@ -372,7 +372,7 @@ searchpathfuncs_t *QDECL FSPAK_LoadArchive (vfsfile_t *file, const char *desc)
 
 	pack->references++;
 
-	Con_TPrintf (TL_ADDEDPACKFILE, desc, numpackfiles);
+	Con_TPrintf ("Added packfile %s (%i files)\n", desc, numpackfiles);
 
 	pack->pub.fsver			= FSVER;
 	pack->pub.GetPathDetails = FSPAK_GetPathDetails;
@@ -555,7 +555,7 @@ newsection:
 
 	pack->references++;
 
-	Con_TPrintf (TL_ADDEDPACKFILE, desc, numpackfiles);
+	Con_TPrintf ("Added packfile %s (%i files)\n", desc, numpackfiles);
 
 	pack->pub.fsver			= FSVER;
 	pack->pub.GetPathDetails = FSPAK_GetPathDetails;
diff --git a/engine/common/fs_win32.c b/engine/common/fs_win32.c
index 5f2487df4..fb13b0565 100644
--- a/engine/common/fs_win32.c
+++ b/engine/common/fs_win32.c
@@ -41,7 +41,7 @@ wchar_t *widen(wchar_t *out, size_t outlen, const char *utf8)
 	while (*utf8)
 	{
 		codepoint = utf8_decode(&error, utf8, (void*)&utf8);
-		if (error)
+		if (error || codepoint > 0x10FFFFu)
 			codepoint = 0xFFFDu;
 		if (codepoint > 0xffff)
 		{
diff --git a/engine/common/fs_zip.c b/engine/common/fs_zip.c
index 89e932115..147d9b677 100644
--- a/engine/common/fs_zip.c
+++ b/engine/common/fs_zip.c
@@ -677,7 +677,7 @@ searchpathfuncs_t *QDECL FSZIP_LoadArchive (vfsfile_t *packhandle, const char *d
 	if (!zip->handle)
 	{
 		Z_Free(zip);
-		Con_TPrintf (TL_COULDNTOPENZIP, desc);
+		Con_TPrintf ("Failed opening zipfile \"%s\" corrupt?\n", desc);
 		return NULL;
 	}
 
@@ -707,7 +707,7 @@ searchpathfuncs_t *QDECL FSZIP_LoadArchive (vfsfile_t *packhandle, const char *d
 	zip->references = 1;
 	zip->currentfile = NULL;
 
-	Con_TPrintf (TL_ADDEDZIPFILE, desc, zip->numfiles);
+	Con_TPrintf ("Added zipfile %s (%i files)\n", desc, zip->numfiles);
 
 	zip->pub.fsver				= FSVER;
 	zip->pub.GetPathDetails		= FSZIP_GetPathDetails;
diff --git a/engine/common/log.c b/engine/common/log.c
index d866bdbac..ad24b9ef9 100644
--- a/engine/common/log.c
+++ b/engine/common/log.c
@@ -278,7 +278,7 @@ void SV_Fraglogfile_f (void)
 
 	if (sv_fraglogfile)
 	{
-		Con_TPrintf (STL_FLOGGINGOFF);
+		Con_TPrintf ("Frag file logging off.\n");
 		VFS_CLOSE (sv_fraglogfile);
 		sv_fraglogfile = NULL;
 		return;
@@ -300,12 +300,12 @@ void SV_Fraglogfile_f (void)
 	}
 	if (i==1000)
 	{
-		Con_TPrintf (STL_FLOGGINGFAILED);
+		Con_TPrintf ("Can't open any logfiles.\n");
 		sv_fraglogfile = NULL;
 		return;
 	}
 
-	Con_TPrintf (STL_FLOGGINGTO, name);
+	Con_TPrintf ("Logging frags to %s.\n", name);
 }
 */
 
diff --git a/engine/common/net_chan.c b/engine/common/net_chan.c
index d41fc6167..25c1ae9aa 100644
--- a/engine/common/net_chan.c
+++ b/engine/common/net_chan.c
@@ -302,7 +302,7 @@ void VARGS Netchan_OutOfBandTPrintf (netsrc_t sock, netadr_t *adr, int language,
 	va_list		argptr;
 	static char		string[8192];		// ??? why static?
 
-	char *format = langtext(text, language);
+	const char *format = langtext(text, language);
 
 	string[0] = A2C_PRINT;
 	
@@ -636,7 +636,7 @@ int Netchan_Transmit (netchan_t *chan, int length, qbyte *data, int rate)
 	if (chan->message.overflowed)
 	{
 		chan->fatal_error = true;
-		Con_TPrintf (TL_OUTMESSAGEOVERFLOW
+		Con_TPrintf ("%s:Outgoing message overflow\n"
 			, NET_AdrToString (remote_adr, sizeof(remote_adr), &chan->remote_address));
 		return 0;
 	}
@@ -866,7 +866,7 @@ qboolean Netchan_Process (netchan_t *chan)
 	if (sequence <= (unsigned)chan->incoming_sequence)
 	{
 		if (showdrop.value)
-			Con_TPrintf (TL_OUTOFORDERPACKET
+			Con_TPrintf ("%s:Out of order packet %i at %i\n"
 				, NET_AdrToString (adr, sizeof(adr), &chan->remote_address)
 				,  sequence
 				, chan->incoming_sequence);
@@ -944,7 +944,7 @@ qboolean Netchan_Process (netchan_t *chan)
 		chan->drop_count += 1;
 
 		if (showdrop.value)
-			Con_TPrintf (TL_DROPPEDPACKETCOUNT
+			Con_TPrintf ("%s:Dropped %i packets at %i\n"
 			, NET_AdrToString (adr, sizeof(adr), &chan->remote_address)
 			, sequence-(chan->incoming_sequence+1)
 			, sequence);
diff --git a/engine/common/net_wins.c b/engine/common/net_wins.c
index a86161c2f..87d4493d3 100644
--- a/engine/common/net_wins.c
+++ b/engine/common/net_wins.c
@@ -2283,13 +2283,13 @@ qboolean FTENET_Generic_GetPacket(ftenet_generic_connection_t *con)
 		if (err == EMSGSIZE)
 		{
 			SockadrToNetadr (&from, &net_from);
-			Con_TPrintf (TL_OVERSIZEPACKETFROM,
+			Con_TPrintf ("Warning:  Oversize packet from %s\n",
 				NET_AdrToString (adr, sizeof(adr), &net_from));
 			return false;
 		}
 		if (err == ECONNABORTED || err == ECONNRESET)
 		{
-			Con_TPrintf (TL_CONNECTIONLOSTORABORTED);	//server died/connection lost.
+			Con_TPrintf ("Connection lost or aborted\n");	//server died/connection lost.
 #ifndef SERVERONLY
 			if (cls.state != ca_disconnected && !con->islisten)
 			{
@@ -2314,7 +2314,7 @@ qboolean FTENET_Generic_GetPacket(ftenet_generic_connection_t *con)
 	net_message.cursize = ret;
 	if (net_message.cursize == sizeof(net_message_buffer) )
 	{
-		Con_TPrintf (TL_OVERSIZEPACKETFROM, NET_AdrToString (adr, sizeof(adr), &net_from));
+		Con_TPrintf ("Warning:  Oversize packet from %s\n", NET_AdrToString (adr, sizeof(adr), &net_from));
 		return false;
 	}
 
@@ -2399,7 +2399,7 @@ qboolean FTENET_Generic_SendPacket(ftenet_generic_connection_t *con, int length,
 			Con_DPrintf("NET_SendPacket Warning: %i\n", ecode);
 		else
 #endif
-			Con_TPrintf (TL_NETSENDERROR, ecode);
+			Con_TPrintf ("NET_SendPacket ERROR: %i\n", ecode);
 	}
 	return true;
 #endif
@@ -2714,7 +2714,7 @@ qboolean FTENET_TCPConnect_GetPacket(ftenet_generic_connection_t *gcon)
 			{
 				if (err == ECONNABORTED || err == ECONNRESET)
 				{
-					Con_TPrintf (TL_CONNECTIONLOSTORABORTED);	//server died/connection lost.
+					Con_TPrintf ("Connection lost or aborted\n");	//server died/connection lost.
 				}
 				else
 					Con_Printf ("TCPConnect_GetPacket: Error (%i): %s\n", err, strerror(err));
@@ -3021,7 +3021,7 @@ handshakeerror:
 			net_message.cursize = BigShort(*(short*)st->inbuffer);
 			if (net_message.cursize >= sizeof(net_message_buffer) )
 			{
-				Con_TPrintf (TL_OVERSIZEPACKETFROM, NET_AdrToString (adr, sizeof(adr), &st->remoteaddr));
+				Con_TPrintf ("Warning:  Oversize packet from %s\n", NET_AdrToString (adr, sizeof(adr), &st->remoteaddr));
 				goto closesvstream;
 			}
 			if (net_message.cursize+2 > st->inlen)
@@ -3175,7 +3175,7 @@ handshakeerror:
 					net_message.cursize = paylen;
 					if (net_message.cursize >= sizeof(net_message_buffer) )
 					{
-						Con_TPrintf (TL_OVERSIZEPACKETFROM, NET_AdrToString (adr, sizeof(adr), &net_from));
+						Con_TPrintf ("Warning:  Oversize packet from %s\n", NET_AdrToString (adr, sizeof(adr), &net_from));
 						goto closesvstream;
 					}
 					memcpy(net_message_buffer, st->inbuffer+payoffs, paylen);
@@ -3759,7 +3759,7 @@ qboolean FTENET_IRCConnect_GetPacket(ftenet_generic_connection_t *gcon)
 					net_message.cursize = 4 + endl - s;
 					if (net_message.cursize >= sizeof(net_message_buffer) )
 					{
-						Con_TPrintf (TL_OVERSIZEPACKETFROM, NET_AdrToString (adr, sizeof(adr), &net_from));
+						Con_TPrintf ("Warning:  Oversize packet from %s\n", NET_AdrToString (adr, sizeof(adr), &net_from));
 						break;
 					}
 
@@ -3886,7 +3886,7 @@ qboolean FTENET_IRCConnect_GetPacket(ftenet_generic_connection_t *gcon)
 						net_message.cursize = st->inlen;
 						if (net_message.cursize >= sizeof(net_message_buffer) )
 						{
-							Con_TPrintf (TL_OVERSIZEPACKETFROM, NET_AdrToString (adr, sizeof(adr), &net_from));
+							Con_TPrintf ("Warning:  Oversize packet from %s\n", NET_AdrToString (adr, sizeof(adr), &net_from));
 							break;
 						}
 
@@ -3918,7 +3918,7 @@ qboolean FTENET_IRCConnect_GetPacket(ftenet_generic_connection_t *gcon)
 			code = strtoul(s, (char **)&s, 10);
 			switch (code)
 			{
-			case 001:
+			case   1:
 				{
 					if (con->ircserver.address.irc.channel)
 					{
@@ -4363,7 +4363,7 @@ static qboolean FTENET_NaClWebSocket_GetPacket(ftenet_generic_connection_t *gcon
 		if (len)
 		{
 			char adr[64];
-			Con_TPrintf (TL_OVERSIZEPACKETFROM, NET_AdrToString (adr, sizeof(adr), &net_from));
+			Con_TPrintf ("Warning:  Oversize packet from %s\n", NET_AdrToString (adr, sizeof(adr), &net_from));
 			return false;
 		}
 		return true;
@@ -4703,7 +4703,7 @@ int maxport = port + 100;
 		if ((i = COM_CheckParm("-ip")) != 0 && i < com_argc)
 		{
 			((struct sockaddr_in*)&address)->sin_addr.s_addr = inet_addr(com_argv[i+1]);
-			Con_TPrintf(TL_NETBINDINTERFACE,
+			Con_TPrintf("Binding to IP Interface Address of %s\n",
 					inet_ntoa(address.sin_addr));
 		}
 		else
@@ -4784,7 +4784,7 @@ int maxport = port + 100;
 //ZOID -- check for interface binding option
 	if ((i = COM_CheckParm("-ip")) != 0 && i < com_argc) {
 		address.sin_addr.s_addr = inet_addr(com_argv[i+1]);
-		Con_TPrintf(TL_NETBINDINTERFACE,
+		Con_TPrintf("Binding to IP Interface Address of %s\n",
 				inet_ntoa(address.sin_addr));
 	} else
 		address.sin_addr.s_addr = INADDR_ANY;
@@ -4852,7 +4852,7 @@ int maxport = port + 100;
 //ZOID -- check for interface binding option
 //	if ((i = COM_CheckParm("-ip6")) != 0 && i < com_argc) {
 //		address.sin6_addr = inet_addr(com_argv[i+1]);
-///		Con_TPrintf(TL_NETBINDINTERFACE,
+///		Con_TPrintf("Binding to IP Interface Address of %s\n",
 //				inet_ntoa(address.sin6_addr));
 //	} else
 		memset(&address.sin6_addr, 0, sizeof(struct in6_addr));
@@ -5069,7 +5069,7 @@ void NET_GetLocalAddress (int socket, netadr_t *out)
 
 	if (!notvalid)
 	{
-		Con_TPrintf(TL_IPADDRESSIS, NET_AdrToString (adrbuf, sizeof(adrbuf), out) );
+		Con_TPrintf("IP address %s\n", NET_AdrToString (adrbuf, sizeof(adrbuf), out) );
 		return;
 	}
 	Con_Printf("Couldn't detect local ip\n");
@@ -5218,7 +5218,7 @@ void NET_InitClient(void)
 	net_message.maxsize = sizeof(net_message_buffer);
 	net_message.data = net_message_buffer;
 
-	Con_TPrintf(TL_CLIENTPORTINITED);
+	Con_TPrintf("Client port Initialized\n");
 }
 #endif
 
diff --git a/engine/common/plugin.c b/engine/common/plugin.c
index f2f021467..c7df92a70 100644
--- a/engine/common/plugin.c
+++ b/engine/common/plugin.c
@@ -252,7 +252,7 @@ plugin_t *Plug_Load(char *file, int type)
 	currentplug = newplug;
 	if (newplug->vm)
 	{
-		Con_Printf("Created plugin %s\n", file);
+		Con_TPrintf("Created plugin %s\n", file);
 
 		newplug->next = plugs;
 		plugs = newplug;
diff --git a/engine/common/pr_bgcmd.c b/engine/common/pr_bgcmd.c
index e2e818d14..7cdde0213 100644
--- a/engine/common/pr_bgcmd.c
+++ b/engine/common/pr_bgcmd.c
@@ -35,7 +35,6 @@ void PF_Common_RegisterCvars(void)
 	WPhys_Init();
 }
 
-char *Translate(char *message);
 char *PF_VarString (pubprogfuncs_t *prinst, int	first, struct globalvars_s *pr_globals)
 {
 #define VARSTRINGLEN 16384+8
@@ -55,7 +54,6 @@ char *PF_VarString (pubprogfuncs_t *prinst, int	first, struct globalvars_s *pr_g
 		s = PR_GetStringOfs(prinst, OFS_PARM0+i*3);
 		if (s)
 		{
-			s = Translate(s);
 			if (strlen(out)+strlen(s)+1 >= VARSTRINGLEN)
 				Con_DPrintf("VarString (builtin call ending with strings) exceeded maximum string length of %i chars", VARSTRINGLEN);
 
diff --git a/engine/common/tlout.h b/engine/common/tlout.h
deleted file mode 100644
index 45a3e5859..000000000
--- a/engine/common/tlout.h
+++ /dev/null
@@ -1,178 +0,0 @@
-"STL_LANGUAGENAME \"English\"\n"
-"STL_CLIENTCONNECTED \"client %s connected\\n\"\n"
-"STL_SPECTATORCONNECTED \"spectator %s connected\\n\"\n"
-"STL_RECORDEDCLIENTCONNECTED \"recorded client %s connected\\n\"\n"
-"STL_RECORDEDSPECTATORCONNECTED \"recorded spectator %s connected\\n\"\n"
-"STL_CLIENTWASBANNED \"%s was banned\\n\"\n"
-"STL_YOUWEREBANNED \"You were banned\\n\"\n"
-"STL_YOUAREBANNED \"You are still banned\\n\"\n"
-"STL_CLIENTTIMEDOUT \"Client %s timed out\\n\"\n"
-"STL_LOADZOMIBETIMEDOUT \"LoadZombie %s timed out\\n\"\n"
-"STL_CLIENTWASKICKED \"%s was kicked\\n\"\n"
-"STL_YOUWEREKICKED \"You were kicked\\n\"\n"
-"STL_YOUWEREKICKEDNAMESPAM \"You were kicked for name spamming\\n\"\n"
-"STL_CLIENTKICKEDNAMESPAM \"%s was kicked for name spamming\\n\"\n"
-"STL_GODON \"godmode ON\\n\"\n"
-"STL_GODOFF \"godmode OFF\\n\"\n"
-"STL_NOCLIPON \"noclip ON\\n\"\n"
-"STL_NOCLIPOFF \"noclip OFF\"\n"
-"STL_CLIENTISCUFFEDPERMANENTLY \"%s is still cuffed\\n\"\n"
-"STL_CLIENTISCUFFED \"%s is cuffed\\n\"\n"
-"STL_CLIENTISSTILLCUFFED \"%s is now cuffed permanently\\n\"\n"
-"STL_YOUWERECUFFED \"You were cuffed\\n\"\n"
-"STL_YOUARNTCUFFED \"You are no longer cuffed\\n\"\n"
-"STL_CLIENTISCRIPPLEDPERMANENTLY \"%s is now crippled permanently\\n\"\n"
-"STL_CLIENTISCRIPPLED \"%s is crippled\\n\"\n"
-"STL_CLIENTISSTILLCRIPPLED \"%s is still crippled\\n\"\n"
-"STL_YOUWERECLIPPLED \"You have been crippled\\n\"\n"
-"STL_YOUARNTCRIPPLED \"You are no longer crippled\\n\"\n"
-"STL_CLIENTISMUTEDPERMANENTLY \"%s was muted permanently\\n\"\n"
-"STL_CLIENTISMUTED \"%s was muted\\n\"\n"
-"STL_CLIENTISSTILLMUTED \"%s is muted (still)\\n\"\n"
-"STL_YOUAREMUTED \"%s is muted\\n\"\n"
-"STL_YOUARNTMUTED \"You are no longer muted\\n\"\n"
-"STL_NONAMEASMUTE \"Muted players may not change their names\\n\"\n"
-"STL_MUTEDVOTE \"Sorry, you cannot vote when muted as it may allow you to send a message.\\n\"\n"
-"STL_MUTEDCHAT \"You cannot chat while muted\\n\"\n"
-"STL_FLOODPROTACTIVE \"floodprot: You can't talk for %i seconds\\n\"\n"
-"STL_FLOODPROTTIME \"You can't talk for %i more seconds\\n\"\n"
-"STL_BUFFERPROTECTION \"buffer overflow protection: failiure\\n\"\n"
-"STL_FIRSTGREETING \"Welcome %s. Your time on this server is being logged and ranked\\n\"\n"
-"STL_SHORTGREETING \"Welcome back %s. You have previously spent %i mins connected\\n\"\n"
-"STL_BIGGREETING \"Welcome back %s. You have previously spent %i:%i hours connected\\n\"\n"
-"STL_POSSIBLEMODELCHEAT \"warning: %s eyes or player model does not match\\n\"\n"
-"STL_MAPCHEAT \"Map model file does not match (%s), %i != %i/%i.\\nYou may need a new version of the map, or the proper install files.\\n\"\n"
-"STL_INVALIDTRACKCLIENT \"invalid player to track\\n\"\n"
-"STL_BADNAME \"Can't change name - new is invalid\\n\"\n"
-"STL_CLIENTNAMECHANGE \"%s changed their name to %s\\n\"\n"
-"STL_SERVERPAUSED \"server is paused\\n\"\n"
-"STL_UPLOADDENIED \"Upload denied\\n\"\n"
-"STL_NAMEDCLIENTDOESNTEXIST \"client does not exist\\n\"\n"
-"STL_NOSUICIDEWHENDEAD \"Can't suicide -- Already dead\\n\"\n"
-"STL_CANTPAUSE \"Can't pause. Not allowed\\n\"\n"
-"STL_CANTPAUSESPEC \"Spectators may not pause the game\\n\"\n"
-"STL_CLIENTPAUSED \"%s paused the game\\n\"\n"
-"STL_CLIENTUNPAUSED \"%s unpaused the game\\n\"\n"
-"STL_CLIENTLESSUNPAUSE \"pause released due to empty server\\n\"\n"
-"STL_CURRENTRATE \"current rate is %i\\n\"\n"
-"STL_RATESETTO \"rate is changed to %i\\n\"\n"
-"STL_CURRENTMSGLEVEL \"current msg level is %i\\n\"\n"
-"STL_MSGLEVELSET \"new msg level set to %i\\n\"\n"
-"STL_GAMESAVED \"Server has saved the game\\n\"\n"
-"STL_CLIENTDROPPED \"%s dropped\\n\"\n"
-"STL_SNAPREFUSED \"%s refused remote screenshot\\n\"\n"
-"STL_FINALVOTE \"%s casts final vote for '%s'\\n\"\n"
-"STL_VOTE \"%s casts a vote for '%s'\\n\"\n"
-"STL_SPEEDCHEATKICKED \"%s was kicked for speedcheating (%s)\\n\"\n"
-"STL_SPEEDCHEATPOSSIBLE \"Speed cheat possibility, analyzing:\\n  %d %.1f %d for: %s\\n\"\n"
-"STL_INITED \"======== %s Initialized ========\\n\"\n"
-"STL_BACKBUFSET \"WARNING %s: [SV_New] Back buffered (%d0, clearing)\\n\"\n"
-"STL_MESSAGEOVERFLOW \"WARNING: backbuf [%d] reliable overflow for %s\\n\"\n"
-"STL_BUILDINGPHS \"Building PHS...\\n\"\n"
-"STL_PHSINFO \"Average leafs visible / hearable / total: %i / %i / %i\\n\"\n"
-"STL_BREAKSTATEMENT \"Break Statement\\n\"\n"
-"STL_BADSPRINT \"tried to sprint to a non-client\\n\"\n"
-"STL_NOPRECACHE \"no precache: %s\\n\"\n"
-"STL_CANTFREEWORLD \"cannot free world entity\\n\"\n"
-"STL_CANTFREEPLAYERS \"cannot free player entities\\n\"\n"
-"STL_COMPILEROVER \"Compile took %f secs\\n\"\n"
-"STL_EDICTWASFREE \"%s edict was free\\n\"\n"
-"STL_NOFREEEDICTS \"WARNING: no free edicts\\n\"\n"
-"STL_NEEDCHEATPARM \"You must run the server with -cheats to enable this command.\\n\"\n"
-"STL_USERDOESNTEXIST \"Couldn't find user number %s\\n\"\n"
-"STL_MAPCOMMANDUSAGE \"map <levelname> : continue game on a new level\\n\"\n"
-"STL_NOVOTING \"Voting was dissallowed\\n\"\n"
-"STL_BADVOTE \"You arn't allowed to vote for that\\n\"\n"
-"STL_VOTESREMOVED \"All votes removed.\\n\"\n"
-"STL_OLDVOTEREMOVED \"Old vote removed.\\n\"\n"
-"TL_EXECING \"execing %s\\n\"\n"
-"TL_EXECCOMMANDUSAGE \"exec <filename> : execute a script file\\n\"\n"
-"TL_EXECFAILED \"couldn't exec %s\\n\"\n"
-"TL_FUNCOVERFLOW \"%s: overflow\\n\"\n"
-"TL_CURRENTALIASCOMMANDS \"Current alias commands:\\n\"\n"
-"TL_ALIASNAMETOOLONG \"Alias name is too long\\n\"\n"
-"TL_ALIASRESTRICTIONLEVELERROR \"Alias is already bound with a higher restriction\\n\"\n"
-"TL_ALIASLEVELCOMMANDUSAGE \"aliaslevel <var> [execlevel]\\n\"\n"
-"TL_ALIASNOTFOUND \"Alias not found\\n\"\n"
-"TL_ALIASRAISELEVELERROR \"You arn't allowed to raise a command above your own level\\n\"\n"
-"TL_ALIASRESTRICTIONLEVELWARN \"WARNING: %s is available to all clients, any client will be able to use it at the new level.\\n\"\n"
-"TL_ALIASRESTRICTLEVEL \"alias %s is set to run at the user level of %i\\n\"\n"
-"TL_ALIASLIST \"Alias list:\\n\"\n"
-"TL_COMMANDLISTHEADER \"Command list:\\n\"\n"
-"TL_CVARLISTHEADER \"CVar list:\\n\"\n"
-"TL_RESTRICTCOMMANDRAISE \"You arn't allowed to raise a command above your own level\\n\"\n"
-"TL_RESTRICTCOMMANDTOOHIGH \"You arn't allowed to alter a level above your own\\n\"\n"
-"TL_RESTRICTCURRENTLEVEL \"%s is restricted to %i\\n\"\n"
-"TL_RESTRICTCURRENTLEVELDEFAULT \"%s is restricted to rcon_level (%i)\\n\"\n"
-"TL_RESTRICTNOTDEFINED \"restrict: %s not defined\\n\"\n"
-"TL_WASRESTIRCTED \"%s was restricted.\\n\"\n"
-"TL_COMMANDNOTDEFINED \"Unknown command \\\"%s\\\"\\n\"\n"
-"TL_IFSYNTAX \"if <condition> <statement> [elseif <condition> <statement>] [...] [else <statement>]\\n\"\n"
-"TL_IFSYNTAXERROR \"Not terminated\\n\"\n"
-"TL_SETSYNTAX \"set <var> <equation>\\n\"\n"
-"TL_CANTXNOTCONNECTED \"Can't \\\"%s\\\", not connected\\n\"\n"
-"TL_SHAREWAREVERSION \"Playing shareware version.\\n\"\n"
-"TL_REGISTEREDVERSION \"Playing registered version.\\n\"\n"
-"TL_CURRENTSEARCHPATH \"Current search path:\\n\"\n"
-"TL_SERACHPATHISPACK \"%s (%i files)\\n\"\n"
-"TL_SERACHPATHISZIP \"%s (%i files)\\n\"\n"
-"TL_COMPRESSEDFILEOPENFAILED \"Tried opening a handle to a compressed stream - %s\\n\"\n"
-"TL_ADDEDPACKFILE \"Added packfile %s (%i files)\\n\"\n"
-"TL_COULDNTOPENZIP \"Failed opening zipfile \\\"%s\\\" corrupt?\\n\"\n"
-"TL_ADDEDZIPFILE \"Added zipfile %s (%i files)\\n\"\n"
-"TL_GAMEDIRAINTPATH \"Gamedir should be a single filename, not a path\\n\"\n"
-"TL_KEYHASSLASH \"Can't use a key with a \\\\\\n\"\n"
-"TL_KEYHASQUOTE \"Can't use a key with a \\\"\\n\"\n"
-"TL_KEYTOOLONG \"Keys and values must be < 64 characters.\\n\"\n"
-"TL_INFOSTRINGTOOLONG \"Info string length exceeded\\n\"\n"
-"TL_STARKEYPROTECTED \"Can't set * keys\\n\"\n"
-"TL_KEYHASNOVALUE \"MISSING VALUE\\n\"\n"
-"TL_OVERSIZEPACKETFROM \"Warning:  Oversize packet from %s\\n\"\n"
-"TL_CONNECTIONLOSTORABORTED \"Connection lost or aborted\\n\"\n"
-"TL_NETGETPACKETERROR \"NET_GetPacket: %s\\n\"\n"
-"TL_NETSENDERROR \"NET_SendPacket ERROR: %i\\n\"\n"
-"TL_NETBINDINTERFACE \"Binding to IP Interface Address of %s\\n\"\n"
-"TL_IPADDRESSIS \"IP address %s\\n\"\n"
-"TL_UDPINITED \"UDP Initialized\\n\"\n"
-"TL_CLIENTPORTINITED \"Client port Initialized\\n\"\n"
-"TL_OUTMESSAGEOVERFLOW \"%s:Outgoing message overflow\\n\"\n"
-"TL_OUTOFORDERPACKET \"%s:Out of order packet %i at %i\\n\"\n"
-"TL_DROPPEDPACKETCOUNT \"%s:Dropped %i packets at %i\\n\"\n"
-"STL_SERVERUNSPAWNED \"Server ended\\n\"\n"
-"STL_SERVERSPAWNED \"Server spawned.\\n\"\n"
-"TL_EXEDATETIME \"Exe: %s %s\\n\"\n"
-"TL_HEAPSIZE \"%4.1f megabyte heap\\n\"\n"
-"TL_VERSION \"\\nBuild %i\\n\\n\"\n"
-"STL_SAVESYNTAX \"save <savename> : save a game\\n\"\n"
-"STL_NORELATIVEPATHS \"Relative pathnames are not allowed.\\n\"\n"
-"STL_SAVEGAMETO \"Saving game to %s...\\n\"\n"
-"STL_ERRORCOULDNTOPEN \"ERROR: couldn't open.\\n\"\n"
-"STL_SAVEDONE \"done.\\n\"\n"
-"STL_LOADSYNTAX \"load <savename> : load a game\\n\"\n"
-"STL_LOADGAMEFROM \"Loading game from %s...\\n\"\n"
-"STL_BADSAVEVERSION \"Savegame is version %i, not %i\\n\"\n"
-"STL_LOADFAILED \"Couldn't load map\\n\"\n"
-"STL_NOMATERMODE \"Setting nomaster mode.\\n\"\n"
-"STL_MASTERAT \"Master server at %s\\n\"\n"
-"STL_SENDINGPING \"Sending a ping.\\n\"\n"
-"STL_SHUTTINGDOWN \"Shutting down.\\n\"\n"
-"STL_LOGGINGOFF \"File logging off.\\n\"\n"
-"STL_LOGGINGTO \"Logging text to %s.\\n\"\n"
-"STL_FLOGGINGOFF \"Frag file logging off.\\n\"\n"
-"STL_FLOGGINGFAILED \"Can't open any logfiles.\\n\"\n"
-"STL_FLOGGINGTO \"Logging frags to %s.\\n\"\n"
-"STL_USERIDNOTONSERVER \"Userid %i is not on the server\\n\"\n"
-"STL_CANTFINDMAP \"Can't find %s\\n\"\n"
-"STL_SERVERINFOSETTINGS \"Server info settings:\\n\"\n"
-"STL_SERVERINFOSYNTAX \"usage: serverinfo [ <key> <value> ]\\n\"\n"
-"STL_LOCALINFOSETTINGS \"Local info settings:\\n\"\n"
-"STL_LOCALINFOSYNTAX \"usage: localinfo [ <key> <value> ]\\n\"\n"
-"STL_USERINFOSYNTAX \"Usage: info <userid>\\n\"\n"
-"STL_NONEGATIVEVALUES \"All values must be positive numbers\\n\"\n"
-"STL_CURRENTGAMEDIR \"Current gamedir: %s\\n\"\n"
-"STL_SVGAMEDIRUSAGE \"Usage: sv_gamedir <newgamedir>\\n\"\n"
-"STL_GAMEDIRCANTBEPATH \"*Gamedir should be a single filename, not a path\\n\"\n"
-"STL_GAMEDIRUSAGE \"Usage: gamedir <newgamedir>\\n\"\n"
-"STL_SNAPTOOMANYFILES \"Snap: Couldn't create a file, clean some out.\\n\"\n"
-"STL_SNAPREQUEST \"Requesting snap from user %d...\\n\"\n"
-"STL_SNAPUSAGE \"Usage:  snap <userid>\\n\"\n"
diff --git a/engine/common/translate.c b/engine/common/translate.c
index 943939c1d..7f8b2e65d 100644
--- a/engine/common/translate.c
+++ b/engine/common/translate.c
@@ -1,257 +1,5 @@
 #include "quakedef.h"
 
-static char *defaultlanguagetext =
-"STL_LANGUAGENAME \"English\"\n"
-"TL_STNL \"%s\\n\"\n"
-"STL_CLIENTCONNECTED \"client %s connected\\n\"\n"
-"STL_SPECTATORCONNECTED \"spectator %s connected\\n\"\n"
-"STL_RECORDEDCLIENTCONNECTED \"recorded client %s connected\\n\"\n"
-"STL_RECORDEDSPECTATORCONNECTED \"recorded spectator %s connected\\n\"\n"
-"STL_CLIENTWASBANNED \"%s was banned\\n\"\n"
-"STL_YOUWEREBANNED \"You were banned\\n\"\n"
-"STL_YOUAREBANNED \"You are still banned\\n\"\n"
-"STL_CLIENTTIMEDOUT \"Client %s timed out\\n\"\n"
-"STL_LOADZOMIBETIMEDOUT \"LoadZombie %s timed out\\n\"\n"
-"STL_CLIENTWASKICKED \"%s was kicked\\n\"\n"
-"STL_YOUWEREKICKED \"You were kicked\\n\"\n"
-"STL_YOUWEREKICKEDNAMESPAM \"You were kicked for name spamming\\n\"\n"
-"STL_CLIENTKICKEDNAMESPAM \"%s was kicked for name spamming\\n\"\n"
-"STL_GODON \"godmode ON\\n\"\n"
-"STL_GODOFF \"godmode OFF\\n\"\n"
-"STL_NOCLIPON \"noclip ON\\n\"\n"
-"STL_NOCLIPOFF \"noclip OFF\"\n"
-"STL_CLIENTISCUFFEDPERMANENTLY \"%s is still cuffed\\n\"\n"
-"STL_CLIENTISCUFFED \"%s is cuffed\\n\"\n"
-"STL_CLIENTISSTILLCUFFED \"%s is now cuffed permanently\\n\"\n"
-"STL_YOUWERECUFFED \"You were cuffed\\n\"\n"
-"STL_YOUARNTCUFFED \"You are no longer cuffed\\n\"\n"
-"STL_CLIENTISCRIPPLEDPERMANENTLY \"%s is now crippled permanently\\n\"\n"
-"STL_CLIENTISCRIPPLED \"%s is crippled\\n\"\n"
-"STL_CLIENTISSTILLCRIPPLED \"%s is still crippled\\n\"\n"
-"STL_YOUWERECLIPPLED \"You have been crippled\\n\"\n"
-"STL_YOUARNTCRIPPLED \"You are no longer crippled\\n\"\n"
-"STL_CLIENTISMUTEDPERMANENTLY \"%s was muted permanently\\n\"\n"
-"STL_CLIENTISMUTED \"%s was muted\\n\"\n"
-"STL_CLIENTISSTILLMUTED \"%s is muted (still)\\n\"\n"
-"STL_YOUAREMUTED \"%s is muted\\n\"\n"
-"STL_YOUARNTMUTED \"You are no longer muted\\n\"\n"
-"STL_NONAMEASMUTE \"Muted players may not change their names\\n\"\n"
-"STL_MUTEDVOTE \"Sorry, you cannot vote when muted as it may allow you to send a message.\\n\"\n"
-"STL_MUTEDCHAT \"You cannot chat while muted\\n\"\n"
-"STL_FLOODPROTACTIVE \"floodprot: You can't talk for %i seconds\\n\"\n"
-"STL_FLOODPROTTIME \"You can't talk for %i more seconds\\n\"\n"
-"STL_BUFFERPROTECTION \"buffer overflow protection: failiure\\n\"\n"
-"STL_FIRSTGREETING \"Welcome %s. Your time on this server is being logged and ranked\\n\"\n"
-"STL_SHORTGREETING \"Welcome back %s. You have previously spent %i mins connected\\n\"\n"
-"STL_BIGGREETING \"Welcome back %s. You have previously spent %i:%i hours connected\\n\"\n"
-"STL_POSSIBLEMODELCHEAT \"warning: %s eyes or player model does not match\\n\"\n"
-"STL_MAPCHEAT \"Map model file does not match (%s), %i != %i/%i.\\nYou may need a new version of the map, or the proper install files.\\n\"\n"
-"STL_INVALIDTRACKCLIENT \"invalid player to track\\n\"\n"
-"STL_BADNAME \"Can't change name - new is invalid\\n\"\n"
-"STL_CLIENTNAMECHANGE \"%s changed their name to %s\\n\"\n"
-"STL_SERVERPAUSED \"server is paused\\n\"\n"
-"STL_UPLOADDENIED \"Upload denied\\n\"\n"
-"STL_NAMEDCLIENTDOESNTEXIST \"client does not exist\\n\"\n"
-"STL_NOSUICIDEWHENDEAD \"Can't suicide -- Already dead\\n\"\n"
-"STL_CANTPAUSE \"Can't pause. Not allowed\\n\"\n"
-"STL_CANTPAUSESPEC \"Spectators may not pause the game\\n\"\n"
-"STL_CLIENTPAUSED \"%s paused the game\\n\"\n"
-"STL_CLIENTUNPAUSED \"%s unpaused the game\\n\"\n"
-"STL_CLIENTLESSUNPAUSE \"pause released due to empty server\\n\"\n"
-"STL_CURRENTRATE \"current rate is %i\\n\"\n"
-"STL_RATESETTO \"rate is changed to %i\\n\"\n"
-"STL_CURRENTMSGLEVEL \"current msg level is %i\\n\"\n"
-"STL_MSGLEVELSET \"new msg level set to %i\\n\"\n"
-"STL_GAMESAVED \"Server has saved the game\\n\"\n"
-"STL_CLIENTDROPPED \"%s dropped\\n\"\n"
-"STL_SNAPREFUSED \"%s refused remote screenshot\\n\"\n"
-"STL_FINALVOTE \"%s casts final vote for '%s'\\n\"\n"
-"STL_VOTE \"%s casts a vote for '%s'\\n\"\n"
-"STL_SPEEDCHEATKICKED \"%s was kicked for speedcheating (%s)\\n\"\n"
-"STL_SPEEDCHEATPOSSIBLE \"Speed cheat possibility, analyzing:\\n  %d %.1f %d for: %s\\n\"\n"
-"STL_INITED \"======== %s Initialized ========\\n\"\n"
-"STL_BACKBUFSET \"WARNING %s: [SV_New] Back buffered (%d0, clearing)\\n\"\n"
-"STL_MESSAGEOVERFLOW \"WARNING: backbuf [%d] reliable overflow for %s\\n\"\n"
-"STL_BUILDINGPHS \"Building PHS...\\n\"\n"
-"STL_PHSINFO \"Average leafs visible / hearable / total: %i / %i / %i\\n\"\n"
-"STL_BREAKSTATEMENT \"Break Statement\\n\"\n"
-"STL_BADSPRINT \"tried to sprint to a non-client\\n\"\n"
-"STL_NOPRECACHE \"no precache: %s\\n\"\n"
-"STL_CANTFREEWORLD \"cannot free world entity\\n\"\n"
-"STL_CANTFREEPLAYERS \"cannot free player entities\\n\"\n"
-"STL_COMPILEROVER \"Compile took %f secs\\n\"\n"
-"STL_EDICTWASFREE \"%s edict was free\\n\"\n"
-"STL_NOFREEEDICTS \"WARNING: no free edicts\\n\"\n"
-"STL_NEEDCHEATPARM \"You must run the server with -cheats to enable this command.\\n\"\n"
-"STL_USERDOESNTEXIST \"Couldn't find user number %s\\n\"\n"
-"STL_MAPCOMMANDUSAGE \"map <levelname> : continue game on a new level\\n\"\n"
-"STL_NOVOTING \"Voting was dissallowed\\n\"\n"
-"STL_BADVOTE \"You arn't allowed to vote for that\\n\"\n"
-"STL_VOTESREMOVED \"All votes removed.\\n\"\n"
-"STL_OLDVOTEREMOVED \"Old vote removed.\\n\"\n"
-"TL_EXECING \"execing %s\\n\"\n"
-"TL_EXECCOMMANDUSAGE \"exec <filename> : execute a script file\\n\"\n"
-"TL_EXECFAILED \"couldn't exec %s\\n\"\n"
-"TL_FUNCOVERFLOW \"%s: overflow\\n\"\n"
-"TL_CURRENTALIASCOMMANDS \"Current alias commands:\\n\"\n"
-"TL_ALIASNAMETOOLONG \"Alias name is too long\\n\"\n"
-"TL_ALIASRESTRICTIONLEVELERROR \"Alias is already bound with a higher restriction\\n\"\n"
-"TL_ALIASLEVELCOMMANDUSAGE \"aliaslevel <var> [execlevel]\\n\"\n"
-"TL_ALIASNOTFOUND \"Alias not found\\n\"\n"
-"TL_ALIASRAISELEVELERROR \"You arn't allowed to raise a command above your own level\\n\"\n"
-"TL_ALIASRESTRICTIONLEVELWARN \"WARNING: %s is available to all clients, any client will be able to use it at the new level.\\n\"\n"
-"TL_ALIASRESTRICTLEVEL \"alias %s is set to run at the user level of %i\\n\"\n"
-"TL_ALIASLIST \"Alias list:\\n\"\n"
-"TL_COMMANDLISTHEADER \"Command list:\\n\"\n"
-"TL_CVARLISTHEADER \"CVar list:\\n\"\n"
-"TL_RESTRICTCOMMANDRAISE \"You arn't allowed to raise a command above your own level\\n\"\n"
-"TL_RESTRICTCOMMANDTOOHIGH \"You arn't allowed to alter a level above your own\\n\"\n"
-"TL_RESTRICTCURRENTLEVEL \"%s is restricted to %i\\n\"\n"
-"TL_RESTRICTCURRENTLEVELDEFAULT \"%s is restricted to rcon_level (%i)\\n\"\n"
-"TL_RESTRICTNOTDEFINED \"restrict: %s not defined\\n\"\n"
-"TL_WASRESTIRCTED \"%s was restricted.\\n\"\n"
-"TL_COMMANDNOTDEFINED \"Unknown command \\\"%s\\\"\\n\"\n"
-"TL_IFSYNTAX \"if <condition> <statement> [elseif <condition> <statement>] [...] [else <statement>]\\n\"\n"
-"TL_IFSYNTAXERROR \"Not terminated\\n\"\n"
-"TL_SETSYNTAX \"set <var> <equation>\\n\"\n"
-"TL_CANTXNOTCONNECTED \"Can't \\\"%s\\\", not connected\\n\"\n"
-"TL_SHAREWAREVERSION \"Playing shareware version.\\n\"\n"
-"TL_REGISTEREDVERSION \"Playing registered version.\\n\"\n"
-"TL_CURRENTSEARCHPATH \"Current search path:\\n\"\n"
-"TL_SERACHPATHISPACK \"%s (%i files)\\n\"\n"
-"TL_SERACHPATHISZIP \"%s (%i files)\\n\"\n"
-"TL_COMPRESSEDFILEOPENFAILED \"Tried opening a handle to a compressed stream - %s\\n\"\n"
-"TL_ADDEDPACKFILE \"Added packfile %s (%i files)\\n\"\n"
-"TL_COULDNTOPENZIP \"Failed opening zipfile \\\"%s\\\" corrupt?\\n\"\n"
-"TL_ADDEDZIPFILE \"Added zipfile %s (%i files)\\n\"\n"
-"TL_GAMEDIRAINTPATH \"Gamedir should be a single filename, not a path\\n\"\n"
-"TL_KEYHASSLASH \"Can't use a key with a \\\\\\n\"\n"
-"TL_KEYHASQUOTE \"Can't use a key with a \\\"\\n\"\n"
-"TL_KEYTOOLONG \"Keys and values must be < 64 characters.\\n\"\n"
-"TL_INFOSTRINGTOOLONG \"Info string length exceeded\\n\"\n"
-"TL_STARKEYPROTECTED \"Can't set * keys\\n\"\n"
-"TL_KEYHASNOVALUE \"MISSING VALUE\\n\"\n"
-"TL_OVERSIZEPACKETFROM \"Warning:  Oversize packet from %s\\n\"\n"
-"TL_CONNECTIONLOSTORABORTED \"Connection lost or aborted\\n\"\n"
-"TL_NETGETPACKETERROR \"NET_GetPacket: %s\\n\"\n"
-"TL_NETSENDERROR \"NET_SendPacket ERROR: %i\\n\"\n"
-"TL_NETBINDINTERFACE \"Binding to IP Interface Address of %s\\n\"\n"
-"TL_IPADDRESSIS \"IP address %s\\n\"\n"
-"TL_CLIENTPORTINITED \"Client port Initialized\\n\"\n"
-"TL_OUTMESSAGEOVERFLOW \"%s:Outgoing message overflow\\n\"\n"
-"TL_OUTOFORDERPACKET \"%s:Out of order packet %i at %i\\n\"\n"
-"TL_DROPPEDPACKETCOUNT \"%s:Dropped %i packets at %i\\n\"\n"
-"STL_SERVERUNSPAWNED \"Server ended\\n\"\n"
-"STL_SERVERSPAWNED \"Server spawned.\\n\"\n"
-"TL_EXEDATETIME \"Exe: %s %s\\n\"\n"
-"TL_HEAPSIZE \"%4.1f megs RAM available.\\n\"\n"
-"TL_VERSION \"\\n%s Build %i\\n\\n\"\n"
-"STL_SAVESYNTAX \"save <savename> : save a game\\n\"\n"
-"STL_NORELATIVEPATHS \"Relative pathnames are not allowed.\\n\"\n"
-"STL_SAVEGAMETO \"Saving game to %s...\\n\"\n"
-"STL_ERRORCOULDNTOPEN \"ERROR: couldn't open.\\n\"\n"
-"STL_SAVEDONE \"done.\\n\"\n"
-"STL_LOADSYNTAX \"load <savename> : load a game\\n\"\n"
-"STL_LOADGAMEFROM \"Loading game from %s...\\n\"\n"
-"STL_BADSAVEVERSION \"Savegame is version %i, not %i\\n\"\n"
-"STL_LOADFAILED \"Couldn't load map\\n\"\n"
-"STL_NOMASTERMODE \"Setting nomaster mode.\\n\"\n"
-"STL_MASTERAT \"Master server at %s\\n\"\n"
-"STL_SENDINGPING \"Sending a ping.\\n\"\n"
-"STL_SHUTTINGDOWN \"Shutting down.\\n\"\n"
-"STL_LOGGINGOFF \"File logging off.\\n\"\n"
-"STL_LOGGINGTO \"Logging text to %s.\\n\"\n"
-"STL_FLOGGINGOFF \"Frag file logging off.\\n\"\n"
-"STL_FLOGGINGFAILED \"Can't open any logfiles.\\n\"\n"
-"STL_FLOGGINGTO \"Logging frags to %s.\\n\"\n"
-"STL_USERIDNOTONSERVER \"Userid %i is not on the server\\n\"\n"
-"STL_CANTFINDMAP \"Can't find %s\\n\"\n"
-"STL_SERVERINFOSETTINGS \"Server info settings:\\n\"\n"
-"STL_SERVERINFOSYNTAX \"usage: serverinfo [ <key> <value> ]\\n\"\n"
-"STL_LOCALINFOSETTINGS \"Local info settings:\\n\"\n"
-"STL_LOCALINFOSYNTAX \"usage: localinfo [ <key> <value> ]\\n\"\n"
-"STL_USERINFOSYNTAX \"Usage: info <userid>\\n\"\n"
-"STL_NONEGATIVEVALUES \"All values must be positive numbers\\n\"\n"
-"STL_CURRENTGAMEDIR \"Current gamedir: %s\\n\"\n"
-"STL_SVGAMEDIRUSAGE \"Usage: sv_gamedir <newgamedir>\\n\"\n"
-"STL_GAMEDIRCANTBEPATH \"*Gamedir should be a single filename, not a path\\n\"\n"
-"STL_GAMEDIRUSAGE \"Usage: gamedir <newgamedir>\\n\"\n"
-"STL_SNAPTOOMANYFILES \"Snap: Couldn't create a file, clean some out.\\n\"\n"
-"STL_SNAPREQUEST \"Requesting snap from user %d...\\n\"\n"
-"STL_SNAPUSAGE \"Usage:  snap <userid>\\n\"\n"
-"TLC_BADSERVERADDRESS \"Bad server address\\n\"\n"
-"TLC_ILLEGALSERVERADDRESS \"Illegal server address\\n\"\n"
-"TLC_CONNECTINGTO \"Connecting to %s...\\n\"\n"
-"TLC_SYNTAX_CONNECT \"usage: connect <server>\\n\"\n"
-"TLC_NORCONPASSWORD \"'rcon_password' is not set.\\n\"\n"
-"TLC_NORCONDEST \"You must either be connected,\\nor set the 'rcon_address' cvar\\nto issue rcon commands\\n\"\n"
-"TLC_SYNTAX_USER \"Usage: user <username / userid>\\n\"\n"
-"TLC_USER_NOUSER \"User not in server.\\n\"\n"
-"TLC_USERBANNER \"userid frags name\\n\"\n"
-"TLC_USERBANNER2 \"------ ----- ----\\n\"\n"
-"TLC_USERLINE \"%6i %4i %s\\n\"\n"
-"TLC_USERTOTAL \"%i total users\\n\"\n"
-"TLC_COLOURCURRENT \"\\\"color\\\" is \\\"%s %s\\\"\\n\"\n"
-"TLC_SYNTAX_COLOUR \"color <0-13> [0-13]\\n\"\n"
-"TLC_SYNTAX_FULLSERVERINFO \"usage: fullserverinfo <complete info string>\\n\"\n"
-"TLC_SERVER_VERSION \"Version %1.2f Server\\n\"\n"
-"TLC_SYNTAX_FULLINFO \"fullinfo <complete info string>\\n\"\n"
-"TLC_SYNTAX_SETINFO \"usage: setinfo [ <key> <value> ]\\n\"\n"
-"TLC_PACKET_SYNTAX \"packet <destination> <contents>\\n\"\n"
-"TLC_BADADDRESS \"Bad address\\n\"\n"
-"TLC_CHANGINGMAP \"\\nChanging map...\\n\"\n"
-"TLC_RECONNECTING \"reconnecting...\\n\"\n"
-"TLC_RECONNECT_NOSERVER \"No server to reconnect to...\\n\"\n"
-"TLC_VERSIONST \"%s Build %i\n\"\n"
-"TL_ST_COLON \"%s: \"\n"
-"TLC_GOTCONNECTION \"connection\\n\"\n"
-"TLC_DUPCONNECTION \"Dup connect received.  Ignored.\\n\"\n"
-"TLC_CONNECTED \"Connected.\\n\"\n"
-"TLC_CONLESS_CONCMD \"client command\\n\"\n"
-"TLC_CMDFROMREMOTE \"Command packet from remote host.  Ignored.\\n\"\n"
-"TLC_LOCALID_NOTSET \""CON_ERROR"Command packet received from local host, but no localid has been set.  You may need to upgrade your server browser.\\n\"\n"
-"TLC_LOCALID_BAD \""CON_ERROR"Invalid localid on command packet received from local host. \\n|%s| != |%s|\\nYou may need to reload your server browser and QuakeWorld.\\n\"\n"
-"TLC_A2C_PRINT \"print\\n\"\n"
-"TLC_A2A_PING \"ping\\n\"\n"
-"TLC_S2C_CHALLENGE \"challenge\\n\"\n"
-"TLC_CONLESSPACKET_UNKNOWN \"unknown connectionless packet:  %c\\n\"\n"
-"TL_RUNTPACKET \"%s: Runt packet\\n\"\n"
-"TLC_SERVERTIMEOUT \"\\nServer connection timed out.\\n\"\n"
-"TLC_CONNECTFIRST \"Must be connected.\\n\"\n"
-"TLC_SYNTAX_DOWNLOAD \"Usage: download <datafile>\\n\"\n"
-"TLC_REQUIRESSERVERMOD \"%s is only available with server support\\n\"\n"
-"TLC_CLIENTCON_ERROR_ENDGAME \""CON_ERROR"Host_EndGame: %s\\n\"\n"
-"TLC_HOSTFATALERROR \"Host_Error: %s\\n\"\n"
-"TLC_CONFIGCFG_WRITEFAILED \"Couldn't write config.cfg.\\n\"\n"
-"TLC_HOSTSPEEDSOUTPUT \"%3i tot %3i server %3i gfx %3i snd\\n\"\n"
-"TLC_QUAKEWORLD_INITED \"^Ue080^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081 %s Initialized ^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue082\\n\"\n"
-"TLC_DEDICATEDCANNOTCONNECT \"Connect ignored - dedicated. set a renderer first\\n\"\n"
-"TLC_Q2CONLESSPACKET_UNKNOWN \"unknown connectionless packet for q2:  %s\\n\"\n"
-"TL_NORELATIVEPATHS \"Refusing to download a path with ..\\n\"\n"
-"TL_NODOWNLOADINDEMO \"Unable to download %s in record mode.\\n\"\n"
-"TL_DOWNLOADINGFILE \"Downloading %s...\\n\"\n"
-"TLC_CHECKINGMODELS \"Checking models...\\n\"\n"
-"TLC_CHECKINGSOUNDS \"Checking sounds...\\n\"\n"
-"TL_FILENOTFOUND \"File not found.\\n\"\n"
-"TL_CLS_DOWNLOAD_ISSET \"cls.download shouldn't have been set\\n\"\n"
-"TL_FAILEDTOOPEN \"Failed to open %s\\n\"\n"
-"TL_RENAMEFAILED \"failed to rename.\\n\"\n"
-"TL_UPLOADCOMPLEATE \"Upload completed\\n\"\n"
-"TL_FTEEXTENSIONS \"Using FTE extensions 0x%x%x\\n\"\n"
-"TLC_LINEBREAK_NEWLEVEL \"\\n\\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\\n\\n\"\n"
-"TLC_PC_PS_NL \"%c%s\\n\"\n"
-"TLC_NOQ2CINEMATICSSUPPORT \"Cinematics on q2 levels is not yet supported\\nType 'cmd nextserver %i' to proceed.\"\n"
-"TLC_GOTSVDATAPACKET \"Serverdata packet received.\\n\"\n"
-"TLC_BAD_MAXCLIENTS \"Bad maxclients from server\\n\"\n"
-"TLC_TOOMANYMODELPRECACHES \"Server sent too many model precaches\\n\"\n"
-"TLC_TOOMANYSOUNDPRECACHES \"Server sent too many sound precaches\\n\"\n"
-"TLC_PARSESTATICWITHNOMAP \"Warning: Parsestatic and no map loaded yet\\n\"\n"
-"TL_FILE_X_MISSING \"\\nThe required model file '%s' could not be found or downloaded.\\n\\n\"\n"
-"TL_GETACLIENTPACK \"You may need to download or purchase a %s client or map pack in order to play on this server.\\n\\n\"\n"
-"TLC_LINEBREAK_MINUS \"------------------\\n\"\n"
-"TL_INT_SPACE \"%i \"\n"
-;
-
 //client may remap messages from the server to a regional bit of text.
 //server may remap progs messages
 
@@ -262,520 +10,133 @@ static char *defaultlanguagetext =
 
 
 char sys_language[64] = "";
-cvar_t language = SCVAR("language", sys_language);
-char lastlang[9];
 
-typedef struct trans_s {
-	char *english;
-	char *foreign;
-	struct trans_s *next;
-} trans_t;
-
-trans_t *firsttranslation;
-
-void TranslateReset(void)
+void TL_LanguageChanged(struct cvar_s *var, char *oldvalue)
 {
-	trans_t *trans;
-	char *f, *eng, *fore;
-//	FILE *F;
-	char *s, *s1, *s2;
-	/*
-	if (*lastlang)
-	{
-		//write
-		F = fopen(va("%s/%s.lng", com_gamedir, lastlang), "wb");
-		if (F)
-		{
-			for (trans = firsttranslation; trans; trans=trans->next)
-			{
-				if (strchr(trans->english, '\n') || strchr(trans->english, '\"') || strchr(trans->english, '\\') || strchr(trans->english, '\t'))
-				{
-					s = trans->english;
-					fputc('"', F);
-					while(*s)
-					{
-						if (*s == '\n')
-							fprintf(F, "\\n");
-						else if (*s == '\\')
-							fprintf(F, "\\\\");
-						else if (*s == '\"')
-							fprintf(F, "\"");
-						else if (*s == '\t')
-							fprintf(F, "\\t");
-						else
-							fputc(*s, F);
-
-						s++;
-					}
-					fputc('"', F);
-				}
-				else
-					fprintf(F, "\"%s\"", trans->english);
-				fputc(' ', F);
-				if (strchr(trans->foreign, '\n') || strchr(trans->foreign, '\"') || strchr(trans->foreign, '\\') || strchr(trans->foreign, '\t'))
-				{
-					s = trans->foreign;
-					fputc('"', F);
-					while(*s)
-					{
-						if (*s == '\n')
-							fprintf(F, "\\n");
-						else if (*s == '\\')
-							fprintf(F, "\\\\");
-						else if (*s == '\"')
-							fprintf(F, "\"");
-						else if (*s == '\t')
-							fprintf(F, "\\t");
-						else
-							fputc(*s, F);
-
-						s++;
-					}
-					fputc('"', F);
-					fputc('\n', F);
-				}
-				else
-					fprintf(F, "\"%s\"\n", trans->foreign);
-			}
-			fclose(F);
-		}
-	}*/
-	Q_strncpyz(lastlang, language.string, 8);
-	if (*language.string)
-	{
-		firsttranslation = NULL;
-		//read in
-		f = COM_LoadTempFile(va("%s.lng", lastlang));
-		s = f;
-		next:
-		while (s && *s)
-		{
-			if (*s == '\"')
-			{
-				s++;
-				eng = s;
-
-				while(*s)
-				{
-					if (*s == '\"')
-					{
-						*s = '\0';	//end of from
-						s++;
-						while (*s)
-						{
-							if (*s == '\"')
-							{
-								s++;
-								fore = s;
-
-								while(*s)
-								{
-									if (*s == '\"')
-									{
-										*s = '\0';	//end of to
-										s++;
-										if (!firsttranslation)
-											trans = firsttranslation = Z_Malloc(sizeof(trans_t)+strlen(eng)+strlen(fore)+2);
-										else
-										{
-											for (trans = firsttranslation; trans->next; trans=trans->next) ;
-											trans = (trans->next = Z_Malloc(sizeof(trans_t)+strlen(eng)+strlen(fore)+2));
-										}
-
-										trans->english = (char *)(trans+1);
-										trans->foreign = trans->english + strlen(eng) + 1;
-
-										s1 = trans->english;
-										s2 = eng;
-										while(*s2)
-										{
-											if (*s2 == '\\')
-											{
-												s2++;
-												switch(*s2)
-												{
-												case 'n':
-													*s1 = '\n';
-													break;
-												case '\"':
-													*s1 = '\"';
-													break;
-												case 't':
-													*s1 = '\t';
-													break;
-												case '\\':
-													*s1 = '\\';
-													break;
-												default:
-													*s1 = '?';
-													break;
-												}
-											}
-											else
-												*s1 = *s2;
-											s1++;
-											s2++;
-										}
-										//strcpy(trans->english, eng);
-										s1 = trans->foreign;
-										s2 = fore;
-										while(*s2)
-										{
-											if (*s2 == '\\')
-											{
-												s2++;
-												switch(*s2)
-												{
-												case 'n':
-													*s1 = '\n';
-													break;
-												case '\"':
-													*s1 = '\"';
-													break;
-												case 't':
-													*s1 = '\t';
-													break;
-												case '\\':
-													*s1 = '\\';
-													break;
-												default:
-													*s1 = '?';
-													break;
-												}
-											}
-											else
-												*s1 = *s2;
-											s1++;
-											s2++;
-										}
-//										strcpy(trans->foreign, fore);
-										goto next;
-									}
-									else if (*s == '\\')	//skip
-										s++;
-									s++;
-								}
-							}
-							else if (*s == '\\')	//skip
-								s++;
-							s++;
-						}
-					}
-					else if (*s == '\\')	//skip
-						s++;
-					s++;
-				}
-			}
-			else if (*s == '\\')	//skip
-				s++;
-			s++;
-		}
-	}
+#ifndef CLIENTONLY
+	svs.language = TL_FindLanguage(var->string);
+#endif
+#ifndef SERVERONLY
+	cls.language = TL_FindLanguage(var->string);
+#endif
 }
 
-char *Translate(char *message)
-{
-	return message;
-
-	//this is pointless.
-
-/*	trans_t *trans;
-	if (!*message)
-		return message;
-	if (Q_strncmp(language.string, lastlang, 8))
-	{
-		TranslateReset();
-	}
-
-	for (trans = firsttranslation; trans; trans=trans->next)
-	{
-		if (*trans->english == *message)	//it's a little faster
-		if (!Q_strcmp(trans->english+1, message+1))
-			return trans->foreign;
-	}
-
-//add translation info to data
-
-	if (!firsttranslation)
-		trans = firsttranslation = Z_Malloc(sizeof(trans_t) + strlen(message)+1);
-	else
-	{
-		for (trans = firsttranslation; trans->next; trans=trans->next) ;
-		trans = (trans->next = Z_Malloc(sizeof(trans_t) + strlen(message)+1));
-	}
-	trans->english = (char *)(trans+1);
-	trans->foreign = (char *)(trans+1);
-	strcpy(trans->english, message);
-	//strcpy(trans->foreign, message);
-
-	return message;
-*/
-}
-
-char *untranslate(char *message)
-{
-	return message;
-}
+cvar_t language = CVARFC("lang", sys_language, CVAR_USERINFO, TL_LanguageChanged);
 
 void TranslateInit(void)
 {
 	Cvar_Register(&language, "International variables");
 }
 
-
-
-
-
-
-
-
-
-
-char *languagetext[STL_MAXSTL][MAX_LANGUAGES];
-
-void TL_ParseLanguage (char *name, char *data, int num)	//this is one of the first functions to be called. so it mustn't use any quake subsystem routines
-{
-	int i;
-	char *s;
-
-	s = data;
-	while(s)
-	{
-		s = COM_Parse(s);
-		if (!s)
-			return;
-
-		for (i = 0; i < STL_MAXSTL; i++)
-		{
-			if (!strcmp(com_token, langtext(i, 0)))	//lang 0 is actually the string names.
-				break;
-		}
-
-		s = COM_ParseCString(s, com_token, sizeof(com_token), NULL);
-		if (i == STL_MAXSTL)	//silently ignore - allow other servers or clients to add stuff
-			continue;
-
-		langtext(i, num) = malloc(strlen(com_token)+1);
-		strcpy(langtext(i, num), com_token);
-//		langtext(i, num) = "";
-	}
-}
-
-void TL_LoadLanguage (char *name, char *shortname, int num)	//this is one of the first functions to be called.
-{
-#ifdef FTE_TARGET_WEB
-	return;
-#else
-	FILE *f;
-	int size;
-	char *buffer;
-	size_t result;
-
-	f = fopen(va("%s.trl", shortname), "rb");
-	if (!f)
-		return;
-	fseek(f, 0, SEEK_END);
-	size = ftell(f);
-	fseek(f, 0, SEEK_SET);
-	buffer = malloc(size+1);
-	buffer[size] = '\0';
-	result = fread(buffer, 1, size, f); // do something with result
-
-	if (result != size)
-		Con_Printf("TL_LoadLanguage() fread: Filename: %s, expected %i, result was %u\n",va("%s.trl", shortname),size,(unsigned int)result);
-
-	fclose(f);
-
-	TL_ParseLanguage(name, buffer, num);
-	free(buffer);
-#endif
-}
-#ifdef _DEBUG
-#define CONVERTDEFAULT
-#endif
-#ifdef CONVERTDEFAULT
-
-char *TL_ExpandToCString(char *in)
-{
-	static char buffer[2048];
-	char *out = buffer;
-
-	while(*in)
-	{
-		if (*in == '\"' || *in == '\\')
-		{
-			*out++ = '\\';
-			*out = *in;
-		}
-		else if (*in == '\n')
-		{
-			*out++ = '\\';
-			*out++ = 'n';
-			*out++ = '\"';
-			*out++ = '\n';
-			*out = '\"';
-		}
-/*		else if (*in == '\t')
-		{
-			*out++ = '\\';
-			*out = '\t';
-		}*/
-		else if (*in == '\r')
-		{
-			in++;
-			continue;
-		}
-		else
-		{
-			*out = *in;
-		}
-
-		out++;
-		in++;
-	}
-	*out = '\0';
-
-	return buffer;
-}
-char *TL_ExpandToDoubleCString(char *in) //TL_ExpandToCString twice
-{
-	static char buffer[2048];
-	char *out = buffer;
-
-	while(*in)
-	{
-		if (*in == '\"' || *in == '\\')
-		{
-			*out++ = '\\';
-			*out = *in;
-		}
-		else if (*in == '\n')
-		{
-			*out++ = '\\';
-			*out = 'n';
-		}
-		else
-		{
-			*out = *in;
-		}
-
-		out++;
-		in++;
-	}
-	*out = '\0';
-
-	return TL_ExpandToCString(buffer);
-}
-void TL_WriteTLHeader(void)
-{
-	/*
-	int i;
-	FILE *f;
-	f = fopen("tlout.h", "wb");
-	if (!f)
-		return;
-
-	for (i = 0; i < STL_MAXSTL; i++)
-	{
-		if (langtext(i, 1))
-		{
-			fprintf(f, "\"%s \\\"%s\\\"\\n\"\n", langtext(i, 0), TL_ExpandToDoubleCString(langtext(i, 1)));
-		}
-	}
-	fclose(f);*/
-}
-#endif
-
 void TL_Shutdown(void)
 {
-	int i, j, k;
+	int j;
 
-	for (i = 0; i < STL_MAXSTL; i++)
+	for (j = 0; j < MAX_LANGUAGES; j++)
 	{
-		for (j = 0; j < MAX_LANGUAGES; j++)
-		{
-			if (j)
-				free(langtext(i, j));
-			for (k = j+1; k < MAX_LANGUAGES; k++)
-			{
-				if (langtext(i, k) == langtext(i, j))
-					langtext(i, k) = NULL;
-			}
-			langtext(i, j) = NULL;
-		}
+		if (!languages[j].name)
+			continue;
+		free(languages[j].name);
+		languages[j].name = NULL;
+		PO_Close(languages[j].po);
+		languages[j].po = NULL;
 	}
 }
 
+static int TL_LoadLanguage(char *lang)
+{
+	vfsfile_t *f;
+	int j;
+	char *u;
+	for (j = 0; j < MAX_LANGUAGES; j++)
+	{
+		if (!languages[j].name)
+			break;
+		if (!stricmp(languages[j].name, lang))
+			return j;
+	}
+
+	//err... oops, ran out of languages...
+	if (j == MAX_LANGUAGES)
+		return 0;
+
+	if (*lang)
+		f = FS_OpenVFS(va("fteqw.%s.po", lang), "rb", FS_BINARYPATH);
+	else
+		f = NULL;
+	if (!f && *lang)
+	{
+		//keep truncating until we can find a name that works
+		u = strrchr(lang, '_');
+		if (u)
+			*u = 0;
+		else
+			lang = "";
+		return TL_LoadLanguage(lang);
+	}
+	languages[j].name = strdup(lang);
+	languages[j].po = f?PO_Load(f):NULL;
+
+	return j;
+}
+int TL_FindLanguage(const char *lang)
+{
+	char trimname[64];
+	Q_strncpyz(trimname, lang, sizeof(trimname));
+	return TL_LoadLanguage(trimname);
+}
+
+//need to set up default languages for any early prints before cvars are inited.
 void TL_InitLanguages(void)
 {
-	int i, j;
-	int lang;
-
-	#define NAME(i) (languagetext[i][0] = #i);
-	#include "translate.h"
-	#undef NAME
-/*
-	#define ENGLISH(i, s) (languagetext[i][1] = s)
-	#undef ENGLISH
-*/
-	TL_ParseLanguage("English", defaultlanguagetext, 1);
-	TL_LoadLanguage("English", "english", 1);
-	TL_LoadLanguage("Spanish", "spanish", 2);
-	TL_LoadLanguage("Portuguese", "portu", 3);
-	TL_LoadLanguage("French", "french", 4);
+	int i;
+	char *lang;
 
+	//lang can override any environment or system settings.
 	if ((i = COM_CheckParm("-lang")))
-		lang = atoi(com_argv[i+1]);
+		Q_strncpyz(sys_language, com_argv[i+1], sizeof(sys_language));
 	else
-		lang = 1;
+	{
+		lang = NULL;
+		if (!lang)
+			lang = getenv("LANGUAGE");
+		if (!lang)
+			lang = getenv("LC_ALL");
+		if (!lang)
+			lang = getenv("LC_MESSAGES");
+		if (!lang)
+			lang = getenv("LANG");
+		if (!lang)
+			lang = "";
+		if (!strcmp(lang, "C") || !strcmp(lang, "POSIX"))
+			lang = "";
 
-	if (lang < 1)
-		lang = 1;
-	if (lang >= MAX_LANGUAGES)
-		lang = MAX_LANGUAGES-1;
+		//windows will have already set the locale from the windows settings, so only replace it if its actually valid.
+		if (*lang)
+			Q_strncpyz(sys_language, lang, sizeof(sys_language));
+	}
+
+	//clean it up.
+	//takes the form: [language[_territory][.codeset][@modifier]]
+	//we don't understand modifiers
+	lang = strrchr(sys_language, '@');
+	if (lang)
+		*lang = 0;
+	//we don't understand codesets sadly.
+	lang = strrchr(sys_language, '.');
+	if (lang)
+		*lang = 0;
+	//but we do support territories.
+	
 #ifndef CLIENTONLY
-	svs.language = lang;
+	svs.language = TL_FindLanguage(sys_language);
 #endif
 #ifndef SERVERONLY
-	cls.language = lang;
+	cls.language = TL_FindLanguage(sys_language);
 #endif
 
-#ifdef CONVERTDEFAULT
-	TL_WriteTLHeader();
-#endif
-
-//	Sys_Printf("-lang %i\n", lang);
-
-	for (i = 0; i < STL_MAXSTL; i++)
-	{
-		if (!langtext(i, 1))
-		{
-			Sys_Printf("warning: default translation for %s isn't set\n", langtext(i, 0));
-			langtext(i, 1) = "";
-		}
-	}
-	if (COM_CheckParm("-langugly"))	//so non-translated strings show more clearly (and you know what they are called).
-	{
-		for (j = 2; j < MAX_LANGUAGES; j++)
-		for (i = 0; i < STL_MAXSTL; i++)
-		{
-			if (!langtext(i, j))
-			{
-				langtext(i, j) = langtext(i, 0);
-			}
-		}
-	}
-	else
-	{
-		for (j = 2; j < MAX_LANGUAGES; j++)
-		for (i = 0; i < STL_MAXSTL; i++)
-		{
-			if (!langtext(i, j))
-			{
-				langtext(i, j) = langtext(i, 1);
-			}
-		}
-	}
+	//make sure a fallback exists, but not as language 0
+	TL_FindLanguage("");
 }
 
 
@@ -934,6 +295,8 @@ struct po_s
 const char *PO_GetText(struct po_s *po, const char *msg)
 {
 	struct poline_s *line;
+	if (!po)
+		return msg;
 	line = Hash_Get(&po->hash, msg);
 	if (line)
 		return line->translated;
@@ -950,21 +313,26 @@ static void PO_AddText(struct po_s *po, const char *orig, const char *trans)
 	memcpy(line->translated, trans, tlen);
 	trans = (const char*)(line->translated);
 	Hash_Add(&po->hash, orig, line, &line->buck);
+
+	line->next = po->lines;
+	po->lines = line;
 }
 struct po_s *PO_Load(vfsfile_t *file)
 {
 	struct po_s *po;
 	unsigned int buckets = 1024;
-	char *in, *end;
+	char *instart, *in, *end;
 	int inlen;
 	char msgid[32768];
 	char msgstr[32768];
 
+	qboolean allowblanks = !!COM_CheckParm("-translatetoblank");
+
 	po = Z_Malloc(sizeof(*po) + Hash_BytesForBuckets(buckets));
 	Hash_InitTable(&po->hash, buckets, po+1);
 
 	inlen = file?VFS_GETLEN(file):0;
-	in = BZ_Malloc(inlen+1);
+	instart = in = BZ_Malloc(inlen+1);
 	if (file)
 		VFS_READ(file, in, inlen);
 	in[inlen] = 0;
@@ -1017,7 +385,7 @@ struct po_s *PO_Load(vfsfile_t *file)
 					break;
 			}
 
-			if (*msgid && start)
+			if ((*msgid && start) || allowblanks)
 				PO_AddText(po, msgid, msgstr);
 		}
 		else
@@ -1029,10 +397,13 @@ struct po_s *PO_Load(vfsfile_t *file)
 		}
 	}
 
+	BZ_Free(instart);
 	return po;
 }
 void PO_Close(struct po_s *po)
 {
+	if (!po)
+		return;
 	while(po->lines)
 	{
 		struct poline_s *r = po->lines;
diff --git a/engine/common/translate.h b/engine/common/translate.h
index 7b28c6d62..a1342cf6f 100644
--- a/engine/common/translate.h
+++ b/engine/common/translate.h
@@ -1,275 +1,19 @@
-#ifdef TRANSLATE_H
-	NAME(STL_LANGUAGENAME)
-
-	NAME(STL_CLIENTCONNECTED)
-	NAME(STL_SPECTATORCONNECTED)
-	NAME(STL_RECORDEDCLIENTCONNECTED)
-	NAME(STL_RECORDEDSPECTATORCONNECTED)
-	NAME(STL_CLIENTWASBANNED)
-	NAME(STL_YOUWEREBANNED)
-	NAME(STL_CLIENTTIMEDOUT)
-	NAME(STL_LOADZOMIBETIMEDOUT)
-	NAME(STL_CLIENTWASKICKED)
-	NAME(STL_YOUWEREKICKED)
-	NAME(STL_YOUWEREKICKEDNAMESPAM)
-	NAME(STL_CLIENTKICKEDNAMESPAM)
-	NAME(STL_GODON)
-	NAME(STL_GODOFF)
-	NAME(STL_NOCLIPON)
-	NAME(STL_NOCLIPOFF)
-
-	NAME(STL_CLIENTISCUFFEDPERMANENTLY)
-	NAME(STL_CLIENTISCUFFED)
-	NAME(STL_CLIENTISSTILLCUFFED)
-	NAME(STL_YOUARNTCUFFED)
-
-	NAME(STL_CLIENTISCRIPPLEDPERMANENTLY)
-	NAME(STL_CLIENTISCRIPPLED)
-	NAME(STL_CLIENTISSTILLCRIPPLED)
-	NAME(STL_YOUARNTCRIPPLED)
-
-	NAME(STL_CLIENTISMUTEDPERMANENTLY)
-	NAME(STL_CLIENTISMUTED)
-	NAME(STL_CLIENTISSTILLMUTED)
-	NAME(STL_YOUAREMUTED)
-	NAME(STL_YOUARNTMUTED)
-	NAME(STL_NONAMEASMUTE)
-	NAME(STL_MUTEDVOTE)
-	NAME(STL_MUTEDCHAT)
-	NAME(STL_FLOODPROTTIME)
-
-	NAME(STL_BUFFERPROTECTION)
-
-	NAME(STL_FIRSTGREETING)
-	NAME(STL_SHORTGREETING)
-	NAME(STL_BIGGREETING)
-
-	NAME(STL_POSSIBLEMODELCHEAT)
-	NAME(STL_MAPCHEAT)
-	NAME(STL_INVALIDTRACKCLIENT)
-	NAME(STL_CLIENTNAMECHANGE)
-	NAME(STL_SERVERPAUSED)
-	NAME(STL_UPLOADDENIED)
-	NAME(STL_NAMEDCLIENTDOESNTEXIST)
-	NAME(STL_NOSUICIDEWHENDEAD)
-	NAME(STL_CANTPAUSE)
-	NAME(STL_CANTPAUSESPEC)
-	NAME(STL_CLIENTPAUSED)
-	NAME(STL_CLIENTUNPAUSED)
-	NAME(STL_CLIENTLESSUNPAUSE)	
-	NAME(STL_RATESETTO)
-	NAME(STL_CURRENTMSGLEVEL)
-	NAME(STL_MSGLEVELSET)
-
-	NAME(STL_CLIENTDROPPED)
-	NAME(STL_SNAPREFUSED)
-	NAME(STL_FINALVOTE)
-	NAME(STL_VOTE)
-
-	NAME(STL_SPEEDCHEATKICKED)
-	NAME(STL_SPEEDCHEATPOSSIBLE)
-
-	NAME(STL_INITED)
-	NAME(STL_MESSAGEOVERFLOW)
-
-
-	
-	NAME(STL_BUILDINGPHS)
-	NAME(STL_PHSINFO)
-
-	NAME(STL_BADSPRINT)
-	NAME(STL_NOPRECACHE)
-	NAME(STL_CANTFREEWORLD)
-	NAME(STL_CANTFREEPLAYERS)
-	NAME(STL_COMPILEROVER)
-	NAME(STL_EDICTWASFREE)
-
-	NAME(STL_NEEDCHEATPARM)
-	NAME(STL_USERDOESNTEXIST)
-
-	NAME(STL_MAPCOMMANDUSAGE)
-
-	NAME(STL_NOVOTING)
-	NAME(STL_BADVOTE)
-	NAME(STL_VOTESREMOVED)
-	NAME(STL_OLDVOTEREMOVED)
-
-	
-	NAME(TL_EXECING)
-	NAME(TL_EXECCOMMANDUSAGE)
-	NAME(TL_EXECFAILED)
-	NAME(TL_FUNCOVERFLOW)
-
-	NAME(TL_CURRENTALIASCOMMANDS)
-	NAME(TL_ALIASNAMETOOLONG)
-	NAME(TL_ALIASRESTRICTIONLEVELERROR)
-	NAME(TL_ALIASLEVELCOMMANDUSAGE)
-	NAME(TL_ALIASNOTFOUND)
-	NAME(TL_ALIASRAISELEVELERROR)
-	NAME(TL_ALIASRESTRICTIONLEVELWARN)
-	NAME(TL_ALIASRESTRICTLEVEL)
-
-	NAME(TL_ALIASLIST)
-	NAME(TL_COMMANDLISTHEADER)
-	NAME(TL_CVARLISTHEADER)
-
-	NAME(TL_RESTRICTCOMMANDRAISE)
-	NAME(TL_RESTRICTCOMMANDTOOHIGH)
-	NAME(TL_RESTRICTCURRENTLEVEL)
-	NAME(TL_RESTRICTCURRENTLEVELDEFAULT)
-	NAME(TL_RESTRICTNOTDEFINED)
-	NAME(TL_WASRESTIRCTED)
-	NAME(TL_COMMANDNOTDEFINED)
-
-	NAME(TL_IFSYNTAX)
-	NAME(TL_IFSYNTAXERROR)
-
-	NAME(TL_SETSYNTAX)
-
-	NAME(TL_CANTXNOTCONNECTED)
-
-
-
-	NAME(TL_REGISTEREDVERSION)
-
-	NAME(TL_CURRENTSEARCHPATH)
-	NAME(TL_ADDEDPACKFILE)
-	NAME(TL_COULDNTOPENZIP)
-
-	NAME(TL_ADDEDZIPFILE)
-
-
-	NAME(TL_OVERSIZEPACKETFROM)
-	NAME(TL_CONNECTIONLOSTORABORTED)
-	NAME(TL_NETGETPACKETERROR)
-	NAME(TL_NETSENDERROR)
-	NAME(TL_NETBINDINTERFACE)
-	NAME(TL_IPADDRESSIS)
-	NAME(TL_CLIENTPORTINITED)
-
-	NAME(TL_OUTMESSAGEOVERFLOW)
-	NAME(TL_OUTOFORDERPACKET)
-	NAME(TL_DROPPEDPACKETCOUNT)
-
-	NAME(STL_SERVERUNSPAWNED)
-	NAME(STL_SERVERSPAWNED)
-
-	NAME(TL_EXEDATETIME)
-
-//savegame.c
-	NAME(STL_SAVEGAMETO)
-	NAME(STL_ERRORCOULDNTOPEN)
-	NAME(STL_LOADGAMEFROM)
-	NAME(STL_BADSAVEVERSION)
-	NAME(STL_LOADFAILED)
-
-//sv_ccmds.c
-	NAME(STL_SHUTTINGDOWN)
-	NAME(STL_FLOGGINGOFF)
-	NAME(STL_FLOGGINGFAILED)
-	NAME(STL_FLOGGINGTO)
-	NAME(STL_USERIDNOTONSERVER)
-	NAME(STL_CANTFINDMAP)
-	NAME(STL_SERVERINFOSETTINGS)
-	NAME(STL_SERVERINFOSYNTAX)
-	NAME(STL_LOCALINFOSETTINGS)
-	NAME(STL_LOCALINFOSYNTAX)
-	NAME(STL_USERINFOSYNTAX)
-	NAME(STL_CURRENTGAMEDIR)
-	NAME(STL_SVGAMEDIRUSAGE)
-	NAME(STL_GAMEDIRCANTBEPATH)
-	NAME(STL_GAMEDIRUSAGE)
-	NAME(STL_SNAPTOOMANYFILES)
-	NAME(STL_SNAPREQUEST)
-	NAME(STL_SNAPUSAGE)
-
-	NAME(TLC_BADSERVERADDRESS)
-	NAME(TLC_ILLEGALSERVERADDRESS)
-	NAME(TLC_CONNECTINGTO)
-	NAME(TLC_SYNTAX_CONNECT)
-	NAME(TLC_NORCONPASSWORD)
-	NAME(TLC_NORCONDEST)
-	NAME(TLC_SYNTAX_USER)
-	NAME(TLC_USER_NOUSER)
-	NAME(TLC_USERBANNER)
-	NAME(TLC_USERBANNER2)
-	NAME(TLC_USERLINE)
-	NAME(TLC_USERTOTAL)
-	NAME(TLC_COLOURCURRENT)
-	NAME(TLC_SYNTAX_COLOUR)
-	NAME(TLC_SYNTAX_FULLSERVERINFO)
-	NAME(TLC_SERVER_VERSION)
-	NAME(TLC_SYNTAX_FULLINFO)
-	NAME(TLC_SYNTAX_SETINFO)
-	NAME(TLC_PACKET_SYNTAX)
-	NAME(TLC_CHANGINGMAP)
-	NAME(TLC_RECONNECTING)
-	NAME(TLC_RECONNECT_NOSERVER)
-	NAME(TL_ST_COLON)
-	NAME(TLC_GOTCONNECTION)
-	NAME(TLC_DUPCONNECTION)
-	NAME(TLC_CONNECTED)
-	NAME(TLC_CONLESS_CONCMD)
-	NAME(TLC_CMDFROMREMOTE)
-	NAME(TLC_LOCALID_NOTSET)
-	NAME(TLC_LOCALID_BAD)
-	NAME(TLC_A2C_PRINT)
-	NAME(TLC_S2C_CHALLENGE)
-	NAME(TLC_CONLESSPACKET_UNKNOWN)
-	NAME(TL_RUNTPACKET)
-	NAME(TLC_SERVERTIMEOUT)
-	NAME(TLC_CONNECTFIRST)
-	NAME(TLC_SYNTAX_DOWNLOAD)
-	NAME(TLC_CLIENTCON_ERROR_ENDGAME)
-	NAME(TLC_HOSTFATALERROR)
-	NAME(TLC_CONFIGCFG_WRITEFAILED)
-	NAME(TLC_QUAKEWORLD_INITED)
-	NAME(TLC_DEDICATEDCANNOTCONNECT)
-	NAME(TLC_Q2CONLESSPACKET_UNKNOWN)
-
-	NAME(TL_NORELATIVEPATHS)
-	NAME(TL_NODOWNLOADINDEMO)
-	NAME(TL_DOWNLOADINGFILE)
-	NAME(TL_FILENOTFOUND)
-	NAME(TL_CLS_DOWNLOAD_ISSET)
-	NAME(TL_FAILEDTOOPEN)
-	NAME(TL_UPLOADCOMPLEATE)
-	NAME(TL_FTEEXTENSIONS)
-	NAME(TLC_LINEBREAK_NEWLEVEL)
-	NAME(TLC_PC_PS_NL)
-	NAME(TLC_GOTSVDATAPACKET)
-	NAME(TLC_TOOMANYMODELPRECACHES)
-	NAME(TLC_TOOMANYSOUNDPRECACHES)
-	NAME(TLC_PARSESTATICWITHNOMAP)
-	NAME(TLC_LINEBREAK_MINUS)
-	NAME(TL_INT_SPACE)
-
-#else
-
+#ifndef TRANSLATE_H
 #define TRANSLATE_H
-
-typedef enum {
-#define NAME(s) s,
-#include "translate.h"
-#undef NAME
-	STL_MAXSTL
-} translation_t;
+typedef const char* translation_t;
 
 #define MAX_LANGUAGES 64
 
 void TranslateInit(void);
 
-extern char *languagetext[STL_MAXSTL][MAX_LANGUAGES];
-
 void SV_InitLanguages(void);
 
-#define langtext(t,l) languagetext[t][l]
-
-
-#define LANGDEFAULT 1
-
-
-
-
+struct language_s
+{
+	char *name;
+	struct po_s *po;
+} languages[MAX_LANGUAGES];
+#define langtext(t,l) PO_GetText(languages[l].po, t)
+int TL_FindLanguage(const char *lang);
 
 #endif
diff --git a/engine/dotnet2005/ftequake.sln b/engine/dotnet2005/ftequake.sln
index f85ec0a30..5f9c042f7 100644
--- a/engine/dotnet2005/ftequake.sln
+++ b/engine/dotnet2005/ftequake.sln
@@ -44,6 +44,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dedserver", "dedserver.vcpr
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "npfte", "npfte.vcproj", "{88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}"
 EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "irc", "..\..\plugins\irc\irc.vcproj", "{6ABD62A3-C5A0-43E8-BA4F-84606057774F}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		D3DDebug|Win32 = D3DDebug|Win32
@@ -576,6 +578,42 @@ Global
 		{88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}.Release|Win32.Build.0 = GLRelease|Win32
 		{88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}.Release|x64.ActiveCfg = GLRelease|x64
 		{88BFEE0E-7BC0-43AD-9CCC-6B1A6E4C1365}.Release|x64.Build.0 = GLRelease|x64
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.D3DDebug|Win32.ActiveCfg = Debug|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.D3DDebug|Win32.Build.0 = Debug|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.D3DDebug|x64.ActiveCfg = Debug|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.D3DRelease|Win32.ActiveCfg = Release|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.D3DRelease|Win32.Build.0 = Release|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.D3DRelease|x64.ActiveCfg = Release|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.Debug Dedicated Server|Win32.ActiveCfg = Debug|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.Debug Dedicated Server|Win32.Build.0 = Debug|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.Debug Dedicated Server|x64.ActiveCfg = Debug|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.Debug|Win32.ActiveCfg = Debug|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.Debug|Win32.Build.0 = Debug|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.Debug|x64.ActiveCfg = Debug|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.GLDebug|Win32.ActiveCfg = Debug|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.GLDebug|Win32.Build.0 = Debug|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.GLDebug|x64.ActiveCfg = Debug|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.GLRelease|Win32.ActiveCfg = Release|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.GLRelease|Win32.Build.0 = Release|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.GLRelease|x64.ActiveCfg = Release|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.MDebug|Win32.ActiveCfg = Debug|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.MDebug|Win32.Build.0 = Debug|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.MDebug|x64.ActiveCfg = Debug|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.MinGLDebug|Win32.ActiveCfg = Debug|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.MinGLDebug|Win32.Build.0 = Debug|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.MinGLDebug|x64.ActiveCfg = Debug|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.MinGLRelease|Win32.ActiveCfg = Release|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.MinGLRelease|Win32.Build.0 = Release|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.MinGLRelease|x64.ActiveCfg = Release|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.MRelease|Win32.ActiveCfg = Release|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.MRelease|Win32.Build.0 = Release|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.MRelease|x64.ActiveCfg = Release|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.Release Dedicated Server|Win32.ActiveCfg = Release|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.Release Dedicated Server|Win32.Build.0 = Release|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.Release Dedicated Server|x64.ActiveCfg = Release|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.Release|Win32.ActiveCfg = Release|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.Release|Win32.Build.0 = Release|Win32
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F}.Release|x64.ActiveCfg = Release|Win32
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -586,6 +624,7 @@ Global
 		{873CCE24-3549-49D4-A4B4-653F91B1532A} = {8CED01C6-2C61-4EC5-90B6-574D9756D773}
 		{9767E236-8454-44E9-8999-CD5BDAFBE9BA} = {8CED01C6-2C61-4EC5-90B6-574D9756D773}
 		{72269FEE-293D-40BC-A7AE-E429F4496869} = {8CED01C6-2C61-4EC5-90B6-574D9756D773}
+		{6ABD62A3-C5A0-43E8-BA4F-84606057774F} = {8CED01C6-2C61-4EC5-90B6-574D9756D773}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		AMDCaProjectFile = C:\Games\Quake\wip\engine\dotnet2005\CodeAnalyst\ftequake.caw
diff --git a/engine/gl/gl_font.c b/engine/gl/gl_font.c
index 5627eec33..9b53b2c9d 100644
--- a/engine/gl/gl_font.c
+++ b/engine/gl/gl_font.c
@@ -615,6 +615,28 @@ static struct charcache_s *Font_GetChar(font_t *f, CHARIDXTYPE charidx)
 		//not cached, can't get.
 		c = Font_TryLoadGlyph(f, charidx);
 
+		if (!c && charidx >= 0x400 && charidx <= 0x45f)
+		{	//apparently there's a lot of russian players out there.
+			//if we just replace all their chars with a '?', they're gonna get pissed.
+			//so lets at least attempt to provide some default mapping that makes sense even if they don't have a full font.
+			//koi8-u is a mapping useful with 7-bit email because the message is still vaugely readable in latin if the high bits get truncated.
+			//not being a language specialist, I'm just going to use that mapping, with the high bit truncated to ascii (which mostly exists in the quake charset).
+			//this exact table is from ezquake. because I'm too lazy to figure out the proper mapping. (beware of triglyphs)
+			static char *wc2koi_table =
+				"?3??4?67??" "??" "??" ">?"
+				"abwgdevzijklmnop"
+				"rstufhc~{}/yx|`q"
+				"ABWGDEVZIJKLMNOP"
+				"RSTUFHC^[]_YX\\@Q"
+				"?#??$?&'??" "??" "??.?";
+			charidx = wc2koi_table[charidx - 0x400];
+			if (charidx != '?')
+			{
+				c = &f->chars[charidx];
+				if (c->texplane == INVALIDPLANE)
+					c = Font_TryLoadGlyph(f, charidx);
+			}
+		}
 		if (!c)
 		{
 			charidx = 0xfffd;	//unicode's replacement char
diff --git a/engine/http/ftpclient.c b/engine/http/ftpclient.c
index afa4be879..45df1deb0 100644
--- a/engine/http/ftpclient.c
+++ b/engine/http/ftpclient.c
@@ -279,11 +279,11 @@ iwboolean FTP_ClientConnThink (FTPclientconn_t *con)	//true to kill con
 
 		if (qerrno == ECONNABORTED || qerrno == ECONNRESET)
 		{
-			Con_TPrintf (TL_CONNECTIONLOSTORABORTED);
+			Con_TPrintf ("Connection lost or aborted\n");
 			return true;
 		}
 
-//		Con_TPrintf (TL_NETGETPACKETERROR, strerror(qerrno));
+//		Con_Printf ("NET_GetPacket: %s\n", strerror(qerrno));
 		return true;
 	}	
 
diff --git a/engine/http/ftpserver.c b/engine/http/ftpserver.c
index 8dbf127ea..b4f8cd777 100644
--- a/engine/http/ftpserver.c
+++ b/engine/http/ftpserver.c
@@ -103,7 +103,7 @@ int FTP_BeginListening(int aftype, int port)
 	//ZOID -- check for interface binding option
 		if ((i = COM_CheckParm("-ip")) != 0 && i < com_argc) {
 			((struct sockaddr_in*)&address)->sin_addr.s_addr = inet_addr(com_argv[i+1]);
-			Con_TPrintf(TL_NETBINDINTERFACE,
+			Con_TPrintf("Binding to IP Interface Address of %s\n",
 					inet_ntoa(((struct sockaddr_in*)&address)->sin_addr));
 		} else
 			((struct sockaddr_in*)&address)->sin_addr.s_addr = INADDR_ANY;
@@ -404,7 +404,7 @@ iwboolean FTP_ServerThinkForConnection(FTPclient_t *cl)
 		if (qerrno == ECONNABORTED || qerrno == ECONNRESET)
 			return true;
 
-		Con_TPrintf (TL_NETGETPACKETERROR, strerror(qerrno));
+		Con_Printf ("NET_GetPacket: %s\n", strerror(qerrno));
 		return true;
 	}
 	if (*cl->messagebuffer)
@@ -954,12 +954,12 @@ unsigned long _true = true;
 
 		if (qerrno == ECONNABORTED || qerrno == ECONNRESET)
 		{
-			Con_TPrintf (TL_CONNECTIONLOSTORABORTED);
+			Con_TPrintf ("Connection lost or aborted\n");
 			return false;
 		}
 
 
-		Con_TPrintf (TL_NETGETPACKETERROR, strerror(qerrno));
+		Con_Printf ("NET_GetPacket: %s\n", strerror(qerrno));
 		return false;
 	}
 
diff --git a/engine/http/httpserver.c b/engine/http/httpserver.c
index e1614274f..2fb0211d2 100644
--- a/engine/http/httpserver.c
+++ b/engine/http/httpserver.c
@@ -150,7 +150,7 @@ qboolean HTTP_ServerInit(int port)
 	if ((i = COM_CheckParm("-ip")) != 0 && i < com_argc)
 	{
 		address.sin_addr.s_addr = inet_addr(com_argv[i+1]);
-		Con_TPrintf(TL_NETBINDINTERFACE,
+		Con_TPrintf("Binding to IP Interface Address of %s\n",
 				inet_ntoa(address.sin_addr));
 	}
 	else
@@ -706,12 +706,12 @@ qboolean HTTP_ServerPoll(qboolean httpserverwanted, int portnum)	//loop while tr
 
 		if (qerrno == ECONNABORTED || qerrno == ECONNRESET)
 		{
-			Con_TPrintf (TL_CONNECTIONLOSTORABORTED);
+			Con_TPrintf ("Connection lost or aborted\n");
 			return false;
 		}
 
 
-		Con_TPrintf (TL_NETGETPACKETERROR, strerror(qerrno));
+		Con_Printf ("NET_GetPacket: %s\n", strerror(qerrno));
 		return false;
 	}
 
diff --git a/engine/http/iweb.h b/engine/http/iweb.h
index adbb0f8fb..f3480dd69 100644
--- a/engine/http/iweb.h
+++ b/engine/http/iweb.h
@@ -11,10 +11,6 @@
 #endif
 
 #define Con_TPrintf IWebPrintf
-#define TL_NETBINDINTERFACE			"binding to %s"
-#define TL_CONNECTIONLOSTORABORTED	"connection lost or aborted"
-#define TL_NETGETPACKETERROR		"get packet error"
-
 #define IWebPrintf printf
 #define com_gamedir "."	//current dir.
 
diff --git a/engine/nacl/fs_ppapi.c b/engine/nacl/fs_ppapi.c
index 4b61cf6d5..9de949d17 100644
--- a/engine/nacl/fs_ppapi.c
+++ b/engine/nacl/fs_ppapi.c
@@ -526,7 +526,7 @@ searchpathfuncs_t *QDECL FSPPAPI_OpenPath(vfsfile_t *mustbenull, const char *des
 
 #else
 
-this code is old and won't work.
+//this code is old and won't work.
 
 #define FSPPAPI_OpenTemp FS_OpenTemp
 #define VFSPPAPI_Open VFSOS_Open
diff --git a/engine/server/pr_cmds.c b/engine/server/pr_cmds.c
index 96d14fb94..8db72bccd 100644
--- a/engine/server/pr_cmds.c
+++ b/engine/server/pr_cmds.c
@@ -225,7 +225,7 @@ pbool PDECL ED_CanFree (edict_t *ed)
 	{
 		if (developer.value)
 		{
-			Con_TPrintf(STL_CANTFREEWORLD);
+			Con_TPrintf("cannot free world entity\n");
 			PR_StackTrace(svprogfuncs);
 			svprogfuncs->pr_trace = 1;
 		}
@@ -233,7 +233,7 @@ pbool PDECL ED_CanFree (edict_t *ed)
 	}
 	if (NUM_FOR_EDICT(svprogfuncs, ed) <= sv.allocated_client_slots)
 	{
-		Con_TPrintf(STL_CANTFREEPLAYERS);
+		Con_TPrintf("cannot free player entities\n");
 		PR_StackTrace(svprogfuncs);
 		svprogfuncs->pr_trace = 1;
 		return false;
@@ -1005,7 +1005,7 @@ progsnum_t AddProgs(char *name)
 	if (num == 0)
 		PR_LoadGlabalStruct();
 
-	Con_Printf("Loaded %s\n", name);
+	Con_TPrintf("Loaded progs %s\n", name);
 
 	PR_ProgsAdded(svprogfuncs, num, name);
 
@@ -1102,7 +1102,7 @@ void PR_Compile_f(void)
 
 	time = Sys_DoubleTime() - time;
 
-	Con_TPrintf(STL_COMPILEROVER, time);
+	Con_TPrintf("Compile took %f secs\n", time);
 }
 
 void PR_ApplyCompilation_f (void)
@@ -2289,14 +2289,14 @@ static void QCBUILTIN PF_setsize (pubprogfuncs_t *prinst, struct globalvars_s *p
 	{
 		if (progstype != PROG_H2)
 		{
-			Con_TPrintf(STL_EDICTWASFREE, "setsize");
+			Con_TPrintf("%s edict was free\n", "setsize");
 			prinst->pr_trace = 1;
 		}
 		return;
 	}
 	if (e->readonly)
 	{
-		Con_Printf("setsize on entity %i\n", e->entnum);
+		Con_TPrintf("setsize on entity %i\n", e->entnum);
 		return;
 	}
 	min = G_VECTOR(OFS_PARM1);
@@ -2556,7 +2556,7 @@ static void QCBUILTIN PF_sprint (pubprogfuncs_t *prinst, struct globalvars_s *pr
 
 	if (entnum < 1 || entnum > sv.allocated_client_slots)
 	{
-		Con_TPrintf (STL_BADSPRINT);
+		Con_TPrintf ("tried to sprint to a non-client\n");
 		return;
 	}
 
@@ -2605,7 +2605,7 @@ void PF_centerprint_Internal (int entnum, qboolean plaque, char *s)
 
 	if (entnum < 1 || entnum > sv.allocated_client_slots)
 	{
-		Con_TPrintf (STL_BADSPRINT);
+		Con_TPrintf ("tried to sprint to a non-client\n");
 		return;
 	}
 
@@ -2934,7 +2934,7 @@ void PF_ambientsound_Internal (float *pos, char *samp, float vol, float attenuat
 
 	if (!*sv.strings.sound_precache[soundnum])
 	{
-		Con_TPrintf (STL_NOPRECACHE, samp);
+		Con_TPrintf ("no precache: %s\n", samp);
 		return;
 	}
 
@@ -6169,7 +6169,7 @@ static void QCBUILTIN PF_readcmd (pubprogfuncs_t *prinst, struct globalvars_s *p
 	if (old != RD_NONE)
 		SV_EndRedirect();
 
-	SV_BeginRedirect(RD_OBLIVION, LANGDEFAULT);
+	SV_BeginRedirect(RD_OBLIVION, TL_FindLanguage(""));
 	Cbuf_Execute();
 	Q_strncpyz(output, outputbuf, sizeof(output));
 	SV_EndRedirect();
diff --git a/engine/server/pr_q1qvm.c b/engine/server/pr_q1qvm.c
index 689be6c3c..181ed5a71 100755
--- a/engine/server/pr_q1qvm.c
+++ b/engine/server/pr_q1qvm.c
@@ -1116,7 +1116,7 @@ static qintptr_t syscallhandle (void *offset, quintptr_t mask, qintptr_t fn, con
 			if (old != RD_NONE)
 				SV_EndRedirect();
 
-			SV_BeginRedirect(RD_OBLIVION, LANGDEFAULT);
+			SV_BeginRedirect(RD_OBLIVION, TL_FindLanguage(""));
 			Cbuf_Execute();
 			Q_strncpyz(output, outputbuf, outputlen);
 			SV_EndRedirect();
diff --git a/engine/server/savegame.c b/engine/server/savegame.c
index fa5bb05fb..63f07c360 100644
--- a/engine/server/savegame.c
+++ b/engine/server/savegame.c
@@ -74,13 +74,13 @@ void SV_Savegame_f (void)
 
 	if (Cmd_Argc() != 2)
 	{
-		Con_TPrintf (STL_SAVESYNTAX);
+		Con_Printf ("save <savename> : save a game\n");
 		return;
 	}
 
 	if (strstr(Cmd_Argv(1), ".."))
 	{
-		Con_TPrintf (STL_NORELATIVEPATHS);
+		Con_TPrintf ("Relative pathnames are not allowed\n");
 		return;
 	}
 
@@ -93,11 +93,11 @@ void SV_Savegame_f (void)
 	sprintf (name, "%s/saves/%s", com_gamedir, Cmd_Argv(1));
 	COM_DefaultExtension (name, ".sav");
 
-	Con_TPrintf (STL_SAVEGAMETO, name);
+	Con_TPrintf ("Saving game to %s...\n", name);
 	f = fopen (name, "w");
 	if (!f)
 	{
-		Con_TPrintf (STL_ERRORCOULDNTOPEN);
+		Con_TPrintf ("ERROR: couldn't open %s.\n", filename);
 		return;
 	}
 
@@ -214,11 +214,11 @@ void SV_Loadgame_f(void)
 // been used.  The menu calls it before stuffing loadgame command
 //	SCR_BeginLoadingPlaque ();
 
-	Con_TPrintf (STL_LOADGAMEFROM, filename);
+	Con_TPrintf ("Loading game from %s...\n", filename);
 	f = fopen (filename, "rb");
 	if (!f)
 	{
-		Con_TPrintf (STL_ERRORCOULDNTOPEN);
+		Con_TPrintf ("ERROR: couldn't open %s.\n", filename);
 		return;
 	}
 
@@ -226,7 +226,7 @@ void SV_Loadgame_f(void)
 	if (version != SAVEGAME_VERSION && version != 5 && version != 6)	//5 for NQ, 6 for ZQ/FQ
 	{
 		fclose (f);
-		Con_TPrintf (STL_BADSAVEVERSION, version, SAVEGAME_VERSION);
+		Con_TPrintf ("Savegame is version %i, not %i\n", version, SAVEGAME_VERSION);
 		return;
 	}
 	fscanf (f, "%s\n", str);
@@ -352,7 +352,7 @@ void SV_Loadgame_f(void)
 	if (sv.state != ss_active)
 	{
 		fclose (f);
-		Con_TPrintf (STL_LOADFAILED);
+		Con_TPrintf ("Couldn't load map\n");
 		return;
 	}
 
@@ -544,7 +544,7 @@ qboolean SV_LoadLevelCache(char *savename, char *level, char *startspot, qboolea
 		Q_snprintfz (name, sizeof(name), "saves/%s", level);
 	COM_DefaultExtension (name, ".lvc", sizeof(name));
 
-//	Con_TPrintf (STL_LOADGAMEFROM, name);
+//	Con_TPrintf ("Loading game from %s...\n", name);
 
 #ifdef Q2SERVER
 	if (gametype == GT_QUAKE2)
@@ -586,7 +586,7 @@ qboolean SV_LoadLevelCache(char *savename, char *level, char *startspot, qboolea
 	if (version != CACHEGAME_VERSION)
 	{
 		VFS_CLOSE (f);
-		Con_TPrintf (STL_BADSAVEVERSION, version, CACHEGAME_VERSION);
+		Con_TPrintf ("Savegame is version %i, not %i\n", version, CACHEGAME_VERSION);
 		return false;
 	}
 	VFS_GETS(f, str, sizeof(str));	//comment
@@ -622,7 +622,7 @@ qboolean SV_LoadLevelCache(char *savename, char *level, char *startspot, qboolea
 	if (sv.state != ss_active)
 	{
 		VFS_CLOSE (f);
-		Con_TPrintf (STL_LOADFAILED);
+		Con_TPrintf ("Couldn't load map\n");
 		return false;
 	}
 
@@ -839,7 +839,7 @@ void SV_SaveLevelCache(char *savedir, qboolean dontharmgame)
 	FS_CreatePath(name, FS_GAMEONLY);
 
 	if (!dontharmgame)	//save game in progress
-		Con_TPrintf (STL_SAVEGAMETO, name);
+		Con_TPrintf ("Saving game to %s...\n", name);
 
 #ifdef Q2SERVER
 	if (ge)
@@ -865,7 +865,7 @@ void SV_SaveLevelCache(char *savedir, qboolean dontharmgame)
 	f = FS_OpenVFS (name, "wb", FS_GAME);
 	if (!f)
 	{
-		Con_TPrintf (STL_ERRORCOULDNTOPEN);
+		Con_TPrintf ("ERROR: couldn't open %s.\n", name);
 		return;
 	}
 
@@ -1100,7 +1100,7 @@ void SV_Loadgame_f (void)
 	f = FS_OpenVFS (filename, "rb", FS_GAME);
 	if (!f)
 	{
-		Con_TPrintf (STL_ERRORCOULDNTOPEN);
+		Con_TPrintf ("ERROR: couldn't open %s.\n", filename);
 		return;
 	}
 
@@ -1109,7 +1109,7 @@ void SV_Loadgame_f (void)
 	if (version < FTESAVEGAME_VERSION || version >= FTESAVEGAME_VERSION+GT_MAX)
 	{
 		VFS_CLOSE (f);
-		Con_TPrintf (STL_BADSAVEVERSION, version, FTESAVEGAME_VERSION);
+		Con_TPrintf ("Savegame is version %i, not %i\n", version, FTESAVEGAME_VERSION);
 		return;
 	}
 	gametype = version - FTESAVEGAME_VERSION;
@@ -1117,7 +1117,7 @@ void SV_Loadgame_f (void)
 #ifndef SERVERONLY
 	if (!cls.state)
 #endif
-		Con_TPrintf (STL_LOADGAMEFROM, filename);
+		Con_TPrintf ("Loading game from %s...\n", filename);
 
 
 	for (clnum = 0; clnum < svs.allocated_client_slots; clnum++)	//clear the server for the level change.
diff --git a/engine/server/server.h b/engine/server/server.h
index 4513b625b..8a1d3210c 100644
--- a/engine/server/server.h
+++ b/engine/server/server.h
@@ -1043,6 +1043,7 @@ void SV_MulticastProtExt(vec3_t origin, multicast_t to, int dimension_mask, int
 void SV_StartSound (int ent, vec3_t origin, int seenmask, int channel, char *sample, int volume, float attenuation, int pitchadj);
 void SVQ1_StartSound (float *origin, wedict_t *entity, int channel, char *sample, int volume, float attenuation, int pitchadj);
 void SV_PrintToClient(client_t *cl, int level, char *string);
+void SV_TPrintToClient(client_t *cl, int level, const char *string);
 void SV_StuffcmdToClient(client_t *cl, char *string);
 void VARGS SV_ClientPrintf (client_t *cl, int level, char *fmt, ...) LIKEPRINTF(3);
 void VARGS SV_ClientTPrintf (client_t *cl, int level, translation_t text, ...);
diff --git a/engine/server/sv_ccmds.c b/engine/server/sv_ccmds.c
index 3deb7e5ce..fca962a85 100644
--- a/engine/server/sv_ccmds.c
+++ b/engine/server/sv_ccmds.c
@@ -165,7 +165,7 @@ SV_Quit_f
 void SV_Quit_f (void)
 {
 	SV_FinalMessage ("server shutdown\n");
-	Con_TPrintf (STL_SHUTTINGDOWN);
+	Con_TPrintf ("Shutting down.\n");
 	SV_Shutdown ();
 	Sys_Quit ();
 }
@@ -182,7 +182,7 @@ void SV_Fraglogfile_f (void)
 
 	if (sv_fraglogfile)
 	{
-		Con_TPrintf (STL_FLOGGINGOFF);
+		Con_TPrintf ("Frag file logging off.\n");
 		VFS_CLOSE (sv_fraglogfile);
 		sv_fraglogfile = NULL;
 		return;
@@ -204,12 +204,12 @@ void SV_Fraglogfile_f (void)
 	}
 	if (i==1000)
 	{
-		Con_TPrintf (STL_FLOGGINGFAILED);
+		Con_TPrintf ("Can't open any logfiles.\n");
 		sv_fraglogfile = NULL;
 		return;
 	}
 
-	Con_TPrintf (STL_FLOGGINGTO, name);
+	Con_TPrintf ("Logging frags to %s.\n", name);
 }
 
 
@@ -239,7 +239,7 @@ qboolean SV_SetPlayer (void)
 			return true;
 		}
 	}
-	Con_TPrintf (STL_USERIDNOTONSERVER, idnum);
+	Con_TPrintf ("Userid %i is not on the server\n", idnum);
 	return false;
 }
 
@@ -255,7 +255,7 @@ void SV_God_f (void)
 {
 	if (!SV_MayCheat())
 	{
-		Con_TPrintf (STL_NEEDCHEATPARM);
+		Con_TPrintf ("You must run the server with +sv_cheats 1 to enable this command.\n");
 		return;
 	}
 
@@ -265,9 +265,9 @@ void SV_God_f (void)
 	SV_LogPlayer(host_client, "god cheat");
 	sv_player->v->flags = (int)sv_player->v->flags ^ FL_GODMODE;
 	if ((int)sv_player->v->flags & FL_GODMODE)
-		SV_ClientTPrintf (host_client, PRINT_HIGH, STL_GODON);
+		SV_ClientTPrintf (host_client, PRINT_HIGH, "godmode ON\n");
 	else
-		SV_ClientTPrintf (host_client, PRINT_HIGH, STL_GODOFF);
+		SV_ClientTPrintf (host_client, PRINT_HIGH, "godmode OFF\n");
 }
 
 
@@ -275,7 +275,7 @@ void SV_Noclip_f (void)
 {
 	if (!SV_MayCheat())
 	{
-		Con_TPrintf (STL_NEEDCHEATPARM);
+		Con_TPrintf ("You must run the server with +sv_cheats 1 to enable this command.\n");
 		return;
 	}
 
@@ -286,12 +286,12 @@ void SV_Noclip_f (void)
 	if (sv_player->v->movetype != MOVETYPE_NOCLIP)
 	{
 		sv_player->v->movetype = MOVETYPE_NOCLIP;
-		SV_ClientTPrintf (host_client, PRINT_HIGH, STL_NOCLIPON);
+		SV_ClientTPrintf (host_client, PRINT_HIGH, "noclip ON\n");
 	}
 	else
 	{
 		sv_player->v->movetype = MOVETYPE_WALK;
-		SV_ClientTPrintf (host_client, PRINT_HIGH, STL_NOCLIPOFF);
+		SV_ClientTPrintf (host_client, PRINT_HIGH, "noclip OFF\n");
 	}
 }
 
@@ -311,7 +311,7 @@ void SV_Give_f (void)
 
 	if (!SV_MayCheat())
 	{
-		Con_TPrintf (STL_NEEDCHEATPARM);
+		Con_TPrintf ("You must run the server with +sv_cheats 1 to enable this command.\n");
 		return;
 	}
 
@@ -368,7 +368,7 @@ void SV_Give_f (void)
 			oldself = pr_global_struct->self;
 			pr_global_struct->self = EDICT_TO_PROG(svprogfuncs, sv_player);
 			Cmd_ShiftArgs(1, false);
-			Con_Printf("Result: %s\n", svprogfuncs->EvaluateDebugString(svprogfuncs, Cmd_Args()));
+			Con_TPrintf("Result: %s\n", svprogfuncs->EvaluateDebugString(svprogfuncs, Cmd_Args()));
 			pr_global_struct->self = oldself;
 		}
 	}
@@ -439,7 +439,7 @@ void SV_Map_f (void)
 
 	if (Cmd_Argc() != 2 && Cmd_Argc() != 3)
 	{
-		Con_TPrintf (STL_MAPCOMMANDUSAGE);
+		Con_TPrintf ("map <levelname> : continue game on a new level\n");
 		return;
 	}
 
@@ -554,7 +554,7 @@ void SV_Map_f (void)
 			{
 				// FTE is still a Quake engine so report BSP missing
 				snprintf (expanded, sizeof(expanded), exts[0], level);
-				Con_TPrintf (STL_CANTFINDMAP, expanded);
+				Con_TPrintf ("Can't find %s\n", expanded);
 #ifndef SERVERONLY
 				SCR_SetLoadingStage(LS_NONE);
 #endif
@@ -716,17 +716,17 @@ void SV_Kick_f (void)
 
 	while((cl = SV_GetClientForString(Cmd_Argv(1), &clnum)))
 	{
-		SV_BroadcastTPrintf (PRINT_HIGH, STL_CLIENTWASKICKED, cl->name);
+		SV_BroadcastTPrintf (PRINT_HIGH, "%s was kicked\n", cl->name);
 		// print directly, because the dropped client won't get the
 		// SV_BroadcastPrintf message
-		SV_ClientTPrintf (cl, PRINT_HIGH, STL_YOUWEREKICKED);
+		SV_ClientTPrintf (cl, PRINT_HIGH, "You were kicked\n");
 
 		SV_LogPlayer(cl, "kicked");
 		SV_DropClient (cl);
 	}
 
 	if (clnum == -1)
-		Con_TPrintf (STL_USERDOESNTEXIST, Cmd_Argv(1));
+		Con_TPrintf ("Couldn't find user number %s\n", Cmd_Argv(1));
 }
 
 /*for q3's kick bot menu*/
@@ -742,10 +742,10 @@ void SV_KickSlot_f (void)
 	{
 		cl = &svs.clients[clnum];
 
-		SV_BroadcastTPrintf (PRINT_HIGH, STL_CLIENTWASKICKED, cl->name);
+		SV_BroadcastTPrintf (PRINT_HIGH, "%s was kicked\n", cl->name);
 		// print directly, because the dropped client won't get the
 		// SV_BroadcastPrintf message
-		SV_ClientTPrintf (cl, PRINT_HIGH, STL_YOUWEREKICKED);
+		SV_ClientTPrintf (cl, PRINT_HIGH, "You were kicked\n");
 
 		SV_LogPlayer(cl, "kicked");
 		SV_DropClient (cl);
@@ -794,16 +794,16 @@ void SV_BanName_f (void)
 		if (reasonsize)
 			Q_strcpy(nb->reason, reason);
 
-		SV_BroadcastTPrintf (PRINT_HIGH, STL_CLIENTWASBANNED, cl->name);
+		SV_BroadcastTPrintf (PRINT_HIGH, "%s was banned\n", cl->name);
 		// print directly, because the dropped client won't get the
 		// SV_BroadcastPrintf message
-		SV_ClientTPrintf (cl, PRINT_HIGH, STL_YOUWEREBANNED);
+		SV_ClientTPrintf (cl, PRINT_HIGH, "You were banned\n");
 		SV_LogPlayer(cl, "banned name");
 		SV_DropClient (cl);
 	}
 
 	if (clnum == -1)
-		Con_TPrintf (STL_USERDOESNTEXIST, Cmd_Argv(1));
+		Con_TPrintf ("Couldn't find user number %s\n", Cmd_Argv(1));
 }
 
 void SV_KickBanIP(netadr_t *banadr, netadr_t *banmask, char *reason)
@@ -836,10 +836,10 @@ void SV_KickBanIP(netadr_t *banadr, netadr_t *banmask, char *reason)
 		if (shouldkick)
 		{
 			// match, so kick
-			SV_BroadcastTPrintf (PRINT_HIGH, STL_CLIENTWASBANNED, cl->name);
+			SV_BroadcastTPrintf (PRINT_HIGH, "%s was banned\n", cl->name);
 			// print directly, because the dropped client won't get the
 			// SV_BroadcastPrintf message
-			SV_ClientTPrintf (cl, PRINT_HIGH, STL_YOUWEREBANNED);
+			SV_ClientTPrintf (cl, PRINT_HIGH, "You were banned\n");
 			SV_LogPlayer(cl, "banned ip");
 			SV_DropClient (cl);
 		}
@@ -1150,7 +1150,7 @@ void SV_ForceName_f (void)
 	}
 
 	if (clnum == -1)
-		Con_TPrintf (STL_USERDOESNTEXIST, Cmd_Argv(1));
+		Con_TPrintf ("Couldn't find user number %s\n", Cmd_Argv(1));
 }
 
 void SV_CripplePlayer_f (void)
@@ -1168,24 +1168,24 @@ void SV_CripplePlayer_f (void)
 			if (persist && cl->rankid)
 			{
 				cl->iscrippled = 2;
-				SV_BroadcastTPrintf (PRINT_HIGH, STL_CLIENTISCRIPPLEDPERMANENTLY, cl->name);
+				SV_BroadcastTPrintf (PRINT_HIGH, "%s is now crippled permanently\n", cl->name);
 			}
 			else
 			{
 				cl->iscrippled = true;
-				SV_BroadcastTPrintf (PRINT_HIGH, STL_CLIENTISCRIPPLED, cl->name);
+				SV_BroadcastTPrintf (PRINT_HIGH, "%s is crippled\n", cl->name);
 			}
 		}
 		else
 		{
 			SV_LogPlayer(cl, "uncrippled");
 			cl->iscrippled = false;
-			SV_ClientTPrintf (cl, PRINT_HIGH, STL_YOUARNTCRIPPLED);
+			SV_ClientTPrintf (cl, PRINT_HIGH, "You are no longer crippled\n");
 		}
 	}
 
 	if (clnum == -1)
-		Con_TPrintf (STL_USERDOESNTEXIST, Cmd_Argv(1));
+		Con_TPrintf ("Couldn't find user number %s\n", Cmd_Argv(1));
 }
 
 void SV_Mute_f (void)
@@ -1203,24 +1203,24 @@ void SV_Mute_f (void)
 			if (persist && cl->rankid)
 			{
 				cl->ismuted = 2;
-				SV_BroadcastTPrintf (PRINT_HIGH, STL_CLIENTISMUTEDPERMANENTLY, cl->name);
+				SV_BroadcastTPrintf (PRINT_HIGH, "%s was muted permanently\n", cl->name);
 			}
 			else
 			{
 				cl->ismuted = true;
-				SV_BroadcastTPrintf (PRINT_HIGH, STL_CLIENTISMUTED, cl->name);
+				SV_BroadcastTPrintf (PRINT_HIGH, "%s was muted\n", cl->name);
 			}
 		}
 		else
 		{
 			SV_LogPlayer(cl, "unmuted");
 			cl->ismuted = false;
-			SV_ClientTPrintf (cl, PRINT_HIGH, STL_YOUARNTMUTED);
+			SV_ClientTPrintf (cl, PRINT_HIGH, "You are no longer muted\n");
 		}
 	}
 
 	if (clnum == -1)
-		Con_TPrintf (STL_USERDOESNTEXIST, Cmd_Argv(1));
+		Con_TPrintf ("Couldn't find user number %s\n", Cmd_Argv(1));
 }
 
 void SV_Cuff_f (void)
@@ -1238,24 +1238,24 @@ void SV_Cuff_f (void)
 			if (persist && cl->rankid)
 			{
 				cl->iscuffed = 2;
-				SV_BroadcastTPrintf (PRINT_HIGH, STL_CLIENTISCUFFEDPERMANENTLY, cl->name);
+				SV_BroadcastTPrintf (PRINT_HIGH, "%s is still cuffed\n", cl->name);
 			}
 			else
 			{
 				cl->iscuffed = true;
-				SV_BroadcastTPrintf (PRINT_HIGH, STL_CLIENTISCUFFED, cl->name);
+				SV_BroadcastTPrintf (PRINT_HIGH, "%s is cuffed\n", cl->name);
 			}
 		}
 		else
 		{
 			SV_LogPlayer(cl, "uncuffed");
 			cl->iscuffed = false;
-			SV_ClientTPrintf (cl, PRINT_HIGH, STL_YOUARNTCUFFED);
+			SV_ClientTPrintf (cl, PRINT_HIGH, "You are no longer cuffed\n");
 		}
 	}
 
 	if (clnum == -1)
-		Con_TPrintf (STL_USERDOESNTEXIST, Cmd_Argv(1));
+		Con_TPrintf ("Couldn't find user number %s\n", Cmd_Argv(1));
 }
 
 void SV_Floodprot_f(void)
@@ -1657,7 +1657,7 @@ void SV_ConSayOne_f (void)
 		SV_ClientPrintf(to, PRINT_CHAT, "%s", text);
 	}
 	if (!clnum)
-		Con_TPrintf(STL_USERDOESNTEXIST, Cmd_Argv(1));
+		Con_TPrintf("Couldn't find user number %s\n", Cmd_Argv(1));
 }
 
 /*
@@ -1729,14 +1729,14 @@ void SV_Serverinfo_f (void)
 
 	if (Cmd_Argc() == 1)
 	{
-		Con_TPrintf (STL_SERVERINFOSETTINGS);
+		Con_TPrintf ("Server info settings:\n");
 		Info_Print (svs.info, "");
 		return;
 	}
 
 	if (Cmd_Argc() < 3)
 	{
-		Con_TPrintf (STL_SERVERINFOSYNTAX);
+		Con_TPrintf ("usage: serverinfo [ <key> <value> ]\n");
 		return;
 	}
 
@@ -1801,14 +1801,14 @@ void SV_Localinfo_f (void)
 
 	if (Cmd_Argc() == 1)
 	{
-		Con_TPrintf (STL_LOCALINFOSETTINGS);
+		Con_TPrintf ("Local info settings:\n");
 		Info_Print (localinfo, "");
 		return;
 	}
 
 	if (Cmd_Argc() != 3)
 	{
-		Con_TPrintf (STL_LOCALINFOSYNTAX);
+		Con_TPrintf ("usage: localinfo [ <key> <value> ]\n");
 		return;
 	}
 
@@ -1875,7 +1875,7 @@ void SV_User_f (void)
 
 	if (Cmd_Argc() != 2)
 	{
-		Con_TPrintf (STL_USERINFOSYNTAX);
+		Con_TPrintf ("Usage: info <userid>\n");
 		return;
 	}
 
@@ -1954,7 +1954,7 @@ void SV_User_f (void)
 	}
 
 	if (clnum == -1)
-		Con_TPrintf (STL_USERIDNOTONSERVER, atoi(Cmd_Argv(1)));
+		Con_TPrintf ("Userid %i is not on the server\n", atoi(Cmd_Argv(1)));
 }
 
 /*
@@ -1978,13 +1978,13 @@ void SV_Gamedir (void)
 
 	if (Cmd_Argc() == 1)
 	{
-		Con_TPrintf (STL_CURRENTGAMEDIR, Info_ValueForKey (svs.info, "*gamedir"));
+		Con_TPrintf ("Current gamedir: %s\n", Info_ValueForKey (svs.info, "*gamedir"));
 		return;
 	}
 
 	if (Cmd_Argc() != 2)
 	{
-		Con_TPrintf (STL_SVGAMEDIRUSAGE);
+		Con_TPrintf ("Usage: sv_gamedir <newgamedir>\n");
 		return;
 	}
 
@@ -1993,7 +1993,7 @@ void SV_Gamedir (void)
 	if (strstr(dir, "..") || strstr(dir, "/")
 		|| strstr(dir, "\\") || strstr(dir, ":") )
 	{
-		Con_TPrintf (STL_GAMEDIRCANTBEPATH);
+		Con_TPrintf ("%s should be a single filename, not a path\n", Cmd_Argv(0));
 		return;
 	}
 
@@ -2013,13 +2013,13 @@ void SV_Gamedir_f (void)
 
 	if (Cmd_Argc() == 1)
 	{
-		Con_TPrintf (STL_CURRENTGAMEDIR, FS_GetGamedir());
+		Con_TPrintf ("Current gamedir: %s\n", FS_GetGamedir());
 		return;
 	}
 
 	if (Cmd_Argc() != 2)
 	{
-		Con_TPrintf (STL_GAMEDIRUSAGE);
+		Con_TPrintf ("Usage: gamedir <newgamedir>\n");
 		return;
 	}
 
@@ -2028,7 +2028,7 @@ void SV_Gamedir_f (void)
 	if (strstr(dir, "..") || strstr(dir, "/")
 		|| strstr(dir, "\\") || strstr(dir, ":") )
 	{
-		Con_TPrintf (STL_GAMEDIRCANTBEPATH);
+		Con_TPrintf ("%s should be a single filename, not a path\n", Cmd_Argv(0));
 		return;
 	}
 
@@ -2061,7 +2061,7 @@ void SV_Snap (int uid)
 	}
 	if (i >= MAX_CLIENTS)
 	{
-		Con_TPrintf (STL_USERDOESNTEXIST);
+		Con_TPrintf ("Couldn't find user number %i\n", uid);
 		return;
 	}
 	if (!ISQWCLIENT(cl))
@@ -2086,7 +2086,7 @@ void SV_Snap (int uid)
 	}
 	if (i==100)
 	{
-		Con_TPrintf (STL_SNAPTOOMANYFILES);
+		Con_TPrintf ("Snap: Couldn't create a file, clean some out.\n");
 		return;
 	}
 	strcpy(cl->uploadfn, checkname);
@@ -2099,7 +2099,7 @@ void SV_Snap (int uid)
 
 	ClientReliableWrite_Begin (cl, svc_stufftext, 24);
 	ClientReliableWrite_String (cl, "cmd snap\n");
-	Con_TPrintf (STL_SNAPREQUEST, uid);
+	Con_TPrintf ("Requesting snap from user %d...\n", uid);
 }
 
 /*
@@ -2113,7 +2113,7 @@ void SV_Snap_f (void)
 
 	if (Cmd_Argc() != 2)
 	{
-		Con_TPrintf (STL_SNAPUSAGE);
+		Con_TPrintf ("Usage:  snap <userid>\n");
 		return;
 	}
 
diff --git a/engine/server/sv_init.c b/engine/server/sv_init.c
index d9a3bc082..dd83fd7e2 100644
--- a/engine/server/sv_init.c
+++ b/engine/server/sv_init.c
@@ -428,7 +428,7 @@ void SV_CalcPHS (void)
 		}
 	}
 	if (developer.value)
-		Con_TPrintf (STL_BUILDINGPHS);
+		Con_TPrintf ("Building PHS...\n");
 
 	sv.phs = ZG_Malloc (&sv.world.worldmodel->memgroup, rowbytes*num);
 
@@ -500,7 +500,7 @@ void SV_CalcPHS (void)
 
 	if (num)
 		if (developer.value)
-			Con_TPrintf (STL_PHSINFO, vcount/num, count/num, num);
+			Con_TPrintf ("Average leafs visible / hearable / total: %i / %i / %i\n", vcount/num, count/num, num);
 }
 
 unsigned SV_CheckModel(char *mdl)
@@ -525,7 +525,7 @@ void SV_UnspawnServer (void)	//terminate the running server.
 	int i;
 	if (sv.state)
 	{
-		Con_TPrintf(STL_SERVERUNSPAWNED);
+		Con_TPrintf("Server ended\n");
 		SV_FinalMessage("Server unspawned\n");
 
 		if (sv.mvdrecording)
@@ -1456,7 +1456,7 @@ void SV_SpawnServer (char *server, char *startspot, qboolean noents, qboolean us
 
 	Info_SetValueForKey (svs.info, "map", sv.name, MAX_SERVERINFO_STRING);
 	if (sv.allocated_client_slots != 1)
-		Con_TPrintf (STL_SERVERSPAWNED);	//misc filenotfounds can be misleading.
+		Con_TPrintf ("Server spawned.\n");	//misc filenotfounds can be misleading.
 
 	if (!startspot)
 	{
diff --git a/engine/server/sv_main.c b/engine/server/sv_main.c
index 886ca4151..56f440bc9 100644
--- a/engine/server/sv_main.c
+++ b/engine/server/sv_main.c
@@ -560,9 +560,9 @@ void SV_DropClient (client_t *drop)
 	if (!drop->redirect && drop->state > cs_zombie)
 	{
 		if (drop->spectator)
-			Con_Printf ("Spectator \"%s\" removed\n",drop->name);
+			Con_TPrintf ("Spectator \"%s\" removed\n",drop->name);
 		else
-			Con_Printf ("Client \"%s\" removed\n",drop->name);
+			Con_TPrintf ("Client \"%s\" removed\n",drop->name);
 	}
 
 	if (drop->download)
@@ -743,7 +743,7 @@ void PIN_SaveMessages(void)
 	f = FS_OpenVFS("pinned.txt", "wb", FS_GAMEONLY);
 	if (!f)
 	{
-		Con_Printf("couldn't write to %s\n", "pinned.txt");
+		Con_TPrintf("couldn't write to %s\n", "pinned.txt");
 		return;
 	}
 
@@ -1041,7 +1041,7 @@ void SVC_Status (void)
 		displayflags = STATUS_SERVERINFO|STATUS_PLAYERS;
 
 	Cmd_TokenizeString ("status", false, false);
-	SV_BeginRedirect (RD_PACKET, LANGDEFAULT);
+	SV_BeginRedirect (RD_PACKET, TL_FindLanguage(""));
 	if (displayflags&STATUS_SERVERINFO)
 		Con_Printf ("%s\n", svs.info);
 	for (i=0 ; i<MAX_CLIENTS ; i++)
@@ -1256,7 +1256,7 @@ void SV_CheckLog (void)
 		svs.logsequence++;
 		sz = &svs.log[svs.logsequence&1];
 		sz->cursize = 0;
-		Con_Printf ("beginning fraglog sequence %i\n", svs.logsequence);
+		Con_TPrintf ("beginning fraglog sequence %i\n", svs.logsequence);
 	}
 
 }
@@ -1542,7 +1542,7 @@ void VARGS SV_OutOfBandTPrintf (int q2, netadr_t *adr, int language, translation
 {
 	va_list		argptr;
 	char		string[8192];
-	char *format = langtext(text, language);
+	const char *format = langtext(text, language);
 
 	va_start (argptr, text);
 	if (q2)
@@ -1903,7 +1903,7 @@ client_t *SVC_DirectConnect(void)
 //			break;
 		default:
 			SV_RejectMessage (SCP_BAD, "Server is %s.\n", version_string());
-			Con_Printf ("* rejected connect from incompatable client\n");
+			Con_TPrintf ("* rejected connect from incompatable client\n");
 			return NULL;
 		}
 
@@ -1926,7 +1926,7 @@ client_t *SVC_DirectConnect(void)
 		if (strcmp(Info_ValueForKey(userinfo[0], "protocol"), "darkplaces 3"))
 		{
 			SV_RejectMessage (SCP_BAD, "Server is %s.\n", version_string());
-			Con_Printf ("* rejected connect from incompatible client\n");
+			Con_TPrintf ("* rejected connect from incompatible client\n");
 			return NULL;
 		}
 		//it's a darkplaces client.
@@ -1937,7 +1937,7 @@ client_t *SVC_DirectConnect(void)
 			//reason: dp is too similar for concerns about unsupported code, while the main reason why we disable nq is because of the lack of challenges
 			//(and no, this isn't a way to bypass invalid challenges)
 			protocol = SCP_NETQUAKE;
-			Con_Printf ("* DP without sv_bigcoords 1\n");
+			Con_TPrintf ("* DP without sv_bigcoords 1\n");
 		}
 		else if (strstr(s, "DP7"))
 			protocol = SCP_DARKPLACES7;
@@ -1968,7 +1968,7 @@ client_t *SVC_DirectConnect(void)
 			if (numssclients<1 || numssclients > MAX_SPLITS)
 			{
 				SV_RejectMessage (SCP_BAD, "Server is %s.\n", version_string());
-				Con_Printf ("* rejected connect from broken client\n");
+				Con_TPrintf ("* rejected connect from broken client\n");
 				return NULL;
 			}
 		}
@@ -1991,7 +1991,7 @@ client_t *SVC_DirectConnect(void)
 		else if (version != PROTOCOL_VERSION_QW)
 		{
 			SV_RejectMessage (SCP_BAD, "Server is protocol version %i, received %i\n", PROTOCOL_VERSION_QW, version);
-			Con_Printf ("* rejected connect from version %i\n", version);
+			Con_TPrintf ("* rejected connect from version %i\n", version);
 			return NULL;
 		}
 		else
@@ -2017,7 +2017,7 @@ client_t *SVC_DirectConnect(void)
 		if (!sv_listen_qw.value && net_from.type != NA_LOOPBACK)
 		{
 			SV_RejectMessage (protocol, "QuakeWorld protocols are not permitted on this server.\n");
-			Con_Printf ("* rejected connect from quakeworld\n");
+			Con_TPrintf ("* rejected connect from quakeworld\n");
 			return NULL;
 		}
 	}
@@ -2028,19 +2028,19 @@ client_t *SVC_DirectConnect(void)
 		if (*Info_ValueForKey(userinfo[0], "*qwfwd"))
 		{
 			SV_RejectMessage (protocol, "Proxies are not permitted on this server.\n");
-			Con_Printf ("* rejected connect from qwfwd proxy\n");
+			Con_TPrintf ("* rejected connect from qwfwd proxy\n");
 			return NULL;
 		}
 		if (*Info_ValueForKey(userinfo[0], "Qizmo"))
 		{
 			SV_RejectMessage (protocol, "Proxies are not permitted on this server.\n");
-			Con_Printf ("* rejected connect from qizmo proxy\n");
+			Con_TPrintf ("* rejected connect from qizmo proxy\n");
 			return NULL;
 		}
 		if (*Info_ValueForKey(userinfo[0], "*qtv"))
 		{
 			SV_RejectMessage (protocol, "Proxies are not permitted on this server.\n");
-			Con_Printf ("* rejected connect from qtv proxy (udp)\n");
+			Con_TPrintf ("* rejected connect from qtv proxy (udp)\n");
 			return NULL;
 		}
 	}
@@ -2111,7 +2111,7 @@ client_t *SVC_DirectConnect(void)
 				stricmp(spectator_password.string, "none") &&
 				strcmp(spectator_password.string, s) )
 			{	// failed
-				Con_Printf ("%s:spectator password failed\n", NET_AdrToString (adrbuf, sizeof(adrbuf), &net_from));
+				Con_TPrintf ("%s:spectator password failed\n", NET_AdrToString (adrbuf, sizeof(adrbuf), &net_from));
 				SV_RejectMessage (protocol, "requires a spectator password\n\n");
 				return NULL;
 			}
@@ -2126,7 +2126,7 @@ client_t *SVC_DirectConnect(void)
 				stricmp(password.string, "none") &&
 				strcmp(password.string, s) )
 			{
-				Con_Printf ("%s:password failed\n", NET_AdrToString (adrbuf, sizeof(adrbuf), &net_from));
+				Con_TPrintf ("%s:password failed\n", NET_AdrToString (adrbuf, sizeof(adrbuf), &net_from));
 				SV_RejectMessage (protocol, "server requires a password\n\n");
 				return NULL;
 			}
@@ -2207,9 +2207,9 @@ client_t *SVC_DirectConnect(void)
 			if (cl->state == cs_connected)
 			{
 				if (cl->protocol != protocol)
-					Con_Printf("%s: diff prot connect\n", NET_AdrToString (adrbuf, sizeof(adrbuf), &adr));
+					Con_TPrintf("%s: diff prot connect\n", NET_AdrToString (adrbuf, sizeof(adrbuf), &adr));
 				else
-					Con_Printf("%s:dup connect\n", NET_AdrToString (adrbuf, sizeof(adrbuf), &adr));
+					Con_TPrintf("%s:dup connect\n", NET_AdrToString (adrbuf, sizeof(adrbuf), &adr));
 
 				cl->protocol = SCP_BAD;	//make sure the netchan doesn't try sending anything.
 				SV_DropClient(cl);
@@ -2229,7 +2229,7 @@ client_t *SVC_DirectConnect(void)
 			}*/
 			else
 			{
-				Con_Printf ("%s:reconnect\n", NET_AdrToString (adrbuf, sizeof(adrbuf), &adr));
+				Con_TPrintf ("%s:reconnect\n", NET_AdrToString (adrbuf, sizeof(adrbuf), &adr));
 //				SV_DropClient (cl);
 			}
 			break;
@@ -2356,14 +2356,14 @@ client_t *SVC_DirectConnect(void)
 			if (!svprogfuncs)
 			{
 				SV_RejectMessage (protocol, "\nserver is full\n\n");
-				Con_Printf ("%s:full connect\n", NET_AdrToString (adrbuf, sizeof(adrbuf), &adr));
+				Con_TPrintf ("%s:full connect\n", NET_AdrToString (adrbuf, sizeof(adrbuf), &adr));
 			}
 			else
 			{
 				if (spectator && spectators >= maxspectators.ival)
 				{
 					SV_RejectMessage (protocol, "\nserver is full (%i of %i spectators)\n\n", spectators, maxspectators.ival);
-					Con_Printf ("%s:full connect\n", NET_AdrToString (adrbuf, sizeof(adrbuf), &adr));
+					Con_TPrintf ("%s:full connect\n", NET_AdrToString (adrbuf, sizeof(adrbuf), &adr));
 				}
 				else if (!spectator && clients >= maxclients.ival)
 					SV_RejectMessage (protocol, "\nserver is full (%i of %i players)\n\n", clients, maxclients.ival);
@@ -2473,7 +2473,7 @@ client_t *SVC_DirectConnect(void)
 		if (pext_ezquake_nochunks.ival)
 		{
 			newcl->fteprotocolextensions &= ~PEXT_CHUNKEDDOWNLOADS;
-			Con_Printf("%s: ignoring ezquake chunked downloads extension.\n", NET_AdrToString (adrbuf, sizeof(adrbuf), &adr));
+			Con_TPrintf("%s: ignoring ezquake chunked downloads extension.\n", NET_AdrToString (adrbuf, sizeof(adrbuf), &adr));
 		}
 	}
 
@@ -2555,7 +2555,7 @@ client_t *SVC_DirectConnect(void)
 			if (!Rank_GetPlayerStats(newcl->rankid, &rs))
 			{
 				SV_RejectMessage (protocol, "Rankings/Account system failed\n");
-				Con_Printf("banned player %s is trying to connect\n", newcl->name);
+				Con_TPrintf("banned player %s is trying to connect\n", newcl->name);
 				newcl->name[0] = 0;
 				memset (newcl->userinfo, 0, sizeof(newcl->userinfo));
 				newcl->state = cs_free;
@@ -2564,15 +2564,15 @@ client_t *SVC_DirectConnect(void)
 
 			if (rs.flags1 & RANK_MUTED)
 			{
-				SV_BroadcastTPrintf(PRINT_MEDIUM, STL_CLIENTISSTILLMUTED, newcl->name);
+				SV_BroadcastTPrintf(PRINT_MEDIUM, "%s is muted (still)\n", newcl->name);
 			}
 			if (rs.flags1 & RANK_CUFFED)
 			{
-				SV_BroadcastTPrintf(PRINT_LOW, STL_CLIENTISSTILLCUFFED, newcl->name);
+				SV_BroadcastTPrintf(PRINT_LOW, "%s is now cuffed permanently\n", newcl->name);
 			}
 			if (rs.flags1 & RANK_CRIPPLED)
 			{
-				SV_BroadcastTPrintf(PRINT_HIGH, STL_CLIENTISSTILLCRIPPLED, newcl->name);
+				SV_BroadcastTPrintf(PRINT_HIGH, "%s is still crippled\n", newcl->name);
 			}
 
 			if (rs.timeonserver)
@@ -2597,9 +2597,9 @@ client_t *SVC_DirectConnect(void)
 				}
 
 				if (rs.timeonserver > 3*60)	//woo. Ages.
-					s = va(langtext(STL_BIGGREETING, newcl->language), newcl->name, (int)(rs.timeonserver/(60*60)), (int)((int)(rs.timeonserver/60)%(60)));
+					s = va(langtext("Welcome back %s. You have previously spent %i:%i hours connected\n", newcl->language), newcl->name, (int)(rs.timeonserver/(60*60)), (int)((int)(rs.timeonserver/60)%(60)));
 				else	//measure this guy in minuites.
-					s = va(langtext(STL_SHORTGREETING, newcl->language), newcl->name, (int)(rs.timeonserver/60));
+					s = va(langtext("Welcome back %s. You have previously spent %i mins connected\n", newcl->language), newcl->name, (int)(rs.timeonserver/60));
 
 				SV_OutOfBandPrintf (protocol == SCP_QUAKE2, &adr, s);
 			}
@@ -2607,7 +2607,7 @@ client_t *SVC_DirectConnect(void)
 			{
 				SV_GetNewSpawnParms(newcl);
 
-				SV_OutOfBandTPrintf (protocol == SCP_QUAKE2, &adr, newcl->language, STL_FIRSTGREETING, newcl->name, (int)rs.timeonserver);
+				SV_OutOfBandTPrintf (protocol == SCP_QUAKE2, &adr, newcl->language, "Welcome %s. Your time on this server is being logged and ranked\n", newcl->name, (int)rs.timeonserver);
 			}
 			//else loaded players already have their initial parms set
 		}
@@ -2635,12 +2635,12 @@ client_t *SVC_DirectConnect(void)
 		}
 		else if (newcl->spectator)
 		{
-			SV_BroadcastTPrintf(PRINT_LOW, STL_SPECTATORCONNECTED, newcl->name);
+			SV_BroadcastTPrintf(PRINT_LOW, "spectator %s connected\n", newcl->name);
 //			Con_Printf ("Spectator %s connected\n", newcl->name);
 		}
 		else
 		{
-			SV_BroadcastTPrintf(PRINT_LOW, STL_CLIENTCONNECTED, newcl->name);
+			SV_BroadcastTPrintf(PRINT_LOW, "client %s connected\n", newcl->name);
 //			Con_DPrintf ("Client %s connected\n", newcl->name);
 		}
 	}
@@ -2648,12 +2648,12 @@ client_t *SVC_DirectConnect(void)
 	{
 		if (newcl->spectator)
 		{
-			SV_BroadcastTPrintf(PRINT_LOW, STL_RECORDEDSPECTATORCONNECTED, newcl->name);
+			SV_BroadcastTPrintf(PRINT_LOW, "recorded spectator %s connected\n", newcl->name);
 //			Con_Printf ("Recorded spectator %s connected\n", newcl->name);
 		}
 		else
 		{
-			SV_BroadcastTPrintf(PRINT_LOW, STL_RECORDEDCLIENTCONNECTED, newcl->name);
+			SV_BroadcastTPrintf(PRINT_LOW, "recorded client %s connected\n", newcl->name);
 //			Con_DPrintf ("Recorded client %s connected\n", newcl->name);
 		}
 	}
@@ -2789,7 +2789,7 @@ void SVC_RemoteCommand (void)
 		char *br = SV_BannedReason(&net_from);
 		if (br)
 		{
-			Con_Printf ("Rcon from banned ip %s\n", NET_AdrToString (adr, sizeof(adr), &net_from));
+			Con_TPrintf ("Rcon from banned ip %s: %s\n", NET_AdrToString (adr, sizeof(adr), &net_from), br);
 			return;
 		}
 	}
@@ -2823,10 +2823,10 @@ void SVC_RemoteCommand (void)
 						return;
 
 
-					Con_Printf ("Rcon from %s:\n%s\n"
+					Con_TPrintf ("Rcon from %s:\n%s\n"
 						, NET_AdrToString (adr, sizeof(adr), &net_from), net_message.data+4);
 
-					SV_BeginRedirect (RD_PACKET, LANGDEFAULT);
+					SV_BeginRedirect (RD_PACKET, svs.language);
 
 					remaining[0] = 0;
 
@@ -2834,9 +2834,9 @@ void SVC_RemoteCommand (void)
 					{
 						if (strlen(remaining)+strlen(Cmd_Argv(i))>=sizeof(remaining)-2)
 						{
-							Con_Printf("Rcon was too long\n");
+							Con_TPrintf("Rcon was too long\n");
 							SV_EndRedirect ();
-							Con_Printf ("Rcon from %s:\n%s\n"
+							Con_TPrintf ("Rcon from %s:\n%s\n"
 								, NET_AdrToString (adr, sizeof(adr), &net_from), "Was too long - possible buffer overflow attempt");
 							return;
 						}
@@ -2853,21 +2853,21 @@ void SVC_RemoteCommand (void)
 		}
 #endif
 
-		Con_Printf ("Bad rcon from %s:\n%s\n"
+		Con_TPrintf ("Bad rcon from %s:\n%s\n"
 			, NET_AdrToString (adr, sizeof(adr), &net_from), net_message.data+4);
 
-		SV_BeginRedirect (RD_PACKET, LANGDEFAULT);
+		SV_BeginRedirect (RD_PACKET, svs.language);
 
-		Con_Printf ("Bad rcon_password.\n");
+		Con_TPrintf ("Bad rcon_password.\n");
 
 	}
 	else
 	{
 
-		Con_Printf ("Rcon from %s:\n%s\n"
+		Con_TPrintf ("Rcon from %s:\n%s\n"
 			, NET_AdrToString (adr, sizeof(adr), &net_from), net_message.data+4);
 
-		SV_BeginRedirect (RD_PACKET, LANGDEFAULT);
+		SV_BeginRedirect (RD_PACKET, svs.language);
 
 		remaining[0] = 0;
 
@@ -2875,9 +2875,9 @@ void SVC_RemoteCommand (void)
 		{
 			if (strlen(remaining)+strlen(Cmd_Argv(i))>=sizeof(remaining)-2)
 			{
-				Con_Printf("Rcon was too long\n");
+				Con_TPrintf("Rcon was too long\n");
 				SV_EndRedirect ();
-				Con_Printf ("Rcon from %s:\n%s\n"
+				Con_TPrintf ("Rcon from %s:\n%s\n"
 					, NET_AdrToString (adr, sizeof(adr), &net_from), "Was too long - possible buffer overflow attempt");
 				return;
 			}
@@ -2920,19 +2920,19 @@ void SVC_RealIP (void)
 
 	if (NET_AddressSmellsFunny(&net_from))
 	{
-		Con_Printf("funny realip address: %s, ", NET_AdrToString(adr, sizeof(adr), &net_from));
-		Con_Printf("proxy address: %s\n", NET_AdrToString(adr, sizeof(adr), &svs.clients[slotnum].netchan.remote_address));
+		Con_TPrintf("funny realip address: %s, ", NET_AdrToString(adr, sizeof(adr), &net_from));
+		Con_TPrintf("proxy address: %s\n", NET_AdrToString(adr, sizeof(adr), &svs.clients[slotnum].netchan.remote_address));
 		return;
 	}
 
 	banreason = SV_BannedReason(&net_from);
 	if (banreason)
 	{
-		Con_Printf("%s has a banned realip\n", svs.clients[slotnum].name);
+		Con_TPrintf("%s has a banned realip\n", svs.clients[slotnum].name);
 		if (*banreason)
-			SV_ClientPrintf(&svs.clients[slotnum], PRINT_CHAT, "You were banned.\nReason: %s\n", banreason);
+			SV_ClientTPrintf(&svs.clients[slotnum], PRINT_CHAT, "You were banned.\nReason: %s\n", banreason);
 		else
-			SV_ClientPrintf(&svs.clients[slotnum], PRINT_CHAT, "You were banned.\n");
+			SV_ClientTPrintf(&svs.clients[slotnum], PRINT_CHAT, "You were banned.\n");
 		SV_DropClient(&svs.clients[slotnum]);
 		return;
 	}
@@ -2967,7 +2967,7 @@ void SVC_ACK (void)
 			}
 		}
 	}
-	Con_Printf ("A2A_ACK from %s\n", NET_AdrToString (adr, sizeof(adr), &net_from));
+	Con_TPrintf ("A2A_ACK from %s\n", NET_AdrToString (adr, sizeof(adr), &net_from));
 }
 
 //returns false to block replies
@@ -3011,7 +3011,7 @@ qboolean SV_ConnectionlessPacket (void)
 
 	if (net_message.cursize >= MAX_QWMSGLEN)	//add a null term in message space
 	{
-		Con_Printf("Oversized packet from %s\n", NET_AdrToString (adr, sizeof(adr), &net_from));
+		Con_TPrintf("Oversized packet from %s\n", NET_AdrToString (adr, sizeof(adr), &net_from));
 		net_message.cursize=MAX_QWMSGLEN-1;
 	}
 	net_message.data[net_message.cursize] = '\0';	//terminate it properly. Just in case.
@@ -3069,7 +3069,7 @@ qboolean SV_ConnectionlessPacket (void)
 #endif
 			if (secure.value)	//FIXME: possible problem for nq clients when enabled
 		{
-			Netchan_OutOfBandPrint (NS_SERVER, &net_from, "%c\nThis server requires client validation.\nPlease use the "DISTRIBUTION" validation program\n", A2C_PRINT);
+			Netchan_OutOfBandTPrintf (NS_SERVER, &net_from, svs.language, "%c\nThis server requires client validation.\nPlease use the "DISTRIBUTION" validation program\n", A2C_PRINT);
 		}
 		else
 		{
@@ -3108,7 +3108,7 @@ qboolean SV_ConnectionlessPacket (void)
 		unsigned int ct = Sys_Milliseconds();
 		if (ct - lt > 5*1000)
 		{
-			Con_Printf ("bad connectionless packet from %s: \"%s\"\n", NET_AdrToString (adr, sizeof(adr), &net_from), c);
+			Con_TPrintf ("bad connectionless packet from %s: \"%s\"\n", NET_AdrToString (adr, sizeof(adr), &net_from), c);
 			lt = ct;
 		}
 	}
@@ -3584,9 +3584,9 @@ qboolean SV_ReadPackets (float *delay)
 		if (banreason)
 		{
 			if (*banreason)
-				Netchan_OutOfBandPrint(NS_SERVER, &net_from, "%cYou are banned: %s\n", A2C_PRINT, banreason);
+				Netchan_OutOfBandTPrintf(NS_SERVER, &net_from, svs.language, "%cYou are banned: %s\n", A2C_PRINT, banreason);
 			else
-				Netchan_OutOfBandPrint(NS_SERVER, &net_from, "%cYou are banned\n", A2C_PRINT);
+				Netchan_OutOfBandTPrintf(NS_SERVER, &net_from, svs.language, "%cYou are banned\n", A2C_PRINT);
 			continue;
 		}
 
@@ -3756,8 +3756,9 @@ void SV_CheckTimeouts (void)
 		if (cl->state == cs_connected || cl->state == cs_spawned) {
 			if (!cl->spectator)
 				nclients++;
-			if (cl->netchan.last_received < droptime && cl->netchan.remote_address.type != NA_LOOPBACK && cl->protocol != SCP_BAD) {
-				SV_BroadcastTPrintf (PRINT_HIGH, STL_CLIENTTIMEDOUT, cl->name);
+			if (cl->netchan.last_received < droptime && cl->netchan.remote_address.type != NA_LOOPBACK && cl->protocol != SCP_BAD)
+			{
+				SV_BroadcastTPrintf (PRINT_HIGH, "Client %s timed out\n", cl->name);
 				SV_DropClient (cl);
 				cl->state = cs_free;	// don't bother with zombie state for local player.
 			}
@@ -3778,7 +3779,7 @@ void SV_CheckTimeouts (void)
 
 				cl->istobeloaded=false;
 
-				SV_BroadcastTPrintf (PRINT_HIGH, STL_LOADZOMIBETIMEDOUT, cl->name);
+				SV_BroadcastTPrintf (PRINT_HIGH, "LoadZombie %s timed out\n", cl->name);
 //				cl->state = cs_zombie;	// the real zombieness starts now
 //				cl->connection_started = realtime;
 			}
@@ -3788,7 +3789,7 @@ void SV_CheckTimeouts (void)
 	{
 		// nobody left, unpause the server
 		if (SV_TogglePause(NULL))
-			SV_BroadcastTPrintf(PRINT_HIGH, STL_CLIENTLESSUNPAUSE);
+			SV_BroadcastTPrintf(PRINT_HIGH, "pause released due to empty server\n");
 	}
 }
 
@@ -4125,7 +4126,7 @@ void SV_MVDStream_Poll(void);
 
 	if (sv.multicast.cursize)
 	{
-		Con_Printf("Unterminated multicast\n");
+		Con_TPrintf("Unterminated multicast\n");
 		sv.multicast.cursize=0;
 	}
 
@@ -4170,7 +4171,7 @@ void SV_MVDStream_Poll(void);
 
 		if (sv.multicast.cursize)
 		{
-			Con_Printf("Unterminated multicast\n");
+			Con_TPrintf("Unterminated multicast\n");
 			sv.multicast.cursize=0;
 		}
 
@@ -4474,7 +4475,7 @@ void Master_Heartbeat (void)
 			else if (!NET_StringToAdr(sv_masterlist[i].cv.string, 0, &sv_masterlist[i].adr))
 			{
 				sv_masterlist[i].adr.port = 0;
-				Con_Printf ("Couldn't resolve master \"%s\"\n", sv_masterlist[i].cv.string);
+				Con_TPrintf ("Couldn't resolve master \"%s\"\n", sv_masterlist[i].cv.string);
 			}
 			else
 			{
@@ -4527,7 +4528,7 @@ void Master_Heartbeat (void)
 					}
 
 					if (sv_reportheartbeats.value)
-						Con_Printf ("Sending heartbeat to %s (%s)\n", NET_AdrToString (adr, sizeof(adr), &sv_masterlist[i].adr), sv_masterlist[i].cv.string);
+						Con_TPrintf ("Sending heartbeat to %s (%s)\n", NET_AdrToString (adr, sizeof(adr), &sv_masterlist[i].adr), sv_masterlist[i].cv.string);
 
 					NET_SendPacket (NS_SERVER, strlen(string), string, &sv_masterlist[i].adr);
 				}
@@ -4536,7 +4537,7 @@ void Master_Heartbeat (void)
 				if (sv_listen_dp.value || sv_listen_nq.value)	//set listen to 1 to allow qw connections, 2 to allow nq connections too.
 				{
 					if (sv_reportheartbeats.value)
-						Con_Printf ("Sending heartbeat to %s (%s)\n", NET_AdrToString (adr, sizeof(adr), &sv_masterlist[i].adr), sv_masterlist[i].cv.string);
+						Con_TPrintf ("Sending heartbeat to %s (%s)\n", NET_AdrToString (adr, sizeof(adr), &sv_masterlist[i].adr), sv_masterlist[i].cv.string);
 
 					{
 						char *str = "\377\377\377\377heartbeat DarkPlaces\x0A";
@@ -4618,7 +4619,7 @@ void Master_Shutdown (void)
 			{
 			case MP_QUAKEWORLD:
 				if (sv_reportheartbeats.value)
-					Con_Printf ("Sending shutdown to %s\n", NET_AdrToString (adr, sizeof(adr), &sv_masterlist[i].adr));
+					Con_TPrintf ("Sending shutdown to %s\n", NET_AdrToString (adr, sizeof(adr), &sv_masterlist[i].adr));
 
 				NET_SendPacket (NS_SERVER, strlen(string), string, &sv_masterlist[i].adr);
 				break;
@@ -4820,7 +4821,7 @@ void SV_ExtractFromUserinfo (client_t *cl, qboolean verbose)
 	if (strncmp(newname, cl->name, sizeof(cl->namebuf)-1))
 	{
 		if (cl->ismuted && *cl->name && verbose)	//!verbose is a gamecode-forced update, where the gamecode is expected to know what its doing.
-			SV_ClientTPrintf (cl, PRINT_HIGH, STL_NONAMEASMUTE);
+			SV_ClientTPrintf (cl, PRINT_HIGH, "Muted players may not change their names\n");
 		else
 		{
 
@@ -4834,8 +4835,8 @@ void SV_ExtractFromUserinfo (client_t *cl, qboolean verbose)
 				}
 				else if (cl->lastnamecount++ > 4 && verbose)
 				{
-					SV_BroadcastTPrintf (PRINT_HIGH, STL_CLIENTKICKEDNAMESPAM, cl->name);
-					SV_ClientTPrintf (cl, PRINT_HIGH, STL_YOUWEREKICKEDNAMESPAM);
+					SV_BroadcastTPrintf (PRINT_HIGH, "%s was kicked for name spamming\n", cl->name);
+					SV_ClientTPrintf (cl, PRINT_HIGH, "You were kicked for name spamming\n");
 					SV_DropClient (cl);
 					return;
 				}
@@ -4843,7 +4844,7 @@ void SV_ExtractFromUserinfo (client_t *cl, qboolean verbose)
 
 			if (*cl->name && cl->state >= cs_spawned && !cl->spectator && verbose)
 			{
-				SV_BroadcastTPrintf (PRINT_HIGH, STL_CLIENTNAMECHANGE, cl->name, newname);
+				SV_BroadcastTPrintf (PRINT_HIGH, "%s changed their name to %s\n", cl->name, newname);
 			}
 			Q_strncpyz (cl->name, newname, sizeof(cl->namebuf));
 
@@ -4855,7 +4856,7 @@ void SV_ExtractFromUserinfo (client_t *cl, qboolean verbose)
 #ifdef SVRANKING
 			}
 			else if (cl->state >= cs_spawned && *rank_filename.string && verbose)
-				SV_ClientPrintf(cl, PRINT_HIGH, "Your rankings name has not been changed\n");
+				SV_ClientTPrintf(cl, PRINT_HIGH, "Your rankings name has not been changed\n");
 #endif
 		}
 	}
@@ -4863,22 +4864,17 @@ void SV_ExtractFromUserinfo (client_t *cl, qboolean verbose)
 	Info_SetValueForKey(cl->userinfo, "name", newname, sizeof(cl->userinfo));
 
 	val = Info_ValueForKey (cl->userinfo, "lang");
-	cl->language = atoi(val);
-	if (!cl->language)
-		cl->language = LANGDEFAULT;
+	cl->language = *val?TL_FindLanguage(val):svs.language;
 
 	val = Info_ValueForKey (cl->userinfo, "nogib");
-	if (atoi(val))
-		cl->gibfilter = true;
-	else
-		cl->gibfilter = false;
+	cl->gibfilter = !!atoi(val);
 
 	// rate command
 	val = Info_ValueForKey (cl->userinfo, "rate");
 	if (strlen(val))
 		cl->rate = atoi(val);
 	else
-		cl->rate = ISNQCLIENT(cl)?10000:2500;
+		cl->rate = ISNQCLIENT(cl)?10000:2500;	//an nq client cannot cope with quakeworld's default rate, and typically doesn't have rate set either.
 
 	val = Info_ValueForKey (cl->userinfo, "drate");
 	if (strlen(val))
@@ -5057,11 +5053,11 @@ void SV_Init (quakeparms_t *parms)
 		Cbuf_Execute ();
 
 
-		Con_TPrintf (TL_EXEDATETIME, __DATE__, __TIME__);
+		Con_TPrintf ("Exe: %s %s\n", __DATE__, __TIME__);
 
 		Con_Printf ("%s\n", version_string());
 
-		Con_TPrintf (STL_INITED, *fs_gamename.string?fs_gamename.string:"Nothing");
+		Con_TPrintf ("======== %s Initialized ========\n", *fs_gamename.string?fs_gamename.string:"Nothing");
 
 		// if a map wasn't specified on the command line, spawn start.map
 		//aliases require that we flush the cbuf in order to actually see the results.
diff --git a/engine/server/sv_nchan.c b/engine/server/sv_nchan.c
index 230b03033..4664d788e 100644
--- a/engine/server/sv_nchan.c
+++ b/engine/server/sv_nchan.c
@@ -79,7 +79,7 @@ void ClientReliable_FinishWrite(client_t *cl)
 		if (cl->backbuf.overflowed)
 		{
 			if (!cl->netchan.message.overflowed)
-				Con_TPrintf (STL_MESSAGEOVERFLOW,cl->num_backbuf,cl->name);
+				Con_TPrintf ("WARNING: backbuf [%d] reliable overflow for %s\n",cl->num_backbuf,cl->name);
 			cl->netchan.message.overflowed = true; // this will drop the client
 		}
 	}
diff --git a/engine/server/sv_send.c b/engine/server/sv_send.c
index 0fb63a033..baeb23492 100644
--- a/engine/server/sv_send.c
+++ b/engine/server/sv_send.c
@@ -231,7 +231,8 @@ EVENT MESSAGES
 =============================================================================
 */
 
-void SV_PrintToClient(client_t *cl, int level, char *string)
+//Directly print to a client without translating nor printing into an mvd. generally for error messages due to the lack of mvd thing.
+void SV_PrintToClient(client_t *cl, int level, const char *string)
 {
 	switch (cl->protocol)
 	{
@@ -265,6 +266,12 @@ void SV_PrintToClient(client_t *cl, int level, char *string)
 		break;
 	}
 }
+//translate it, but avoid 'public' mvd prints.
+void SV_TPrintToClient(client_t *cl, int level, const char *string)
+{
+	string = langtext(string, cl->language);
+	SV_PrintToClient(cl, level, string);
+}
 
 void SV_StuffcmdToClient(client_t *cl, char *string)
 {
@@ -298,6 +305,7 @@ void SV_StuffcmdToClient(client_t *cl, char *string)
 SV_ClientPrintf
 
 Sends text across to be displayed if the level passes
+Is included in mvds.
 =================
 */
 void VARGS SV_ClientPrintf (client_t *cl, int level, char *fmt, ...)
@@ -333,7 +341,7 @@ void VARGS SV_ClientTPrintf (client_t *cl, int level, translation_t stringnum, .
 {
 	va_list		argptr;
 	char		string[1024];
-	char *fmt = languagetext[stringnum][cl->language];
+	const char *fmt = langtext(stringnum, cl->language);
 
 	if (level < cl->messagelevel)
 		return;
@@ -411,7 +419,7 @@ void VARGS SV_BroadcastTPrintf (int level, translation_t stringnum, ...)
 	client_t	*cl;
 	int			i;
 	int oldlang=-1;
-	char *fmt = languagetext[stringnum][oldlang=svs.language];
+	const char *fmt = langtext(stringnum, oldlang=svs.language);
 
 	va_start (argptr,stringnum);
 	vsnprintf (string,sizeof(string)-1, fmt,argptr);
@@ -433,7 +441,7 @@ void VARGS SV_BroadcastTPrintf (int level, translation_t stringnum, ...)
 
 		if (oldlang!=cl->language)
 		{
-			fmt = languagetext[stringnum][oldlang=cl->language];
+			fmt = langtext(stringnum, oldlang=cl->language);
 
 			va_start (argptr,stringnum);
 			vsnprintf (string,sizeof(string)-1, fmt,argptr);
diff --git a/engine/server/sv_user.c b/engine/server/sv_user.c
index 879d10cf7..74aa9f964 100644
--- a/engine/server/sv_user.c
+++ b/engine/server/sv_user.c
@@ -257,7 +257,7 @@ void SV_New_f (void)
 //spawns.  These functions are written to not overflow
 /*	if (host_client->num_backbuf)
 	{
-		Con_TPrintf(STL_BACKBUFSET, host_client->name, host_client->netchan.message.cursize);
+		Con_Printf("WARNING %s: [SV_New] Back buffered (%d0, clearing)\n", host_client->name, host_client->netchan.message.cursize);
 		host_client->num_backbuf = 0;
 		SZ_Clear(&host_client->netchan.message);
 	}
@@ -1429,7 +1429,7 @@ void SVQW_PreSpawn_f (void)
 		{
 			char *msg;
 			SV_ClientTPrintf (host_client, PRINT_HIGH,
-				STL_MAPCHEAT,
+				"Map model file does not match (%s), %i != %i/%i.\nYou may need a new version of the map, or the proper install files.\n",
 				sv.modelname, check, sv.world.worldmodel->checksum, sv.world.worldmodel->checksum2);
 
 
@@ -1848,7 +1848,7 @@ void SV_Begin_f (void)
 
 		if (pmodel != sv.model_player_checksum ||
 			emodel != sv.eyes_player_checksum)
-			SV_BroadcastTPrintf (PRINT_HIGH, STL_POSSIBLEMODELCHEAT, host_client->name);
+			SV_BroadcastTPrintf (PRINT_HIGH, "warning: %s eyes or player model does not match\n", host_client->name);
 	}
 
 	// if we are paused, tell the client
@@ -1860,7 +1860,7 @@ void SV_Begin_f (void)
 			ClientReliableWrite_Byte (host_client, sv.paused!=0);
 		}
 		if (sv.paused&~4)
-			SV_ClientTPrintf(host_client, PRINT_HIGH, STL_SERVERPAUSED);
+			SV_ClientTPrintf(host_client, PRINT_HIGH, "server is paused\n");
 	}
 
 	if (sendangles)
@@ -1997,7 +1997,7 @@ void SV_NextChunkedDownload(unsigned int chunknum, int ezpercent, int ezfilenum)
 
 	if (chunknum*CHUNKSIZE > host_client->downloadsize)
 	{
-		SV_ClientPrintf (host_client, PRINT_HIGH, "Warning: Invalid file chunk requested %u to %u of %u.\n", chunknum*CHUNKSIZE, (chunknum+1)*CHUNKSIZE, host_client->downloadsize);
+		SV_ClientTPrintf (host_client, PRINT_HIGH, "Warning: Invalid file chunk requested %u to %u of %u.\n", chunknum*CHUNKSIZE, (chunknum+1)*CHUNKSIZE, host_client->downloadsize);
 		error = 2;
 	}
 
@@ -2187,7 +2187,7 @@ void SV_NextUpload (void)
 
 	if (!*host_client->uploadfn)
 	{
-		SV_ClientTPrintf(host_client, PRINT_HIGH, STL_UPLOADDENIED);
+		SV_ClientTPrintf(host_client, PRINT_HIGH, "Upload denied\n");
 		ClientReliableWrite_Begin (host_client, svc_stufftext, 8);
 		ClientReliableWrite_String (host_client, "stopul\n");
 
@@ -3032,8 +3032,7 @@ void SV_SayOne_f (void)
 
 		if (host_client->ismuted)
 		{
-			SV_ClientTPrintf(host_client, PRINT_CHAT,
-					STL_YOUAREMUTED);
+			SV_ClientTPrintf(host_client, PRINT_CHAT, "%s is muted\n");
 			return;
 		}
 
@@ -3072,7 +3071,7 @@ void SV_SayOne_f (void)
 
 	if (clnum==-1)	//none found
 	{
-		SV_ClientTPrintf(host_client, PRINT_CHAT, STL_NAMEDCLIENTDOESNTEXIST);
+		SV_ClientTPrintf(host_client, PRINT_CHAT, "client does not exist\n");
 		return;
 	}
 }
@@ -3167,8 +3166,7 @@ void SV_Say (qboolean team)
 
 	if (host_client->ismuted)
 	{
-		SV_ClientTPrintf(host_client, PRINT_CHAT,
-			STL_MUTEDCHAT);
+		SV_ClientTPrintf(host_client, PRINT_CHAT, "You cannot chat while muted\n");
 		return;
 	}
 
@@ -3179,9 +3177,7 @@ void SV_Say (qboolean team)
 
 	if ((floodtime=SV_CheckFloodProt(host_client)))
 	{
-		SV_ClientTPrintf(host_client, PRINT_CHAT,
-				STL_FLOODPROTTIME,
-					(int) (floodtime));
+		SV_ClientTPrintf(host_client, PRINT_CHAT, "You can't talk for %i more seconds\n", (int) (floodtime));
 		return;
 	}
 	SV_PushFloodProt(host_client);
@@ -3196,7 +3192,7 @@ void SV_Say (qboolean team)
 
 	if (strlen(text)+strlen(p)+2 >= sizeof(text)-10)
 	{
-		SV_ClientTPrintf(host_client, PRINT_CHAT, STL_BUFFERPROTECTION);
+		SV_ClientTPrintf(host_client, PRINT_CHAT, "buffer overflow protection: failiure\n");
 		return;
 	}
 	if (svprogfuncs)
@@ -3399,7 +3395,7 @@ void SV_Kill_f (void)
 
 	if (sv_player->v->health <= 0)
 	{
-		SV_ClientTPrintf (host_client, PRINT_HIGH, STL_NOSUICIDEWHENDEAD);
+		SV_ClientTPrintf (host_client, PRINT_HIGH, "Can't suicide -- Already dead\n");
 		return;
 	}
 
@@ -3450,22 +3446,22 @@ void SV_Pause_f (void)
 {
 	if (!pausable.value)
 	{
-		SV_ClientTPrintf (host_client, PRINT_HIGH, STL_CANTPAUSE);
+		SV_ClientTPrintf (host_client, PRINT_HIGH, "Can't pause. Not allowed\n");
 		return;
 	}
 
 	if (host_client->spectator && !svs.demoplayback)
 	{
-		SV_ClientTPrintf (host_client, PRINT_HIGH, STL_CANTPAUSESPEC);
+		SV_ClientTPrintf (host_client, PRINT_HIGH, "Spectators may not pause the game\n");
 		return;
 	}
 
 	if (SV_TogglePause(host_client))
 	{
 		if (sv.paused & 1)
-			SV_BroadcastTPrintf (PRINT_HIGH, STL_CLIENTPAUSED, host_client->name);
+			SV_BroadcastTPrintf (PRINT_HIGH, "%s paused the game\n", host_client->name);
 		else
-			SV_BroadcastTPrintf (PRINT_HIGH, STL_CLIENTUNPAUSED, host_client->name);
+			SV_BroadcastTPrintf (PRINT_HIGH, "%s unpaused the game\n", host_client->name);
 	}
 
 }
@@ -3490,7 +3486,7 @@ void SV_Drop_f (void)
 		else
 		{
 			if (!host_client->spectator)
-				SV_BroadcastTPrintf (PRINT_HIGH, STL_CLIENTDROPPED, host_client->name);
+				SV_BroadcastTPrintf (PRINT_HIGH, "%s dropped\n", host_client->name);
 		}
 		host_client->drop = true;
 	}
@@ -3536,7 +3532,7 @@ void SV_PTrack_f (void)
 
 	if (!SV_CanTrack(host_client, i+1))
 	{
-		SV_ClientTPrintf (host_client, PRINT_HIGH, STL_INVALIDTRACKCLIENT);
+		SV_ClientTPrintf (host_client, PRINT_HIGH, "invalid player to track\n");
 		host_client->spec_track = 0;
 		ent = EDICT_NUM(svprogfuncs, host_client - svs.clients + 1);
 		tent = EDICT_NUM(svprogfuncs, 0);
@@ -3573,7 +3569,7 @@ void SV_Rate_f (void)
 	Info_SetValueForKey (host_client->userinfo, "rate", Cmd_Argv(1), sizeof(host_client->userinfo));
 	SV_ExtractFromUserinfo (host_client, true);
 
-	SV_ClientTPrintf (host_client, PRINT_HIGH, STL_RATESETTO, SV_RateForClient(host_client));
+	SV_ClientTPrintf (host_client, PRINT_HIGH, "rate is changed to %i\n", SV_RateForClient(host_client));
 }
 
 
@@ -3588,14 +3584,14 @@ void SV_Msg_f (void)
 {
 	if (Cmd_Argc() != 2)
 	{
-		SV_ClientTPrintf (host_client, PRINT_HIGH, STL_CURRENTMSGLEVEL,
+		SV_ClientTPrintf (host_client, PRINT_HIGH, "current msg level is %i\n",
 			host_client->messagelevel);
 		return;
 	}
 
 	host_client->messagelevel = atoi(Cmd_Argv(1));
 
-	SV_ClientTPrintf (host_client, PRINT_HIGH, STL_MSGLEVELSET, host_client->messagelevel);
+	SV_ClientTPrintf (host_client, PRINT_HIGH, "new msg level set to %i\n", host_client->messagelevel);
 }
 
 qboolean SV_UserInfoIsBasic(char *infoname)
@@ -3755,7 +3751,7 @@ void SV_NoSnap_f(void)
 	if (*host_client->uploadfn)
 	{
 		*host_client->uploadfn = 0;
-		SV_BroadcastTPrintf (PRINT_HIGH, STL_SNAPREFUSED, host_client->name);
+		SV_BroadcastTPrintf (PRINT_HIGH, "%s refused remote screenshot\n", host_client->name);
 	}
 }
 
@@ -3860,12 +3856,12 @@ void SV_Vote_f (void)
 
 	if (!votelevel.value)
 	{
-		SV_ClientTPrintf(host_client, PRINT_HIGH, STL_NOVOTING);
+		SV_ClientTPrintf(host_client, PRINT_HIGH, "Voting was dissallowed\n");
 		return;
 	}
 	if (host_client->ismuted)
 	{
-		SV_ClientTPrintf(host_client, PRINT_HIGH, STL_MUTEDVOTE);
+		SV_ClientTPrintf(host_client, PRINT_HIGH, "Sorry, you cannot vote when muted as it may allow you to send a message.\n");
 		return;
 	}
 
@@ -3879,7 +3875,7 @@ void SV_Vote_f (void)
 		base = NULL;
 	if (strchr(command, ';') || !strcmp(command, "if"))
 	{
-		SV_ClientTPrintf(host_client, PRINT_HIGH, STL_BADVOTE);
+		SV_ClientTPrintf(host_client, PRINT_HIGH, "You arn't allowed to vote for that\n");
 		return;
 	}
 	num = Cmd_Level(command);
@@ -3887,7 +3883,7 @@ void SV_Vote_f (void)
 		*base = ' ';
 	if (num != Cmd_ExecLevel)
 	{
-		SV_ClientTPrintf(host_client, PRINT_HIGH, STL_BADVOTE);
+		SV_ClientTPrintf(host_client, PRINT_HIGH, "You arn't allowed to vote for that\n");
 		return;
 	}
 
@@ -3901,13 +3897,13 @@ void SV_Vote_f (void)
 	if (VoteCount(command, id))
 	{
 		VoteRemoveCommands(command, id);
-		SV_ClientTPrintf(host_client, PRINT_HIGH, STL_OLDVOTEREMOVED);
+		SV_ClientTPrintf(host_client, PRINT_HIGH, "Old vote removed.\n");
 		return;
 	}
 	if (VoteCount(NULL, id)>=3)
 	{
 		VoteRemoveCommands(NULL, id);
-		SV_ClientTPrintf(host_client, PRINT_HIGH, STL_VOTESREMOVED);
+		SV_ClientTPrintf(host_client, PRINT_HIGH, "All votes removed.\n");
 	}
 
 	num = VoteCount(command, -1)+1;
@@ -3922,7 +3918,7 @@ void SV_Vote_f (void)
 
 	if (passes)	//>min number of votes, and meets the percent required
 	{
-		SV_BroadcastTPrintf(PRINT_HIGH, STL_FINALVOTE, host_client->name, command);
+		SV_BroadcastTPrintf(PRINT_HIGH, "%s casts final vote for '%s'\n", host_client->name, command);
 
 		VoteRemoveCommands(command, -1);
 		Cbuf_AddText(command, votelevel.value);
@@ -3932,7 +3928,7 @@ void SV_Vote_f (void)
 	}
 	else	//otherwise, try later.
 	{
-		SV_BroadcastTPrintf(PRINT_HIGH, STL_VOTE, host_client->name, command);
+		SV_BroadcastTPrintf(PRINT_HIGH, "%s casts a vote for '%s'\n", host_client->name, command);
 
 		VoteAdd(command, id);
 	}
@@ -3958,15 +3954,15 @@ void Cmd_God_f (void)
 {
 	if (!SV_MayCheat())
 	{
-		SV_PrintToClient(host_client, PRINT_HIGH, "Cheats are not allowed on this server\n");
+		SV_TPrintToClient(host_client, PRINT_HIGH, "Cheats are not allowed on this server\n");
 		return;
 	}
 
 	SV_LogPlayer(host_client, "god cheat");
 	if ((int) (sv_player->v->flags = (int) sv_player->v->flags ^ FL_GODMODE) & FL_GODMODE)
-		SV_ClientPrintf (host_client, PRINT_HIGH, "godmode ON\n");
+		SV_ClientTPrintf (host_client, PRINT_HIGH, "godmode ON\n");
 	else
-		SV_ClientPrintf (host_client, PRINT_HIGH, "godmode OFF\n");
+		SV_ClientTPrintf (host_client, PRINT_HIGH, "godmode OFF\n");
 }
 
 
@@ -3985,7 +3981,7 @@ void Cmd_Give_f (void)
 
 	if (!SV_MayCheat())
 	{
-		SV_PrintToClient(host_client, PRINT_HIGH, "Cheats are not allowed on this server\n");
+		SV_TPrintToClient(host_client, PRINT_HIGH, "Cheats are not allowed on this server\n");
 		return;
 	}
 
@@ -4024,21 +4020,21 @@ void Cmd_Give_f (void)
 			sv_player->v->ammo_cells = v;
 			break;
 		default:
-			Con_Printf("give: unknown item\n");
+			SV_TPrintToClient(host_client, PRINT_HIGH, "give: unknown item\n");
 		}
 	}
 	else
 	{
 		if (developer.value < 2 && host_client->netchan.remote_address.type != NA_LOOPBACK)	//we don't want clients doing nasty things... like setting movetype 3123
 		{
-			SV_PrintToClient(host_client, PRINT_HIGH, "'give' debugging command requires developer 2 set on the server before you may use it\n");
+			SV_TPrintToClient(host_client, PRINT_HIGH, "'give' debugging command requires developer 2 set on the server before you may use it\n");
 		}
 		else
 		{
 			int oldself;
 			oldself = pr_global_struct->self;
 			pr_global_struct->self = EDICT_TO_PROG(svprogfuncs, sv_player);
-			SV_ClientPrintf(host_client, PRINT_HIGH, "Result: %s\n", svprogfuncs->EvaluateDebugString(svprogfuncs, Cmd_Args()));
+			SV_ClientTPrintf(host_client, PRINT_HIGH, "Result: %s\n", svprogfuncs->EvaluateDebugString(svprogfuncs, Cmd_Args()));
 			pr_global_struct->self = oldself;
 		}
 	}
@@ -4048,7 +4044,7 @@ void Cmd_Noclip_f (void)
 {
 	if (!SV_MayCheat())
 	{
-		SV_PrintToClient(host_client, PRINT_HIGH, "Cheats are not allowed on this server\n");
+		SV_TPrintToClient(host_client, PRINT_HIGH, "Cheats are not allowed on this server\n");
 		return;
 	}
 
@@ -4057,7 +4053,7 @@ void Cmd_Noclip_f (void)
 	{
 		sv_player->v->movetype = MOVETYPE_NOCLIP;
 		sv_player->v->solid = SOLID_TRIGGER;
-		SV_ClientPrintf (host_client, PRINT_HIGH, "noclip ON\n");
+		SV_ClientTPrintf (host_client, PRINT_HIGH, "noclip ON\n");
 	}
 	else
 	{
@@ -4066,7 +4062,7 @@ void Cmd_Noclip_f (void)
 			sv_player->v->solid = SOLID_SLIDEBOX;
 		else
 			sv_player->v->solid = SOLID_NOT;
-		SV_ClientPrintf (host_client, PRINT_HIGH, "noclip OFF\n");
+		SV_ClientTPrintf (host_client, PRINT_HIGH, "noclip OFF\n");
 	}
 }
 
@@ -4074,7 +4070,7 @@ void Cmd_Fly_f (void)
 {
 	if (!SV_MayCheat())
 	{
-		SV_PrintToClient(host_client, PRINT_HIGH, "Cheats are not allowed on this server\n");
+		SV_TPrintToClient(host_client, PRINT_HIGH, "Cheats are not allowed on this server\n");
 		return;
 	}
 
@@ -4082,7 +4078,7 @@ void Cmd_Fly_f (void)
 	if (sv_player->v->movetype != MOVETYPE_FLY)
 	{
 		sv_player->v->movetype = MOVETYPE_FLY;
-		SV_ClientPrintf (host_client, PRINT_HIGH, "flymode ON\n");
+		SV_ClientTPrintf (host_client, PRINT_HIGH, "flymode ON\n");
 	}
 	else
 	{
@@ -4091,7 +4087,7 @@ void Cmd_Fly_f (void)
 			sv_player->v->solid = SOLID_SLIDEBOX;
 		else
 			sv_player->v->solid = SOLID_NOT;
-		SV_ClientPrintf (host_client, PRINT_HIGH, "flymode OFF\n");
+		SV_ClientTPrintf (host_client, PRINT_HIGH, "flymode OFF\n");
 	}
 }
 
@@ -4105,7 +4101,7 @@ void Cmd_SetPos_f(void)
 {
 	if (!SV_MayCheat())
 	{
-		SV_PrintToClient(host_client, PRINT_HIGH, "Cheats are not allowed on this server\n");
+		SV_TPrintToClient(host_client, PRINT_HIGH, "Cheats are not allowed on this server\n");
 		return;
 	}
 
@@ -4118,7 +4114,7 @@ void Cmd_SetPos_f(void)
 	if (sv_player->v->movetype != MOVETYPE_NOCLIP)
 	{
 		sv_player->v->movetype = MOVETYPE_NOCLIP;
-		SV_PrintToClient(host_client, PRINT_HIGH, "noclip on\n");
+		SV_TPrintToClient(host_client, PRINT_HIGH, "noclip on\n");
 	}
 
 	sv_player->v->origin[0] = atof(Cmd_Argv(1));
@@ -4197,19 +4193,19 @@ void Cmd_Join_f (void)
 
 	if (svs.gametype != GT_PROGS)
 	{
-		SV_PrintToClient(host_client, PRINT_HIGH, "Sorry, not implemented in this gamecode type. Try moaning at the dev team\n");
+		SV_TPrintToClient(host_client, PRINT_HIGH, "Sorry, not implemented in this gamecode type. Try moaning at the dev team\n");
 		return;
 	}
 
 	if (!(host_client->zquake_extensions & Z_EXT_JOIN_OBSERVE))
 	{
-		SV_PrintToClient(host_client, PRINT_HIGH, "Your QW client doesn't support this command\n");
+		SV_TPrintToClient(host_client, PRINT_HIGH, "Your game client doesn't support this command\n");
 		return;
 	}
 
 	if (password.string[0] && stricmp(password.string, "none"))
 	{
-		SV_ClientPrintf(host_client, PRINT_HIGH, "This server requires a %s password. Please disconnect, set the password and reconnect as %s.\n", "player", "player");
+		SV_ClientTPrintf(host_client, PRINT_HIGH, "This server requires a %s password. Please disconnect, set the password and reconnect as %s.\n", "player", "player");
 		return;
 	}
 
@@ -4225,7 +4221,7 @@ void Cmd_Join_f (void)
 	}
 	if (numclients+seats > maxclients.value)
 	{
-		SV_PrintToClient(host_client, PRINT_HIGH, "Can't join, all player slots full\n");
+		SV_TPrintToClient(host_client, PRINT_HIGH, "Can't join, all player slots full\n");
 		return;
 	}
 
@@ -4307,19 +4303,19 @@ void Cmd_Observe_f (void)
 
 	if (svs.gametype != GT_PROGS)
 	{
-		SV_PrintToClient(host_client, PRINT_HIGH, "Sorry, not implemented in this gamecode type. Try moaning at the dev team\n");
+		SV_TPrintToClient(host_client, PRINT_HIGH, "Sorry, not implemented in this gamecode type. Try moaning at the dev team\n");
 		return;
 	}
 
 	if (!(host_client->zquake_extensions & Z_EXT_JOIN_OBSERVE))
 	{
-		SV_PrintToClient(host_client, PRINT_HIGH, "Your QW client doesn't support this command\n");
+		SV_TPrintToClient(host_client, PRINT_HIGH, "Your game client doesn't support this command\n");
 		return;
 	}
 
 	if (spectator_password.string[0] && stricmp(spectator_password.string, "none"))
 	{
-		SV_ClientPrintf(host_client, PRINT_HIGH, "This server requires a %s password. Please disconnect, set the password and reconnect as %s.\n", "spectator", "spectator");
+		SV_ClientTPrintf(host_client, PRINT_HIGH, "This server requires a %s password. Please disconnect, set the password and reconnect as %s.\n", "spectator", "spectator");
 		return;
 	}
 
@@ -4335,7 +4331,7 @@ void Cmd_Observe_f (void)
 	}
 	if (numspectators+seats > maxspectators.value)
 	{
-		SV_PrintToClient(host_client, PRINT_HIGH, "Can't join, all spectator slots full\n");
+		SV_TPrintToClient(host_client, PRINT_HIGH, "Can't join, all spectator slots full\n");
 		return;
 	}
 
@@ -4489,7 +4485,7 @@ void SV_DisableClientsCSQC(void)
 }
 
 void SV_UserCmdMVDList_f (void);
-void SV_STFU_f(void)
+static void SV_STFU_f(void)
 {
 	char *msg;
 	SV_ClientPrintf(host_client, 255, "stfu\n");
@@ -4663,7 +4659,7 @@ void SVNQ_Begin_f (void)
 
 		if (pmodel != sv.model_player_checksum ||
 			emodel != sv.eyes_player_checksum)
-			SV_BroadcastPrintf (PRINT_HIGH, "warning: %s eyes or player model not verified\n", host_client->name);
+			SV_BroadcastTPrintf (PRINT_HIGH, "warning: %s eyes or player model not verified\n", host_client->name);
 	}
 
 
@@ -4676,7 +4672,7 @@ void SVNQ_Begin_f (void)
 			ClientReliableWrite_Byte (host_client, sv.paused!=0);
 		}
 		if (sv.paused&~4)
-			SV_ClientTPrintf(host_client, PRINT_HIGH, STL_SERVERPAUSED!=0);
+			SV_ClientTPrintf(host_client, PRINT_HIGH, "server is paused\n");
 	}
 
 	if (sendangles)
@@ -4785,6 +4781,8 @@ void SVNQ_Ping_f(void)
 	int i;
 	client_t *cl;
 
+	//don't translate this, most advanced clients (including us) automate and parse them, the results being visible in the scoreboard and NOT the console.
+	//translating these prints can thus confuse things greatly.
 	SV_PrintToClient(host_client, PRINT_HIGH, "Client ping times:\n");
 	for (i=0,cl=svs.clients ; i<MAX_CLIENTS ; i++,cl++)
 	{
@@ -4897,7 +4895,7 @@ ucmd_t ucmds[] =
 	{"begin", SV_Begin_f, true},
 
 	/*ezquake warning*/
-	{"al", SV_STFU_f, true},
+	{"al", SV_STFU_f, true},	//can probably be removed now.
 
 	{"drop", SV_Drop_f},
 	{"disconnect", SV_Drop_f},
@@ -5148,7 +5146,7 @@ void SV_ExecuteUserCommand (char *s, qboolean fromQC)
 				return;
 			}
 
-			Con_Printf ("cmd from %s:\n%s\n"
+			Con_TPrintf ("cmd from %s:\n%s\n"
 				, host_client->name, net_message.data+4);
 
 			SV_BeginRedirect (RD_CLIENT, host_client->language);
@@ -5176,7 +5174,7 @@ void SV_ExecuteUserCommand (char *s, qboolean fromQC)
 			return;
 		}
 #endif
-		Con_Printf ("Bad user command: %s\n", Cmd_Argv(0));
+		Con_TPrintf ("Bad user command: %s\n", Cmd_Argv(0));
 	}
 
 	host_client = oldhost;
@@ -5572,14 +5570,14 @@ void SV_RunCmd (usercmd_t *ucmd, qboolean recurse)
 			{
 				host_client->msec_cheating++;
 				SV_BroadcastTPrintf(PRINT_HIGH,
-						STL_SPEEDCHEATPOSSIBLE,
+						"Speed cheat possibility, analyzing:\n  %d %.1f %d for: %s\n",
 							host_client->msecs, tmp_time,
 							host_client->msec_cheating, host_client->name);
 
 				if (host_client->msec_cheating >= 2)
 				{
 					SV_BroadcastTPrintf(PRINT_HIGH,
-							STL_SPEEDCHEATKICKED,
+							"%s was kicked for speedcheating (%s)\n",
 								host_client->name, NET_AdrToString(adr, sizeof(adr), &host_client->netchan.remote_address));
 					host_client->drop = true;	//drop later
 				}
diff --git a/fteqtv/rcon.c b/fteqtv/rcon.c
index 3ed8285e2..97dfca003 100644
--- a/fteqtv/rcon.c
+++ b/fteqtv/rcon.c
@@ -195,7 +195,7 @@ void Info_SetValueForStarKey (char *s, const char *key, const char *value, int m
 		// don't change it!
 		if (strlen(value) - strlen(v) + strlen(s) + 1 > maxsize)
 		{
-	//		Con_TPrintf (TL_INFOSTRINGTOOLONG);
+	//		Con_Printf ("Info string length exceeded\n");
 			return;
 		}
 	}
diff --git a/plugins/plugin.c b/plugins/plugin.c
index 46d5a077e..e15637e39 100644
--- a/plugins/plugin.c
+++ b/plugins/plugin.c
@@ -255,7 +255,7 @@ BUILTINR(float, cos, (float f));
 #endif
 
 
-char	*va(char *format, ...)	//Identical in function to the one in Quake, though I can assure you that I wrote it...
+char	*va(const char *format, ...)	//Identical in function to the one in Quake, though I can assure you that I wrote it...
 {					//It's not exactly hard, just easy to use, so gets duplicated lots.
 	va_list		argptr;
 	static char		string[1024];
diff --git a/plugins/plugin.h b/plugins/plugin.h
index 300ae0e86..e8c2db340 100644
--- a/plugins/plugin.h
+++ b/plugins/plugin.h
@@ -247,7 +247,7 @@ EBUILTIN(qhandle_t, Net_Accept, (qhandle_t socket, char *address, int addresssiz
 EBUILTIN(int, Net_Recv, (qhandle_t socket, void *buffer, int len));
 EBUILTIN(int, Net_Send, (qhandle_t socket, void *buffer, int len));
 EBUILTIN(void, Net_Close, (qhandle_t socket));
-#define N_WOULDBLOCK -1
+#define N_WOULDBLOCK 0
 #define NET_CLIENTPORT -1
 #define NET_SERVERPORT -2
 
@@ -261,7 +261,7 @@ EBUILTIN(float, sin, (float f));
 #endif
 
 typedef qintptr_t (*export_t) (qintptr_t *args);
-char	*va(char *format, ...);
+char	*va(const char *format, ...);
 qintptr_t Plug_Init(qintptr_t *args);
 qboolean Plug_Export(const char *name, export_t func);
 void Con_Printf(const char *format, ...);