Index: /AE/installer2/src/net/oni2/aeinstaller/AEInstaller.properties
===================================================================
--- /AE/installer2/src/net/oni2/aeinstaller/AEInstaller.properties	(revision 601)
+++ /AE/installer2/src/net/oni2/aeinstaller/AEInstaller.properties	(revision 602)
@@ -1,4 +1,4 @@
 appname=AE Installer 2
-appversion=0.50
+appversion=0.55
 
 invalidPath.title=Wrong directory
Index: /AE/installer2/src/net/oni2/aeinstaller/AEInstaller2.java
===================================================================
--- /AE/installer2/src/net/oni2/aeinstaller/AEInstaller2.java	(revision 601)
+++ /AE/installer2/src/net/oni2/aeinstaller/AEInstaller2.java	(revision 602)
@@ -132,4 +132,5 @@
 		System.out.println("Architect: " + Settings.getArchitecture());
 		System.out.println(".NET:      " + OniSplit.isDotNETInstalled());
+		System.out.println("OniSplit:  " + OniSplit.isOniSplitInstalled());
 		System.out.println("Globalized:" + Installer.isEditionInitialized());
 
Index: /AE/installer2/src/net/oni2/aeinstaller/backend/Paths.java
===================================================================
--- /AE/installer2/src/net/oni2/aeinstaller/backend/Paths.java	(revision 601)
+++ /AE/installer2/src/net/oni2/aeinstaller/backend/Paths.java	(revision 602)
@@ -16,13 +16,15 @@
 	 */
 	public static File getInstallerPath() {
-		String jarPath = Settings.class.getProtectionDomain().getCodeSource()
-				.getLocation().getPath();
-		String decodedPath = null;
-		try {
-			decodedPath = URLDecoder.decode(jarPath, "UTF-8");
-		} catch (UnsupportedEncodingException e) {
-			e.printStackTrace();
-		}
-		return new File(decodedPath).getParentFile();
+//		String jarPath = Settings.class.getProtectionDomain().getCodeSource()
+//				.getLocation().getPath();
+//		String decodedPath = null;
+//		try {
+//			decodedPath = URLDecoder.decode(jarPath, "UTF-8");
+//		} catch (UnsupportedEncodingException e) {
+//			e.printStackTrace();
+//		}
+//		return new File(decodedPath).getParentFile();
+		String wd = System.getProperty("user.dir");
+		return new File(wd);
 	}
 
Index: /AE/installer2/src/net/oni2/aeinstaller/backend/depot/DepotConfig.java
===================================================================
--- /AE/installer2/src/net/oni2/aeinstaller/backend/depot/DepotConfig.java	(revision 601)
+++ /AE/installer2/src/net/oni2/aeinstaller/backend/depot/DepotConfig.java	(revision 602)
@@ -61,3 +61,10 @@
 		return "Package";
 	}
+	
+	/**
+	 * @return Taxonomy term name for modtype Tool
+	 */
+	public static String getTaxonomyName_ModType_Tool() {
+		return "Tool";
+	}
 }
Index: /AE/installer2/src/net/oni2/aeinstaller/backend/mods/Mod.java
===================================================================
--- /AE/installer2/src/net/oni2/aeinstaller/backend/mods/Mod.java	(revision 601)
+++ /AE/installer2/src/net/oni2/aeinstaller/backend/mods/Mod.java	(revision 602)
@@ -13,4 +13,5 @@
 import net.oni2.aeinstaller.backend.Settings;
 import net.oni2.aeinstaller.backend.Settings.Platform;
+import net.oni2.aeinstaller.backend.depot.DepotConfig;
 import net.oni2.aeinstaller.backend.depot.DepotManager;
 import net.oni2.aeinstaller.backend.depot.model.NodeMod;
@@ -22,5 +23,5 @@
 public class Mod implements Comparable<Mod> {
 	// TODO: Dependencies/Conflicts
-	
+
 	private String name = "";
 	private int packageNumber = 0;
@@ -37,4 +38,7 @@
 	private net.oni2.aeinstaller.backend.depot.model.File file = null;
 
+	private HashSet<Integer> conflicts = new HashSet<Integer>();
+	private HashSet<Integer> dependencies = new HashSet<Integer>();
+
 	private long localTimestamp = 0;
 
@@ -52,5 +56,6 @@
 			Type t = ModManager.getInstance().getTypeByName(tt.getName());
 			types.add(t);
-			t.addEntry(this);
+			if (!t.getName().equals(DepotConfig.getTaxonomyName_ModType_Tool()))
+				t.addEntry(this);
 		}
 		platform = nm.getPlatform();
@@ -268,5 +273,5 @@
 	 * @return Is a mod that is always installed?
 	 */
