diff --git a/r5dev/common/global.cpp b/r5dev/common/global.cpp
index ffa384dd..5e6969b2 100644
--- a/r5dev/common/global.cpp
+++ b/r5dev/common/global.cpp
@@ -518,7 +518,7 @@ void ConVar_StaticInit(void)
 	net_processTimeBudget      = ConVar::StaticCreate("net_processTimeBudget"     ,"200"                       , FCVAR_RELEASE    , "Net message process time budget in milliseconds (removing netchannel if exceeded).", true, 0.f, false, 0.f, nullptr, "0 = disabled");
 	//-------------------------------------------------------------------------
 	// NETWORKSYSTEM                                                          |
-	pylon_matchmaking_hostname = ConVar::StaticCreate("pylon_matchmaking_hostname", "ms.r5reloaded.com", FCVAR_RELEASE, "Holds the pylon matchmaking hostname.", false, 0.f, false, 0.f, &MP_HostName_Changed_f, nullptr);
+	pylon_matchmaking_hostname = ConVar::StaticCreate("pylon_matchmaking_hostname", "ms.r5reloaded.com", FCVAR_RELEASE | FCVAR_MATERIAL_SYSTEM_THREAD, "Holds the pylon matchmaking hostname.", false, 0.f, false, 0.f, &MP_HostName_Changed_f, nullptr);
 	pylon_host_update_interval = ConVar::StaticCreate("pylon_host_update_interval", "5"                , FCVAR_RELEASE, "Length of time in seconds between each status update interval to master server.", true, 5.f, false, 0.f, nullptr, nullptr);
 	pylon_showdebuginfo        = ConVar::StaticCreate("pylon_showdebuginfo"       , "0"                , FCVAR_RELEASE, "Shows debug output for pylon.", false, 0.f, false, 0.f, nullptr, nullptr);
 	//-------------------------------------------------------------------------
diff --git a/r5dev/gameui/IBrowser.cpp b/r5dev/gameui/IBrowser.cpp
index bf6dd7c2..257f8873 100644
--- a/r5dev/gameui/IBrowser.cpp
+++ b/r5dev/gameui/IBrowser.cpp
@@ -219,7 +219,7 @@ void CBrowser::Think(void)
 //-----------------------------------------------------------------------------
 void CBrowser::DrawSurface(void)
 {
-    std::lock_guard<std::mutex> l(m_Mutex);
+    AUTO_LOCK(m_Mutex);
 
     ImGui::BeginTabBar("CompMenu");
     if (ImGui::BeginTabItem("Browsing"))
@@ -374,7 +374,7 @@ void CBrowser::RefreshServerList(void)
     std::string svServerListMessage;
     g_ServerListManager.RefreshServerList(svServerListMessage);
 
-    std::lock_guard<std::mutex> l(m_Mutex);
+    AUTO_LOCK(m_Mutex);
     m_svServerListMessage = svServerListMessage;
 }
 
