Index: /binary-improvements/7dtd-server-fixes/7dtd-server-fixes.csproj
===================================================================
--- /binary-improvements/7dtd-server-fixes/7dtd-server-fixes.csproj	(revision 82)
+++ /binary-improvements/7dtd-server-fixes/7dtd-server-fixes.csproj	(revision 83)
@@ -31,5 +31,8 @@
     <Reference Include="System" />
     <Reference Include="Assembly-CSharp">
-      <HintPath>..\assembly-patcher\bin\Release\Assembly-CSharp.dll</HintPath>
+      <HintPath>..\NamePatcher\bin\Release\Assembly-CSharp.dll</HintPath>
+    </Reference>
+    <Reference Include="UnityEngine">
+      <HintPath>..\assembly-patcher\bin\Release\UnityEngine.dll</HintPath>
     </Reference>
   </ItemGroup>
@@ -39,7 +42,8 @@
     <Compile Include="src\AllocsTelnetConnection.cs" />
     <Compile Include="src\TelnetCommands\GetTime.cs" />
-    <Compile Include="src\AllocsRequestToSpawnPlayer.cs" />
     <Compile Include="src\TelnetCommands\ListPlayersExtended.cs" />
     <Compile Include="src\TelnetCommands\GetGamePrefs.cs" />
+    <Compile Include="src\TelnetCommands\SayToPlayer.cs" />
+    <Compile Include="src\AllocsLogFunctions.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
Index: /binary-improvements/7dtd-server-fixes/src/AllocsLogFunctions.cs
===================================================================
--- /binary-improvements/7dtd-server-fixes/src/AllocsLogFunctions.cs	(revision 83)
+++ /binary-improvements/7dtd-server-fixes/src/AllocsLogFunctions.cs	(revision 83)
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class AllocsLogFunctions
+{
+	public static void RequestToSpawnPlayer (GameManager manager, int _clientId, string _name, string _playerClassname, string _skinTexture, int _chunkViewDim)
+	{
+		string ip = manager.connectionManager.connectedClients [_clientId].networkPlayer.ipAddress;
+		string name = string.Empty;
+		int entityId = -1;
+		Dictionary<int,int> d = manager.connectionManager.mapClientToEntity;
+		if (d.ContainsKey (_clientId)) {
+			entityId = d [_clientId];
+			World w = manager.World;
+			name = w.playerEntities.dict [entityId].EntityName;
+		}
+
+		Log.Out ("Player connected, clientid=" + _clientId +
+			", entityid=" + entityId +
+			", name=" + name +
+			", steamid=" + SingletonMonoBehaviour<Authenticator>.Instance.GetPlayerId (name) +
+			", ip=" + ip
+		);
+	}
+
+	public static void ExecuteCmdFromClient (ConsoleSdtd console, NetworkPlayer _networkPlayer, string _playerID, string _command)
+	{
+		Log.Out ("Executed command \"" + _command + "\" from player \"" + _playerID + "\"");
+	}
+}
Index: /binary-improvements/7dtd-server-fixes/src/AllocsNetTelnetServer.cs
===================================================================
--- /binary-improvements/7dtd-server-fixes/src/AllocsNetTelnetServer.cs	(revision 82)
+++ /binary-improvements/7dtd-server-fixes/src/AllocsNetTelnetServer.cs	(revision 83)
@@ -136,4 +136,5 @@
 		console.AddCommand(new GetTime(console));
 		console.AddCommand(new ListPlayersExtended(console));
+		console.AddCommand(new SayToPlayer(console));
 	}
 
