Index: AE/installer2/src/net/oni2/aeinstaller/backend/OniSplit.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/OniSplit.java	(revision 594)
+++ 	(revision )
@@ -1,72 +1,0 @@
-package net.oni2.aeinstaller.backend;
-
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.util.Map;
-import java.util.Vector;
-
-import net.oni2.aeinstaller.backend.Settings.Architecture;
-import net.oni2.aeinstaller.backend.app_launcher.QuickAppExecution;
-
-/**
- * @author Christian Illy
- */
-public class OniSplit {
-
-	/**
-	 * @return is a .NET implementation installed?
-	 */
-	public static boolean isDotNETInstalled() {
-		switch (Settings.getPlatform()) {
-			case WIN:
-				try {
-					int view = WinRegistry.KEY_WOW64_32KEY;
-					if (Settings.getArchitecture() == Architecture.AMD64)
-						view = WinRegistry.KEY_WOW64_64KEY;
-
-					Map<String, String> m = WinRegistry
-							.readStringValues(
-									WinRegistry.HKEY_LOCAL_MACHINE,
-									"Software\\Microsoft\\NET Framework Setup\\NDP\\v2.0.50727",
-									view);
-					return m != null;
-				} catch (IllegalArgumentException e) {
-					// TODO Auto-generated catch block
-					e.printStackTrace();
-				} catch (IllegalAccessException e) {
-					// TODO Auto-generated catch block
-					e.printStackTrace();
-				} catch (InvocationTargetException e) {
-					// TODO Auto-generated catch block
-					e.printStackTrace();
-				} catch (Exception e) {
-					if (!e.getMessage()
-							.equals("Registry access not supported (not a Windows OS?)."))
-						// TODO Auto-generated catch block
-						e.printStackTrace();
-				}
-				return false;
-			case MACOS:
-			case LINUX:
-				Vector<String> cmd = new Vector<String>();
-				cmd.add("which");
-				cmd.add("mono");
-				Vector<String> res = null;
-				try {
-					res = QuickAppExecution.execute(cmd);
-				} catch (IOException e) {
-					// TODO Auto-generated catch block
-					e.printStackTrace();
-				}
-				if (res != null) {
-					if (res.get(0).startsWith("/")
-							&& res.get(0).endsWith("mono")) {
-						return true;
-					}
-				}
-				return false;
-			default:
-				return false;
-		}
-	}
-}
Index: AE/installer2/src/net/oni2/aeinstaller/backend/Paths.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/Paths.java	(revision 596)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/Paths.java	(revision 596)
@@ -0,0 +1,110 @@
+package net.oni2.aeinstaller.backend;
+
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+
+/**
+ * @author Christian Illy
+ */
+public class Paths {
+
+	/**
+	 * Get the Jar path
+	 * 
+	 * @return Path
+	 */
+	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();
+	}
+
+	/**
+	 * Get the preferences path
+	 * 
+	 * @return Path
+	 */
+	public static File getPrefsPath() {
+		return getInstallerPath();
+	}
+
+	/**
+	 * Get the path to store downloaded files
+	 * 
+	 * @return Download path
+	 */
+	public static File getDownloadPath() {
+		return new File(getTempPath(), "downloads");
+	}
+
+	/**
+	 * Get the path to store mods
+	 * 
+	 * @return Data path
+	 */
+	public static File getModsPath() {
+		return new File(getInstallerPath(), "mods");
+	}
+
+	/**
+	 * Get the path where vanilla .oni-files are stored
+	 * 
+	 * @return Vanilla .oni's path
+	 */
+	public static File getVanillaOnisPath() {
+		return new File(getInstallerPath(), "vanilla");
+	}
+
+	/**
+	 * Get the base path of Oni
+	 * 
+	 * @return Vanilla Oni path
+	 */
+	public static File getOniBasePath() {
+		return getInstallerPath().getParentFile().getParentFile();
+	}
+
+	/**
+	 * Get the base path of the Edition
+	 * 
+	 * @return Edition path
+	 */
+	public static File getEditionBasePath() {
+		return getInstallerPath().getParentFile();
+	}
+
+	/**
+	 * Get the path where the vanilla Oni GDF is located
+	 * 
+	 * @return Vanilla Oni GDF
+	 */
+	public static File getVanillaGDF() {
+		return new File(getOniBasePath(), "GameDataFolder");
+	}
+
+	/**
+	 * Get the path where the Edition GDF is located
+	 * 
+	 * @return Edition GDF
+	 */
+	public static File getEditionGDF() {
+		return new File(getEditionBasePath(), "GameDataFolder");
+	}
+
+	/**
+	 * Get the systems temp-path
+	 * 
+	 * @return Path
+	 */
+	public static File getTempPath() {
+		return new File(System.getProperty("java.io.tmpdir"), "oni_aei");
+	}
+
+}
Index: AE/installer2/src/net/oni2/aeinstaller/backend/Settings.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/Settings.java	(revision 594)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/Settings.java	(revision 596)
@@ -7,6 +7,4 @@
 import java.io.IOException;
 import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
 import java.util.HashMap;
 import java.util.Vector;
