Index: AE/installer2/src/net/oni2/aeinstaller/backend/mods/EBSLInstallType.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/mods/EBSLInstallType.java	(revision 606)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/mods/EBSLInstallType.java	(revision 608)
@@ -5,8 +5,4 @@
  */
 public enum EBSLInstallType {
-	/**
-	 * No BSL files
-	 */
-	NONE,
 	/**
 	 * Normal BSL install mode
Index: AE/installer2/src/net/oni2/aeinstaller/backend/mods/Mod.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/mods/Mod.java	(revision 606)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/mods/Mod.java	(revision 608)
@@ -29,5 +29,5 @@
 	private String version = "";
 	private String creator = "";
-	private EBSLInstallType bslInstallType = null;
+	private EBSLInstallType bslInstallType = EBSLInstallType.NORMAL;
 	private String description = "";
 	private double aeVersion = 0;
@@ -36,5 +36,5 @@
 	private net.oni2.aeinstaller.backend.depot.model.File file = null;
 
-	private HashSet<Integer> conflicts = new HashSet<Integer>();
+	private HashSet<Integer> incompatibilities = new HashSet<Integer>();
 	private HashSet<Integer> dependencies = new HashSet<Integer>();
 
@@ -51,11 +51,11 @@
 		name = nm.getTitle();
 		packageNumber = nm.getPackageNumber();
+		platform = nm.getPlatform();
 		for (TaxonomyTerm tt : nm.getTypes()) {
 			Type t = ModManager.getInstance().getTypeByName(tt.getName());
 			types.add(t);
-			if (!nm.isTool())
+			if (!nm.isTool() && isValidOnPlatform())
 				t.addEntry(this);
 		}
-		platform = nm.getPlatform();
 		version = nm.getVersion();
 		creator = nm.getCreator();
@@ -101,8 +101,4 @@
 						if (sVal.equalsIgnoreCase("addon"))
 							bslInstallType = EBSLInstallType.ADDON;
-						else if (sVal.equalsIgnoreCase("yes"))
-							bslInstallType = EBSLInstallType.NORMAL;
-						else
-							bslInstallType = EBSLInstallType.NONE;
 					} else if (sName.equalsIgnoreCase("ModVersion")) {
 						if (node == null)
@@ -111,5 +107,5 @@
 						if (node == null)
 							description = sVal.replaceAll("\\\\n", "<br>");
-					} else if (sName.equalsIgnoreCase("Depends")) {
+					} else if (sName.equalsIgnoreCase("DependsOn")) {
 						String[] depsS = sVal.split(",");
 						for (String s : depsS) {
@@ -123,13 +119,13 @@
 							}
 						}
-					} else if (sName.equalsIgnoreCase("Conflicts")) {
+					} else if (sName.equalsIgnoreCase("IncompatibleWith")) {
 						String[] confS = sVal.split(",");
 						for (String s : confS) {
 							try {
 								int conf = Integer.parseInt(s);
-								conflicts.add(conf);
+								incompatibilities.add(conf);
 							} catch (NumberFormatException e) {
 								System.err
-										.format("Mod %05d does contain a non-number dependency: '%s'\n",
+										.format("Mod %05d does contain a non-number incompatibility: '%s'\n",
 												packageNumber, s);
 							}
@@ -182,8 +178,4 @@
 		updateLocalData();
 
-		Type t = ModManager.getInstance().getTypeByName("-Local-");
-		types.add(t);
-		t.addEntry(this);
-
 		platform = ECompatiblePlatform.BOTH;
 	}
@@ -323,8 +315,8 @@
 
 	/**
-	 * @return the conflicts
-	 */
-	public HashSet<Integer> getConflicts() {
-		return conflicts;
+	 * @return the incompabitilities
+	 */
+	public HashSet<Integer> getIncompabitilities() {
+		return incompatibilities;
 	}
 
@@ -339,7 +331,6 @@
 	 * @return Is this mod valid on the running platform?
 	 */
-	public boolean validOnPlatform() {
-		ECompatiblePlatform plat = platform;
-		switch (plat) {
+	public boolean isValidOnPlatform() {
+		switch (platform) {
 			case BOTH:
 				return true;
Index: AE/installer2/src/net/oni2/aeinstaller/backend/mods/ModManager.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/mods/ModManager.java	(revision 606)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/mods/ModManager.java	(revision 608)
@@ -43,10 +43,12 @@
 		Vector<Integer> res = new Vector<Integer>();
 		try {
-			FileInputStream fis = new FileInputStream(f);
-			XStream xs = new XStream(new StaxDriver());
-			Object obj = xs.fromXML(fis);
-			if (obj instanceof Vector<?>)
-				res = (Vector<Integer>) obj;
-			fis.close();
+			if (f.exists()) {
+				FileInputStream fis = new FileInputStream(f);
+				XStream xs = new XStream(new StaxDriver());
+				Object obj = xs.fromXML(fis);
+				if (obj instanceof Vector<?>)
+					res = (Vector<Integer>) obj;
+				fis.close();
+			}
 		} catch (FileNotFoundException e) {
 			e.printStackTrace();
@@ -87,5 +89,6 @@
 		mods = new HashMap<Integer, Mod>();
 
-		types.put("-Local-", new Type("-Local-", null));
+		Type localType = new Type("-Local-", null);
+		types.put("-Local-", localType);
 
 		for (TaxonomyTerm tt : DepotManager.getInstance()
@@ -120,4 +123,8 @@
 
 		for (Mod m : modFolders.values()) {
+			if (!m.isMandatoryMod()) {
+				localType.addEntry(m);
+				m.getTypes().add(localType);
+			}
 			mods.put(m.getPackageNumber(), m);
 		}
@@ -152,36 +159,44 @@
 
 	/**
-	 * @return Collection of mods
-	 */
-	public Collection<Mod> getMods() {
-		return mods.values();
-	}
-
-	/**
-	 * @return Mods which are always installed
+	 * @return Collection of mods valid on this platform and not mandatory
+	 */
+	public Collection<Mod> getModsValidAndNotMandatory() {
+		Vector<Mod> res = new Vector<Mod>();
+		for (Mod m : mods.values())
+			if (m.isValidOnPlatform() && !m.isMandatoryMod())
+				res.add(m);
+		return res;
+	}
+
+	/**
+	 * @return Mods which are always installed and valid on this platform
 	 */
 	public TreeSet<Mod> getMandatoryMods() {
 		TreeSet<Mod> res = new TreeSet<Mod>();
 		for (Mod m : mods.values()) {
-			if (m.isMandatoryMod())
-				res.add(m);
-		}
-		return res;
-	}
-
-	/**
-	 * @return Collection of tools
+			if (m.isValidOnPlatform() && m.isMandatoryMod())
+				res.add(m);
+		}
+		return res;
+	}
+
+	/**
+	 * @return Collection of tools valid on this platform and not mandatory
 	 */
 	public Collection<Mod> getTools() {
-		return tools.values();
-	}
-
-	/**
-	 * @return Tools which are always installed
+		Vector<Mod> res = new Vector<Mod>();
+		for (Mod m : tools.values())
+			if (m.isValidOnPlatform() && !m.isMandatoryMod())
+				res.add(m);
+		return res;
+	}
+
+	/**
+	 * @return Tools which are always installed and valid on this platform
 	 */
 	public TreeSet<Mod> getMandatoryTools() {
 		TreeSet<Mod> res = new TreeSet<Mod>();
 		for (Mod m : tools.values()) {
-			if (m.isMandatoryMod())
+			if (m.isValidOnPlatform() && m.isMandatoryMod())
 				res.add(m);
 		}
@@ -230,16 +245,16 @@
 
 	/**
-	 * Check for conflicts between given mods
+	 * Check for incompabitilites between given mods
 	 * 
 	 * @param mods
 	 *            Mods to check
-	 * @return Conflicting mods
-	 */
-	public HashMap<Mod, HashSet<Mod>> checkConflicts(TreeSet<Mod> mods) {
+	 * @return Incompatible mods
+	 */
+	public HashMap<Mod, HashSet<Mod>> checkIncompabitilites(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()) {
+			for (int confNum : m.getIncompabitilities()) {
 				Mod other = getModByNumber(confNum);
 				if (mods.contains(other)) {
Index: AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java	(revision 606)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java	(revision 608)
@@ -9,4 +9,5 @@
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Scanner;
@@ -18,4 +19,5 @@
 import net.oni2.aeinstaller.backend.Settings;
 import net.oni2.aeinstaller.backend.Settings.Platform;
+import net.oni2.aeinstaller.backend.mods.EBSLInstallType;
 import net.oni2.aeinstaller.backend.mods.Mod;
 import net.oni2.aeinstaller.backend.mods.ModManager;
@@ -27,4 +29,11 @@
  */
 public class Installer {
+	private static FileFilter dirFileFilter = new FileFilter() {
+		@Override
+		public boolean accept(File pathname) {
+			return pathname.isDirectory();
+		}
+	};
+
 	/**
 	 * @return Is Edition Core initialized
@@ -97,4 +106,5 @@
 		}
 	}
+
 	/**
 	 * Install the given set of mods
@@ -116,6 +126,6 @@
 		ModManager.getInstance().saveModSelection(installCfg, mods);
 
-		Vector<File> folders = new Vector<File>();
-		folders.add(Paths.getVanillaOnisPath());
+		Vector<File> foldersOni = new Vector<File>();
+		foldersOni.add(Paths.getVanillaOnisPath());
 
 		for (Mod m : mods) {
@@ -127,19 +137,114 @@
 					File oniWin = new File(oni, "win_only");
 					if (oniCommon.exists())
-						folders.add(oniCommon);
+						foldersOni.add(oniCommon);
 					if (Settings.getPlatform() == Platform.MACOS
 							&& oniMac.exists())
-						folders.add(oniMac);
+						foldersOni.add(oniMac);
 					else if (oniWin.exists())
-						folders.add(oniWin);
+						foldersOni.add(oniWin);
 				} else {
-					folders.add(oni);
-				}
-			}
-		}
-
-		combineBinaryFiles(folders, listener);
-
-		// TODO: bsl()
+					foldersOni.add(oni);
+				}
+			}
+		}
+		combineBinaryFiles(foldersOni, listener);
+		combineBSLFolders(mods, listener);
+	}
+
+	private static void combineBSLFolders(TreeSet<Mod> mods,
+			InstallProgressListener listener) {
+		listener.installProgressUpdate(95, 100, "Installing BSL files");
+
+		HashMap<EBSLInstallType, Vector<Mod>> modsToInclude = new HashMap<EBSLInstallType, Vector<Mod>>();
+		modsToInclude.put(EBSLInstallType.NORMAL, new Vector<Mod>());
+		modsToInclude.put(EBSLInstallType.ADDON, new Vector<Mod>());
+
+		for (Mod m : mods.descendingSet()) {
+			File bsl = new File(m.getLocalPath(), "bsl");
+			if (bsl.exists()) {
+				if (m.hasSeparatePlatformDirs()) {
+					File bslCommon = new File(bsl, "common");
+					File bslMac = new File(bsl, "mac_only");
+					File bslWin = new File(bsl, "win_only");
+					if ((Settings.getPlatform() == Platform.MACOS && bslMac
+							.exists())
+							|| ((Settings.getPlatform() == Platform.WIN || Settings
+									.getPlatform() == Platform.LINUX) && bslWin
+									.exists()) || bslCommon.exists()) {
+						modsToInclude.get(m.getBSLInstallType()).add(m);
+					}
+				} else {
+					modsToInclude.get(m.getBSLInstallType()).add(m);
+				}
+			}
+		}
+
+		for (Mod m : modsToInclude.get(EBSLInstallType.NORMAL)) {
+			copyBSL(m, false);
+		}
+		for (Mod m : modsToInclude.get(EBSLInstallType.ADDON)) {
+			copyBSL(m, true);
+		}
+	}
+
+	private static void copyBSL(Mod sourceMod, boolean addon) {
+		File targetBaseFolder = new File(Paths.getEditionGDF(), "IGMD");
+		if (!targetBaseFolder.exists())
+			targetBaseFolder.mkdir();
+
+		Vector<File> sources = new Vector<File>();
+		File bsl = new File(sourceMod.getLocalPath(), "bsl");
+		if (sourceMod.hasSeparatePlatformDirs()) {
+			File bslCommon = new File(bsl, "common");
+			File bslMac = new File(bsl, "mac_only");
+			File bslWin = new File(bsl, "win_only");
+			if (Settings.getPlatform() == Platform.MACOS && bslMac.exists()) {
+				for (File f : bslMac.listFiles(dirFileFilter)) {
+					File targetBSL = new File(targetBaseFolder, f.getName());
+					if (addon || !targetBSL.exists())
+						sources.add(f);
+				}
+			}
+			if ((Settings.getPlatform() == Platform.WIN || Settings
+					.getPlatform() == Platform.LINUX) && bslWin.exists()) {
+				for (File f : bslWin.listFiles(dirFileFilter)) {
+					File targetBSL = new File(targetBaseFolder, f.getName());
+					if (addon || !targetBSL.exists())
+						sources.add(f);
+				}
+			}
+			if (bslCommon.exists()) {
+				for (File f : bslCommon.listFiles(dirFileFilter)) {
+					File targetBSL = new File(targetBaseFolder, f.getName());
+					if (addon || !targetBSL.exists())
+						sources.add(f);
+				}
+			}
+		} else {
+			for (File f : bsl.listFiles(dirFileFilter)) {
+				File targetBSL = new File(targetBaseFolder, f.getName());
+				if (addon || !targetBSL.exists())
+					sources.add(f);
+			}
+		}
+
+		System.out.println("For mod: " + sourceMod.getName()
+				+ " install BSL folders: " + sources.toString());
+		for (File f : sources) {
+			File targetPath = new File(targetBaseFolder, f.getName());
+			if (!targetPath.exists())
+				targetPath.mkdir();
+			for (File fbsl : f.listFiles()) {
+				File targetFile = new File(targetPath, fbsl.getName());
+				if (!targetFile.exists()) {
+					try {
+						FileUtils.copyFile(fbsl, targetFile);
+					} catch (IOException e) {
+						// TODO Auto-generated catch block
+						e.printStackTrace();
+					}
+				}
+			}
+		}
 	}
 
@@ -171,4 +276,5 @@
 		String s : levels.keySet())
 			totalSteps++;
+		totalSteps++;
 
 		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@@ -202,4 +308,5 @@
 
 			log.println();
+			stepsDone++;
 		}
 
