Index: AE/installer2/src/net/oni2/aeinstaller/AEInstaller.properties
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/AEInstaller.properties	(revision 709)
+++ AE/installer2/src/net/oni2/aeinstaller/AEInstaller.properties	(revision 720)
@@ -1,2 +1,2 @@
 appname=AE Installer 2
-appversion=0.99u
+appversion=0.99v
Index: AE/installer2/src/net/oni2/aeinstaller/AEInstaller2.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/AEInstaller2.java	(revision 709)
+++ AE/installer2/src/net/oni2/aeinstaller/AEInstaller2.java	(revision 720)
@@ -21,6 +21,6 @@
 import javax.swing.UIManager.LookAndFeelInfo;
 
+import net.oni2.SettingsManager;
 import net.oni2.aeinstaller.backend.CaseInsensitiveFile;
-import net.oni2.aeinstaller.backend.DotNet;
 import net.oni2.aeinstaller.backend.Paths;
 import net.oni2.aeinstaller.backend.SizeFormatter;
@@ -30,6 +30,7 @@
 import net.oni2.aeinstaller.gui.HTMLLinkLabel;
 import net.oni2.aeinstaller.gui.MainWin;
-import net.oni2.settingsmanager.Settings;
-import net.oni2.settingsmanager.Settings.Platform;
+import net.oni2.platformtools.PlatformInformation;
+import net.oni2.platformtools.PlatformInformation.Platform;
+import net.oni2.platformtools.applicationinvoker.DotNet;
 
 import org.javabuilders.swing.SwingJavaBuilder;
@@ -123,11 +124,11 @@
 		initBundles();
 
-		if (Settings.getPlatform() == Platform.MACOS)
+		if (PlatformInformation.getPlatform() == Platform.MACOS)
 			initMacOS();
 
-		Settings.setDebug(debug);
-		Settings.deserializeFromFile(Paths.getSettingsFilename());
-		Settings.setDebug(debug);
-		Settings.getInstance().setNoCacheUpdateMode(noCacheUpdate);
+		SettingsManager.setDebug(debug);
+		SettingsManager.deserializeFromFile(Paths.getSettingsFilename());
+		SettingsManager.setDebug(debug);
+		SettingsManager.getInstance().setNoCacheUpdateMode(noCacheUpdate);
 
 		SwingJavaBuilder.getConfig().addResourceBundle(imagesBundle);