Index: nary-improvements/7dtd-server-fixes/src/AllocsRequestToSpawnPlayer.cs
===================================================================
--- /binary-improvements/7dtd-server-fixes/src/AllocsRequestToSpawnPlayer.cs	(revision 82)
+++ 	(revision )
@@ -1,24 +1,0 @@
-using System;
-using System.Collections.Generic;
-
-public class AllocsRequestToSpawnPlayer
-{
-	public static void RequestToSpawnPlayer (GameManager manager, int _clientId, string _name, string _playerClassname, string _skinTexture, int _chunkViewDim)
-	{
-		string ip = manager.connectionManager.connectedClients [_clientId].networkPlayer.ipAddress;
-		string name = string.Empty;
-		int entityId = -1;
-		Dictionary<int,int> d = manager.connectionManager.mapClientToEntity;
-		if (d.ContainsKey (_clientId)) {
-			entityId = d [_clientId];
-			World w = manager.World;
-			name = w.playerEntities.dict [entityId].EntityName;
-		}
-
-		Log.Out ("Player connected, clientid=" + _clientId +
-		         ", entityid=" + entityId +
-		         ", name=" + name +
-		         ", steamid=" + SingletonMonoBehaviour<Authenticator>.Instance.GetPlayerId (name) +
-		         ", ip=" + ip);
-	}
-}
Index: /binary-improvements/7dtd-server-fixes/src/TelnetCommands/GetGamePrefs.cs
===================================================================
--- /binary-improvements/7dtd-server-fixes/src/TelnetCommands/GetGamePrefs.cs	(revision 83)
+++ /binary-improvements/7dtd-server-fixes/src/TelnetCommands/GetGamePrefs.cs	(revision 83)
@@ -0,0 +1,73 @@
+using System;
+using System.Collections.Generic;
+
+public class GetGamePrefs : ConsoleCommand
+{
+	private string[] forbiddenPrefs = new string[] {
+			"telnet",
+			"adminfilename",
+			"controlpanel",
+			"password",
+			"savegamefolder",
+			"options",
+			"last"
+		};
+
+	private bool prefAccessAllowed (EnumGamePrefs gp)
+	{
+		string gpName = gp.ToString ().ToLower ();
+		foreach (string s in forbiddenPrefs) {
+			if (gpName.Contains (s)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	public GetGamePrefs (ConsoleSdtd cons) : base(cons)
+	{
+	}
+
+	public override string Description ()
+	{
+		return "gets a game pref";
+	}
+
+	public override string[] Names ()
+	{
+		return new string[]
+		{
+			"getgamepref",
+			"gg"
+		};
+	}
+
+	public override void Run (string[] _params)
+	{
+		if (_params.Length <= 0) {
+			SortedList<string, string> sortedList = new SortedList<string, string> ();
+			foreach (EnumGamePrefs gp in Enum.GetValues(typeof(EnumGamePrefs))) {
+				if (prefAccessAllowed (gp))
+					sortedList.Add (gp.ToString (), string.Format ("{0} = {1}", gp.ToString (), GamePrefs.GetObject (gp)));
+			}
+			foreach (string s in sortedList.Keys) {
+				m_Console.md000a (sortedList [s]);
+			}
+			return;
+		}
+
+		EnumGamePrefs enumGamePrefs;
+		try {
+			enumGamePrefs = (EnumGamePrefs)((int)Enum.Parse (typeof(EnumGamePrefs), _params [0]));
+		} catch (Exception) {
+			m_Console.md000a ("Error parsing parameter: " + _params [0]);
+			return;
+		}
+
+		if (prefAccessAllowed (enumGamePrefs))
+			m_Console.md000a (string.Format ("{0} = {1}", enumGamePrefs, GamePrefs.GetObject (enumGamePrefs)));
+		else
+			m_Console.md000a ("Access to requested preference is forbidden");
+	}
+}
+
Index: /binary-improvements/7dtd-server-fixes/src/TelnetCommands/SayToPlayer.cs
===================================================================
--- /binary-improvements/7dtd-server-fixes/src/TelnetCommands/SayToPlayer.cs	(revision 83)
+++ /binary-improvements/7dtd-server-fixes/src/TelnetCommands/SayToPlayer.cs	(revision 83)
@@ -0,0 +1,79 @@
+using System;
+using System.Collections.Generic;
+
+public class SayToPlayer : ConsoleCommand
+{
+	private GameManager manager;
+
+	public SayToPlayer (ConsoleSdtd cons) : base(cons)
+	{
+		manager = m_Console.gameManager;
+	}
+
+	public override string Description ()
+	{
+		return "send a message to a single player";
+	}
+
+	public override string[] Names ()
+	{
+		return new string[] { "sayplayer", string.Empty };
+	}
+
+	public override void Run (string[] _params)
+	{
+		if (_params.Length < 2) {
+			m_Console.md000a ("Usage: sayplayer <playername|entityid> <message>");
+			return;
+		}
+
+		string message = _params [1];
+		for (int i = 2; i < _params.Length; i++) {
+			message += " " + _params [i];
+		}
+
+		int entityId = -1;
+		if (int.TryParse (_params [0], out entityId)) {
+			foreach (KeyValuePair<int, int> kvp in manager.connectionManager.mapClientToEntity) {
+				if (kvp.Value == entityId) {
+					int clientid = kvp.Key;
+					ClientInfo ci = manager.connectionManager.connectedClients[clientid];
+					if (ci != null) {
+						manager.connectionManager.networkView.RPC ("RPC_ChatMessage", ci.networkPlayer, new object[] {
+							message,
+							-1,
+							"Server (private)",
+							true
+							}
+						);
+						m_Console.md000a ("Message sent");
+						return;
+					}
+				}
+			}
+			m_Console.md000a ("Entity ID not found.");
+		} else {
+			string destPlayerName = _params [0].ToLower ();
+			foreach (ClientInfo ci in manager.connectionManager.connectedClients.Values) {
+				Dictionary<int,int> d = manager.connectionManager.mapClientToEntity;
+				if (d.ContainsKey (ci.clientId)) {
+					entityId = d [ci.clientId];
+					string curName = manager.World.playerEntities.dict [entityId].EntityName;
+					if (curName.ToLower ().Equals (destPlayerName)) {
+						manager.connectionManager.networkView.RPC ("RPC_ChatMessage", ci.networkPlayer, new object[] {
+							message,
+							-1,
+							"Server (private)",
+							true
+							}
+						);
+						m_Console.md000a ("Message sent");
+						return;
+					}
+				}
+			}
+			m_Console.md000a ("Playername not found.");
+		}
+	}
+}
+
Index: /binary-improvements/NamePatcher/NamePatcher.cs
===================================================================
--- /binary-improvements/NamePatcher/NamePatcher.cs	(revision 82)
+++ /binary-improvements/NamePatcher/NamePatcher.cs	(revision 83)
@@ -103,4 +103,12 @@
 				TypeDefinition typeConsole = mainModule.GetType (consoleTypeName);
 				string consoleCommandTypeName = string.Empty;
+				foreach (MethodDefinition md in typeConsole.Methods) {
+					if (!md.IsConstructor) {
+						if (md.Parameters.Count == 3 && md.Parameters [0].ParameterType.Name.Equals ("NetworkPlayer")) {
+							Console.WriteLine ("Renaming console method -> ExecuteCmdFromClient");
+							NameNormalizer.setName (md, "ExecuteCmdFromClient");
+						}
+					}
+				}
 				foreach (FieldDefinition fd in typeConsole.Fields) {
 					TypeReference fdType = fd.FieldType;
Index: /binary-improvements/assembly-patcher/Assembly-Patcher.userprefs
===================================================================
--- /binary-improvements/assembly-patcher/Assembly-Patcher.userprefs	(revision 82)
+++ /binary-improvements/assembly-patcher/Assembly-Patcher.userprefs	(revision 83)
@@ -1,7 +1,7 @@
 ﻿<Properties>
   <MonoDevelop.Ide.Workspace ActiveConfiguration="Release|x86" />
-  <MonoDevelop.Ide.Workbench ActiveDocument="AssemblyInfo.cs">
+  <MonoDevelop.Ide.Workbench ActiveDocument="Main.cs">
     <Files>
-      <File FileName="Main.cs" Line="38" Column="4" />
+      <File FileName="Main.cs" Line="48" Column="3" />
       <File FileName="AssemblyInfo.cs" Line="21" Column="1" />
     </Files>
Index: /binary-improvements/assembly-patcher/Main.cs
===================================================================
--- /binary-improvements/assembly-patcher/Main.cs	(revision 82)
+++ /binary-improvements/assembly-patcher/Main.cs	(revision 83)
@@ -13,4 +13,5 @@
 			telnetPatch (module);
 			connectLogPatch (module);
+			executionLogPatch( module);
 			module.Write ("Assembly-CSharp.dll");
 			Console.WriteLine ("Done");
@@ -26,5 +27,17 @@
 
 			markTypePatched (module, type);
-			addHook (type, "RequestToSpawnPlayer", true, 5, true, typeof(AllocsRequestToSpawnPlayer).GetMethod ("RequestToSpawnPlayer"));
+			addHook (type, "RequestToSpawnPlayer", true, 5, true, typeof(AllocsLogFunctions).GetMethod ("RequestToSpawnPlayer"));
+		}
+
+		private static void executionLogPatch (ModuleDefinition module)
+		{
+			TypeDefinition type = module.GetType ("ConsoleSdtd");
+
+			if (isPatched (type)) {
+				return;
+			}
+
+			markTypePatched (module, type);
+			addHook (type, "ExecuteCmdFromClient", true, 3, false, typeof(AllocsLogFunctions).GetMethod ("ExecuteCmdFromClient"));
 		}
 
