Index: AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.java
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.java	(revision 622)
+++ AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.java	(revision 623)
@@ -8,4 +8,5 @@
 import java.io.File;
 import java.io.IOException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -17,4 +18,7 @@
 import java.util.Vector;
 
+import javax.swing.AbstractAction;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
 import javax.swing.JButton;
 import javax.swing.JComboBox;
@@ -38,4 +42,6 @@
 import javax.swing.table.TableRowSorter;
 
+import net.oni2.aeinstaller.AEInstaller2;
+import net.oni2.aeinstaller.backend.AppExecution;
 import net.oni2.aeinstaller.backend.Paths;
 import net.oni2.aeinstaller.backend.Settings;
@@ -80,4 +86,6 @@
 
 	private JMenu mainMenu;
+	private JMenu toolsMenu;
+	private TreeSet<JMenuItem> toolsMenuItems = new TreeSet<JMenuItem>();
 
 	private JSplitPane contents;
@@ -412,4 +420,37 @@
 
 	@SuppressWarnings("unused")
+	private void refreshToolsMenu() {
+		for (JMenuItem i : toolsMenuItems) {
+			toolsMenu.remove(i);
+		}
+		toolsMenuItems.clear();
+		for (Mod m : ModManager.getInstance().getInstalledTools()) {
+			if (m.getExeFile() != null && m.getExeFile().exists()) {
+				JMenuItem item = new JMenuItem();
+				final Vector<String> params = new Vector<String>();
+				params.add(m.getExeFile().getPath());
+				final File wd = m.getWorkingDir();
+				Icon ico = null;
+				if (m.getIconFile() != null && m.getIconFile().exists()) {
+					ico = new ImageIcon(m.getIconFile().getPath());
+				} else {
+					URL icon = AEInstaller2.class.getResource("images/transparent.png");
+					ico = new ImageIcon(icon);
+				}
+				item.setAction(new AbstractAction(m.getName(), ico) {
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					public void actionPerformed(ActionEvent e) {
+						AppExecution.execute(params, wd);
+					}
+				});
+				toolsMenuItems.add(item);
+				toolsMenu.add(item);
+			}
+		}
+	}
+
+	@SuppressWarnings("unused")
 	private void revertSelection() {
 		model.revertSelection();
@@ -510,5 +551,19 @@
 
 		if (instReady) {
-			Installer.install(mods, new InstallProgressListener() {
+			TreeSet<Mod> actuallyMods = new TreeSet<Mod>();
+			TreeSet<Mod> actuallyTools = new TreeSet<Mod>();
+
+			for (Mod m : mods) {
+				if (m.isTool())
+					actuallyTools.add(m);
+				else
+					actuallyMods.add(m);
+			}
+
+			if (actuallyTools.size() > 0) {
+				Installer.installTools(actuallyTools);
+			}
+
+			Installer.install(actuallyMods, new InstallProgressListener() {
 				@Override
 				public void installProgressUpdate(int done, int total,
@@ -657,11 +712,5 @@
 		Vector<String> params = getBasicOniLaunchParams();
 		if (params.size() > 0) {
-			try {
-				ProcessBuilder pb = new ProcessBuilder(params);
-				pb.directory(Paths.getEditionBasePath());
-				pb.start();
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
+			AppExecution.execute(params, Paths.getEditionBasePath());
 		}
 	}
@@ -672,11 +721,5 @@
 		if (params.size() > 0) {
 			params.add("-noswitch");
-			try {
-				ProcessBuilder pb = new ProcessBuilder(params);
-				pb.directory(Paths.getEditionBasePath());
-				pb.start();
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
+			AppExecution.execute(params, Paths.getEditionBasePath());
 		}
 	}
Index: AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.properties
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.properties	(revision 622)
+++ AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.properties	(revision 623)
@@ -24,8 +24,10 @@
 menu.reglobalize=&Rebuild Core Data
 menu.reglobalizeTooltip=Rebuild Core Data
-menu.tools=&Manage Tools
-menu.toolsTooltip=Install/Remove Tools
 menu.update=&Check for updates
 menu.updateTooltip=Check for updates to already downloaded packages on the Depot
+
+menu.tools=&Tools
+menu.manageTools=&Manage Tools
+menu.manageToolsTooltip=Install/Remove Tools
 
 btnRevertSelection.text=Revert selection
Index: AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.yml
===================================================================
--- AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.yml	(revision 622)
+++ AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.yml	(revision 623)
@@ -6,5 +6,5 @@
   locationRelativeTo: null
   defaultCloseOperation: doNothingOnClose
-  onWindowOpened: [execDepotUpdate,checkMandatoryFiles,checkInitialize,initialize,checkUpdates,doUpdate]
+  onWindowOpened: [execDepotUpdate,checkMandatoryFiles,checkInitialize,initialize,checkUpdates,doUpdate,refreshToolsMenu,focus]
   onWindowClosing: [saveLocalData,exit]
   iconImage: img.ae
@@ -19,5 +19,5 @@
     - Action(name=saveConfig, text=menu.saveConfig, toolTipText=menu.saveConfigTooltip, icon=img.saveFile, onAction=[saveConfig])
     - Action(name=reglobalize, text=menu.reglobalize, toolTipText=menu.reglobalizeTooltip, icon=img.refresh, onAction=[reglobalize])
-    - Action(name=tools, text=menu.tools, toolTipText=menu.toolsTooltip, icon=img.tools, onAction=[tools])
+    - Action(name=tools, text=menu.manageTools, toolTipText=menu.manageToolsTooltip, icon=img.tools, onAction=[tools,refreshToolsMenu])
     - Action(name=update, text=menu.update, toolTipText=menu.updateTooltip, icon=img.update, onAction=[checkUpdates,doUpdate])
     - JMenuBar:
@@ -37,7 +37,8 @@
             - JMenuItem(action=reglobalize)
             - JSeparator()
-            - JMenuItem(action=tools)
+            - JMenuItem(action=update)
+        - JMenu(name=toolsMenu, text=menu.tools):
+            - JMenuItem(name=manageToolsItem, action=tools)
             - JSeparator()
-            - JMenuItem(action=update)
     - JToolBar(name=toolbar, floatable=false, orientation=0):
         - JButton(action=exitAction, hideActionText=true)