@@ -142,8 +143,8 @@
 
 		try {
-			String laf = Settings.getInstance().get("lookandfeel",
+			String laf = SettingsManager.getInstance().get("lookandfeel",
 					(String) null);
 			if (laf == null) {
-				if (Settings.getPlatform() != Platform.LINUX) {
+				if (PlatformInformation.getPlatform() != Platform.LINUX) {
 					laf = UIManager.getSystemLookAndFeelClassName();
 				} else {
@@ -171,6 +172,6 @@
 		System.out.println("TempPath:  " + Paths.getTempPath());
 		System.out.println("ValidPath: " + Installer.verifyRunningDirectory());
-		System.out.println("Platform:  " + Settings.getPlatform());
-		System.out.println("Architect: " + Settings.getArchitecture());
+		System.out.println("Platform:  " + PlatformInformation.getPlatform());
+		System.out.println("Architect: " + PlatformInformation.getArchitecture());
 		System.out.println(".NET:      " + DotNet.isInstalled());
 		System.out.println("OniSplit:  " + OniSplit.isOniSplitInstalled());
@@ -190,7 +191,7 @@
 			HTMLLinkLabel hll = new HTMLLinkLabel();
 			String dlUrl = "";
-			switch (Settings.getPlatform()) {
+			switch (PlatformInformation.getPlatform()) {
 				case WIN:
-					switch (Settings.getArchitecture()) {
+					switch (PlatformInformation.getArchitecture()) {
 						case X86:
 							dlUrl = "http://download.microsoft.com/download/c/6/e/c6e88215-0178-4c6c-b5f3-158ff77b1f38/NetFx20SP2_x86.exe";
@@ -220,5 +221,5 @@
 					globalBundle.getString("invalidPath.title"),
 					JOptionPane.ERROR_MESSAGE);
-			if (!Settings.isDebug()) {
+			if (!SettingsManager.isDebug()) {
 				return;
 			}
@@ -238,5 +239,5 @@
 					JOptionPane.INFORMATION_MESSAGE);
 		}
-		Settings.getInstance().setOfflineMode(offline);
+		SettingsManager.getInstance().setOfflineMode(offline);
 
 		SwingUtilities.invokeLater(new Runnable() {
Index: AE/installer2/src/net/oni2/aeinstaller/backend/DotNet.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/DotNet.java	(revision 709)
+++ 	(revision )
@@ -1,80 +1,0 @@
-package net.oni2.aeinstaller.backend;
-
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.util.Map;
-import java.util.Vector;
-
-import net.oni2.applicationinvoker.AppExecution;
-import net.oni2.applicationinvoker.AppExecutionResult;
-import net.oni2.settingsmanager.Settings;
-import net.oni2.settingsmanager.Settings.Architecture;
-import net.oni2.settingsmanager.Settings.Platform;
-
-/**
- * @author Christian Illy
- */
-public class DotNet {
-
-	/**
-	 * @return is a .NET implementation installed?
-	 */
-	public static boolean isInstalled() {
-		switch (Settings.getPlatform()) {
-			case WIN:
-				try {
-					int view = WinRegistry.KEY_WOW64_32KEY;
-					if (Settings.getArchitecture() == Architecture.AMD64)
-						view = WinRegistry.KEY_WOW64_64KEY;
-
-					Map<String, String> m = WinRegistry
-							.readStringValues(
-									WinRegistry.HKEY_LOCAL_MACHINE,
-									"Software\\Microsoft\\NET Framework Setup\\NDP\\v2.0.50727",
-									view);
-					return m != null;
-				} catch (IllegalArgumentException e) {
-					e.printStackTrace();
-				} catch (IllegalAccessException e) {
-					e.printStackTrace();
-				} catch (InvocationTargetException e) {
-					e.printStackTrace();
-				} catch (Exception e) {
-					if (!e.getMessage()
-							.equals("Registry access not supported (not a Windows OS?)."))
-						e.printStackTrace();
-				}
-				return false;
-			case MACOS:
-			case LINUX:
-				Vector<String> cmd = new Vector<String>();
-				cmd.add("which");
-				cmd.add("mono");
-				AppExecutionResult res = null;
-				try {
-					res = AppExecution.executeAndWait(cmd);
-				} catch (IOException e) {
-					e.printStackTrace();
-				}
-				if (res != null) {
-					if (res.output.get(0).startsWith("/")
-							&& res.output.get(0).endsWith("mono")) {
-						return true;
-					}
-				}
-				return false;
-			default:
-				return false;
-		}
-	}
-
-	/**
-	 * @return Get the .Net runtime executable name
-	 */
-	public static String getRuntimeExe() {
-		if (Settings.getPlatform() != Platform.WIN)
-			return "mono";
-		return "";
-	}
-
-}
Index: AE/installer2/src/net/oni2/aeinstaller/backend/Paths.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/Paths.java	(revision 709)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/Paths.java	(revision 720)
@@ -5,5 +5,5 @@
 import java.net.URLDecoder;
 
-import net.oni2.settingsmanager.Settings;
+import net.oni2.SettingsManager;
 
 /**
@@ -32,9 +32,9 @@
 	 */
 	public static File getInstallerPath() {
-		if (Settings.isDebug()) {
+		if (SettingsManager.isDebug()) {
 			String wd = System.getProperty("user.dir");
 			return new File(wd);
 		} else {
-			String jarPath = Settings.class.getProtectionDomain()
+			String jarPath = SettingsManager.class.getProtectionDomain()
 					.getCodeSource().getLocation().getPath();
 			String decodedPath = null;
Index: AE/installer2/src/net/oni2/aeinstaller/backend/ToolLauncher.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/ToolLauncher.java	(revision 709)
+++ 	(revision )
@@ -1,55 +1,0 @@
-package net.oni2.aeinstaller.backend;
-
-import java.io.File;
-import java.util.Vector;
-
-import net.oni2.aeinstaller.backend.packages.Package;
-import net.oni2.applicationinvoker.AppExecution;
-import net.oni2.settingsmanager.Settings;
-import net.oni2.settingsmanager.Settings.Platform;
-
-/**
- * @author Christian Illy
- */
-public class ToolLauncher {
-	/**
-	 * @param p
-	 *            Package of tool to launch
-	 * @throws Exception
-	 *             If a required runtime is not found
-	 */
-	public static void launch(Package p) throws Exception {
-		File exe = p.getExeFile();
-
-		Vector<String> params = new Vector<String>();
-		switch (p.getExeType()) {
-			case OSBINARY:
-				break;
-			case DOTNET:
-				if (!DotNet.isInstalled())
-					throw new Exception(".NET not found");
-				if (Settings.getPlatform() != Platform.WIN) {
-					params.add(DotNet.getRuntimeExe());
-				}
-				break;
-			case JAR:
-				File jre = null;
-				if (Settings.getPlatform() == Platform.WIN)
-					jre = new File(System.getProperties().getProperty(
-							"java.home"), "bin/javaw.exe");
-				else
-					jre = new File(System.getProperties().getProperty(
-							"java.home"), "bin/java");
-				if (!jre.exists())
-					throw new Exception("JRE not found");
-				params.add(jre.getPath());
-				params.add("-jar");
-				break;
-		}
-		params.add(exe.getPath());
-
-		File wd = p.getWorkingDir();
-
-		AppExecution.execute(params, wd);
-	}
-}
Index: AE/installer2/src/net/oni2/aeinstaller/backend/depot/DepotConfig.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/depot/DepotConfig.java	(revision 709)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/depot/DepotConfig.java	(revision 720)
@@ -3,5 +3,5 @@
 import java.util.TreeSet;
 
-import net.oni2.settingsmanager.Settings;
+import net.oni2.SettingsManager;
 
 /**
@@ -88,5 +88,5 @@
 	 */
 	static String getDepotUrl() {
-		return Settings.getInstance().get("depot_url", "http://mods.oni2.net/");
+		return SettingsManager.getInstance().get("depot_url", "http://mods.oni2.net/");
 	}
 
@@ -95,5 +95,5 @@
 	 */
 	static String getDepotApiUrl() {
-		return Settings.getInstance().get("depot_api_url",
+		return SettingsManager.getInstance().get("depot_api_url",
 				"http://mods.oni2.net/?q=api/");
 	}
Index: AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java	(revision 709)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java	(revision 720)
@@ -21,4 +21,5 @@
 import java.util.regex.Pattern;
 
+import net.oni2.SettingsManager;
 import net.oni2.aeinstaller.AEInstaller2;
 import net.oni2.aeinstaller.backend.CaseInsensitiveFile;
@@ -27,7 +28,7 @@
 import net.oni2.aeinstaller.backend.packages.Package;
 import net.oni2.aeinstaller.backend.packages.PackageManager;
-import net.oni2.applicationinvoker.AppExecutionResult;
-import net.oni2.settingsmanager.Settings;
-import net.oni2.settingsmanager.Settings.Platform;
+import net.oni2.platformtools.PlatformInformation;
+import net.oni2.platformtools.PlatformInformation.Platform;
+import net.oni2.platformtools.applicationinvoker.ApplicationInvocationResult;
 
 import org.apache.commons.io.FileUtils;
@@ -134,5 +135,5 @@
 							copyRemoveToolsFiles(plainCommon,
 									Paths.getEditionBasePath(), uninstall);
-						if (Settings.getPlatform() == Platform.MACOS
+						if (PlatformInformation.getPlatform() == Platform.MACOS
 								&& plainMac.exists())
 							copyRemoveToolsFiles(plainMac,
@@ -225,7 +226,7 @@
 						|| s.endsWith(".raw")
 						|| s.endsWith(".sep")
-						|| (s.equals("intro.bik") && !Settings.getInstance()
+						|| (s.equals("intro.bik") && !SettingsManager.getInstance()
 								.get("copyintro", false))
-						|| (s.equals("outro.bik") && !Settings.getInstance()
+						|| (s.equals("outro.bik") && !SettingsManager.getInstance()
 								.get("copyoutro", false));
 			}
@@ -279,5 +280,5 @@
 					if (oniCommon.exists())
 						foldersOni.add(oniCommon);
-					if (Settings.getPlatform() == Platform.MACOS
+					if (PlatformInformation.getPlatform() == Platform.MACOS
 							&& oniMac.exists())
 						foldersOni.add(oniMac);
@@ -301,5 +302,5 @@
 					if (patchesCommon.exists())
 						foldersPatches.add(patchesCommon);
-					if (Settings.getPlatform() == Platform.MACOS
+					if (PlatformInformation.getPlatform() == Platform.MACOS
 							&& patchesMac.exists())
 						foldersPatches.add(patchesMac);
@@ -369,7 +370,7 @@
 					File bslWin = CaseInsensitiveFile.getCaseInsensitiveFile(
 							bsl, "win_only");
-					if ((Settings.getPlatform() == Platform.MACOS && bslMac
+					if ((PlatformInformation.getPlatform() == Platform.MACOS && bslMac
 							.exists())
-							|| ((Settings.getPlatform() == Platform.WIN || Settings
+							|| ((PlatformInformation.getPlatform() == Platform.WIN || PlatformInformation
 									.getPlatform() == Platform.LINUX) && bslWin
 									.exists()) || bslCommon.exists()) {
@@ -406,5 +407,5 @@
 			File bslWin = CaseInsensitiveFile.getCaseInsensitiveFile(bsl,
 					"win_only");
-			if (Settings.getPlatform() == Platform.MACOS && bslMac.exists()) {
+			if (PlatformInformation.getPlatform() == Platform.MACOS && bslMac.exists()) {
 				for (File f : bslMac.listFiles(dirFileFilter)) {
 					File targetBSL = new File(targetBaseFolder, f.getName());
@@ -413,5 +414,5 @@
 				}
 			}
-			if ((Settings.getPlatform() == Platform.WIN || Settings
+			if ((PlatformInformation.getPlatform() == Platform.WIN || PlatformInformation
 					.getPlatform() == Platform.LINUX) && bslWin.exists()) {
 				for (File f : bslWin.listFiles(dirFileFilter)) {
@@ -508,5 +509,5 @@
 					if (srcFolder.getPath().toLowerCase().contains("vanilla")) {
 						// Extract from .dat
-						AppExecutionResult res = OniSplit.export(levelFolder,
+						ApplicationInvocationResult res = OniSplit.export(levelFolder,
 								srcFolder, exportPatterns);
 						logAppOutput(res, log);
@@ -533,5 +534,5 @@
 								.contains("vanilla")) {
 							// Extract from .dat
-							AppExecutionResult res = OniSplit.export(
+							ApplicationInvocationResult res = OniSplit.export(
 									levelFolder, srcFolder, patterns);
 							logAppOutput(res, log);
@@ -556,5 +557,5 @@
 			Vector<File> files = new Vector<File>();
 			files.add(new File(levelFolder, "*.oni"));
-			AppExecutionResult res = OniSplit.convertOniToXML(levelFolderXML,
+			ApplicationInvocationResult res = OniSplit.convertOniToXML(levelFolderXML,
 					files);
 			logAppOutput(res, log);
@@ -613,5 +614,5 @@
 					"Installing level " + l);
 
-			AppExecutionResult res = OniSplit.packLevel(oniLevelFolders.get(l),
+			ApplicationInvocationResult res = OniSplit.packLevel(oniLevelFolders.get(l),
 					new File(Paths.getEditionGDF(), sanitizeLevelName(l)
 							+ ".dat"));
@@ -627,5 +628,5 @@
 
 	private static void copyVideos(PrintWriter log) {
-		if (Settings.getInstance().get("copyintro", false)) {
+		if (SettingsManager.getInstance().get("copyintro", false)) {
 			File src = new File(Paths.getVanillaGDF(), "intro.bik");
 			log.println("Copying intro");
@@ -640,5 +641,5 @@
 			log.println("NOT copying intro");
 		}
-		if (Settings.getInstance().get("copyoutro", true)) {
+		if (SettingsManager.getInstance().get("copyoutro", true)) {
 			File src = new File(Paths.getVanillaGDF(), "outro.bik");
 			log.println("Copying outro");
@@ -741,5 +742,5 @@
 
 				// Export Vanilla-Level-Dat -> Temp/Level
-				AppExecutionResult res = OniSplit.export(tempLevelFolder, f);
+				ApplicationInvocationResult res = OniSplit.export(tempLevelFolder, f);
 				logAppOutput(res, log);
 
@@ -763,5 +764,5 @@
 				folders.add(f);
 
-				AppExecutionResult res = OniSplit
+				ApplicationInvocationResult res = OniSplit
 						.importLevel(folders,
 								new File(Paths.getVanillaOnisPath(), levelName
@@ -922,5 +923,5 @@
 	}
 
-	private static void logAppOutput(AppExecutionResult result, PrintWriter log) {
+	private static void logAppOutput(ApplicationInvocationResult result, PrintWriter log) {
 		if (result != null) {
 			log.println("\t\t\tCalled:");
Index: AE/installer2/src/net/oni2/aeinstaller/backend/oni/OniLauncher.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/oni/OniLauncher.java	(revision 720)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/oni/OniLauncher.java	(revision 720)
@@ -0,0 +1,68 @@
+package net.oni2.aeinstaller.backend.oni;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Vector;
+
+import net.oni2.aeinstaller.backend.Paths;
+import net.oni2.platformtools.PlatformInformation;
+import net.oni2.platformtools.applicationinvoker.ApplicationInvoker;
+import net.oni2.platformtools.applicationinvoker.EExeType;
+import net.oni2.platformtools.applicationinvoker.ERuntimeNotInstalledException;
+
+/**
+ * @author Christian Illy
+ */
+public class OniLauncher {
+
+	private static File getOniExe() {
+		File exe = null;
+		switch (PlatformInformation.getPlatform()) {
+			case WIN:
+				exe = new File(Paths.getEditionBasePath(), "Oni.exe");
+				break;
+			case MACOS:
+				exe = new File(Paths.getEditionBasePath(),
+						"Oni.app/Contents/MacOS/Oni");
+				break;
+			case LINUX:
+				exe = new File(Paths.getEditionBasePath(), "Oni.exe");
+				break;
+			default:
+		}
+		if ((exe != null) && !exe.exists())
+			exe = null;
+		return exe;
+	}
+
+	private static EExeType getOniExeType() {
+		switch (PlatformInformation.getPlatform()) {
+			case MACOS:
+				return EExeType.OSBINARY;
+			default:
+				return EExeType.WINEXE;
+		}
+	}
+
+	/**
+	 * @param windowed
+	 *            Run in windowed mode
+	 * @throws FileNotFoundException
+	 *             If Oni's executable was not found
+	 * @throws ERuntimeNotInstalledException
+	 *             If Linux and Wine not found
+	 */
+	public static void launch(boolean windowed) throws FileNotFoundException,
+			ERuntimeNotInstalledException {
+		File exe = getOniExe();
+		if (exe == null)
+			throw new FileNotFoundException("Oni's executable was not found");
+		Vector<String> params = new Vector<String>();
+		params.add("-debugfiles");
+		if (windowed)
+			params.add("-noswitch");
+		ApplicationInvoker.execute(getOniExeType(), exe.getParentFile(), exe,
+				params);
+	}
+
+}
Index: AE/installer2/src/net/oni2/aeinstaller/backend/oni/OniSplit.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/oni/OniSplit.java	(revision 709)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/oni/OniSplit.java	(revision 720)
@@ -6,10 +6,11 @@
 
 import net.oni2.aeinstaller.backend.CaseInsensitiveFile;
-import net.oni2.aeinstaller.backend.DotNet;
 import net.oni2.aeinstaller.backend.Paths;
-import net.oni2.applicationinvoker.AppExecution;
-import net.oni2.applicationinvoker.AppExecutionResult;
-import net.oni2.settingsmanager.Settings;
-import net.oni2.settingsmanager.Settings.Platform;
+import net.oni2.platformtools.PlatformInformation;
+import net.oni2.platformtools.PlatformInformation.Platform;
+import net.oni2.platformtools.applicationinvoker.ApplicationInvoker;
+import net.oni2.platformtools.applicationinvoker.ApplicationInvocationResult;
+import net.oni2.platformtools.applicationinvoker.EExeType;
+import net.oni2.platformtools.applicationinvoker.ERuntimeNotInstalledException;
 
 /**
@@ -34,5 +35,5 @@
 	 * @return OniSplit output
 	 */
-	public static AppExecutionResult export(File targetFolder, File input) {
+	public static ApplicationInvocationResult export(File targetFolder, File input) {
 		return export(targetFolder, input, null);
 	}
@@ -49,22 +50,24 @@
 	 * @return OniSplit output
 	 */
-	public static AppExecutionResult export(File targetFolder, File input,
+	public static ApplicationInvocationResult export(File targetFolder, File input,
 			Vector<String> patterns) {
 		if (!targetFolder.exists())
 			targetFolder.mkdir();
 
-		Vector<String> cmdLine = getProgramInvocation();
+		Vector<String> params = new Vector<String>();
 		if (patterns == null)
-			cmdLine.add("-export");
+			params.add("-export");
 		else {
 			for (String p : patterns)
-				cmdLine.add("-export:" + p);
-		}
-		cmdLine.add(targetFolder.getPath());
-		cmdLine.add(input.getPath());
-		AppExecutionResult res = null;
-		try {
-			res = AppExecution.executeAndWait(cmdLine);
-		} catch (IOException e) {
+				params.add("-export:" + p);
+		}
+		params.add(targetFolder.getPath());
+		params.add(input.getPath());
+		ApplicationInvocationResult res = null;
+		try {
+			res = ApplicationInvoker.executeAndWait(EExeType.DOTNET, null, getProgramFile(), params);
+		} catch (IOException e) {
+			e.printStackTrace();
+		} catch (ERuntimeNotInstalledException e) {
 			e.printStackTrace();
 		}
@@ -81,15 +84,17 @@
 	 * @return OniSplit output
 	 */
-	public static AppExecutionResult importLevel(Vector<File> sourceFolders,
+	public static ApplicationInvocationResult importLevel(Vector<File> sourceFolders,
 			File targetFile) {
-		Vector<String> cmdLine = getProgramInvocation();
-		cmdLine.add(getImportParam());
+		Vector<String> params = new Vector<String>();
+		params.add(getImportParam());
 		for (File f : sourceFolders)
-			cmdLine.add(f.getPath());
-		cmdLine.add(targetFile.getPath());
-		AppExecutionResult res = null;
-		try {
-			res = AppExecution.executeAndWait(cmdLine);
-		} catch (IOException e) {
+			params.add(f.getPath());
+		params.add(targetFile.getPath());
+		ApplicationInvocationResult res = null;
+		try {
+			res = ApplicationInvoker.executeAndWait(EExeType.DOTNET, null, getProgramFile(), params);
+		} catch (IOException e) {
+			e.printStackTrace();
+		} catch (ERuntimeNotInstalledException e) {
 			e.printStackTrace();
 		}
@@ -108,17 +113,19 @@
 	 * @return OniSplit output
 	 */
-	public static AppExecutionResult packLevel(Vector<File> sourceFoldersFiles,
+	public static ApplicationInvocationResult packLevel(Vector<File> sourceFoldersFiles,
 			File targetFile) {
-		Vector<String> cmdLine = getProgramInvocation();
-		cmdLine.add(getPackParam());
-		cmdLine.add(getPackTypeParam());
-		cmdLine.add("-out");
-		cmdLine.add(targetFile.getPath());
+		Vector<String> params = new Vector<String>();
+		params.add(getPackParam());
+		params.add(getPackTypeParam());
+		params.add("-out");
+		params.add(targetFile.getPath());
 		for (File f : sourceFoldersFiles)
-			cmdLine.add(f.getPath());
-		AppExecutionResult res = null;
-		try {
-			res = AppExecution.executeAndWait(cmdLine);
-		} catch (IOException e) {
+			params.add(f.getPath());
+		ApplicationInvocationResult res = null;
+		try {
+			res = ApplicationInvoker.executeAndWait(EExeType.DOTNET, null, getProgramFile(), params);
+		} catch (IOException e) {
+			e.printStackTrace();
+		} catch (ERuntimeNotInstalledException e) {
 			e.printStackTrace();
 		}
@@ -138,18 +145,20 @@
 	 * @return OniSplit output
 	 */
-	public static AppExecutionResult move(File targetFolder, String input,
+	public static ApplicationInvocationResult move(File targetFolder, String input,
 			String moveParameter) {
 		if (!targetFolder.exists())
 			targetFolder.mkdir();
 
-		Vector<String> cmdLine = getProgramInvocation();
-		cmdLine.add("-move"
+		Vector<String> params = new Vector<String>();
+		params.add("-move"
 				+ (moveParameter != null ? ":" + moveParameter : ""));
-		cmdLine.add(targetFolder.getPath());
-		cmdLine.add(input);
-		AppExecutionResult res = null;
-		try {
-			res = AppExecution.executeAndWait(cmdLine);
-		} catch (IOException e) {
+		params.add(targetFolder.getPath());
+		params.add(input);
+		ApplicationInvocationResult res = null;
+		try {
+			res = ApplicationInvoker.executeAndWait(EExeType.DOTNET, null, getProgramFile(), params);
+		} catch (IOException e) {
+			e.printStackTrace();
+		} catch (ERuntimeNotInstalledException e) {
 			e.printStackTrace();
 		}
@@ -166,19 +175,21 @@
 	 * @return OniSplit output
 	 */
-	public static AppExecutionResult convertOniToXML(File targetFolder,
+	public static ApplicationInvocationResult convertOniToXML(File targetFolder,
 			Vector<File> inputFiles) {
 		if (!targetFolder.exists())
 			targetFolder.mkdirs();
 
-		Vector<String> cmdLine = getProgramInvocation();
-		cmdLine.add("-extract:xml");
-		cmdLine.add(targetFolder.getPath());
+		Vector<String> params = new Vector<String>();
+		params.add("-extract:xml");
+		params.add(targetFolder.getPath());
 		for (File f : inputFiles) {
-			cmdLine.add(f.getPath());
-		}
-		AppExecutionResult res = null;
-		try {
-			res = AppExecution.executeAndWait(cmdLine);
-		} catch (IOException e) {
+			params.add(f.getPath());
+		}
+		ApplicationInvocationResult res = null;
+		try {
+			res = ApplicationInvoker.executeAndWait(EExeType.DOTNET, null, getProgramFile(), params);
+		} catch (IOException e) {
+			e.printStackTrace();
+		} catch (ERuntimeNotInstalledException e) {
 			e.printStackTrace();
 		}
@@ -195,19 +206,21 @@
 	 * @return OniSplit output
 	 */
-	public static AppExecutionResult convertXMLtoOni(File targetFolder,
+	public static ApplicationInvocationResult convertXMLtoOni(File targetFolder,
 			Vector<File> inputFiles) {
 		if (!targetFolder.exists())
 			targetFolder.mkdirs();
 
-		Vector<String> cmdLine = getProgramInvocation();
-		cmdLine.add("-create");
-		cmdLine.add(targetFolder.getPath());
+		Vector<String> params = new Vector<String>();
+		params.add("-create");
+		params.add(targetFolder.getPath());
 		for (File f : inputFiles) {
-			cmdLine.add(f.getPath());
-		}
-		AppExecutionResult res = null;
-		try {
-			res = AppExecution.executeAndWait(cmdLine);
-		} catch (IOException e) {
+			params.add(f.getPath());
+		}
+		ApplicationInvocationResult res = null;
+		try {
+			res = ApplicationInvoker.executeAndWait(EExeType.DOTNET, null, getProgramFile(), params);
+		} catch (IOException e) {
+			e.printStackTrace();
+		} catch (ERuntimeNotInstalledException e) {
 			e.printStackTrace();
 		}
@@ -216,5 +229,5 @@
 
 	private static String getImportParam() {
-		if (Settings.getPlatform() == Platform.MACOS)
+		if (PlatformInformation.getPlatform() == Platform.MACOS)
 			return "-import:sep";
 		else
@@ -227,16 +240,8 @@
 
 	private static String getPackTypeParam() {
-		if (Settings.getPlatform() == Platform.MACOS)
+		if (PlatformInformation.getPlatform() == Platform.MACOS)
 			return "-type:macintel";
 		else
 			return "-type:pc";
-	}
-
-	private static Vector<String> getProgramInvocation() {
-		Vector<String> res = new Vector<String>();
-		if (DotNet.getRuntimeExe().length() > 0)
-			res.add(DotNet.getRuntimeExe());
-		res.add(getProgramFile().getPath());
-		return res;
 	}
 
Index: AE/installer2/src/net/oni2/aeinstaller/backend/oni/XMLTools.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/oni/XMLTools.java	(revision 709)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/oni/XMLTools.java	(revision 720)
@@ -6,8 +6,9 @@
 
 import net.oni2.aeinstaller.backend.CaseInsensitiveFile;
-import net.oni2.aeinstaller.backend.DotNet;
 import net.oni2.aeinstaller.backend.Paths;
-import net.oni2.applicationinvoker.AppExecution;
-import net.oni2.applicationinvoker.AppExecutionResult;
+import net.oni2.platformtools.applicationinvoker.ApplicationInvoker;
+import net.oni2.platformtools.applicationinvoker.ApplicationInvocationResult;
+import net.oni2.platformtools.applicationinvoker.EExeType;
+import net.oni2.platformtools.applicationinvoker.ERuntimeNotInstalledException;
 
 /**
@@ -26,14 +27,17 @@
 	 * @return XMLTools output
 	 */
-	public static AppExecutionResult patch(File patch, File source) {
-		Vector<String> cmdLine = getProgramInvocation();
+	public static ApplicationInvocationResult patch(File patch, File source) {
+		Vector<String> params = new Vector<String>();
 		// xmlTools.exe patchfile -filename:PATCH -forceinfiles:TOPATCH
-		cmdLine.add("patchfile");
-		cmdLine.add("-filename:" + patch.getPath());
-		cmdLine.add("-forceinfiles:" + source.getPath());
-		AppExecutionResult res = null;
+		params.add("patchfile");
+		params.add("-filename:" + patch.getPath());
+		params.add("-forceinfiles:" + source.getPath());
+		ApplicationInvocationResult res = null;
 		try {
-			res = AppExecution.executeAndWait(cmdLine);
+			res = ApplicationInvoker.executeAndWait(EExeType.DOTNET, null,
+					getProgramFile(), params);
 		} catch (IOException e) {
+			e.printStackTrace();
+		} catch (ERuntimeNotInstalledException e) {
 			e.printStackTrace();
 		}
@@ -41,15 +45,9 @@
 	}
 
-	private static Vector<String> getProgramInvocation() {
-		Vector<String> res = new Vector<String>();
-		if (DotNet.getRuntimeExe().length() > 0)
-			res.add(DotNet.getRuntimeExe());
-		res.add(getProgramFile().getPath());
-		return res;
-	}
-
 	private static File getProgramFile() {
-		File toolsPath = CaseInsensitiveFile.getCaseInsensitiveFile(Paths.getEditionBasePath(), "Tools");
-		return CaseInsensitiveFile.getCaseInsensitiveFile(toolsPath, "xmlTools.exe");
+		File toolsPath = CaseInsensitiveFile.getCaseInsensitiveFile(
+				Paths.getEditionBasePath(), "Tools");
+		return CaseInsensitiveFile.getCaseInsensitiveFile(toolsPath,
+				"xmlTools.exe");
 	}
 }
Index: AE/installer2/src/net/oni2/aeinstaller/backend/packages/EExeType.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/packages/EExeType.java	(revision 709)
+++ 	(revision )
@@ -1,19 +1,0 @@
-package net.oni2.aeinstaller.backend.packages;
-
-/**
- * @author Christian Illy
- */
-public enum EExeType {
-	/**
-	 * Exe is an executable for the target platform
-	 */
-	OSBINARY,
-	/**
-	 * Exe is a .Net executable
-	 */
-	DOTNET,
-	/**
-	 * Exe is a Java .jar archive
-	 */
-	JAR
-}
Index: AE/installer2/src/net/oni2/aeinstaller/backend/packages/Mod_Info.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/packages/Mod_Info.java	(revision 709)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/packages/Mod_Info.java	(revision 720)
@@ -11,4 +11,5 @@
 import net.oni2.aeinstaller.backend.CaseInsensitiveFile;
 import net.oni2.aeinstaller.backend.Paths;
+import net.oni2.platformtools.applicationinvoker.EExeType;
 
 /**
@@ -112,8 +113,11 @@
 					}
 				} else if (sName.equalsIgnoreCase("ExeName")) {
-					exeFile = CaseInsensitiveFile.getCaseInsensitiveFile(Paths.getEditionBasePath(), sVal);
+					exeFile = CaseInsensitiveFile.getCaseInsensitiveFile(
+							Paths.getEditionBasePath(), sVal);
 				} else if (sName.equalsIgnoreCase("ExeType")) {
 					if (sVal.equalsIgnoreCase("OSBinary"))
 						exeType = EExeType.OSBINARY;
+					else if (sVal.equalsIgnoreCase("WinExe"))
+						exeType = EExeType.WINEXE;
 					else if (sVal.equalsIgnoreCase("DotNet"))
 						exeType = EExeType.DOTNET;
@@ -123,5 +127,6 @@
 					workingDir = sVal;
 				} else if (sName.equalsIgnoreCase("IconName")) {
-					iconFile = CaseInsensitiveFile.getCaseInsensitiveFile(Paths.getEditionBasePath(), sVal);
+					iconFile = CaseInsensitiveFile.getCaseInsensitiveFile(
+							Paths.getEditionBasePath(), sVal);
 				}
 			}
@@ -129,4 +134,6 @@
 				if (exeFile.getName().toLowerCase().endsWith(".jar"))
 					exeType = EExeType.JAR;
+				else if (exeType == EExeType.OSBINARY && exeFile.getName().toLowerCase().endsWith(".exe"))
+					exeType = EExeType.WINEXE;
 			}
 		} catch (FileNotFoundException e) {
Index: AE/installer2/src/net/oni2/aeinstaller/backend/packages/Package.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/packages/Package.java	(revision 709)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/packages/Package.java	(revision 720)
@@ -12,6 +12,4 @@
 import java.util.HashSet;
 
-import org.apache.commons.io.FileUtils;
-
 import net.oni2.aeinstaller.backend.CaseInsensitiveFile;
 import net.oni2.aeinstaller.backend.Paths;
@@ -21,6 +19,9 @@
 import net.oni2.aeinstaller.backend.depot.model.TaxonomyTerm;
 import net.oni2.aeinstaller.backend.oni.Installer;
-import net.oni2.settingsmanager.Settings;
-import net.oni2.settingsmanager.Settings.Platform;
+import net.oni2.platformtools.PlatformInformation;
+import net.oni2.platformtools.PlatformInformation.Platform;
+import net.oni2.platformtools.applicationinvoker.EExeType;
+
+import org.apache.commons.io.FileUtils;
 
 /**
@@ -426,8 +427,8 @@
 				return true;
 			case MACOS:
-				return (Settings.getPlatform() == Platform.MACOS);
+				return (PlatformInformation.getPlatform() == Platform.MACOS);
 			case WIN:
-				return (Settings.getPlatform() == Platform.WIN)
-						|| (Settings.getPlatform() == Platform.LINUX);
+				return (PlatformInformation.getPlatform() == Platform.WIN)
+						|| (PlatformInformation.getPlatform() == Platform.LINUX);
 		}
 		return false;
Index: AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.java	(revision 709)
+++ AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.java	(revision 720)
@@ -10,4 +10,5 @@
 import java.awt.event.KeyEvent;
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.net.URL;
 import java.util.Date;
@@ -39,12 +40,13 @@
 import javax.swing.filechooser.FileFilter;
 
+import net.oni2.SettingsManager;
 import net.oni2.aeinstaller.AEInstaller2;
 import net.oni2.aeinstaller.backend.ImageResizer;
 import net.oni2.aeinstaller.backend.Paths;
-import net.oni2.aeinstaller.backend.ToolLauncher;
 import net.oni2.aeinstaller.backend.SizeFormatter;
 import net.oni2.aeinstaller.backend.depot.DepotManager;
 import net.oni2.aeinstaller.backend.oni.InstallProgressListener;
 import net.oni2.aeinstaller.backend.oni.Installer;
+import net.oni2.aeinstaller.backend.oni.OniLauncher;
 import net.oni2.aeinstaller.backend.oni.OniSplit;
 import net.oni2.aeinstaller.backend.packages.Package;
@@ -57,6 +59,6 @@
 import net.oni2.aeinstaller.gui.corepackages.CorePackagesDialog;
 import net.oni2.aeinstaller.gui.downloadwindow.Downloader;
+import net.oni2.aeinstaller.gui.modtable.EApplyFilterTo;
 import net.oni2.aeinstaller.gui.modtable.ModInstallSelectionListener;
-import net.oni2.aeinstaller.gui.modtable.EApplyFilterTo;
 import net.oni2.aeinstaller.gui.modtable.ModSelectionListener;
 import net.oni2.aeinstaller.gui.modtable.ModTable;
@@ -65,7 +67,8 @@
 import net.oni2.aeinstaller.gui.settings.SettingsDialog;
 import net.oni2.aeinstaller.gui.toolmanager.ToolManager;
-import net.oni2.applicationinvoker.AppExecution;
-import net.oni2.settingsmanager.Settings;
-import net.oni2.settingsmanager.Settings.Platform;
+import net.oni2.platformtools.PlatformInformation;
+import net.oni2.platformtools.PlatformInformation.Platform;
+import net.oni2.platformtools.applicationinvoker.ApplicationInvoker;
+import net.oni2.platformtools.applicationinvoker.ERuntimeNotInstalledException;
 
 import org.javabuilders.BuildResult;
@@ -138,8 +141,9 @@
 		scrollMods.setViewportView(tblMods);
 
-		contents.setDividerLocation(Settings.getInstance().get("win_main_divloc", 550));
+		contents.setDividerLocation(SettingsManager.getInstance().get(
+				"win_main_divloc", 550));
 		contents.setResizeWeight(0.4);
 
-		if (Settings.getPlatform() == Platform.MACOS) {
+		if (PlatformInformation.getPlatform() == Platform.MACOS) {
 			mainMenu.setVisible(false);
 		}
@@ -165,6 +169,7 @@
 		tblMods.addModSelectionListener(this);
 		tblMods.addDownloadSizeListener(this);
-		
-		setSize(Settings.getInstance().get("win_main_width", 950), Settings.getInstance().get("win_main_height", 600));
+
+		setSize(SettingsManager.getInstance().get("win_main_width", 950),
+				SettingsManager.getInstance().get("win_main_height", 600));
 		setLocationRelativeTo(null);
 	}
@@ -190,14 +195,16 @@
 
 	private void saveLocalData() {
-		Settings.getInstance().put("win_main_divloc", contents.getDividerLocation());
-		Settings.getInstance().put("win_main_width", getWidth());
-		Settings.getInstance().put("win_main_height", getHeight());
-		Settings.getInstance().serializeToFile(Paths.getSettingsFilename());
+		SettingsManager.getInstance().put("win_main_divloc",
+				contents.getDividerLocation());
+		SettingsManager.getInstance().put("win_main_width", getWidth());
+		SettingsManager.getInstance().put("win_main_height", getHeight());
+		SettingsManager.getInstance().serializeToFile(
+				Paths.getSettingsFilename());
 	}
 
 	@DoInBackground(progressMessage = "updateDepot.title", cancelable = false, indeterminateProgress = false)
 	private void execDepotUpdate(final BackgroundEvent evt) {
-		if (!Settings.getInstance().isOfflineMode()
-				&& !Settings.getInstance().isNoCacheUpdateMode()) {
+		if (!SettingsManager.getInstance().isOfflineMode()
+				&& !SettingsManager.getInstance().isNoCacheUpdateMode()) {
 			long start = new Date().getTime();
 
@@ -222,6 +229,6 @@
 	private void checkUpdates(Object evtSource) {
 		if ((evtSource != this)
-				|| Settings.getInstance().get("notifyupdates", true)) {
-			if (Settings.getInstance().isOfflineMode()) {
+				|| SettingsManager.getInstance().get("notifyupdates", true)) {
+			if (SettingsManager.getInstance().isOfflineMode()) {
 				if (evtSource != this) {
 					JOptionPane.showMessageDialog(
@@ -250,5 +257,6 @@
 					size += m.getZipSize();
 					JCheckBox check = new JCheckBox("Mod: " + m.getName()
-							+ " (" + SizeFormatter.format(m.getZipSize(), 1) + ")");
+							+ " (" + SizeFormatter.format(m.getZipSize(), 1)
+							+ ")");
 					check.setSelected(true);
 					check.addItemListener(new ItemListener() {
@@ -274,5 +282,6 @@
 					size += m.getZipSize();
 					JCheckBox check = new JCheckBox("Tool: " + m.getName()
-							+ " (" + SizeFormatter.format(m.getZipSize(), 1) + ")");
+							+ " (" + SizeFormatter.format(m.getZipSize(), 1)
+							+ ")");
 					check.setSelected(true);
 					check.addItemListener(new ItemListener() {
@@ -313,10 +322,10 @@
 					JCheckBox checkFutureUpdates = new JCheckBox(
 							bundle.getString("checkOnStartup.text"));
-					checkFutureUpdates.setSelected(Settings.getInstance().get(
-							"notifyupdates", true));
+					checkFutureUpdates.setSelected(SettingsManager
+							.getInstance().get("notifyupdates", true));
 					checkFutureUpdates.addItemListener(new ItemListener() {
 						@Override
 						public void itemStateChanged(ItemEvent evt) {
-							Settings.getInstance().put("notifyupdates",
+							SettingsManager.getInstance().put("notifyupdates",
 									evt.getStateChange() == ItemEvent.SELECTED);
 						}
@@ -492,12 +501,19 @@
 					public void actionPerformed(ActionEvent evt) {
 						try {
-							ToolLauncher.launch(m);
-						} catch (Exception ex) {
-							if (ex.getMessage().contains("JRE"))
+							ApplicationInvoker.execute(m.getExeType(),
+									m.getWorkingDir(), m.getExeFile(), null);
+						} catch (ERuntimeNotInstalledException e) {
+							JOptionPane.showMessageDialog(null,
+									bundle.getString("exeNotFound.text"),
+									bundle.getString("exeNotFound.title"),
+									JOptionPane.ERROR_MESSAGE);
+							e.printStackTrace();
+						} catch (FileNotFoundException e) {
+							if (e.getMessage().contains("JRE"))
 								JOptionPane.showMessageDialog(null,
 										bundle.getString("jreNotFound.text"),
 										bundle.getString("jreNotFound.title"),
 										JOptionPane.ERROR_MESSAGE);
-							if (ex.getMessage().contains(".NET"))
+							if (e.getMessage().contains(".NET"))
 								JOptionPane.showMessageDialog(
 										null,
@@ -505,4 +521,10 @@
 										bundle.getString("dotNetNotFound.title"),
 										JOptionPane.ERROR_MESSAGE);
+							if (e.getMessage().contains("Wine"))
+								JOptionPane.showMessageDialog(null,
+										bundle.getString("wineNotFound.text"),
+										bundle.getString("wineNotFound.title"),
+										JOptionPane.ERROR_MESSAGE);
+							e.printStackTrace();
 						}
 					}
@@ -525,5 +547,5 @@
 	@DoInBackground(progressMessage = "checkCorePackages.title", cancelable = false, indeterminateProgress = false)
 	private void checkCorePackages(final BackgroundEvent evt) {
-		if (!Settings.getInstance().isOfflineMode()) {
+		if (!SettingsManager.getInstance().isOfflineMode()) {
 			for (Package m : PackageManager.getInstance().getCoreTools()) {
 				if (m.isNewerAvailable()) {
@@ -558,5 +580,6 @@
 			}
 			evt.setProgressMessage(bundle.getString("coreToolsInstall.title"));
-			Installer.installTools(PackageManager.getInstance().getCoreTools(), false);
+			Installer.installTools(PackageManager.getInstance().getCoreTools(),
+					false);
 		}
 	}
@@ -594,5 +617,6 @@
 			}
 
-			if (toDownload.size() > 0 && Settings.getInstance().isOfflineMode()) {
+			if (toDownload.size() > 0
+					&& SettingsManager.getInstance().isOfflineMode()) {
 				installState = EInstallState.OFFLINE;
 				break;
@@ -647,6 +671,6 @@
 							.getString("installDependencies.none");
 
-				if (!Settings.getInstance()
-						.get("notifyDepsAfterInstall", false)) {
+				if (!SettingsManager.getInstance().get(
+						"notifyDepsAfterInstall", false)) {
 					int res = JOptionPane.showConfirmDialog(this, String
 							.format(bundle
@@ -736,6 +760,6 @@
 				revertSelection();
 				if (installDeps.size() > 0
-						&& Settings.getInstance().get("notifyDepsAfterInstall",
-								false)) {
+						&& SettingsManager.getInstance().get(
+								"notifyDepsAfterInstall", false)) {
 					String installedDeps = "";
 					for (Package m : installDeps) {
@@ -835,52 +859,30 @@
 	}
 
-	private Vector<String> getBasicOniLaunchParams() {
-		Vector<String> params = new Vector<String>();
-		File exe = null;
-		switch (Settings.getPlatform()) {
-			case WIN:
-				exe = new File(Paths.getEditionBasePath(), "Oni.exe");
-				if (exe.exists())
-					params.add(exe.getPath());
-				break;
-			case MACOS:
-				exe = new File(Paths.getEditionBasePath(),
-						"Oni.app/Contents/MacOS/Oni");
-				if (exe.exists())
-					params.add(exe.getPath());
-				break;
-			case LINUX:
-				String wine = Settings.getWinePath();
-				exe = new File(Paths.getEditionBasePath(), "Oni.exe");
-				if (exe.exists()) {
-					if (wine != null) {
-						params.add(wine);
-						params.add(exe.getPath());
-					}
-				}
-				break;
-			default:
-		}
-		if (params.size() > 0) {
-			params.add("-debugfiles");
-		}
-		return params;
+	private void oni(boolean windowed) {
+		try {
+			OniLauncher.launch(windowed);
+		} catch (FileNotFoundException e) {
+			JOptionPane.showMessageDialog(this,
+					bundle.getString("oniExeNotFound.text"),
+					bundle.getString("oniExeNotFound.title"),
+					JOptionPane.ERROR_MESSAGE);
+			e.printStackTrace();
+		} catch (ERuntimeNotInstalledException e) {
+			JOptionPane.showMessageDialog(this,
+					bundle.getString("wineNotFound.text"),
+					bundle.getString("wineNotFound.title"),
+					JOptionPane.ERROR_MESSAGE);
+			e.printStackTrace();
+		}
 	}
 
 	@SuppressWarnings("unused")
 	private void oniFull() {
-		Vector<String> params = getBasicOniLaunchParams();
-		if (params.size() > 0) {
-			AppExecution.execute(params, Paths.getEditionBasePath());
-		}
+		oni(false);
 	}
 
 	@SuppressWarnings("unused")
 	private void oniWin() {
-		Vector<String> params = getBasicOniLaunchParams();
-		if (params.size() > 0) {
-			params.add("-noswitch");
-			AppExecution.execute(params, Paths.getEditionBasePath());
-		}
+		oni(true);
 	}
 
Index: AE/installer2/src/net/oni2/aeinstaller/gui/corepackages/CorePackagesDialog.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/gui/corepackages/CorePackagesDialog.java	(revision 709)
+++ AE/installer2/src/net/oni2/aeinstaller/gui/corepackages/CorePackagesDialog.java	(revision 720)
@@ -12,4 +12,5 @@
 import javax.swing.KeyStroke;
 
+import net.oni2.SettingsManager;
 import net.oni2.aeinstaller.backend.packages.Package;
 import net.oni2.aeinstaller.gui.modtable.ModSelectionListener;
@@ -17,5 +18,4 @@
 import net.oni2.aeinstaller.gui.modtable.ModTable.ETableContentType;
 import net.oni2.aeinstaller.gui.packageinfobox.PackageInfoBox;
-import net.oni2.settingsmanager.Settings;
 
 import org.javabuilders.BuildResult;
@@ -60,5 +60,5 @@
 		getRootPane().getActionMap().put("close", closeAction);
 
-		contents.setDividerLocation(Settings.getInstance().get("win_core_divloc", 550));
+		contents.setDividerLocation(SettingsManager.getInstance().get("win_core_divloc", 550));
 		contents.setResizeWeight(0.4);
 
@@ -69,5 +69,5 @@
 		tblTools.addModSelectionListener(this);
 
-		setSize(Settings.getInstance().get("win_core_width", 950), Settings.getInstance().get("win_core_height", 600));
+		setSize(SettingsManager.getInstance().get("win_core_width", 950), SettingsManager.getInstance().get("win_core_height", 600));
 		setLocationRelativeTo(null);
 	}
@@ -80,7 +80,7 @@
 	@SuppressWarnings("unused")
 	private void closing() {
-		Settings.getInstance().put("win_core_divloc", contents.getDividerLocation());
-		Settings.getInstance().put("win_core_width", getWidth());
-		Settings.getInstance().put("win_core_height", getHeight());
+		SettingsManager.getInstance().put("win_core_divloc", contents.getDividerLocation());
+		SettingsManager.getInstance().put("win_core_width", getWidth());
+		SettingsManager.getInstance().put("win_core_height", getHeight());
 	}
 }
Index: AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTable.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTable.java	(revision 709)
+++ AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTable.java	(revision 720)
@@ -35,8 +35,8 @@
 import javax.swing.table.TableRowSorter;
 
+import net.oni2.SettingsManager;
 import net.oni2.aeinstaller.backend.packages.Package;
 import net.oni2.aeinstaller.backend.packages.Type;
 import net.oni2.aeinstaller.gui.downloadwindow.Downloader;
-import net.oni2.settingsmanager.Settings;
 
 /**
@@ -103,6 +103,6 @@
 		List<RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
 
-		int sortCol = Settings.getInstance().get("modSortColumn", 1);
-		SortOrder sortOrder = SortOrder.valueOf(Settings.getInstance().get(
+		int sortCol = SettingsManager.getInstance().get("modSortColumn", 1);
+		SortOrder sortOrder = SortOrder.valueOf(SettingsManager.getInstance().get(
 				"modSortOrder", "ASCENDING"));
 
@@ -244,6 +244,6 @@
 				int col = keys.get(0).getColumn();
 				SortOrder so = keys.get(0).getSortOrder();
-				Settings.getInstance().put("modSortColumn", col);
-				Settings.getInstance().put("modSortOrder", so.toString());
+				SettingsManager.getInstance().put("modSortColumn", col);
+				SettingsManager.getInstance().put("modSortOrder", so.toString());
 			}
 		}
@@ -459,5 +459,5 @@
 			for (int i = 1; i < columns.size(); i++) {
 				TableColumn tc = columns.get(i);
-				if (!Settings.getInstance().get(
+				if (!SettingsManager.getInstance().get(
 						String.format("modShowColumn%02d", tc.getModelIndex()),
 						true))
@@ -506,5 +506,5 @@
 							tcm.removeColumn(col);
 						}
-						Settings.getInstance().put(
+						SettingsManager.getInstance().put(
 								String.format("modShowColumn%02d",
 										col.getModelIndex()), itm.isSelected());
Index: AE/installer2/src/net/oni2/aeinstaller/gui/settings/LaFComboModel.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/gui/settings/LaFComboModel.java	(revision 709)
+++ AE/installer2/src/net/oni2/aeinstaller/gui/settings/LaFComboModel.java	(revision 720)
@@ -9,5 +9,5 @@
 import javax.swing.event.ListDataListener;
 
-import net.oni2.settingsmanager.Settings;
+import net.oni2.SettingsManager;
 
 /**
@@ -32,5 +32,5 @@
 
 		
-		String laf = Settings.getInstance().get("lookandfeel",
+		String laf = SettingsManager.getInstance().get("lookandfeel",
 				UIManager.getLookAndFeel().getClass().getName());
 
Index: AE/installer2/src/net/oni2/aeinstaller/gui/settings/SettingsDialog.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/gui/settings/SettingsDialog.java	(revision 709)
+++ AE/installer2/src/net/oni2/aeinstaller/gui/settings/SettingsDialog.java	(revision 720)
@@ -14,5 +14,5 @@
 import javax.swing.UIManager;
 
-import net.oni2.settingsmanager.Settings;
+import net.oni2.SettingsManager;
 
 import org.javabuilders.BuildResult;
@@ -66,5 +66,5 @@
 
 	private void initValues() {
-		Settings set = Settings.getInstance();
+		SettingsManager set = SettingsManager.getInstance();
 
 		laFModel = new LaFComboModel();
@@ -79,5 +79,5 @@
 	@SuppressWarnings("unused")
 	private boolean save() {
-		Settings set = Settings.getInstance();
+		SettingsManager set = SettingsManager.getInstance();
 
 		set.put("notifyupdates", chkNotifyOnStart.isSelected());
Index: AE/installer2/src/net/oni2/aeinstaller/gui/toolmanager/ToolManager.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/gui/toolmanager/ToolManager.java	(revision 709)
+++ AE/installer2/src/net/oni2/aeinstaller/gui/toolmanager/ToolManager.java	(revision 720)
@@ -17,4 +17,5 @@
 import javax.swing.KeyStroke;
 
+import net.oni2.SettingsManager;
 import net.oni2.aeinstaller.backend.oni.Installer;
 import net.oni2.aeinstaller.backend.packages.Package;
@@ -24,5 +25,4 @@
 import net.oni2.aeinstaller.gui.modtable.ModTable.ETableContentType;
 import net.oni2.aeinstaller.gui.packageinfobox.PackageInfoBox;
-import net.oni2.settingsmanager.Settings;
 
 import org.javabuilders.BuildResult;
@@ -73,5 +73,5 @@
 		getRootPane().getActionMap().put("close", closeAction);
 
-		contents.setDividerLocation(Settings.getInstance().get("win_tools_divloc", 550));
+		contents.setDividerLocation(SettingsManager.getInstance().get("win_tools_divloc", 550));
 		contents.setResizeWeight(0.4);
 
@@ -87,5 +87,5 @@
 				SwingJavaBuilder.getConfig().getResource("img.uninstall")));
 
-		setSize(Settings.getInstance().get("win_tools_width", 950), Settings.getInstance().get("win_tools_height", 600));
+		setSize(SettingsManager.getInstance().get("win_tools_width", 950), SettingsManager.getInstance().get("win_tools_height", 600));
 		setLocationRelativeTo(null);
 	}
@@ -100,5 +100,5 @@
 			} else {
 				if (!selectedPackage.isLocalAvailable()) {
-					if (Settings.getInstance().isOfflineMode()) {
+					if (SettingsManager.getInstance().isOfflineMode()) {
 						JOptionPane.showMessageDialog(this,
 								bundle.getString("offlineMode.text"),
@@ -152,7 +152,7 @@
 	@SuppressWarnings("unused")
 	private void closing() {
-		Settings.getInstance().put("win_tools_divloc", contents.getDividerLocation());
-		Settings.getInstance().put("win_tools_width", getWidth());
-		Settings.getInstance().put("win_tools_height", getHeight());
+		SettingsManager.getInstance().put("win_tools_divloc", contents.getDividerLocation());
+		SettingsManager.getInstance().put("win_tools_width", getWidth());
+		SettingsManager.getInstance().put("win_tools_height", getHeight());
 	}
 }
Index: AE/installer2/src/net/oni2/aeinstaller/localization/MainWin.properties
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/localization/MainWin.properties	(revision 709)
+++ AE/installer2/src/net/oni2/aeinstaller/localization/MainWin.properties	(revision 720)
@@ -89,2 +89,11 @@
 dotNetNotFound.text=This tool requires a .NET runtime but it was not found.
 dotNetNotFound.title=No .NET runtime found
+
+wineNotFound.text=Wine is required to run a Windows executable on Linux but it was not found.
+wineNotFound.title=Wine not found
+
+oniExeNotFound.text=Oni's executable was not found.
+oniExeNotFound.title=Oni not found
+
+exeNotFound.text=Executable was not found.
+exeNotFound.title=Exe not found
