Index: AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java	(revision 648)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java	(revision 653)
@@ -213,8 +213,30 @@
 		}
 
+		File logFile = new File(Paths.getInstallerPath(), "Installation.log");
+		PrintWriter log = null;
+		try {
+			log = new PrintWriter(logFile);
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		}
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		Date start = new Date();
+		log.println("Installation of mods started at " + sdf.format(start));
+
+		log.println();
+		log.println("Installed tools:");
+		for (Package t : PackageManager.getInstance().getInstalledTools()) {
+			log.println(String.format(" - %s (%s)", t.getName(), t.getVersion()));
+		}
+		log.println("Installing mods:");
+		for (Package m : mods) {
+			log.println(String.format(" - %s (%s)", m.getName(), m.getVersion()));
+		}
+		log.println();
+
 		File installCfg = new File(Paths.getEditionGDF(), "installed_mods.xml");
 		PackageManager.getInstance().saveModSelection(installCfg, mods);
 
-		HashSet<Integer> unlockLevels = new HashSet<Integer>();
+		TreeSet<Integer> unlockLevels = new TreeSet<Integer>();
 
 		Vector<File> foldersOni = new Vector<File>();
@@ -243,17 +265,24 @@
 			}
 		}
-		combineBinaryFiles(foldersOni, listener);
-		combineBSLFolders(mods, listener);
-
-		copyVideos();
+		combineBinaryFiles(foldersOni, listener, log);
+		combineBSLFolders(mods, listener, log);
+
+		copyVideos(log);
 
 		if (unlockLevels.size() > 0) {
-			unlockLevels(unlockLevels);
-		}
+			unlockLevels(unlockLevels, log);
+		}
+
+		Date end = new Date();
+		log.println("Initialization ended at " + sdf.format(end));
+		log.println("Process took "
+				+ ((end.getTime() - start.getTime()) / 1000) + " seconds");
+		log.close();
 	}
 
 	private static void combineBSLFolders(TreeSet<Package> mods,
-			InstallProgressListener listener) {
+			InstallProgressListener listener, PrintWriter log) {
 		listener.installProgressUpdate(95, 100, "Installing BSL files");
+		log.println("Installing BSL files");
 
 		HashMap<EBSLInstallType, Vector<Package>> modsToInclude = new HashMap<EBSLInstallType, Vector<Package>>();
@@ -351,5 +380,5 @@
 
 	private static void combineBinaryFiles(List<File> srcFoldersFiles,
-			InstallProgressListener listener) {
+			InstallProgressListener listener, PrintWriter log) {
 		TreeMap<String, Vector<File>> levels = new TreeMap<String, Vector<File>>();
 
@@ -379,17 +408,4 @@
 		totalSteps++;
 
-		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
-		File logFile = new File(Paths.getInstallerPath(), "Installation.log");
-		PrintWriter log = null;
-		try {
-			log = new PrintWriter(logFile);
-		} catch (FileNotFoundException e) {
-			e.printStackTrace();
-		}
-
-		Date start = new Date();
-		log.println("Installation of mods started at " + sdf.format(start));
-
 		log.println("Importing levels");
 		for (String l : levels.keySet()) {
@@ -411,15 +427,10 @@
 			stepsDone++;
 		}
-
-		Date end = new Date();
-		log.println("Initialization ended at " + sdf.format(end));
-		log.println("Process took "
-				+ ((end.getTime() - start.getTime()) / 1000) + " seconds");
-		log.close();
-	}
-
-	private static void copyVideos() {
+	}
+
+	private static void copyVideos(PrintWriter log) {
 		if (Settings.getInstance().get("copyintro", false)) {
 			File src = new File(Paths.getVanillaGDF(), "intro.bik");
+			log.println("Copying intro");
 			if (src.exists()) {
 				try {
@@ -432,4 +443,5 @@
 		if (Settings.getInstance().get("copyoutro", true)) {
 			File src = new File(Paths.getVanillaGDF(), "outro.bik");
+			log.println("Copying outro");
 			if (src.exists()) {
 				try {
@@ -442,8 +454,11 @@
 	}
 
-	private static void unlockLevels(HashSet<Integer> unlockLevels) {
+	private static void unlockLevels(TreeSet<Integer> unlockLevels,
+			PrintWriter log) {
 		File dat = new File(Paths.getEditionBasePath(), "persist.dat");
+		log.println("Unlocking levels: " + unlockLevels.toString());
 		if (!dat.exists()) {
-			InputStream is = AEInstaller2.class.getResourceAsStream("/net/oni2/aeinstaller/resources/persist.dat");
+			InputStream is = AEInstaller2.class
+					.getResourceAsStream("/net/oni2/aeinstaller/resources/persist.dat");
 			try {
 				FileUtils.copyInputStreamToFile(is, dat);
