Index: /java/installer2/src/net/oni2/aeinstaller/AEInstaller.properties
===================================================================
--- /java/installer2/src/net/oni2/aeinstaller/AEInstaller.properties	(revision 1019)
+++ /java/installer2/src/net/oni2/aeinstaller/AEInstaller.properties	(revision 1020)
@@ -1,2 +1,2 @@
 appname=AE Installer 2
-appversion=.21
+appversion=.22
Index: /java/installer2/src/net/oni2/aeinstaller/backend/oni/management/Installer.java
===================================================================
--- /java/installer2/src/net/oni2/aeinstaller/backend/oni/management/Installer.java	(revision 1019)
+++ /java/installer2/src/net/oni2/aeinstaller/backend/oni/management/Installer.java	(revision 1020)
@@ -610,5 +610,5 @@
 
 		for (Package p : mods) {
-			ToolFileIterator.iteratePlatformToolFiles(p, false,
+			ToolFileIterator.iteratePlatformToolFiles(p,
 					new ToolFileIteratorEntry() {
 						@Override
Index: /java/installer2/src/net/oni2/aeinstaller/backend/oni/management/tools/ToolFileIterator.java
===================================================================
--- /java/installer2/src/net/oni2/aeinstaller/backend/oni/management/tools/ToolFileIterator.java	(revision 1019)
+++ /java/installer2/src/net/oni2/aeinstaller/backend/oni/management/tools/ToolFileIterator.java	(revision 1020)
@@ -19,10 +19,8 @@
 	 * @param tool
 	 *            Tool to iterate over
-	 * @param handleAppAsFiles
-	 *            Whether or not to handle MacOS .app folders as a single file
 	 * @param handler
 	 *            Handler to handle found files
 	 */
-	public static void iteratePlatformToolFiles(Package tool, boolean handleAppAsFiles,
+	public static void iteratePlatformToolFiles(Package tool,
 			ToolFileIteratorEntry handler) {
 		File plain = CaseInsensitiveFile.getCaseInsensitiveFile(
@@ -37,24 +35,27 @@
 						plain, "win_only");
 				if (plainCommon.exists())
-					iterateFiles(plainCommon, Paths.getEditionBasePath(), handleAppAsFiles,
+					iterateFiles(plainCommon, Paths.getEditionBasePath(),
 							handler);
 				if (PlatformInformation.getPlatform() == Platform.MACOS
 						&& plainMac.exists())
-					iterateFiles(plainMac, Paths.getEditionBasePath(), handleAppAsFiles, handler);
+					iterateFiles(plainMac, Paths.getEditionBasePath(), handler);
 				else if (plainWin.exists())
-					iterateFiles(plainWin, Paths.getEditionBasePath(), handleAppAsFiles, handler);
+					iterateFiles(plainWin, Paths.getEditionBasePath(), handler);
 			} else {
-				iterateFiles(plain, Paths.getEditionBasePath(), handleAppAsFiles, handler);
+				iterateFiles(plain, Paths.getEditionBasePath(), handler);
 			}
 		}
 	}
 
-	private static void iterateFiles(File srcFolder, File targetFolder, boolean handleAppAsFiles,
+	private static void iterateFiles(File srcFolder, File targetFolder,
 			ToolFileIteratorEntry handler) {
 		for (File f : srcFolder.listFiles()) {
-			if (f.isDirectory() && (!f.getName().endsWith(".app") || !handleAppAsFiles))
+			if (f.isDirectory()) {
+				if (f.getName().endsWith(".app")) {
+					handler.toolFile(f, new File(targetFolder, f.getName()), f.isDirectory());
+				}
 				iterateFiles(f, CaseInsensitiveFile.getCaseInsensitiveFile(
-						targetFolder, f.getName()), handleAppAsFiles, handler);
-			else {
+						targetFolder, f.getName()), handler);
+			} else {
 				handler.toolFile(f, new File(targetFolder, f.getName()), f.isDirectory());
 			}
Index: /java/installer2/src/net/oni2/aeinstaller/backend/oni/management/tools/ToolsManager.java
===================================================================
--- /java/installer2/src/net/oni2/aeinstaller/backend/oni/management/tools/ToolsManager.java	(revision 1019)
+++ /java/installer2/src/net/oni2/aeinstaller/backend/oni/management/tools/ToolsManager.java	(revision 1020)
@@ -26,8 +26,9 @@
 		final ToolInstallationList til = ToolInstallationList.getInstance();
 		for (final Package m : PackageManager.getInstance().getInstalledTools()) {
-			ToolFileIterator.iteratePlatformToolFiles(m, false,
+			ToolFileIterator.iteratePlatformToolFiles(m,
 					new ToolFileIteratorEntry() {
 						@Override
-						public void toolFile(File source, File target, boolean isDir) {
+						public void toolFile(File source, File target,
+								boolean isDir) {
 							byte[] chkSrc = FileChecksum
 									.calculateFileMD5(source);
@@ -35,8 +36,10 @@
 								til.markModified(m.getPackageNumber(), true);
 							} else {
-								byte[] chkTrg = FileChecksum
-										.calculateFileMD5(target);
-								if (!Arrays.equals(chkSrc, chkTrg))
-									til.markModified(m.getPackageNumber(), true);
+								if (!isDir) {
+									byte[] chkTrg = FileChecksum
+											.calculateFileMD5(target);
+									if (!Arrays.equals(chkSrc, chkTrg))
+										til.markModified(m.getPackageNumber(), true);
+								}
 							}
 						}
@@ -56,8 +59,9 @@
 			if (!uninstall) { // Install:
 				final HashSet<String> files = new HashSet<String>();
-				ToolFileIterator.iteratePlatformToolFiles(m, true,
+				ToolFileIterator.iteratePlatformToolFiles(m,
 						new ToolFileIteratorEntry() {
 							@Override
-							public void toolFile(File source, File target, boolean isDir) {
+							public void toolFile(File source, File target,
+									boolean isDir) {
 								copyToolsFiles(source, target, isDir, files);
 							}
@@ -80,21 +84,27 @@
 					target.getParentFile(), target.getName());
 
-			files.add(target.getPath().replace(
-					Paths.getEditionBasePath().getPath(), ""));
+			if (isDir && src.getAbsolutePath().endsWith(".app")) {
+				files.add(target.getPath().replace(
+						Paths.getEditionBasePath().getPath(), ""));
 
-			if (isDir) {
 				if (targetFile.exists()) {
 					FileUtils.deleteDirectory(targetFile);
 				}
-				
-				FileUtils.copyDirectory(src, target, true);	
+
+				FileUtils.copyDirectory(src, target, true);
 			} else {
-				// Case mismatch?
-				if (!targetFile.getName().equals(src.getName()))
-					targetFile.delete();
+				if (!src.getAbsolutePath().contains(".app/")) {
+					files.add(target.getPath().replace(
+							Paths.getEditionBasePath().getPath(), ""));
 
-				FileUtils.copyFile(src, target);
-				if (src.canExecute())
-					target.setExecutable(true);
+					// Case mismatch?
+					if (!targetFile.getName().equals(src.getName()))
+						targetFile.delete();
+
+					FileUtils.copyFile(src, target);
+				}
+
+				if (src.canExecute() && targetFile.exists())
+					targetFile.setExecutable(true);
 			}
 		} catch (IOException e) {
Index: /java/installer2/src/net/oni2/aeinstaller/backend/packages/Package.java
===================================================================
--- /java/installer2/src/net/oni2/aeinstaller/backend/packages/Package.java	(revision 1019)
+++ /java/installer2/src/net/oni2/aeinstaller/backend/packages/Package.java	(revision 1020)
@@ -122,6 +122,6 @@
 				getLocalPath(), "Mod_Info.cfg");
 		File aeicfg = new File(getLocalPath(), "aei.cfg");
-		File plain = CaseInsensitiveFile.getCaseInsensitiveFile(getLocalPath(),
-				"plain");
+//		File plain = CaseInsensitiveFile.getCaseInsensitiveFile(getLocalPath(),
+//				"plain");
 		if (config.exists()) {
 			Mod_Info mi = new Mod_Info(config, packageNumber);
@@ -173,6 +173,7 @@
 			}
 		}
-		if (isLocalOnly())
-			tool = plain.exists();
+		if (isLocalOnly()) {
+			tool = packageNumber < 10000;
+		}
 	}
 
