diff --git a/Aki.Core/Program.cs b/Aki.Core/Program.cs
index 8316dfe..101e465 100644
--- a/Aki.Core/Program.cs
+++ b/Aki.Core/Program.cs
@@ -10,26 +10,28 @@ namespace SPT_AKI_Installer.Aki.Core
     //TODO:
     // delete patcher zip and aki zip
     // progress for copyDirectory
-    // move Game/patcher/aki check methods out of core
     // add figlet for SPT-AKI INSTALLER
     // locales, language selection
+    // PreCheckHelper.AkiCheck is currently hardcoded for 2.3.1
+    // get waffle to add exit code on patcher
+    // remove all user input other than errors
+
+    //comments:
+    // static: FileHelper, ZipHelper, LogHelper 
+    // nonStatic: ProcessHelper, PreCheckHelper, StringHelper
 
     public static class SPTinstaller
     {
-        public static string targetPath = Environment.CurrentDirectory;
-        private static string patchRef;
-        private static string akiRef;
-        private static DirectoryInfo dir;
-        private static string gamePath;
-
         static void Main(string[] args)
         {
+            string targetPath = Environment.CurrentDirectory;
+            PreCheckHelper preCheckHelper = new();
 #if DEBUG
             targetPath = @"D:\install";
 #endif
-            GameCheck(out gamePath);
+            preCheckHelper.GameCheck(out string gamePath);
 
-            if (PatcherCheck(gamePath, out patchRef))
+            if (preCheckHelper.PatcherCheck(gamePath,targetPath, out string patchRef))
             {
                 LogHelper.Info($"Correct Zip for Patcher Present: {patchRef}");
             }
@@ -41,7 +43,7 @@ namespace SPT_AKI_Installer.Aki.Core
                 Environment.Exit(0);
             }
 
-            if (AkiCheck(out akiRef))
+            if (preCheckHelper.AkiCheck(targetPath,out string akiRef))
             {
                 LogHelper.Info($"Correct Zip for SPT-AKI Present: {akiRef}");
             }
@@ -57,16 +59,36 @@ namespace SPT_AKI_Installer.Aki.Core
             LogHelper.User("PLEASE PRESS ENTER TO COPY GAME FILES!");
             Console.ReadKey();
 
-            // copies and pastes EFT to AKI installer test folder
+            GameCopy(gamePath, targetPath, akiRef);
+        }
+
+        /// <summary>
+        /// copies and pastes EFT to AKI installer test folder
+        /// </summary>
+        /// <param name="gamePath"></param>
+        /// <param name="targetPath"></param>
+        static void GameCopy(string gamePath, string targetPath, string akiRef)
+        {
 #if !DEBUG
             FileHelper.CopyDirectory(gamePath, targetPath, true);
+#endif
             LogHelper.User("GAME HAS BEEN COPIED, PRESS ENTER TO EXTRACT PATCHER!");
             Console.ReadKey();
-#endif
 
-            // extracts patcher and moves out inner folders
+            PatcherCopy(gamePath, targetPath, akiRef);
+        }
+
+        /// <summary>
+        /// extracts patcher and moves out inner folders
+        /// </summary>
+        /// <param name="patchRef"></param>
+        /// <param name="targetPath"></param>
+        /// <param name="akiRef"></param>
+        static void PatcherCopy(string patchRef, string targetPath, string akiRef)
+        {
+#if !DEBUG
             ZipHelper.Decompress(patchRef, targetPath);
-            FileHelper.FindFolder(patchRef, out dir);
+            FileHelper.FindFolder(patchRef, targetPath, out DirectoryInfo dir);
             FileHelper.CopyDirectory(dir.FullName, targetPath, true);
             if (dir.Exists)
             {
@@ -78,11 +100,22 @@ namespace SPT_AKI_Installer.Aki.Core
                     LogHelper.Error($"please delete folder called {dir.FullName}");
                 }
             }
+#endif
+            PatcherProcessStart(targetPath, akiRef);
+        }
 
