diff --git a/r5dev/r5dev.vcxproj b/r5dev/r5dev.vcxproj
index 1df19480..005037e8 100644
--- a/r5dev/r5dev.vcxproj
+++ b/r5dev/r5dev.vcxproj
@@ -82,7 +82,7 @@
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(SolutionDir)r5net\include;$(SolutionDir)external\minhook\include;$(SolutionDir)external\imgui\include;$(SolutionDir)external\spdlog\include;$(SolutionDir)shared\include;$(SolutionDir)r5dev\include;$(IncludePath)</IncludePath>
+    <IncludePath>$(SolutionDir)r5net\include\r5;$(SolutionDir)external\minhook\include;$(SolutionDir)external\imgui\include;$(SolutionDir)external\spdlog\include;$(SolutionDir)shared\include;$(SolutionDir)r5dev\include;$(IncludePath)</IncludePath>
     <LibraryPath>$(SolutionDir)external\minhook\lib\$(Configuration);$(SolutionDir)r5net\lib\$(Configuration);$(LibraryPath)</LibraryPath>
     <OutDir>$(SolutionDir)bin\$(Configuration)\</OutDir>
     <TargetName>r5detours</TargetName>
@@ -90,7 +90,7 @@
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <LinkIncremental>false</LinkIncremental>
-    <IncludePath>$(SolutionDir)r5net\include;$(SolutionDir)external\minhook\include;$(SolutionDir)external\imgui\include;$(SolutionDir)external\spdlog\include;$(SolutionDir)shared\include;$(SolutionDir)r5dev\include;$(IncludePath)</IncludePath>
+    <IncludePath>$(SolutionDir)r5net\include\r5;$(SolutionDir)external\minhook\include;$(SolutionDir)external\imgui\include;$(SolutionDir)external\spdlog\include;$(SolutionDir)shared\include;$(SolutionDir)r5dev\include;$(IncludePath)</IncludePath>
     <LibraryPath>$(SolutionDir)external\minhook\lib\$(Configuration);$(SolutionDir)r5net\lib\$(Configuration);$(LibraryPath)</LibraryPath>
     <OutDir>$(SolutionDir)bin\$(Configuration)\</OutDir>
     <IntDir>$(SolutionDir)build\$(ProjectName)\$(Configuration)\</IntDir>
@@ -157,7 +157,11 @@
     <PreBuildEvent>
       <Command>if not EXIST $(SolutionDir)external\minhook\lib\$(Configuration)\Minhook.x64.lib (
 "$(DevEnvDir)devenv" "$(SolutionDir)apex.sln" /Rebuild $(Configuration) /project "$(SolutionDir)external\minhook\libMinHook.vcxproj"
-)</Command>
+);
+
+if not EXIST $(SolutionDir)r5net\lib\$(Configuration)\r5net.lib (
+"$(DevEnvDir)devenv" "$(SolutionDir)apex.sln" /Rebuild $(Configuration) /project "$(SolutionDir)r5net\r5net.vcxproj"
+);</Command>
     </PreBuildEvent>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -194,7 +198,11 @@
     <PreBuildEvent>
       <Command>if not EXIST $(SolutionDir)external\minhook\lib\$(Configuration)\Minhook.x64.lib (
 "$(DevEnvDir)devenv" "$(SolutionDir)apex.sln" /Rebuild $(Configuration) /project "$(SolutionDir)external\minhook\libMinHook.vcxproj"
-)</Command>
+);
+
+if not EXIST $(SolutionDir)r5net\lib\$(Configuration)\r5net.lib (
+"$(DevEnvDir)devenv" "$(SolutionDir)apex.sln" /Rebuild $(Configuration) /project "$(SolutionDir)r5net\r5net.vcxproj"
+);</Command>
     </PreBuildEvent>
   </ItemDefinitionGroup>
   <ItemGroup>
diff --git a/r5dev/src/CCompanion.cpp b/r5dev/src/CCompanion.cpp
index a354d245..fc579cc0 100644
--- a/r5dev/src/CCompanion.cpp
+++ b/r5dev/src/CCompanion.cpp
@@ -190,39 +190,39 @@ void CCompanion::ServerBrowserSection()
             }
             ImGui::EndTable();
     }
