diff --git a/Tools/HashingCmdStart/HashingCmdStart.csproj b/Tools/HashingCmdStart/HashingCmdStart.csproj
index 9fcebb397cf5049487e500b331ed850f47cbed4c..b8a4abbaa30bdefb1ae1d291ba4e4f0f27dfa9a8 100644
--- a/Tools/HashingCmdStart/HashingCmdStart.csproj
+++ b/Tools/HashingCmdStart/HashingCmdStart.csproj
@@ -8,4 +8,8 @@
     <DefineConstants />
   </PropertyGroup>
 
+  <ItemGroup>
+    <Compile Include="..\VECTOStart\StarterHelper.cs" Link="StarterHelper.cs" />
+  </ItemGroup>
+
 </Project>
diff --git a/Tools/HashingCmdStart/Program.cs b/Tools/HashingCmdStart/Program.cs
index 4ee38c806d52ec7f2ee2e774945c926e400537ee..f3b287ab1d002769cb532880115205f80372126c 100644
--- a/Tools/HashingCmdStart/Program.cs
+++ b/Tools/HashingCmdStart/Program.cs
@@ -1,65 +1,7 @@
-using System;
-using Microsoft.Win32;
-using System.Diagnostics;
-using System.Reflection;
-using System.IO;
-
-namespace TUGraz.VECTO
+namespace TUGraz.VECTO
 {
 	class Program
 	{
-		static void Main()
-		{
-			var version = GetHighestNETVersion();
-			Process.Start(new ProcessStartInfo($"{version}\\{Assembly.GetExecutingAssembly().GetName().Name}.exe") {
-				WorkingDirectory = Directory.GetCurrentDirectory()
-			});
-		}
-
-		private static string GetHighestNETVersion()
-		{
-			if (SupportsNet60()) {
-				return "net60";
-			}
-
-			if (SupportsNet48()) {
-				return "net48";
-			}
-
-			return "net45";
-		}
-
-		private static bool SupportsNet60()
-		{
-			try {
-				var p = Process.Start(new ProcessStartInfo("dotnet", "--list-runtimes") {
-					CreateNoWindow = true,
-					UseShellExecute = false,
-					RedirectStandardError = true,
-					RedirectStandardOutput = true
-				});
-
-				p.WaitForExit();
-				var output = p.StandardOutput.ReadToEnd();
-				return output.Contains("Microsoft.WindowsDesktop.App 6");
-			} catch (Exception e) {
-				Console.WriteLine(e);
-			}
-
-			return false;
-		}
-
-		private static bool SupportsNet48()
-		{
-			const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
-			using (var ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey)) {
-				if (ndpKey != null && ndpKey.GetValue("Release") != null) {
-					var releaseKey = (int)ndpKey.GetValue("Release");
-					return releaseKey >= 528040;
-				}
-
-				return false;
-			}
-		}
+		static void Main(string[] args) => StarterHelper.StartVECTO(args);
 	}
-}
+}
\ No newline at end of file
diff --git a/Tools/HashingToolStart/HashingToolStart.csproj b/Tools/HashingToolStart/HashingToolStart.csproj
index e3d1dcf88ad6968750da69b00fd4acc572fe495b..c1f363bb2227524a61d13f8ba908bdc184e2c5bf 100644
--- a/Tools/HashingToolStart/HashingToolStart.csproj
+++ b/Tools/HashingToolStart/HashingToolStart.csproj
@@ -8,4 +8,12 @@
     <TargetFrameworks>net45</TargetFrameworks>
     <DefineConstants />
   </PropertyGroup>
+
+  <ItemGroup>
+    <Compile Include="..\VECTOStart\StarterHelper.cs" Link="StarterHelper.cs" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Reference Include="System.Windows.Forms" />
+  </ItemGroup>
 </Project>
diff --git a/Tools/HashingToolStart/Program.cs b/Tools/HashingToolStart/Program.cs
index c02231108231f8e676d4c49d64708861628ef3af..5e249bc5535387770fb697ebb4b6442ec018b8eb 100644
--- a/Tools/HashingToolStart/Program.cs
+++ b/Tools/HashingToolStart/Program.cs
@@ -3,17 +3,42 @@ using Microsoft.Win32;
 using System.Diagnostics;
 using System.Reflection;
 using System.IO;
