Index: binary-improvements2/CommandExtensions/src/Commands/Give.cs
===================================================================
--- binary-improvements2/CommandExtensions/src/Commands/Give.cs	(revision 391)
+++ binary-improvements2/CommandExtensions/src/Commands/Give.cs	(revision 402)
@@ -27,6 +27,5 @@
 		public override void Execute (List<string> _params, CommandSenderInfo _senderInfo) {
 			if (_params.Count != 3 && _params.Count != 4) {
-				SdtdConsole.Instance.Output ("Wrong number of arguments, expected 3 or 4, found " + _params.Count +
-				                             ".");
+				SdtdConsole.Instance.Output ($"Wrong number of arguments, expected 3 or 4, found {_params.Count}.");
 				return;
 			}
Index: binary-improvements2/CommandExtensions/src/Commands/ListItems.cs
===================================================================
--- binary-improvements2/CommandExtensions/src/Commands/ListItems.cs	(revision 391)
+++ binary-improvements2/CommandExtensions/src/Commands/ListItems.cs	(revision 402)
@@ -39,9 +39,9 @@
 				}
 
-				SdtdConsole.Instance.Output ("    " + s);
+				SdtdConsole.Instance.Output ($"    {s}");
 				listed++;
 			}
 
-			SdtdConsole.Instance.Output ("Listed " + listed + " matching items.");
+			SdtdConsole.Instance.Output ($"Listed {listed} matching items.");
 		}
 	}
Index: binary-improvements2/CommandExtensions/src/Commands/ListLandProtection.cs
===================================================================
--- binary-improvements2/CommandExtensions/src/Commands/ListLandProtection.cs	(revision 391)
+++ binary-improvements2/CommandExtensions/src/Commands/ListLandProtection.cs	(revision 402)
@@ -60,5 +60,5 @@
 						userIdFilter = ci.InternalId;
 					} else {
-						SdtdConsole.Instance.Output ("Player name or entity id \"" + _params [0] + "\" not found.");
+						SdtdConsole.Instance.Output ($"Player name or entity id \"{_params [0]}\" not found.");
 						return;
 					}
@@ -82,5 +82,5 @@
 					} catch (Exception e) {
 						SdtdConsole.Instance.Output ("Error getting current player's position");
-						Log.Out ("Error in ListLandProtection.Run: " + e);
+						Log.Out ($"Error in ListLandProtection.Run: {e}");
 						return;
 					}
@@ -114,8 +114,8 @@
 				foreach (Vector3i v in claimPositions) {
 					if (parseableOutput) {
-						SdtdConsole.Instance.Output ("LandProtectionOf: id=" + claimOwner.PlatformId +
-						                             ", playerName=" + claimOwner.Name + ", location=" + v);
+						SdtdConsole.Instance.Output (
+							$"LandProtectionOf: id={claimOwner.PlatformId}, playerName={claimOwner.Name}, location={v}");
 					} else {
-						SdtdConsole.Instance.Output ("   (" + v + ")");
+						SdtdConsole.Instance.Output ($"   ({v})");
 					}
 				}
@@ -123,5 +123,5 @@
 
 			if (userIdFilter == null) {
-				SdtdConsole.Instance.Output ("Total of " + ppl.m_lpBlockMap.Count + " keystones in the game");
+				SdtdConsole.Instance.Output ($"Total of {ppl.m_lpBlockMap.Count} keystones in the game");
 			}
 		}
Index: binary-improvements2/CommandExtensions/src/Commands/RemoveLandProtection.cs
===================================================================
--- binary-improvements2/CommandExtensions/src/Commands/RemoveLandProtection.cs	(revision 391)
+++ binary-improvements2/CommandExtensions/src/Commands/RemoveLandProtection.cs	(revision 402)
@@ -50,11 +50,9 @@
 				GameManager.Instance.SetBlocksRPC (changes);
 