-	public boolean isDefaultMod() {
+	public boolean isMandatoryMod() {
 		return packageNumber < 10000;
 	}
@@ -282,4 +287,18 @@
 	public String toString() {
 		return name;
+	}
+
+	/**
+	 * @return the conflicts
+	 */
+	public HashSet<Integer> getConflicts() {
+		return conflicts;
+	}
+
+	/**
+	 * @return the dependencies
+	 */
+	public HashSet<Integer> getDependencies() {
+		return dependencies;
 	}
 
Index: /AE/installer2/src/net/oni2/aeinstaller/backend/mods/ModManager.java
===================================================================
--- /AE/installer2/src/net/oni2/aeinstaller/backend/mods/ModManager.java	(revision 601)
+++ /AE/installer2/src/net/oni2/aeinstaller/backend/mods/ModManager.java	(revision 602)
@@ -5,7 +5,10 @@
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.TreeSet;
 import java.util.Vector;
 
 import net.oni2.aeinstaller.backend.Paths;
+import net.oni2.aeinstaller.backend.depot.DepotConfig;
 import net.oni2.aeinstaller.backend.depot.DepotManager;
 import net.oni2.aeinstaller.backend.depot.model.NodeMod;
@@ -23,4 +26,5 @@
 	private HashMap<String, Type> types = new HashMap<String, Type>();
 	private HashMap<Integer, Mod> mods = new HashMap<Integer, Mod>();
+	private HashMap<Integer, Mod> tools = new HashMap<Integer, Mod>();
 
 	/**
@@ -52,8 +56,13 @@
 		}
 
+		TaxonomyTerm toolTerm = DepotManager.getInstance().getTaxonomyTerm(
+				DepotConfig.getTaxonomyName_ModType_Tool());
 		for (NodeMod nm : DepotManager.getInstance().getModPackageNodes()) {
 			if (nm.getUploads().size() == 1) {
 				Mod m = new Mod(nm);
-				mods.put(m.getPackageNumber(), m);
+				if (nm.getTypes().contains(toolTerm))
+					tools.put(m.getPackageNumber(), m);
+				else
+					mods.put(m.getPackageNumber(), m);
 				modFolders.remove(m.getPackageNumber());
 			}
@@ -102,11 +111,96 @@
 	 * @return Mods which are always installed
 	 */
-	public Collection<Mod> getDefaultMods() {
+	public Collection<Mod> getMandatoryMods() {
 		Vector<Mod> res = new Vector<Mod>();
 		for (Mod m : mods.values()) {
-			if (m.isDefaultMod())
+			if (m.isMandatoryMod())
 				res.add(m);
 		}
 		return res;
 	}
+	
+	/**
+	 * @return Collection of tools
+	 */
+	public Collection<Mod> getTools() {
+		return tools.values();
+	}
+	
+	/**
+	 * @return Tools which are always installed
+	 */
+	public Collection<Mod> getMandatoryTools() {
+		Vector<Mod> res = new Vector<Mod>();
+		for (Mod m : tools.values()) {
+			if (m.isMandatoryMod())
+				res.add(m);
+		}
+		return res;
+	}
+
+	/**
+	 * Get a mod by its package number
+	 * 
+	 * @param number
+	 *            Package number
+	 * @return Mod or null
+	 */
+	public Mod getModByNumber(int number) {
+		for (Mod m : mods.values()) {
+			if (m.getPackageNumber() == number)
+				return m;
+		}
+		return null;
+	}
+
+	/**
+	 * Check for unresolved dependencies within the given mods
+	 * 
+	 * @param mods
+	 *            Mods to check
+	 * @return Unmet dependencies
+	 */
+	public HashMap<Mod, HashSet<Mod>> checkDependencies(TreeSet<Mod> mods) {
+		// TODO: Verify functionality
+		HashMap<Mod, HashSet<Mod>> res = new HashMap<Mod, HashSet<Mod>>();
+
+		for (Mod m : mods) {
+			for (int depNum : m.getDependencies()) {
+				Mod other = getModByNumber(depNum);
+				if (!mods.contains(other)) {
+					if (!res.containsKey(m))
+						res.put(m, new HashSet<Mod>());
+					res.get(m).add(other);
+				}
+			}
+		}
+
+		return res;
+	}
+
+	/**
+	 * Check for conflicts between given mods
+	 * 
+	 * @param mods
+	 *            Mods to check
+	 * @return Conflicting mods
+	 */
+	public HashMap<Mod, HashSet<Mod>> checkConflicts(TreeSet<Mod> mods) {
+		// TODO: Verify functionality
+		HashMap<Mod, HashSet<Mod>> res = new HashMap<Mod, HashSet<Mod>>();
+
+		for (Mod m : mods) {
+			for (int confNum : m.getConflicts()) {
+				Mod other = getModByNumber(confNum);
+				if (mods.contains(other)) {
+					if (!res.containsKey(m))
+						res.put(m, new HashSet<Mod>());
+					res.get(m).add(other);
+				}
+			}
+		}
+
+		return res;
+	}
+
 }
Index: /AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java
===================================================================
--- /AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java	(revision 601)
+++ /AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java	(revision 602)
@@ -39,7 +39,14 @@
 	}
 