+using System.Windows.Forms;
+using System.Linq;
 
 namespace TUGraz.VECTO
 {
 	class Program
 	{
-		static void Main()
+		private static string[] validVersions = { "net45" };
+		private static void ValidateVersion(string version)
 		{
-			var version = GetHighestNETVersion();
-			Process.Start(new ProcessStartInfo($"{version}\\{Assembly.GetExecutingAssembly().GetName().Name}.exe") {
-				WorkingDirectory = Directory.GetCurrentDirectory()
-			});
+			if (!validVersions.Contains(version))
+				throw new Exception($"Invalid .NET Version supplied. Only the following values are valid: {string.Join(", ", validVersions)}");
+		}
+
+		static void Main(string[] args)
+		{
+			var path = "No path found.";
+			string version = "No version found.";
+			try {
+				if (args.Length > 0) {
+					version = args[0].ToLower();
+					ValidateVersion(version);
+				} else {
+					version = GetHighestNETVersion();
+				}
+
+				path = $"{version}\\{Assembly.GetExecutingAssembly().GetName().Name}.exe";
+				Process.Start(new ProcessStartInfo(path) {
+					WorkingDirectory = Directory.GetCurrentDirectory()
+				});
+			} catch (Exception e) {
+				var message = $"Error during starting VECTO.\nDetected .NET version: {version}\nTried to open path: {path}\n{e.Message}";
+				File.AppendAllText("LOG.txt", $"{DateTime.Now} {message}\n");
+				Console.WriteLine(message);
+				MessageBox.Show(message);
+			}
 		}
 
 		private static string GetHighestNETVersion()
diff --git a/Tools/VECTOConsoleStart/Program.cs b/Tools/VECTOConsoleStart/Program.cs
index 4ee38c806d52ec7f2ee2e774945c926e400537ee..178aabefbf8e59c15ecad4b119b343f94ccb3928 100644
--- a/Tools/VECTOConsoleStart/Program.cs
+++ b/Tools/VECTOConsoleStart/Program.cs
@@ -1,65 +1,7 @@
-using System;
-using Microsoft.Win32;
-using System.Diagnostics;
-using System.Reflection;
-using System.IO;
-
-namespace TUGraz.VECTO
+namespace TUGraz.VECTO
 {
 	class Program
 	{
-		static void Main()
-		{
-			var version = GetHighestNETVersion();
-			Process.Start(new ProcessStartInfo($"{version}\\{Assembly.GetExecutingAssembly().GetName().Name}.exe") {
-				WorkingDirectory = Directory.GetCurrentDirectory()
-			});
-		}
-
-		private static string GetHighestNETVersion()
-		{
-			if (SupportsNet60()) {
-				return "net60";
-			}
-
-			if (SupportsNet48()) {
-				return "net48";
-			}
-
-			return "net45";
-		}
-
-		private static bool SupportsNet60()
-		{
-			try {
-				var p = Process.Start(new ProcessStartInfo("dotnet", "--list-runtimes") {
-					CreateNoWindow = true,
-					UseShellExecute = false,
-					RedirectStandardError = true,
-					RedirectStandardOutput = true
-				});
-
-				p.WaitForExit();
-				var output = p.StandardOutput.ReadToEnd();
-				return output.Contains("Microsoft.WindowsDesktop.App 6");
-			} catch (Exception e) {
-				Console.WriteLine(e);
-			}
-
-			return false;
-		}
-
-		private static bool SupportsNet48()
-		{
-			const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
-			using (var ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey)) {
-				if (ndpKey != null && ndpKey.GetValue("Release") != null) {
-					var releaseKey = (int)ndpKey.GetValue("Release");
-					return releaseKey >= 528040;
-				}
-
-				return false;
-			}
-		}
+		static void Main(string[] args) => StarterHelper.StartVECTO(args);
 	}
 }
diff --git a/Tools/VECTOConsoleStart/VECTOConsoleStart.csproj b/Tools/VECTOConsoleStart/VECTOConsoleStart.csproj
index eb31dee287a0b3b2fdcfb7d6069dfdfbde1f7296..a87fbbd03e9cd78f53ccf2b74f476cd77ef64b4b 100644
--- a/Tools/VECTOConsoleStart/VECTOConsoleStart.csproj
+++ b/Tools/VECTOConsoleStart/VECTOConsoleStart.csproj
@@ -9,4 +9,12 @@
     <DefineConstants />
   </PropertyGroup>
 
+  <ItemGroup>
+    <Compile Include="..\VECTOStart\StarterHelper.cs" Link="StarterHelper.cs" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Reference Include="System.Windows.Forms" />
+  </ItemGroup>
+
 </Project>
diff --git a/Tools/VECTOMultistageStart/Program.cs b/Tools/VECTOMultistageStart/Program.cs
index 2dce9c985988ae71a5b9ae7bff4d3f32ca46718a..69d88bdf179b7874437e5ccf855371e974a34212 100644
--- a/Tools/VECTOMultistageStart/Program.cs
+++ b/Tools/VECTOMultistageStart/Program.cs
@@ -1,47 +1,7 @@
-using System;
-using System.Diagnostics;
-using System.IO;
-using System.Reflection;
-
-namespace TUGraz.VECTO
+namespace TUGraz.VECTO
 {
 	class Program
 	{
-		static void Main()
-		{
-			var version = GetHighestNETVersion();
-			Process.Start(new ProcessStartInfo($"{version}\\{Assembly.GetExecutingAssembly().GetName().Name}.exe") {
-				WorkingDirectory = Directory.GetCurrentDirectory()
-			});
-		}
-
-		private static string GetHighestNETVersion()
-		{
-			if (SupportsNet60()) {
-				return "net60";
-			}
-
-			return "net48";
-		}
-
-		private static bool SupportsNet60()
-		{
-			try {
-				var p = Process.Start(new ProcessStartInfo("dotnet", "--list-runtimes") {
-					CreateNoWindow = true,
-					UseShellExecute = false,
-					RedirectStandardError = true,
-					RedirectStandardOutput = true
-				});
-
-				p.WaitForExit();
-				var output = p.StandardOutput.ReadToEnd();
-				return output.Contains("Microsoft.WindowsDesktop.App 6");
-			} catch (Exception e) {
-				Console.WriteLine(e);
-			}
-
-			return false;
-		}
+		static void Main(string[] args) => StarterHelper.StartVECTO(args, "net48", "net60");
 	}
 }
diff --git a/Tools/VECTOMultistageStart/VECTOMultistage.csproj b/Tools/VECTOMultistageStart/VECTOMultistage.csproj
index 06003236964e93d1b1df5cbf892ea81e74adc5f9..da3310873330bb510cc8a4fbb7f13b06a93bf3a5 100644
--- a/Tools/VECTOMultistageStart/VECTOMultistage.csproj
+++ b/Tools/VECTOMultistageStart/VECTOMultistage.csproj
@@ -9,4 +9,12 @@
     <DefineConstants />
   </PropertyGroup>
 
+  <ItemGroup>
+    <Compile Include="..\VECTOStart\StarterHelper.cs" Link="StarterHelper.cs" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Reference Include="System.Windows.Forms" />
+  </ItemGroup>
+
 </Project>
diff --git a/Tools/VECTOStart/Program.cs b/Tools/VECTOStart/Program.cs
index f99188e877fb616643ab4ba635ad8c05d3b542a9..178aabefbf8e59c15ecad4b119b343f94ccb3928 100644
--- a/Tools/VECTOStart/Program.cs
+++ b/Tools/VECTOStart/Program.cs
@@ -1,89 +1,7 @@
-using System;
-using Microsoft.Win32;
-using System.Diagnostics;
-using System.IO;
-using System.Linq;
-using System.Reflection;
-using System.Windows.Forms;
-
-namespace TUGraz.VECTO
+namespace TUGraz.VECTO
 {
 	class Program
 	{
-		static void Main(string[] args) {
-			var path = "No path found.";
-			string version = "No version found.";
-			try {
-				if (args.Length > 0) {
-					version = args[0];
-					ValidateVersion(version);
-				} else {
-					version = GetHighestNETVersion();
-				}
-
-				path = $"{version}\\{Assembly.GetExecutingAssembly().GetName().Name}.exe";
-				Process.Start(new ProcessStartInfo(path) {
-					WorkingDirectory = Directory.GetCurrentDirectory()
-				});
-			} catch (Exception e) {
-				Console.WriteLine(e);
-				var message = $"Error during starting VECTO.\nDetected .NET version: {version}\nTried to open path: {path}\n{e.Message}";
-				File.AppendAllText("LOG.txt", $"{DateTime.Now} {message}\n");
-				MessageBox.Show(message);
-			}
-		}
-
-		private static void ValidateVersion(string version)
-		{
-			var validVersions = new[] { "net45", "net48", "net60" };
-			if (!validVersions.Contains(version))
-				throw new Exception($"Invalid .NET Version supplied. Only the following values are valid: {string.Join(", ", validVersions)}");
-		}
-
-		private static string GetHighestNETVersion()
-		{
-			if (SupportsNet60()) {
-				return "net60";
-			}
-
-			if (SupportsNet48()) {
-				return "net48";
-			}
-
-			return "net45";
-		}
-
-		private static bool SupportsNet60()
-		{
-			try {
-				var p = Process.Start(new ProcessStartInfo("dotnet", "--list-runtimes") {
-					CreateNoWindow = true,
-					UseShellExecute = false,
-					RedirectStandardError = true,
-					RedirectStandardOutput = true
-				});
-
-				p.WaitForExit();
-				var output = p.StandardOutput.ReadToEnd();
-				return output.Contains("Microsoft.WindowsDesktop.App 6");
-			} catch (Exception e) {
-				Console.WriteLine(e);
-			}
-
-			return false;
-		}
-
-		private static bool SupportsNet48()
-		{
-			const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
-			using (var ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey)) {
-				if (ndpKey != null && ndpKey.GetValue("Release") != null) {
-					var releaseKey = (int)ndpKey.GetValue("Release");
-					return releaseKey >= 528040;
-				}
-
-				return false;
-			}
-		}
+		static void Main(string[] args) => StarterHelper.StartVECTO(args);
 	}
 }
