Index: /AE/installer2/src/net/oni2/aeinstaller/AEInstaller.properties
===================================================================
--- /AE/installer2/src/net/oni2/aeinstaller/AEInstaller.properties	(revision 652)
+++ /AE/installer2/src/net/oni2/aeinstaller/AEInstaller.properties	(revision 653)
@@ -1,2 +1,2 @@
 appname=AE Installer 2
-appversion=0.99f
+appversion=0.99g
Index: /AE/installer2/src/net/oni2/aeinstaller/AEInstaller2.java
===================================================================
--- /AE/installer2/src/net/oni2/aeinstaller/AEInstaller2.java	(revision 652)
+++ /AE/installer2/src/net/oni2/aeinstaller/AEInstaller2.java	(revision 653)
@@ -60,4 +60,15 @@
 			e.printStackTrace();
 		}
+	}
+	
+	private static void initBundles() {
+		File localesDir = new File(Paths.getInstallerPath(), "locales");
+		if (localesDir.isDirectory())
+			addClassPath(localesDir);
+		imagesBundle = ResourceBundle.getBundle("net.oni2.aeinstaller.Images");
+		basicBundle = ResourceBundle
+				.getBundle("net.oni2.aeinstaller.AEInstaller");
+		globalBundle = ResourceBundle
+				.getBundle("net.oni2.aeinstaller.localization.Global");
 	}
 
@@ -107,4 +118,6 @@
 			}
 		}
+		
+		initBundles();
 
 		if (Settings.getPlatform() == Platform.MACOS)
@@ -115,13 +128,4 @@
 		Settings.setDebug(debug);
 		Settings.getInstance().setNoCacheUpdateMode(noCacheUpdate);
-
-		File localesDir = new File(Paths.getInstallerPath(), "locales");
-		if (localesDir.isDirectory())
-			addClassPath(localesDir);
-		imagesBundle = ResourceBundle.getBundle("net.oni2.aeinstaller.Images");
-		basicBundle = ResourceBundle
-				.getBundle("net.oni2.aeinstaller.AEInstaller");
-		globalBundle = ResourceBundle
-				.getBundle("net.oni2.aeinstaller.localization.Global");
 
 		SwingJavaBuilder.getConfig().addResourceBundle(imagesBundle);
Index: /AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java
===================================================================
--- /AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java	(revision 652)
+++ /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);