@@ -696,7 +696,7 @@ void CBrowser::UpdateHostingStatus(void)
     {
     case EHostStatus_t::NOT_HOSTING:
     {
-        std::lock_guard<std::mutex> g(m_Mutex);
+        AUTO_LOCK(m_Mutex);
         if (!m_svHostToken.empty())
         {
             m_svHostToken.clear();
@@ -782,15 +782,22 @@ void CBrowser::SendHostingPostRequest(const NetGameServer_t& gameServer)
     string svHostToken;
     string svHostIp;
 
-    bool result = g_MasterServer.PostServerHost(svHostRequestMessage, svHostToken, svHostIp, gameServer);
+    const bool result = g_MasterServer.PostServerHost(svHostRequestMessage, svHostToken, svHostIp, gameServer);
 
-    std::lock_guard<std::mutex> l(m_Mutex);
+    AUTO_LOCK(m_Mutex);
 
     m_svHostRequestMessage = svHostRequestMessage;
     m_svHostToken = svHostToken;
 
-    if(svHostIp.length() != 0)
-        g_MasterServer.SetHostIP(svHostIp);
+    if (!svHostIp.empty())
+    {
+        // Must be set from the main thread, dispatch it off
+        // and set it at the start of the next frame.
+        g_TaskScheduler->Dispatch([svHostIp]()
+            {
+                g_MasterServer.SetHostIP(svHostIp);
+            }, 0);
+    }
 
     if (result)
     {
@@ -847,7 +854,7 @@ void CBrowser::SettingsPanel(void)
 //-----------------------------------------------------------------------------
 void CBrowser::SetHostName(const char* pszHostName)
 {
-    std::lock_guard<std::mutex> l(m_Mutex);
+    AUTO_LOCK(m_Mutex);
     m_szMatchmakingHostName = pszHostName;
 }
 
diff --git a/r5dev/gameui/IBrowser.h b/r5dev/gameui/IBrowser.h
index f03be79f..b01eb17d 100644
--- a/r5dev/gameui/IBrowser.h
+++ b/r5dev/gameui/IBrowser.h
@@ -7,7 +7,7 @@
 #include "public/isurfacesystem.h"
 #include "thirdparty/imgui/misc/imgui_utility.h"
 
-class CBrowser : public ISurface
+class CBrowser : public IDebugSurface
 {
 public:
     CBrowser(void);
@@ -53,7 +53,7 @@ private:
 
     ID3D11ShaderResourceView* m_idLockedIcon;
     MODULERESOURCE m_rLockedIconBlob;
-    mutable std::mutex m_Mutex;
+    mutable CThreadFastMutex m_Mutex;
 
     ////////////////////
     //   Server List  //
diff --git a/r5dev/gameui/IConsole.cpp b/r5dev/gameui/IConsole.cpp
index 58390b2f..7d5f9b12 100644
--- a/r5dev/gameui/IConsole.cpp
+++ b/r5dev/gameui/IConsole.cpp
@@ -192,7 +192,7 @@ void CConsole::RunFrame(void)
 void CConsole::RunTask(void)
 {
     // m_Logger and m_vHistory are modified.
-    std::lock_guard<std::mutex> l(m_Mutex);
+    AUTO_LOCK(m_Mutex);
 
     ClampLogSize();
     ClampHistorySize();
@@ -279,7 +279,8 @@ void CConsole::DrawSurface(void)
 
     // Mutex is locked here, as we start using/modifying
     // non-atomic members that are used from several threads.
-    std::lock_guard<std::mutex> l(m_Mutex);
+    AUTO_LOCK(m_Mutex);
+
     m_Logger.Render();
 
     if (m_bCopyToClipBoard)
@@ -1043,7 +1044,7 @@ int CConsole::TextEditCallbackStub(ImGuiInputTextCallbackData* iData)
 //-----------------------------------------------------------------------------
 void CConsole::AddLog(const ConLog_t& conLog)
 {
-    std::lock_guard<std::mutex> l(m_Mutex);
+    AUTO_LOCK(m_Mutex);
     m_Logger.InsertText(conLog);
 }
 
@@ -1073,8 +1074,9 @@ void CConsole::AddLog(const ImVec4& color, const char* fmt, ...) /*IM_FMTARGS(2)
 //-----------------------------------------------------------------------------
 void CConsole::RemoveLog(int nStart, int nEnd)
 {
-    std::lock_guard<std::mutex> l(m_Mutex);
-    int nLines = m_Logger.GetTotalLines();
+    AUTO_LOCK(m_Mutex);
+
+    const int nLines = m_Logger.GetTotalLines();
 
     if (nEnd >= nLines)
     {
@@ -1114,7 +1116,7 @@ void CConsole::RemoveLog(int nStart, int nEnd)
 //-----------------------------------------------------------------------------
 void CConsole::ClearLog(void)
 {
-    std::lock_guard<std::mutex> l(m_Mutex);
+    AUTO_LOCK(m_Mutex);
     m_Logger.RemoveLine(0, (m_Logger.GetTotalLines() - 1));
 }
 
@@ -1124,7 +1126,7 @@ void CConsole::ClearLog(void)
 //-----------------------------------------------------------------------------
 vector<string> CConsole::GetHistory(void) const
 {
-    std::lock_guard<std::mutex> l(m_Mutex);
+    AUTO_LOCK(m_Mutex);
     return m_vHistory;
 }
 
@@ -1133,7 +1135,8 @@ vector<string> CConsole::GetHistory(void) const
 //-----------------------------------------------------------------------------
 void CConsole::ClearHistory(void)
 {
-    std::lock_guard<std::mutex> l(m_Mutex);
+    AUTO_LOCK(m_Mutex);
+
     m_vHistory.clear();
     BuildSummary();
 }
diff --git a/r5dev/gameui/IConsole.h b/r5dev/gameui/IConsole.h
index a8b383ef..ac100fc6 100644
--- a/r5dev/gameui/IConsole.h
+++ b/r5dev/gameui/IConsole.h
@@ -6,7 +6,7 @@
 #include "thirdparty/imgui/misc/imgui_logger.h"
 #include "thirdparty/imgui/misc/imgui_utility.h"
 
-class CConsole : public ISurface
+class CConsole : public IDebugSurface
 {
 public:
     enum PositionMode_t
@@ -73,8 +73,8 @@ private:
     const char*                    m_pszConsoleLabel;
     const char*                    m_pszLoggingLabel;
     char                           m_szInputBuf[512];
-    char                           m_szSummary[512];
-    char                           m_szWindowLabel[512];
+    char                           m_szSummary[256];
+    char                           m_szWindowLabel[128];
 
     string                         m_svInputConVar;
     ssize_t                        m_nHistoryPos;
@@ -104,7 +104,7 @@ private:
     ImVec2                         m_ivSuggestWindowPos;
     ImVec2                         m_ivSuggestWindowSize;
     CTextLogger                    m_Logger;
-    mutable std::mutex             m_Mutex;
+    mutable CThreadFastMutex       m_Mutex;
 
     ImGuiInputTextFlags m_nInputFlags;
     ImGuiWindowFlags m_nSuggestFlags;
diff --git a/r5dev/networksystem/pylon.h b/r5dev/networksystem/pylon.h
index 2f98f045..c6dff3e7 100644
--- a/r5dev/networksystem/pylon.h
+++ b/r5dev/networksystem/pylon.h
@@ -34,17 +34,17 @@ public:
 	bool SendRequest(const char* endpoint, const rapidjson::Document& requestJson, rapidjson::Document& responseJson, string& outMessage, CURLINFO& status, const char* errorText = nullptr, const bool checkEula = true) const;
 	bool QueryServer(const char* endpoint, const char* request, string& outResponse, string& outMessage, CURLINFO& outStatus) const;
 
+	inline void SetCurrentToken(const string& token) { m_Token = token; }
 	inline const string& GetCurrentToken() const { return m_Token; }
+
+	inline void SetCurrentError(const string& error) { m_ErrorMsg = error; }
 	inline const string& GetCurrentError() const { return m_ErrorMsg; }
 
+	inline void SetHostIP(const string& ip) { m_HostIP = ip; };
 	inline const string& GetHostIP() const { return m_HostIP; };
 
-	inline void SetCurrentToken(const string& token) { m_Token = token; }
-	inline void SetCurrentError(const string& error) { m_ErrorMsg = error; }
-
-	inline void SetHostIP(const string& ip) { m_HostIP = ip; };
-
 	inline void SetLanguage(const char* lang) { m_Language = lang; };
+	inline const string& GetLanguage() const { return m_Language; };
 
 private:
 	string m_Token;
diff --git a/r5dev/public/isurfacesystem.h b/r5dev/public/isurfacesystem.h
index 83fd18ab..28048a24 100644
--- a/r5dev/public/isurfacesystem.h
+++ b/r5dev/public/isurfacesystem.h
@@ -1,10 +1,10 @@
 #ifndef ISURFACESYSTEM_H
 #define ISURFACESYSTEM_H
 
-class ISurface
+class IDebugSurface
 {
 public:
-    virtual ~ISurface() { };
+    virtual ~IDebugSurface() { };
 	virtual bool Init() = 0;
 	virtual void Think() = 0;
 	virtual void RunFrame() = 0;