-        ImGui::EndChild();
+    ImGui::EndChild();
 
-        ImGui::Separator();
+    ImGui::Separator();
 
-        ImGui::InputTextWithHint("##ServerBrowser_ServerConnString", "Enter IP address or \"localhost\"", ServerConnStringBuffer, IM_ARRAYSIZE(ServerConnStringBuffer));
+    ImGui::InputTextWithHint("##ServerBrowser_ServerConnString", "Enter IP address or \"localhost\"", ServerConnStringBuffer, IM_ARRAYSIZE(ServerConnStringBuffer));
 
-        ImGui::SameLine();
+    ImGui::SameLine();
 
-        if (ImGui::Button("Connect##ServerBrowser_ConnectByIp", ImVec2(ImGui::GetWindowContentRegionWidth() * (1.f / 3.f / 2.f), 19)))
-        {
-            //const char* replace = ""; // For history pos soon
-            std::stringstream cmd;
-            cmd << "connect " << ServerConnStringBuffer;
-            ConnectToServer(ServerConnStringBuffer);
-            //strcpy_s(ServerConnStringBuffer, sizeof(replace), replace); // For history pos soon
-        }
+    if (ImGui::Button("Connect##ServerBrowser_ConnectByIp", ImVec2(ImGui::GetWindowContentRegionWidth() * (1.f / 3.f / 2.f), 19)))
+    {
+        //const char* replace = ""; // For history pos soon
+        std::stringstream cmd;
+        cmd << "connect " << ServerConnStringBuffer;
+        ConnectToServer(ServerConnStringBuffer);
+        //strcpy_s(ServerConnStringBuffer, sizeof(replace), replace); // For history pos soon
+    }
 
-        ImGui::SameLine();
+    ImGui::SameLine();
 
-        if (ImGui::Button("Private Servers##ServerBrowser_PrivateServersButton", ImVec2(ImGui::GetWindowContentRegionWidth() * (1.f / 3.f / 2.f), 19)))
-        {
-            ImGui::OpenPopup("Connect to Private Server##PrivateServersConnectModal");
-        }
+    if (ImGui::Button("Private Servers##ServerBrowser_PrivateServersButton", ImVec2(ImGui::GetWindowContentRegionWidth() * (1.f / 3.f / 2.f), 19)))
+    {
+        ImGui::OpenPopup("Connect to Private Server##PrivateServersConnectModal");
+    }
 