@@ -142,65 +140,12 @@
 
 	/**
-	 * Get the Jar path
-	 * 
-	 * @return Path
-	 */
-	public static String getJarPath() {
-		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().getPath() + "/";
-	}
-
-	/**
-	 * Get the preferences path
-	 * 
-	 * @return Path
-	 */
-	public static String getPrefsPath() {
-		return getJarPath();
-	}
-
-	/**
-	 * Get the path to store downloaded files
-	 * 
-	 * @return Download path
-	 */
-	public static String getDownloadPath() {
-		return getTempPath() + "oni_aei/";
-	}
-
-	/**
-	 * Get the path to store game information data
-	 * 
-	 * @return Data path
-	 */
-	public static String getDataPath() {
-		return getJarPath() + "mods/";
-	}
-
-	/**
-	 * Get the systems temp-path
-	 * 
-	 * @return Path
-	 */
-	public static String getTempPath() {
-		return new File(System.getProperty("java.io.tmpdir")).getPath() + "/";
-	}
-
-	/**
 	 * @return Mod Depot cache filename
 	 */
-	public static String getDepotCacheFilename() {
-		return Settings.getPrefsPath() + "ModDepotCache.xml";
-	}
-
-	private static String getSettingsFilename() {
-		return Settings.getPrefsPath() + "AEI-Settings.xml";
+	public static File getDepotCacheFilename() {
+		return new File(Paths.getPrefsPath(), "ModDepotCache.xml");
+	}
+
+	private static File getSettingsFilename() {
+		return new File(Paths.getPrefsPath(), "AEI-Settings.xml");
 	}
 
Index: AE/installer2/src/net/oni2/aeinstaller/backend/StuffToRefactorLater.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/StuffToRefactorLater.java	(revision 594)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/StuffToRefactorLater.java	(revision 596)
@@ -1,5 +1,4 @@
 package net.oni2.aeinstaller.backend;
 
-import java.io.File;
 
 public class StuffToRefactorLater {
@@ -9,8 +8,5 @@
 	 */
 	public static boolean verifyRunningDirectory() {
-		File jarPath = new File(Settings.getJarPath());
-		File parentPath = jarPath.getParentFile().getParentFile();
-		File gdf = new File(parentPath, "GameDataFolder");
-		return gdf.exists() && gdf.isDirectory();
+		return Paths.getVanillaGDF().exists() && Paths.getVanillaGDF().isDirectory();
 	}
 }
Index: AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java	(revision 596)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/oni/Installer.java	(revision 596)
@@ -0,0 +1,65 @@
+package net.oni2.aeinstaller.backend.oni;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.util.Scanner;
+
+import net.oni2.aeinstaller.backend.Paths;
+
+import org.apache.commons.io.FileUtils;
+
+/**
+ * @author Christian Illy
+ */
+public class Installer {
+	/**
+	 * @return Is Edition Core initialized
+	 */
+	public static boolean isEditionInitialized() {
+		File editionGDF = Paths.getEditionGDF();
+		File vanillaDats = Paths.getVanillaGDF();
+		return editionGDF.exists() && vanillaDats.exists();
+	}
+
+	private static void createEmptyPath(File path) throws IOException {
+		if (path.exists())
+			FileUtils.deleteDirectory(path);
+		path.mkdirs();
+	}
+
+	/**
+	 * Initializes the Edition core
+	 */
+	public static void initializeEdition() {
+		File init = new File(Paths.getTempPath(), "init");
+		try {
+			createEmptyPath(Paths.getEditionGDF());
+			createEmptyPath(Paths.getVanillaOnisPath());
+			createEmptyPath(init);
+
+			for (File f : Paths.getVanillaGDF().listFiles(new FilenameFilter() {
+				@Override
+				public boolean accept(File dir, String name) {
+					return name.endsWith(".dat");
+				}
+			})) {
+				String levelName = f.getName().substring(0,
+						f.getName().indexOf('.'));
+				int levelNumber = -1;
+
+				Scanner fi = new Scanner(levelName);
+				fi.useDelimiter("[^\\p{Alnum}]");
+				while (fi.hasNextInt()) {
+					levelNumber = fi.nextInt();
+				}
+
+				OniSplit.export(new File(init, levelName), f);
+			}
+
+			// TODO: FileUtils.deleteDirectory(Paths.getEditionGDF());
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+}
Index: AE/installer2/src/net/oni2/aeinstaller/backend/oni/OniSplit.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/backend/oni/OniSplit.java	(revision 596)
+++ AE/installer2/src/net/oni2/aeinstaller/backend/oni/OniSplit.java	(revision 596)
@@ -0,0 +1,125 @@
+package net.oni2.aeinstaller.backend.oni;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Map;
+import java.util.Vector;
+
+import net.oni2.aeinstaller.backend.Paths;
+import net.oni2.aeinstaller.backend.Settings;
+import net.oni2.aeinstaller.backend.Settings.Architecture;
+import net.oni2.aeinstaller.backend.Settings.Platform;
+import net.oni2.aeinstaller.backend.WinRegistry;
+import net.oni2.aeinstaller.backend.app_launcher.QuickAppExecution;
+
+/**
+ * @author Christian Illy
+ */
+public class OniSplit {
+
+	/**
+	 * @return is a .NET implementation installed?
+	 */
+	public static boolean isDotNETInstalled() {
+		switch (Settings.getPlatform()) {
+			case WIN:
+				try {
+					int view = WinRegistry.KEY_WOW64_32KEY;
+					if (Settings.getArchitecture() == Architecture.AMD64)
+						view = WinRegistry.KEY_WOW64_64KEY;
+
+					Map<String, String> m = WinRegistry
+							.readStringValues(
+									WinRegistry.HKEY_LOCAL_MACHINE,
+									"Software\\Microsoft\\NET Framework Setup\\NDP\\v2.0.50727",
+									view);
+					return m != null;
+				} catch (IllegalArgumentException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (IllegalAccessException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (InvocationTargetException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (Exception e) {
+					if (!e.getMessage()
+							.equals("Registry access not supported (not a Windows OS?)."))
+						// TODO Auto-generated catch block
+						e.printStackTrace();
+				}
+				return false;
+			case MACOS:
+			case LINUX:
+				Vector<String> cmd = new Vector<String>();
+				cmd.add("which");
+				cmd.add("mono");
+				Vector<String> res = null;
+				try {
+					res = QuickAppExecution.execute(cmd);
+				} catch (IOException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+				if (res != null) {
+					if (res.get(0).startsWith("/")
+							&& res.get(0).endsWith("mono")) {
+						return true;
+					}
+				}
+				return false;
+			default:
+				return false;
+		}
+	}
+
+	/**
+	 * Export given dat-file to target folder
+	 * 
+	 * @param targetFolder
+	 *            Target folder
+	 * @param input
+	 *            Dat file
+	 */
+	public static void export(File targetFolder, File input) {
+		if (!targetFolder.exists())
+			targetFolder.mkdir();
+
+		Vector<String> cmdLine = getProgramInvocation();
+		cmdLine.add("-export");
+		cmdLine.add(targetFolder.getPath());
+		cmdLine.add(input.getPath());
+		System.out.println(cmdLine.toString());
+		Vector<String> res = null;
+		try {
+			res = QuickAppExecution.execute(cmdLine);
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		if (res != null) {
+			System.out.println(res.toString());
+		}
+	}
+
+	public static void importLevel() {
+		getImportParam();
+	}
+
+	private static String getImportParam() {
+		if (Settings.getPlatform() == Platform.MACOS)
+			return "-import:sep";
+		else
+			return "-import:nosep";
+	}
+
+	private static Vector<String> getProgramInvocation() {
+		Vector<String> res = new Vector<String>();
+		if (Settings.getPlatform() != Platform.WIN)
+			res.add("mono");
+		res.add(new File(Paths.getInstallerPath(), "Onisplit.exe").getPath());
+		return res;
+	}
+}
