Index: AE/installer2/src/net/oni2/aeinstaller/backend/mods/Mod.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/mods/Mod.java	(revision 626)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/mods/Mod.java	(revision 631)
@@ -216,4 +216,8 @@
 	}
 
+	private String getSanitizedPathName() {
+		return name.replaceAll("[^a-zA-Z0-9_.-]", "_");
+	}
+
 	/**
 	 * @return Path to local mod folder
@@ -233,5 +237,6 @@
 		}
 
-		return new File(Paths.getModsPath(), folderStart);
+		return new File(Paths.getModsPath(), folderStart
+				+ getSanitizedPathName());
 	}
 
@@ -254,4 +259,11 @@
 
 	/**
+	 * @return Is mod installed?
+	 */
+	public boolean isInstalled() {
+		return ModManager.getInstance().isModInstalled(this);
+	}
+
+	/**
 	 * @return Name of mod
 	 */
@@ -376,4 +388,5 @@
 		return exeFile;
 	}
+
 	/**
 	 * @return Icon file of this tool
Index: AE/installer2/src/net/oni2/aeinstaller/backend/mods/ModManager.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/mods/ModManager.java	(revision 626)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/mods/ModManager.java	(revision 631)
@@ -334,5 +334,5 @@
 	 * @return Is mod installed?
 	 */
-	public boolean isModInstalled(Mod m) {
+	boolean isModInstalled(Mod m) {
 		return currentlyInstalled.contains(m.getPackageNumber());
 	}
Index: AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java	(revision 626)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java	(revision 631)
@@ -8,4 +8,5 @@
 import java.io.FilenameFilter;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.PrintWriter;
 import java.text.SimpleDateFormat;
@@ -19,4 +20,5 @@
 import java.util.Vector;
 
+import net.oni2.aeinstaller.AEInstaller2;
 import net.oni2.aeinstaller.backend.Paths;
 import net.oni2.aeinstaller.backend.Settings;
@@ -244,36 +246,8 @@
 		combineBSLFolders(mods, listener);
 
-		if (Settings.getInstance().get("copyintro", false)) {
-			File src = new File(Paths.getVanillaGDF(), "intro.bik");
-			if (src.exists()) {
-				try {
-					FileUtils.copyFileToDirectory(src, Paths.getEditionGDF());
-				} catch (IOException e) {
-					e.printStackTrace();
-				}
-			}
-		}
-		if (Settings.getInstance().get("copyoutro", true)) {
-			File src = new File(Paths.getVanillaGDF(), "outro.bik");
-			if (src.exists()) {
-				try {
-					FileUtils.copyFileToDirectory(src, Paths.getEditionGDF());
-				} catch (IOException e) {
-					e.printStackTrace();
-				}
-			}
-		}
+		copyVideos();
 
 		if (unlockLevels.size() > 0) {
-			File dat = new File(Paths.getEditionBasePath(), "persist.dat");
-			if (dat.exists()) {
-				PersistDat save = new PersistDat(dat);
-				HashSet<Integer> currentlyUnlocked = save.getUnlockedLevels();
-				currentlyUnlocked.addAll(unlockLevels);
-				save.setUnlockedLevels(currentlyUnlocked);
-				save.close();
-			} else {
-				// TODO: what if persist.dat does not exist?
-			}
+			unlockLevels(unlockLevels);
 		}
 	}
@@ -445,4 +419,45 @@
 	}
 
+	private static void copyVideos() {
+		if (Settings.getInstance().get("copyintro", false)) {
+			File src = new File(Paths.getVanillaGDF(), "intro.bik");
+			if (src.exists()) {
+				try {
+					FileUtils.copyFileToDirectory(src, Paths.getEditionGDF());
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		if (Settings.getInstance().get("copyoutro", true)) {
+			File src = new File(Paths.getVanillaGDF(), "outro.bik");
+			if (src.exists()) {
+				try {
+					FileUtils.copyFileToDirectory(src, Paths.getEditionGDF());
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+
+	private static void unlockLevels(HashSet<Integer> unlockLevels) {
+		File dat = new File(Paths.getEditionBasePath(), "persist.dat");
+		if (!dat.exists()) {
+			InputStream is = AEInstaller2.class.getResourceAsStream("/net/oni2/aeinstaller/resources/persist.dat");
+			try {
+				FileUtils.copyInputStreamToFile(is, dat);
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+		}
+		PersistDat save = new PersistDat(dat);
+		HashSet<Integer> currentlyUnlocked = save.getUnlockedLevels();
+		currentlyUnlocked.addAll(unlockLevels);
+		save.setUnlockedLevels(currentlyUnlocked);
+		save.close();
+	}
+
 	/**
 	 * Initializes the Edition core