-        bool modalOpen = true;
-        if (ImGui::BeginPopupModal("Connect to Private Server##PrivateServersConnectModal", &modalOpen))
-        {
-            // I *WILL* move this in a separate class
+    bool modalOpen = true;
+    if (ImGui::BeginPopupModal("Connect to Private Server##PrivateServersConnectModal", &modalOpen))
+    {
+        // I *WILL* move this in a separate class
 
-            ImGui::SetWindowSize(ImVec2(400.f, 200.f), ImGuiCond_Always);
+        ImGui::SetWindowSize(ImVec2(400.f, 200.f), ImGuiCond_Always);
 
-            /* When removing this and adding the resource instead. Please initialize the texture in the CCompanion class constructor. - Pixie*/
-            static unsigned char lockedserver[] = {
+        /* When removing this and adding the resource instead. Please initialize the texture in the CCompanion class constructor. - Pixie*/
+        static unsigned char lockedserver[] = {
                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -271,69 +271,67 @@ void CCompanion::ServerBrowserSection()
       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+        };
+        // ^^^^
+        // this definitely wont reach the final commit lmao
+        // Nope it will for now -Pixie
+        if (!ApexLockIcon)
+        {
+            bool ret = LoadTextureFromByteArray(lockedserver, ApexLockIconWidth, ApexLockIconHeight, &ApexLockIcon); // Load texture from byte array.
+        }
 
-            };
-            // ^^^^
-            // this definitely wont reach the final commit lmao
-            // Nope it will for now -Pixie
-            if (!ApexLockIcon)
-            {
-                bool ret = LoadTextureFromByteArray(lockedserver, ApexLockIconWidth, ApexLockIconHeight, &ApexLockIcon); // Load texture from byte array.
-            }
-
-            ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(0.00f, 0.00f, 0.00f, 0.00f)); // Override the style color for child bg.
-            ImGui::BeginChild("##PrivateServersConnectModal_IconParent", ImVec2(ApexLockIconWidth, ApexLockIconHeight));
-            {
-                ImGui::Image(ApexLockIcon, ImVec2(ApexLockIconWidth, ApexLockIconHeight)); // Display texture.
-            }
-            ImGui::EndChild();
-            ImGui::PopStyleColor(); // Pop the override for the child bg.
-
-            ImGui::SameLine();
-
-            ImGui::Text("Enter the following details to continue");
-
-            ImGui::PushItemWidth(ImGui::GetWindowContentRegionWidth()); // Override item width.
-            ImGui::InputTextWithHint("##PrivateServersConnectModal_TokenInput", "Token", &PrivateServerToken);
-            ImGui::InputTextWithHint("##PrivateServersConnectModal_PasswordInput", "Password", &PrivateServerPassword, ImGuiInputTextFlags_Password);
-            ImGui::PopItemWidth(); // Pop item width.
-
-            ImGui::Dummy(ImVec2(ImGui::GetWindowContentRegionWidth(), 19.f)); // Place a dummy, basically making space inserting a blank element.
-
-            ImGui::TextColored(PrivateServerMessageColor, PrivateServerRequestMessage.c_str());
-
-            ImGui::Separator();
-
-            if (ImGui::Button("Connect##PrivateServersConnectModal_ConnectButton", ImVec2(ImGui::GetWindowContentRegionWidth() / 2.f, 19)))
-            {
-                PrivateServerRequestMessage = "";
-                ServerListing server;
-                bool result = r5net.GetServerByToken(server, PrivateServerRequestMessage, PrivateServerToken, PrivateServerPassword); // Send token connect request.
-                if (!server.name.empty())
-                {
-                    ConnectToServer(server.ip, server.port); // Connect to the server
-                    PrivateServerRequestMessage = "Found Server: " + server.name;
-                    PrivateServerMessageColor = ImVec4(0.00f, 1.00f, 0.00f, 1.00f);
-                    ImGui::CloseCurrentPopup();
-                }
-                else
-                {
-                    PrivateServerRequestMessage = "Error: " + PrivateServerRequestMessage;
-                    PrivateServerMessageColor = ImVec4(1.00f, 0.00f, 0.00f, 1.00f);
-                }
-
-            }
-
-            ImGui::SameLine();
-
-            if (ImGui::Button("Close##PrivateServersConnectModal_CloseButton", ImVec2(ImGui::GetWindowContentRegionWidth() / 2.f, 19)))
+        ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(0.00f, 0.00f, 0.00f, 0.00f)); // Override the style color for child bg.
+        ImGui::BeginChild("##PrivateServersConnectModal_IconParent", ImVec2(ApexLockIconWidth, ApexLockIconHeight));
+        {
+            ImGui::Image(ApexLockIcon, ImVec2(ApexLockIconWidth, ApexLockIconHeight)); // Display texture.
+        }
+        ImGui::EndChild();
+        ImGui::PopStyleColor(); // Pop the override for the child bg.
+        
+        ImGui::SameLine();
+
+        ImGui::Text("Enter the following details to continue");
+
+        ImGui::PushItemWidth(ImGui::GetWindowContentRegionWidth()); // Override item width.
+        ImGui::InputTextWithHint("##PrivateServersConnectModal_TokenInput", "Token", &PrivateServerToken);
+        ImGui::InputTextWithHint("##PrivateServersConnectModal_PasswordInput", "Password", &PrivateServerPassword, ImGuiInputTextFlags_Password);
+        ImGui::PopItemWidth(); // Pop item width.
+
+        ImGui::Dummy(ImVec2(ImGui::GetWindowContentRegionWidth(), 19.f)); // Place a dummy, basically making space inserting a blank element.
+
+        ImGui::TextColored(PrivateServerMessageColor, PrivateServerRequestMessage.c_str());
+
+        ImGui::Separator();
+
+        if (ImGui::Button("Connect##PrivateServersConnectModal_ConnectButton", ImVec2(ImGui::GetWindowContentRegionWidth() / 2.f, 19)))
+        {
+            PrivateServerRequestMessage = "";
+            ServerListing server;
+            bool result = r5net.GetServerByToken(server, PrivateServerRequestMessage, PrivateServerToken, PrivateServerPassword); // Send token connect request.
+            if (!server.name.empty())
             {
+                ConnectToServer(server.ip, server.port); // Connect to the server
+                PrivateServerRequestMessage = "Found Server: " + server.name;
+                PrivateServerMessageColor = ImVec4(0.00f, 1.00f, 0.00f, 1.00f);
                 ImGui::CloseCurrentPopup();
             }
-
-            ImGui::EndPopup();
+            else
+            {
+                PrivateServerRequestMessage = "Error: " + PrivateServerRequestMessage;
+                PrivateServerMessageColor = ImVec4(1.00f, 0.00f, 0.00f, 1.00f);
+            }
         }