-				SdtdConsole.Instance.Output ("Tried to remove #" + changes.Count +
-				                             " land protection blocks for player \"" + _id + "\". Note " +
-				                             "that only blocks in chunks that are currently loaded (close to any player) could be removed. " +
-				                             "Please check for remaining blocks by running:");
-				SdtdConsole.Instance.Output ("  listlandprotection " + _id);
+				SdtdConsole.Instance.Output (
+					$"Tried to remove #{changes.Count} land protection blocks for player \"{_id}\". Note that only blocks in chunks that are currently loaded (close to any player) could be removed. Please check for remaining blocks by running:");
+				SdtdConsole.Instance.Output ($"  listlandprotection {_id}");
 			} catch (Exception e) {
-				Log.Out ("Error in RemoveLandProtection.removeById: " + e);
+				Log.Out ($"Error in RemoveLandProtection.removeById: {e}");
 			}
 		}
@@ -87,5 +85,5 @@
 			GameManager.Instance.SetBlocksRPC (changes);
 
-			SdtdConsole.Instance.Output ("Land protection block at (" + v + ") removed");
+			SdtdConsole.Instance.Output ($"Land protection block at ({v}) removed");
 		}
 
@@ -128,9 +126,9 @@
 					} catch (Exception e) {
 						SdtdConsole.Instance.Output ("Error removing claims");
-						Log.Out ("Error in RemoveLandProtection.Run: " + e);
+						Log.Out ($"Error in RemoveLandProtection.Run: {e}");
 					}
 				} catch (Exception e) {
 					SdtdConsole.Instance.Output ("Error getting current player's position");
-					Log.Out ("Error in RemoveLandProtection.Run: " + e);
+					Log.Out ($"Error in RemoveLandProtection.Run: {e}");
 				}
 			} else if (_params.Count == 1) {
Index: binary-improvements2/CommandExtensions/src/Commands/ShowInventory.cs
===================================================================
--- binary-improvements2/CommandExtensions/src/Commands/ShowInventory.cs	(revision 391)
+++ binary-improvements2/CommandExtensions/src/Commands/ShowInventory.cs	(revision 402)
@@ -47,5 +47,5 @@
 
 			if (tag == null) {
-				SdtdConsole.Instance.Output ("Belt of player " + p.Name + ":");
+				SdtdConsole.Instance.Output ($"Belt of player {p.Name}:");
 			}
 
@@ -56,5 +56,5 @@
 
 			if (tag == null) {
-				SdtdConsole.Instance.Output ("Bagpack of player " + p.Name + ":");
+				SdtdConsole.Instance.Output ($"Bagpack of player {p.Name}:");
 			}
 
@@ -65,5 +65,5 @@
 
 			if (tag == null) {
-				SdtdConsole.Instance.Output ("Equipment of player " + p.Name + ":");
+				SdtdConsole.Instance.Output ($"Equipment of player {p.Name}:");
 			}
 
@@ -71,6 +71,5 @@
 
 			if (tag != null) {
-				SdtdConsole.Instance.Output ("tracker_item id=" + p.EntityID + ", tag=" + tag +
-				                             ", SHOWINVENTORY DONE");
+				SdtdConsole.Instance.Output ($"tracker_item id={p.EntityID}, tag={tag}, SHOWINVENTORY DONE");
 			}
 		}
@@ -94,7 +93,6 @@
 					// Tag defined -> parseable output
 					string partsMsg = DoParts (_inv [i].parts, 1, "");
-					string msg = "tracker_item id=" + _entityId + ", tag=" + _tag + ", location=" + _location +
-					             ", slot=" + i + ", item=" + _inv [i].itemName + ", qnty=" + _inv [i].count +
-					             ", quality=" + _inv [i].quality + ", parts=(" + partsMsg + ")";
+					string msg =
+						$"tracker_item id={_entityId}, tag={_tag}, location={_location}, slot={i}, item={_inv [i].itemName}, qnty={_inv [i].count}, quality={_inv [i].quality}, parts=({partsMsg})";
 					SdtdConsole.Instance.Output (msg);
 				}