+	/**
+	 * Install the given set of mods
+	 * 
+	 * @param mods
+	 *            Mods to install
+	 * @param listener
+	 *            Listener for install progress updates
+	 */
 	public static void install(TreeSet<Mod> mods,
 			InstallProgressListener listener) {
-
 		Vector<File> folders = new Vector<File>();
 		folders.add(Paths.getVanillaOnisPath());
@@ -65,9 +72,4 @@
 		}
 
-		// for (File f : Paths.getModsPath().listFiles()) {
-		// File oni = new File(f, "oni");
-		// if (oni.exists())
-		// folders.add(oni);
-		// }
 		combineBinaryFiles(folders, listener);
 
@@ -140,5 +142,5 @@
 				log.println();
 			}
-			
+
 			Date end = new Date();
 			log.println("Initialization ended at " + sdf.format(end));
Index: /AE/installer2/src/net/oni2/aeinstaller/backend/oni/OniSplit.java
===================================================================
--- /AE/installer2/src/net/oni2/aeinstaller/backend/oni/OniSplit.java	(revision 601)
+++ /AE/installer2/src/net/oni2/aeinstaller/backend/oni/OniSplit.java	(revision 602)
@@ -77,4 +77,11 @@
 
 	/**
+	 * @return Is Onisplit installed?
+	 */
+	public static boolean isOniSplitInstalled() {
+		return getProgramFile().exists();
+	}
+
+	/**
 	 * Export given dat-file to target folder
 	 * 
@@ -112,5 +119,6 @@
 	 * @return OniSplit output
 	 */
-	public static Vector<String> importLevel(Vector<File> sourceFolders, File targetFile) {
+	public static Vector<String> importLevel(Vector<File> sourceFolders,
+			File targetFile) {
 		Vector<String> cmdLine = getProgramInvocation();
 		cmdLine.add(getImportParam());
@@ -212,7 +220,11 @@
 		if (Settings.getPlatform() != Platform.WIN)
 			res.add("mono");
-		res.add(new File(new File(Paths.getEditionBasePath(), "Tools"),
-				"Onisplit.exe").getPath());
-		return res;
+		res.add(getProgramFile().getPath());
+		return res;
+	}
+
+	private static File getProgramFile() {
+		return new File(new File(Paths.getEditionBasePath(), "Tools"),
+				"Onisplit.exe");
 	}
 }
Index: /AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.java
===================================================================
--- /AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.java	(revision 601)
+++ /AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.java	(revision 602)
@@ -264,8 +264,24 @@
 	}
 
+	@DoInBackground(progressMessage = "mandatoryFiles.title", cancelable = false, indeterminateProgress = false)
+	private void checkMandatoryFiles(final BackgroundEvent evt) {
+		System.out.println("Tools:");
+		for (Mod m : ModManager.getInstance().getTools()) {
+			System.out.format("  %05d %s", m.getPackageNumber(), m.getName());
+		}
+		System.out.println();
+		
+		System.out.println("Mandatory tools:");
+		for (Mod m : ModManager.getInstance().getMandatoryTools()) {
+			System.out.format("  %05d %s", m.getPackageNumber(), m.getName());
+		}
+	}
+
 	@DoInBackground(progressMessage = "installing.title", cancelable = false, indeterminateProgress = false)
 	private void install(final BackgroundEvent evt) {
+		// TODO: Conflicts/Dependencies
+
 		TreeSet<Mod> mods = new TreeSet<Mod>();
-		mods.addAll(ModManager.getInstance().getDefaultMods());
+		mods.addAll(ModManager.getInstance().getMandatoryMods());
 		mods.addAll(model.getSelectedMods());
 
@@ -284,8 +300,4 @@
 			}
 		});
-
-		// TODO method stub
-		JOptionPane.showMessageDialog(this, "install", "todo",
-				JOptionPane.INFORMATION_MESSAGE);
 	}
 
Index: /AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.properties
===================================================================
--- /AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.properties	(revision 601)
+++ /AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.properties	(revision 602)
@@ -46,2 +46,3 @@
 initializingEdition.title=Initializing Edition core
 installing.title=Installing mods
+mandatoryFiles.title=Checking for mandatory files
Index: /AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.yml
===================================================================
--- /AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.yml	(revision 601)
+++ /AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.yml	(revision 602)
@@ -6,5 +6,5 @@
   locationRelativeTo: null
   defaultCloseOperation: doNothingOnClose
-  onWindowOpened: [execDepotUpdate,checkUpdates,initialize,focus]
+  onWindowOpened: [execDepotUpdate,checkMandatoryFiles,initialize,checkUpdates,focus]
   onWindowClosing: [askClose,saveLocalData,exit]
   iconImage: img.ae
Index: /AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTableFilter.java
===================================================================
--- /AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTableFilter.java	(revision 601)
+++ /AE/installer2/src/net/oni2/aeinstaller/gui/modtable/ModTableFilter.java	(revision 602)
@@ -26,5 +26,5 @@
 		Mod mod = (Mod) entry.getModel().getValueAt(entry.getIdentifier(), -1);
 
-		if (mod.isDefaultMod())
+		if (mod.isMandatoryMod())
 			return false;
 