+
+        ImGui::SameLine();
+
+        if (ImGui::Button("Close##PrivateServersConnectModal_CloseButton", ImVec2(ImGui::GetWindowContentRegionWidth() / 2.f, 19)))
+        {
+            ImGui::CloseCurrentPopup();
+        }
+
+        ImGui::EndPopup();
     }
+}
 
 void CCompanion::HostServerSection()
 {
diff --git a/r5dev/src/hooks/hooks.cpp b/r5dev/src/hooks/hooks.cpp
index 3793c8a8..ad0c1801 100644
--- a/r5dev/src/hooks/hooks.cpp
+++ b/r5dev/src/hooks/hooks.cpp
@@ -47,14 +47,12 @@ void Hooks::InstallHooks()
 
 	///////////////////////////////////////////////////////////////////////////////
 	// Hook WinAPI
-	HMODULE user32dll = GetModuleHandleA("user32.dll");
-
-	if (user32dll)
+	if (Module user32dll = Module("user32.dll"); user32dll.GetModuleBase()) // Is user32.dll valid?
 	{
-		void* SetCursorPosPtr = GetProcAddress(user32dll, "SetCursorPos");
-		void* ClipCursorPtr = GetProcAddress(user32dll, "ClipCursor");
-		void* GetCursorPosPtr = GetProcAddress(user32dll, "GetCursorPos");
-		void* ShowCursorPtr = GetProcAddress(user32dll, "ShowCursor");
+		void* SetCursorPosPtr = user32dll.GetExportedFunction("SetCursorPos");
+		void* ClipCursorPtr = user32dll.GetExportedFunction("ClipCursor");
+		void* GetCursorPosPtr = user32dll.GetExportedFunction("GetCursorPos");
+		void* ShowCursorPtr = user32dll.GetExportedFunction("ShowCursor");
 
 		MH_CreateHook(SetCursorPosPtr, &Hooks::SetCursorPos, reinterpret_cast<void**>(&originalSetCursorPos));
 		MH_CreateHook(ClipCursorPtr, &Hooks::ClipCursor, reinterpret_cast<void**>(&originalClipCursor));
@@ -124,14 +122,12 @@ void Hooks::RemoveHooks()
 
 	///////////////////////////////////////////////////////////////////////////////
 	// Unhook WinAPI
-	HMODULE user32dll = GetModuleHandleA("user32.dll");
-
-	if (user32dll)
+	if (Module user32dll = Module("user32.dll"); user32dll.GetModuleBase()) // Is user32.dll valid?
 	{
-		void* SetCursorPosPtr = GetProcAddress(user32dll, "SetCursorPos");
-		void* ClipCursorPtr = GetProcAddress(user32dll, "ClipCursor");
-		void* GetCursorPosPtr = GetProcAddress(user32dll, "GetCursorPos");
-		void* ShowCursorPtr = GetProcAddress(user32dll, "ShowCursor");
+		void* SetCursorPosPtr = user32dll.GetExportedFunction("SetCursorPos");
+		void* ClipCursorPtr = user32dll.GetExportedFunction("ClipCursor");
+		void* GetCursorPosPtr = user32dll.GetExportedFunction("GetCursorPos");
+		void* ShowCursorPtr = user32dll.GetExportedFunction("ShowCursor");
 
 		MH_RemoveHook(SetCursorPosPtr);
 		MH_RemoveHook(ClipCursorPtr);
diff --git a/r5dev/src/id3dx.cpp b/r5dev/src/id3dx.cpp
index c830c2d5..31962ca3 100644
--- a/r5dev/src/id3dx.cpp
+++ b/r5dev/src/id3dx.cpp
@@ -9,7 +9,6 @@
 #include "CCompanion.h"
 #include "CGameConsole.h"
 
-
 #pragma comment(lib, "d3d11.lib")
 
 /*---------------------------------------------------------------------------------
@@ -29,7 +28,6 @@ extern BOOL                     g_bShowConsole              = false;
 extern BOOL                     g_bShowBrowser              = false;
 static BOOL                     g_bInitMenu                 = false;
 static BOOL                     g_bInitialized              = false;
-static BOOL                     g_bPresentHooked            = false;
 
 ///////////////////////////////////////////////////////////////////////////////////
 static WNDPROC                  g_oWndProc                  = NULL;
@@ -227,18 +225,12 @@ void GetPresent()
 	pDeviceVTable             = (DWORD_PTR*)pDevice;
 	pDeviceVTable             = (DWORD_PTR*)pDeviceVTable[0];
 
-	int pIDX                  = (int)DXGISwapChainVTbl::Present;
-	int rIDX                  = (int)DXGISwapChainVTbl::ResizeBuffers;
-
-	g_fnIDXGISwapChainPresent = (IDXGISwapChainPresent)(DWORD_PTR)pSwapChainVtable[pIDX];
-	g_oResizeBuffers          = (IDXGIResizeBuffers)(DWORD_PTR)pSwapChainVtable[rIDX];
+	g_fnIDXGISwapChainPresent = (IDXGISwapChainPresent)(DWORD_PTR)pSwapChainVtable[(int)DXGISwapChainVTbl::Present];
+	g_oResizeBuffers          = (IDXGIResizeBuffers)(DWORD_PTR)pSwapChainVtable[(int)DXGISwapChainVTbl::ResizeBuffers];
 
 	pSwapChain->Release();
 	pContext->Release();
 	pDevice->Release();
-
-	///////////////////////////////////////////////////////////////////////////////
-	g_bPresentHooked          = true;
 }
 
 //#################################################################################
@@ -316,7 +308,7 @@ void CreateRenderTarget(IDXGISwapChain* pSwapChain)
 
 void DestroyRenderTarget()
 {
-	if (nullptr != g_pRenderTargetView)
+	if (g_pRenderTargetView)
 	{
 		g_pRenderTargetView->Release();
 		g_pRenderTargetView = nullptr;
@@ -348,7 +340,6 @@ HRESULT __stdcall GetResizeBuffers(IDXGISwapChain* pSwapChain, UINT nBufferCount
 	g_bShowConsole    = false;
 	g_bShowBrowser    = false;
 	g_bInitialized    = false;
-	g_bPresentHooked  = false;
 
 	///////////////////////////////////////////////////////////////////////////////
 
@@ -448,19 +439,6 @@ bool LoadTextureFromByteArray(unsigned char* image_data, const int& image_width,
 
 void InstallDXHooks()
 {
-	HMODULE user32dll = GetModuleHandleA("user32.dll");
-
-	if (user32dll)
-	{
-		IPostMessageA PostMessageA = (IPostMessageA)GetProcAddress(user32dll, "PostMessageA");
-		IPostMessageW PostMessageW = (IPostMessageW)GetProcAddress(user32dll, "PostMessageW");
-	}
-
-	///////////////////////////////////////////////////////////////////////////////
-	// Hook PostMessage
-	MH_CreateHook(PostMessageA, &HPostMessageA, reinterpret_cast<void**>(&g_oPostMessageA));
-	MH_CreateHook(PostMessageW, &HPostMessageW, reinterpret_cast<void**>(&g_oPostMessageW));
-
 	///////////////////////////////////////////////////////////////////////////////
 	// Hook SwapChain
 	MH_CreateHook(g_fnIDXGISwapChainPresent, &Present, reinterpret_cast<void**>(&originalPresent));
@@ -468,26 +446,36 @@ void InstallDXHooks()
 	 
 	///////////////////////////////////////////////////////////////////////////////
 	// Enable hooks
-	MH_EnableHook(PostMessageA);
-	MH_EnableHook(PostMessageW);
 	MH_EnableHook(g_fnIDXGISwapChainPresent);
 	MH_EnableHook(g_oResizeBuffers);
+
+	if (Module user32dll = Module("user32.dll"); user32dll.GetModuleBase()) // Is user32.dll valid?
+	{
+		IPostMessageA PostMessageA = user32dll.GetExportedFunction("PostMessageA").RCast<IPostMessageA>();
+		IPostMessageW PostMessageW = user32dll.GetExportedFunction("PostMessageW").RCast<IPostMessageW>();
+
+		///////////////////////////////////////////////////////////////////////////////
+		// Hook PostMessage
+		MH_CreateHook(PostMessageA, &HPostMessageA, reinterpret_cast<void**>(&g_oPostMessageA));
+		MH_CreateHook(PostMessageW, &HPostMessageW, reinterpret_cast<void**>(&g_oPostMessageW));
+
+		MH_EnableHook(PostMessageA);
+		MH_EnableHook(PostMessageW);
+	}
 }
 
 void RemoveDXHooks()
 {
-	HMODULE user32dll = GetModuleHandleA("user32.dll");
-
-	if (user32dll)
-	{
-		IPostMessageA PostMessageA = (IPostMessageA)GetProcAddress(user32dll, "PostMessageA");
-		IPostMessageW PostMessageW = (IPostMessageW)GetProcAddress(user32dll, "PostMessageW");
-	}
-
 	///////////////////////////////////////////////////////////////////////////////
 	// Unhook PostMessage
-	MH_RemoveHook(PostMessageA);
-	MH_RemoveHook(PostMessageW);
+	if (Module user32dll = Module("user32.dll"); user32dll.GetModuleBase()) // Is user32.dll valid?
+	{
+		IPostMessageA PostMessageA = user32dll.GetExportedFunction("PostMessageA").RCast<IPostMessageA>();
+		IPostMessageW PostMessageW = user32dll.GetExportedFunction("PostMessageW").RCast<IPostMessageW>();
+
+		MH_RemoveHook(PostMessageA);
+		MH_RemoveHook(PostMessageW);
+	}
 
 	///////////////////////////////////////////////////////////////////////////////
 	// Unhook SwapChain
diff --git a/r5net/include/r5net.h b/r5net/include/r5/r5net.h
similarity index 99%
rename from r5net/include/r5net.h
rename to r5net/include/r5/r5net.h
index fba7f02e..dadf9124 100644
--- a/r5net/include/r5net.h
+++ b/r5net/include/r5/r5net.h
@@ -4,7 +4,6 @@
 
 namespace R5Net
 {
-
 	struct Config
 	{
 		std::string MOTD;
@@ -19,14 +18,10 @@ namespace R5Net
 		Client(std::string serverString) : m_HttpClient(serverString.c_str())
 		{
 			m_HttpClient.set_connection_timeout(10);
-
 		}
 	
-
 		std::vector<ServerListing> GetServersList();
-
 		bool PostServerHost(std::string& outMessage, std::string& outToken, const ServerListing& serverListing);
-
 		bool GetServerByToken(ServerListing& outServer, std::string& outError, const std::string& token, const std::string& password = "");
 	};
 }
\ No newline at end of file
diff --git a/r5net/include/serverlisting.h b/r5net/include/r5/serverlisting.h
similarity index 86%
rename from r5net/include/serverlisting.h
rename to r5net/include/r5/serverlisting.h
index 92cd0a30..4209c19a 100644
--- a/r5net/include/serverlisting.h
+++ b/r5net/include/r5/serverlisting.h
@@ -1,7 +1,5 @@
 #pragma once
 
-#include "netpch.h"
-
 struct ServerListing
 {
 	std::string name;
diff --git a/r5net/r5net.vcxproj b/r5net/r5net.vcxproj
index 081afc9e..577d5ed0 100644
--- a/r5net/r5net.vcxproj
+++ b/r5net/r5net.vcxproj
@@ -20,7 +20,7 @@
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="include\netpch.h" />
-    <ClInclude Include="include\r5net.h" />
+    <ClInclude Include="include\r5\r5net.h" />
     <ClInclude Include="include\serverlisting.h" />
   </ItemGroup>
   <ItemGroup>
@@ -91,14 +91,14 @@
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <LinkIncremental>true</LinkIncremental>
-    <OutDir>$(ProjectDir)lib\$(Configuration)</OutDir>
-    <IntDir>$(SolutionDir)build\$(ProjectName)\$(Configuration)</IntDir>
+    <OutDir>$(ProjectDir)lib\$(Configuration)\</OutDir>
+    <IntDir>$(SolutionDir)build\$(ProjectName)\$(Configuration)\</IntDir>
     <IncludePath>$(SolutionDir)shared\include;$(ProjectDir)include;$(IncludePath)</IncludePath>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <LinkIncremental>false</LinkIncremental>
-    <OutDir>$(ProjectDir)lib\$(Configuration)</OutDir>
-    <IntDir>$(SolutionDir)build\$(ProjectName)\$(Configuration)</IntDir>
+    <OutDir>$(ProjectDir)lib\$(Configuration)\</OutDir>
+    <IntDir>$(SolutionDir)build\$(ProjectName)\$(Configuration)\</IntDir>
     <IncludePath>$(SolutionDir)shared\include;$(ProjectDir)include;$(IncludePath)</IncludePath>
   </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
diff --git a/r5net/r5net.vcxproj.filters b/r5net/r5net.vcxproj.filters
index f76f868a..f50c168f 100644
--- a/r5net/r5net.vcxproj.filters
+++ b/r5net/r5net.vcxproj.filters
@@ -9,15 +9,15 @@
     </Filter>
   </ItemGroup>
   <ItemGroup>
-    <ClInclude Include="include\r5net.h">
-      <Filter>include</Filter>
-    </ClInclude>
     <ClInclude Include="include\serverlisting.h">
       <Filter>include</Filter>
     </ClInclude>
     <ClInclude Include="include\netpch.h">
       <Filter>include</Filter>
     </ClInclude>
+    <ClInclude Include="include\r5\r5net.h">
+      <Filter>include</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="src\r5net.cpp">
diff --git a/r5net/src/netpch.cpp b/r5net/src/netpch.cpp
index 783231ed..0c622c94 100644
--- a/r5net/src/netpch.cpp
+++ b/r5net/src/netpch.cpp
@@ -1,3 +1,2 @@
 #pragma once
-
 #include "netpch.h"
\ No newline at end of file
diff --git a/r5net/src/r5net.cpp b/r5net/src/r5net.cpp
index 28d2fca3..c7d3d916 100644
--- a/r5net/src/r5net.cpp
+++ b/r5net/src/r5net.cpp
@@ -2,14 +2,11 @@
 //
 
 #include "netpch.h"
-#include "r5net.h"
+#include "r5\r5net.h"
 
-
-using namespace R5Net;
-
-std::vector<ServerListing> Client::GetServersList()
+std::vector<ServerListing> R5Net::Client::GetServersList()
 {
-    std::vector<ServerListing> list;
+    std::vector<ServerListing> list{ };
     
     auto res = m_HttpClient.Get("/servers");
 
@@ -23,11 +20,10 @@ std::vector<ServerListing> Client::GetServersList()
             );
         }
     }
-
     return list;
 }
 
-bool Client::PostServerHost(std::string& outMessage, std::string& outToken, const ServerListing& serverListing)
+bool R5Net::Client::PostServerHost(std::string& outMessage, std::string& outToken, const ServerListing& serverListing)
 {
     nlohmann::json reqBody = nlohmann::json::object();
     reqBody["name"] = serverListing.name;
@@ -48,7 +44,7 @@ bool Client::PostServerHost(std::string& outMessage, std::string& outToken, cons
         if (resBody["token"].is_string())
             outToken = resBody["token"].get<std::string>();
         else
-            outToken     = "";
+            outToken = "";
         return true;
     }
     else
@@ -94,5 +90,7 @@ bool R5Net::Client::GetServerByToken(ServerListing& outServer, std::string& outE
         outServer = ServerListing{};
         return false;
     }
+
+    return false;
 }
 
diff --git a/r5net/src/serverlisting.cpp b/r5net/src/serverlisting.cpp
index fecac08a..1f5f5a71 100644
--- a/r5net/src/serverlisting.cpp
+++ b/r5net/src/serverlisting.cpp
@@ -1,3 +1,3 @@
 #include "netpch.h"
 
-#include "serverlisting.h"
+#include "r5\serverlisting.h"
diff --git a/shared/include/address.h b/shared/include/address.h
index f7d92531..9a9d88b6 100644
--- a/shared/include/address.h
+++ b/shared/include/address.h
@@ -343,7 +343,7 @@ public:
 	{
 		for (ModuleSections& currentSection : moduleSections)
 		{
-			printf(" [+Module: %s+]%s, %p\n", moduleName.c_str(), currentSection.sectionName.c_str(), currentSection.sectionStartAddress);
+			printf(" [+Module: %s+]%s, %p\n", moduleName.c_str(), currentSection.sectionName.c_str(), reinterpret_cast<void*>(currentSection.sectionStartAddress));
 		}
 	}
 
@@ -436,6 +436,52 @@ public:
 
 		return MemoryAddress(latestOccurence);
 	}
+
+	MemoryAddress GetExportedFunction(const std::string functionName)
+	{
+		if (!dosHeader || dosHeader->e_magic != IMAGE_DOS_SIGNATURE) // Is dosHeader valid?
+			return MemoryAddress();
+
+		if (!ntHeaders || ntHeaders->Signature != IMAGE_NT_SIGNATURE) // Is ntHeader valid?
+			return MemoryAddress();
+
+		// Get the location of IMAGE_EXPORT_DIRECTORY for this module by adding the IMAGE_DIRECTORY_ENTRY_EXPORT relative virtual address onto our module base address.
+		IMAGE_EXPORT_DIRECTORY* ImageExportDirectory = reinterpret_cast<IMAGE_EXPORT_DIRECTORY*>(moduleBase + ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
+		if (!ImageExportDirectory)
+			return MemoryAddress();
+
+		// Are there any exported functions?
+		if (!ImageExportDirectory->NumberOfFunctions)
+			return MemoryAddress();
+
+		// Get the location of the functions via adding the relative virtual address from the struct into our module base address.
+		DWORD* AddressOfFunctionsPtr = reinterpret_cast<DWORD*>(moduleBase + ImageExportDirectory->AddressOfFunctions);
+		if (!AddressOfFunctionsPtr)
+			return MemoryAddress();
+
+		// Get the names of the functions via adding the relative virtual address from the struct into our module base address.
+		DWORD* AddressOfNamePtr = reinterpret_cast<DWORD*>(moduleBase + ImageExportDirectory->AddressOfNames);
+		if (!AddressOfNamePtr)
+			return MemoryAddress();
+
+		// Get the ordinals of the functions via adding the relative virtual address from the struct into our module base address.
+		DWORD* AddressOfOrdinalsPtr = reinterpret_cast<DWORD*>(moduleBase + ImageExportDirectory->AddressOfNameOrdinals);
+		if (!AddressOfOrdinalsPtr)
+			return MemoryAddress();
+
+		for (std::size_t i = 0; i < ImageExportDirectory->NumberOfFunctions; i++) // Iterate through all the functions.
+		{
+			// Get virtual relative address of the function name. Then add module base address to get the actual location.
+			std::string ExportFunctionName = reinterpret_cast<char*>(reinterpret_cast<DWORD*>(moduleBase + AddressOfNamePtr[i]));
+
+			if (ExportFunctionName.compare(functionName) == 0) // Is this our wanted exported function?
+			{
+				// Get the function ordinal. Then grab the relative virtual address of our wanted function. Then add module base address so we get the actual location.
+				return MemoryAddress(moduleBase + AddressOfFunctionsPtr[reinterpret_cast<WORD*>(AddressOfOrdinalsPtr)[i]]); // Return as MemoryAddress class.
+			}
+		}
+		return MemoryAddress();
+	}
 	
 	MemoryAddress FindAddressForString(const std::string string, bool nullTerminator)
 	{