@@ -140,7 +138,6 @@
 					// Tag defined -> parseable output
 					string partsMsg = DoParts (_items [slotindices [i]].parts, 1, "");
-					string msg = "tracker_item id=" + _entityId + ", tag=" + _tag + ", location=" + _location +
-					             ", slot=" + _slotname + ", item=" + item.itemName + ", qnty=1, quality=" +
-					             item.quality + ", parts=(" + partsMsg + ")";
+					string msg =
+						$"tracker_item id={_entityId}, tag={_tag}, location={_location}, slot={_slotname}, item={item.itemName}, qnty=1, quality={item.quality}, parts=({partsMsg})";
 					SdtdConsole.Instance.Output (msg);
 				}
@@ -176,5 +173,5 @@
 					}
 
-					_currentMessage += _parts [i].itemName + "@" + _parts [i].quality;
+					_currentMessage += $"{_parts [i].itemName}@{_parts [i].quality}";
 					_currentMessage = DoParts (_parts [i].parts, _indent + 1, _currentMessage);
 				}
Index: binary-improvements2/CommandExtensions/src/Commands/TestLogSpam.cs
===================================================================
--- binary-improvements2/CommandExtensions/src/Commands/TestLogSpam.cs	(revision 402)
+++ binary-improvements2/CommandExtensions/src/Commands/TestLogSpam.cs	(revision 402)
@@ -0,0 +1,75 @@
+using System.Collections;
+using System.Collections.Generic;
+using JetBrains.Annotations;
+using UnityEngine;
+
+namespace CommandExtensions.Commands {
+	[UsedImplicitly]
+	public class TestLogSpam : ConsoleCmdAbstract {
+		public override string[] GetCommands () {
+			return new[] { "tls" };
+		}
+
+		public override bool AllowedInMainMenu => true;
+
+		public override bool IsExecuteOnClient => true;
+
+		public override string GetDescription () {
+			return "Spams the log with until stopped";
+		}
+
+		public override string GetHelp () {
+			return @"
+			|Usage:
+			|  1. tls <N> ['second']
+			|  2. tls stop
+			|1. Start spamming with N messages per frame - or per second if the second argument is the word 'second'
+			|2. Stop spamming
+			".Unindent ();
+		}
+
+		private Coroutine spamCoroutine;
+		private WaitForSeconds waitObj;
+
+		public override void Execute (List<string> _params, CommandSenderInfo _senderInfo) {
+			if (_params.Count != 1 && _params.Count != 2) {
+				SdtdConsole.Instance.Output ($"Wrong number of arguments, expected 1 or 2, found {_params.Count}.");
+				return;
+			}
+
+			if (_params [0].EqualsCaseInsensitive ("stop")) {
+				if (spamCoroutine == null) {
+					SdtdConsole.Instance.Output ("Not spamming.");
+					return;
+				}
+
+				ThreadManager.StopCoroutine (spamCoroutine);
+				spamCoroutine = null;
+				SdtdConsole.Instance.Output ("Spam stopped.");
+				return;
+			}
+
+			if (!int.TryParse (_params [0], out int count)) {
+				SdtdConsole.Instance.Output ("The given spam number is not a valid integer");
+				return;
+			}
+
+			bool perSecond = _params.Count > 1 && _params [1] == "second";
+
+			waitObj = perSecond ? new WaitForSeconds (1f) : null;
+
+			SdtdConsole.Instance.Output ($"Started spamming {count} messages per {(perSecond ? "second" : "frame")}");
+			spamCoroutine = ThreadManager.StartCoroutine (SpamCo (count));
+		}
+
+		private IEnumerator SpamCo (int _count) {
+			do {
+				for (int i = 0; i < _count; i++) {
+					Log.Out ("This is a spam log message.");
+				}
+
+				yield return waitObj;
+			} while (spamCoroutine != null);
+		}
+	}
+}