-            // starts patcher and checks for user input to exit patcher and proceed
+        /// <summary>
+        /// starts patcher and checks for user input to exit patcher and proceed
+        /// </summary>
+        /// <param name="targetPath"></param>
+        /// <param name="akiRef"></param>
+        static void PatcherProcessStart(string targetPath, string akiRef)
+        {
+#if !DEBUG
             LogHelper.Info("PATCHER HAS BEEN EXTRACTED, STARTING PATCHER!");
             ProcessHelper patcherProcess = new();
             patcherProcess.StartProcess(Path.Join(targetPath + "/patcher.exe"), targetPath);
+#endif
             LogHelper.User("PATCHER HAS BEEN STARTED, TYPE YES ONCE THE PATCHER IS COMPLETE!");
             var complete = Console.ReadLine();
 
@@ -97,72 +130,17 @@ namespace SPT_AKI_Installer.Aki.Core
             // if user input "yes" kill patcher process, delete patcher.exe, extract aki zip
             if (string.Equals(complete, "yes", StringComparison.OrdinalIgnoreCase))
             {
+#if !DEBUG
                 patcherProcess.EndProcess();
                 Thread.Sleep(1000);
                 FileHelper.DeleteFile("file", targetPath + "/patcher.exe");
                 ZipHelper.Decompress(akiRef, targetPath);
+#endif
                 LogHelper.Info("AKI HAS BEEN EXTRACTED, RUN THE SERVER AND WAIT TILL YOU SEE HAPPY SERVER THEN LAUNCHER AND ENJOY!");
                 LogHelper.User("PRESS ENTER TO CLOSE THE APP");
                 Console.ReadKey();
-            }
-        }
-
-        /// <summary>
-        /// checks the game is installed, out = game directory
-        /// </summary>
-        /// <param name="gamePath"></param>
-        private static void GameCheck(out string gamePath)
-        {
-            string Path = GameHelper.DetectOriginalGamePath();
-
-            if (Path == null)
-            {
-                LogHelper.Error("EFT IS NOT INSTALLED!");
-                LogHelper.Error("Press enter to close the app");
-                Console.ReadKey();
                 Environment.Exit(0);
             }
-            gamePath = Path;
-        }
-
-        /// <summary>
-        /// checks for patcher zip path, out = patcher path
-        /// </summary>
-        /// <param name="gamePath"></param>
-        /// <param name="patchRef"></param>
-        /// <returns>bool</returns>
-        private static bool PatcherCheck(string gamePath, out string patchRef)
-        {
-            FileVersionInfo version = FileVersionInfo.GetVersionInfo(Path.Join(gamePath + "/EscapeFromTarkov.exe"));
-            string versionCheck = StringHelper.Splitter(version.ProductVersion, '-', '.', 2);
-            LogHelper.Info($"GAME VERSION IS: {version.ProductVersion}");
-            string patcherRef = FileHelper.FindFile(targetPath, versionCheck);
-
-            if (patcherRef != null)
-            {
-                patchRef = patcherRef;
-                return true;
-            }
-            patchRef = null;
-            return false;
-        }
-
-        /// <summary>
-        /// checks for aki zip path, out = aki path
-        /// </summary>
-        /// <param name="akiRef"></param>
-        /// <returns>bool</returns>
-        private static bool AkiCheck(out string akiRef)
-        {
-            string aki = FileHelper.FindFile(targetPath, "2.3.1");
-
-            if (aki != null)
-            {
-                akiRef = aki;
-                return true;
-            }
-            akiRef = null;
-            return false;
         }
     }
 }
\ No newline at end of file
diff --git a/Aki.Helper/FileHelper.cs b/Aki.Helper/FileHelper.cs
index 3fc3c69..212182b 100644
--- a/Aki.Helper/FileHelper.cs
+++ b/Aki.Helper/FileHelper.cs
@@ -1,5 +1,4 @@
-using SPT_AKI_Installer.Aki.Core;
-using System;
+using System;
 using System.IO;
 
 namespace SPT_AKI_Installer.Aki.Helper