diff --git a/Tools/VECTOStart/StarterHelper.cs b/Tools/VECTOStart/StarterHelper.cs
new file mode 100644
index 0000000000000000000000000000000000000000..6ff0fe0d428fb44566758321b6a39c93429906ea
--- /dev/null
+++ b/Tools/VECTOStart/StarterHelper.cs
@@ -0,0 +1,93 @@
+using Microsoft.Win32;
+using System;
+using System.Collections;
+using System.Diagnostics;
+using System.IO;
+using System.Reflection;
+using System.Windows.Forms;
+
+namespace TUGraz.VECTO
+{
+	class StarterHelper
+	{
+		public static void StartVECTO(string[] args, params string[] validVersions)
+		{
+			var path = "No path found.";
+			string version = "No version found.";
+			if (validVersions is null) {
+				validVersions = new[] { "net45", "net48", "net60" };
+			}
+			try {
+				if (args.Length > 0) {
+					version = args[0].ToLower();
+				} else {
+					version = StarterHelper.GetHighestNETVersion();
+				}
+
+				path = $"{version}\\{Assembly.GetExecutingAssembly().GetName().Name}.exe";
+				Process.Start(new ProcessStartInfo(path) {
+					WorkingDirectory = Directory.GetCurrentDirectory()
+				});
+				ValidateVersion(version, validVersions);
+			} catch (Exception e) {
+				var message = $"Error during starting VECTO.\nDetected .NET version: {version}\nTried to open path: {path}\n{e.Message}";
+				File.AppendAllText("LOG.txt", $"{DateTime.Now} {message}\n");
+				Console.WriteLine(message);
+				MessageBox.Show(message);
+			}
+		}
+		
+		private static void ValidateVersion(string version, params string[] validVersions)
+		{
+			if (!((IList)validVersions).Contains(version))
+				throw new Exception($"Invalid .NET Version supplied. Only the following values are valid: {string.Join(", ", validVersions)}");
+		}
+		
+		private static string GetHighestNETVersion()
+		{
+			if (SupportsNet60()) {
+				return "net60";
+			}
+
+			if (SupportsNet48()) {
+				return "net48";
+			}
+
+			return "net45";
+		}
+
+		private static bool SupportsNet60()
+		{
+			try {
+				var p = Process.Start(new ProcessStartInfo("dotnet", "--list-runtimes") {
+					CreateNoWindow = true,
+					UseShellExecute = false,
+					RedirectStandardError = true,
+					RedirectStandardOutput = true
+				});
+
+				p.WaitForExit();
+				var output = p.StandardOutput.ReadToEnd();
+				return output.Contains("Microsoft.WindowsDesktop.App 6");
+			} catch (Exception e) {
+				Console.WriteLine(e);
+			}
+
+			return false;
+		}
+
+		private static bool SupportsNet48()
+		{
+			const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
+			using (var ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey)) {
+				if (ndpKey != null && ndpKey.GetValue("Release") != null) {
+					var releaseKey = (int)ndpKey.GetValue("Release");
+					return releaseKey >= 528040;
+				}
+
+				return false;
+			}
+		}
+
+	}
+}