@@ -84,11 +83,11 @@ namespace SPT_AKI_Installer.Aki.Helper
         /// <param name="patchRef"></param>
         /// <param name="dir"></param>
         /// <returns></returns>
-        public static bool FindFolder(string patchRef, out DirectoryInfo dir)
+        public static bool FindFolder(string patchRef, string targetPath, out DirectoryInfo dir)
         {
             var patchInfo = new FileInfo(patchRef);
             var patchName = patchInfo.Name.Replace(patchInfo.Extension, "");
-            var path = new DirectoryInfo(Path.Join(SPTinstaller.targetPath, patchName));
+            var path = new DirectoryInfo(Path.Join(targetPath, patchName));
             if (path.Exists)
             {
                 dir = path;
diff --git a/Aki.Helper/GameHelper.cs b/Aki.Helper/GameHelper.cs
deleted file mode 100644
index 3577eaf..0000000
--- a/Aki.Helper/GameHelper.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using Microsoft.Win32;
-using System.Runtime.InteropServices;
-using System.IO;
-
-namespace SPT_AKI_Installer.Aki.Helper
-{
-    public static class GameHelper
-    {
-        private const string registryInstall = @"Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\EscapeFromTarkov";
-
-        public static string DetectOriginalGamePath()
-        {
-            // We can't detect the installed path on non-Windows
-            if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
-                return null;
-
-            var uninstallStringValue = Registry.LocalMachine.OpenSubKey(registryInstall, false)
-                ?.GetValue("UninstallString");
-            var info = (uninstallStringValue is string key) ? new FileInfo(key) : null;
-            return info?.DirectoryName;
-        }
-    }
-}
diff --git a/Aki.Helper/LogHelper.cs b/Aki.Helper/LogHelper.cs
index 767731f..7bf6bff 100644
--- a/Aki.Helper/LogHelper.cs
+++ b/Aki.Helper/LogHelper.cs
@@ -12,7 +12,7 @@ namespace SPT_AKI_Installer.Aki.Helper
 
         /// <summary>
         /// Outputs a string to console starting with [USER] with
-        /// a Green background and Black foreground
+        /// Green text
         /// </summary>
         public static void User(string text)
         {
@@ -21,7 +21,7 @@ namespace SPT_AKI_Installer.Aki.Helper
 
         /// <summary>
         /// Outputs a string to console starting with [WARNING] with
-        /// a Yellow background and Black foreground
+        /// Yellow text
         /// </summary>
         public static void Warning(string text)
         {
@@ -30,7 +30,7 @@ namespace SPT_AKI_Installer.Aki.Helper
 
         /// <summary>
         /// Outputs a string to console starting with [ERROR] with
-        /// a Red background and Black foreground
+        /// Red text
         /// </summary>
         public static void Error(string text)
         {
@@ -39,7 +39,7 @@ namespace SPT_AKI_Installer.Aki.Helper
 
         /// <summary>
         /// Outputs a string to console starting with [INFO] with
-        /// a DarkGray background and White foreground
+        /// Blue text
         /// </summary>
         public static void Info(string text)
         {
diff --git a/Aki.Helper/PreCheckHelper.cs b/Aki.Helper/PreCheckHelper.cs
new file mode 100644
index 0000000..dff0f9a
--- /dev/null
+++ b/Aki.Helper/PreCheckHelper.cs
@@ -0,0 +1,91 @@
+using Microsoft.Win32;
+using System.Runtime.InteropServices;
+using System.IO;
+using System;
+using System.Diagnostics;
+
+namespace SPT_AKI_Installer.Aki.Helper
+{
+    public class PreCheckHelper
+    {
+        private const string registryInstall = @"Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\EscapeFromTarkov";
+
+        /// <summary>
+        /// gets the original EFT game path
+        /// </summary>
+        /// <returns>Path or null</returns>
+        public string DetectOriginalGamePath()
+        {
+            // We can't detect the installed path on non-Windows
+            if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+                return null;
+
+            var uninstallStringValue = Registry.LocalMachine.OpenSubKey(registryInstall, false)
+                ?.GetValue("UninstallString");
+            var info = (uninstallStringValue is string key) ? new FileInfo(key) : null;
+            return info?.DirectoryName;
+        }
+
+        /// <summary>
+        /// checks path is not null, out = gamePath
+        /// </summary>
+        /// <param name="gamePath"></param>
+        public void GameCheck(out string gamePath)
+        {
+            string Path = DetectOriginalGamePath();
+
+            if (Path == null)
+            {
+                LogHelper.Error("EFT IS NOT INSTALLED!");
+                LogHelper.Error("Press enter to close the app");
+                Console.ReadKey();
+                Environment.Exit(0);
+            }
+            gamePath = Path;
+        }
+
+        /// <summary>
+        /// Checks version of EFT installed, Then checks that matches the Zip, out = patch version number 0.12.12.*here*
+        /// </summary>
+        /// <param name="gamePath"></param>
+        /// <param name="targetPath"></param>
+        /// <param name="patchRef"></param>
+        /// <returns>bool</returns>
+        public bool PatcherCheck(string gamePath,string targetPath, out string patchRef)
+        {
+            StringHelper stringHelper = new StringHelper();
+            FileVersionInfo version = FileVersionInfo.GetVersionInfo(Path.Join(gamePath + "/EscapeFromTarkov.exe"));
+
+            string versionCheck = stringHelper.Splitter(version.ProductVersion, '-', '.', 2);
+            LogHelper.Info($"GAME VERSION IS: {version.ProductVersion}");
+            string patcherRef = FileHelper.FindFile(targetPath, versionCheck);
+
+            if (patcherRef != null)
+            {
+                patchRef = patcherRef;
+                return true;
+            }
+            patchRef = null;
+            return false;
+        }
+
+        /// <summary>
+        /// Checks Aki Zip is 2.3.1 currently
+        /// </summary>
+        /// <param name="targetPath"></param>
+        /// <param name="akiRef"></param>
+        /// <returns>bool</returns>
+        public bool AkiCheck(string targetPath,out string akiRef)
+        {
+            string aki = FileHelper.FindFile(targetPath, "2.3.1");
+
+            if (aki != null)
+            {
+                akiRef = aki;
+                return true;
+            }
+            akiRef = null;
+            return false;
+        }
+    }
+}
diff --git a/Aki.Helper/ProcessHelper.cs b/Aki.Helper/ProcessHelper.cs
index c145ca0..7a27993 100644
--- a/Aki.Helper/ProcessHelper.cs
+++ b/Aki.Helper/ProcessHelper.cs
@@ -1,10 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading;
-using System.IO;
-using System.Diagnostics;
+using System.Diagnostics;
 
 namespace SPT_AKI_Installer.Aki.Helper
 {
diff --git a/Aki.Helper/StatusHelper.cs b/Aki.Helper/StatusHelper.cs
index e93cdee..0ec6210 100644
--- a/Aki.Helper/StatusHelper.cs
+++ b/Aki.Helper/StatusHelper.cs
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
 
 namespace SPT_AKI_Installer.Aki.Helper
 {
-    internal class StatusHelper
-{
-}
+    public class StatusHelper
+    {
+    }
 }
diff --git a/Aki.Helper/StringHelper.cs b/Aki.Helper/StringHelper.cs
index 8447c8a..d2f0873 100644
--- a/Aki.Helper/StringHelper.cs
+++ b/Aki.Helper/StringHelper.cs
@@ -1,6 +1,6 @@
 namespace SPT_AKI_Installer.Aki.Helper
 {
-    public static class StringHelper
+    public class StringHelper
     {
         /// <summary>
         /// string to split, changes oldChar to newChar
@@ -10,7 +10,7 @@
         /// <param name="newChar"></param>
         /// <param name="amount"></param>
         /// <returns>returns the string at a position using amount</returns>
-        public static string Splitter(string toSplit, char oldChar, char newChar, int amount)
+        public string Splitter(string toSplit, char oldChar, char newChar, int amount)
         {
             return toSplit.Replace(oldChar, newChar).Split(newChar)[^amount];
         }