Index: java/installer2/src/net/oni2/aeinstaller/AEInstaller.properties
===================================================================
--- java/installer2/src/net/oni2/aeinstaller/AEInstaller.properties	(revision 880)
+++ java/installer2/src/net/oni2/aeinstaller/AEInstaller.properties	(revision 886)
@@ -1,2 +1,2 @@
 appname=AE Installer 2
-appversion=.15
+appversion=.16
Index: java/installer2/src/net/oni2/aeinstaller/AEInstaller2.java
===================================================================
--- java/installer2/src/net/oni2/aeinstaller/AEInstaller2.java	(revision 880)
+++ java/installer2/src/net/oni2/aeinstaller/AEInstaller2.java	(revision 886)
@@ -5,5 +5,4 @@
 import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.io.PrintStream;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -11,4 +10,6 @@
 import java.net.URL;
 import java.net.URLClassLoader;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.ResourceBundle;
 
@@ -24,4 +25,5 @@
 import net.oni2.SettingsManager;
 import net.oni2.aeinstaller.backend.CaseInsensitiveFile;
+import net.oni2.aeinstaller.backend.LogPrintStream;
 import net.oni2.aeinstaller.backend.Paths;
 import net.oni2.aeinstaller.backend.RuntimeOptions;
@@ -127,12 +129,12 @@
 				RuntimeOptions.setUseWorkingDir(true);
 		}
+		LogPrintStream lps = LogPrintStream.getInstance();
 		if (!RuntimeOptions.isDebug()) {
 			try {
-				PrintStream ps = new PrintStream(new File(Paths.getPrefsPath(),
-						"aei_output.log"));
-				System.setOut(ps);
-				System.setErr(ps);
+				lps.setFile(new File(Paths.getPrefsPath(), "aei_output.log"));
 			} catch (FileNotFoundException e1) {
 				e1.printStackTrace();
+			} catch (IOException e) {
+				e.printStackTrace();
 			}
 		}
@@ -142,9 +144,9 @@
 
 		SettingsManager.deserializeFromFile(Paths.getSettingsFilename());
-		
+
 		if (Paths.getProxySettingsFilename().exists()) {
 			ProxySettings.deserializeFromFile(Paths.getProxySettingsFilename());
 		}
-		
+
 		initBundles();
 
@@ -181,6 +183,16 @@
 		JFrame.setDefaultLookAndFeelDecorated(true);
 
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 		System.out.println(basicBundle.getString("appname")
 				+ basicBundle.getString("appversion"));
+		System.out.println("Time:      " + sdf.format(new Date()));
+		System.out.println("Java:      \""
+				+ System.getProperty("java.runtime.name") + "\" v. "
+				+ System.getProperty("java.version") + " by \""
+				+ System.getProperty("java.vendor") + "\" (spec. "
+				+ System.getProperty("java.specification.version") + ")");
+		System.out.println("Java home: " + System.getProperty("java.home"));
+		System.out.println("Command:   "
+				+ System.getProperty("sun.java.command"));
 		System.out.println("JarPath:   " + Paths.getJarPath());
 		System.out.println("PrefsPath: " + Paths.getPrefsPath());
Index: java/installer2/src/net/oni2/aeinstaller/backend/LogPrintStream.java
===================================================================
--- java/installer2/src/net/oni2/aeinstaller/backend/LogPrintStream.java	(revision 886)
+++ java/installer2/src/net/oni2/aeinstaller/backend/LogPrintStream.java	(revision 886)
@@ -0,0 +1,81 @@
+package net.oni2.aeinstaller.backend;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+
+/**
+ * @author Christian Illy
+ */
+public class LogPrintStream extends OutputStream {
+	private static LogPrintStream instance = new LogPrintStream();
+
+	private ByteArrayOutputStream baos = new ByteArrayOutputStream();
+	private FileWriter fw = null;
+	private PrintStream stdOut = null;
+
+	private boolean logStdOut = true;
+
+	private LogPrintStream() {
+		stdOut = System.out;
+
+		PrintStream ps = new PrintStream(this);
+		System.setOut(ps);
+		System.setErr(ps);
+	}
+
+	/**
+	 * @return Logger instance
+	 */
+	public static LogPrintStream getInstance() {
+		return instance;
+	}
+
+	/**
+	 * Set the file to log to
+	 * 
+	 * @param logFile
+	 *            Log file
+	 * @throws IOException
+	 *             Should not happen?!
+	 */
+	public void setFile(File logFile) throws IOException {
+		if (fw != null)
+			fw.close();
+		fw = new FileWriter(logFile);
+	}
+
+	@Override
+	public void write(int b) throws IOException {
+		baos.write(b);
+		if (logStdOut)
+			stdOut.write(b);
+		if (fw != null)
+			fw.write(b);
+	}
+
+	/**
+	 * @return Get the text that has been written to log up to now
+	 */
+	public String getLog() {
+		return baos.toString();
+	}
+
+	@Override
+	public void flush() throws IOException {
+		stdOut.flush();
+		baos.flush();
+		if (fw != null)
+			fw.flush();
+	}
+
+	@Override
+	public void close() throws IOException {
+		if (fw != null)
+			fw.close();
+		super.close();
+	}
+}
Index: java/installer2/src/net/oni2/aeinstaller/backend/StringDataSource.java
===================================================================
--- java/installer2/src/net/oni2/aeinstaller/backend/StringDataSource.java	(revision 886)
+++ java/installer2/src/net/oni2/aeinstaller/backend/StringDataSource.java	(revision 886)
@@ -0,0 +1,47 @@
+package net.oni2.aeinstaller.backend;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import javax.activation.DataSource;
+
+/**
+ * @author Christian Illy
+ */
+public class StringDataSource implements DataSource {
+
+	private String str;
+
+	/**
+	 * Create a SDS from the given string
+	 * 
+	 * @param str
+	 *            String to represent
+	 */
+	public StringDataSource(String str) {
+		this.str = str;
+	}
+
+	@Override
+	public String getContentType() {
+		return "text/plain";
+	}
+
+	@Override
+	public InputStream getInputStream() throws IOException {
+		return new ByteArrayInputStream(str.getBytes());
+	}
+
+	@Override
+	public String getName() {
+		return "<unknown>";
+	}
+
+	@Override
+	public OutputStream getOutputStream() throws IOException {
+		throw new IOException("Can not write to the string data source");
+	}
+
+}
Index: java/installer2/src/net/oni2/aeinstaller/gui/MainWin.java
===================================================================
--- java/installer2/src/net/oni2/aeinstaller/gui/MainWin.java	(revision 880)
+++ java/installer2/src/net/oni2/aeinstaller/gui/MainWin.java	(revision 886)
@@ -75,4 +75,5 @@
 import net.oni2.aeinstaller.gui.modtable.ModTable.ETableContentType;
 import net.oni2.aeinstaller.gui.packageinfobox.PackageInfoBox;
+import net.oni2.aeinstaller.gui.reporter.ReporterDialog;
 import net.oni2.aeinstaller.gui.settings.SettingsDialog;
 import net.oni2.aeinstaller.gui.toolmanager.ToolManager;
@@ -514,4 +515,9 @@
 		}
 	}
+	
+	@SuppressWarnings("unused")
+	private void showReport() {
+		new ReporterDialog().setVisible(true);
+	}
 
 	private JFileChooser getConfigOpenSaveDialog(boolean save) {
Index: java/installer2/src/net/oni2/aeinstaller/gui/MainWin.yml
===================================================================
--- java/installer2/src/net/oni2/aeinstaller/gui/MainWin.yml	(revision 880)
+++ java/installer2/src/net/oni2/aeinstaller/gui/MainWin.yml	(revision 886)
@@ -14,4 +14,5 @@
     - Action(name=about, text=menu.about, toolTipText=menu.aboutTooltip, icon=img.about, onAction=[showAbout])
     - Action(name=help, text=menu.help, toolTipText=menu.helpTooltip, icon=img.help, onAction=[showHelp])
+    - Action(name=report, text=menu.report, toolTipText=menu.reportTooltip, icon=img.help, onAction=[showReport])
     - Action(name=runOniFull, text=menu.runOniFull, toolTipText=menu.runOniFullTooltip, icon=img.oni, onAction=[oniFull])
     - Action(name=runOniWin, text=menu.runOniWin, toolTipText=menu.runOniWinTooltip, icon=img.oni, onAction=[oniWin])
@@ -23,5 +24,5 @@
     - Action(name=reglobalize, text=menu.reglobalize, toolTipText=menu.reglobalizeTooltip, icon=img.refresh, onAction=[reglobalizeVerify,reglobalize])
     - 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])
+    - Action(name=update, text=menu.update, toolTipText=menu.updateTooltip, icon=img.update, onAction=[execDepotUpdate,checkCorePackages,infoCorePackages,checkUpdates,doUpdate,showNewPackages])
     - Action(name=corePackages, text=menu.corePackages, toolTipText=menu.corePackagesTooltip, icon=img.core, onAction=[showCorePackagesDialog])
     - JMenuBar:
@@ -29,4 +30,5 @@
             - JMenuItem(action=about)
             - JMenuItem(action=help)
+            - JMenuItem(action=report)
             - JMenuItem(action=settings)
             - JMenuItem(action=exitAction)
Index: java/installer2/src/net/oni2/aeinstaller/gui/reporter/ReporterDialog.java
===================================================================
--- java/installer2/src/net/oni2/aeinstaller/gui/reporter/ReporterDialog.java	(revision 886)
+++ java/installer2/src/net/oni2/aeinstaller/gui/reporter/ReporterDialog.java	(revision 886)
@@ -0,0 +1,254 @@
+package net.oni2.aeinstaller.gui.reporter;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Properties;
+import java.util.ResourceBundle;
+import java.util.regex.Pattern;
+
+import javax.activation.DataHandler;
+import javax.activation.DataSource;
+import javax.activation.FileDataSource;
+import javax.mail.AuthenticationFailedException;
+import javax.mail.Authenticator;
+import javax.mail.Message;
+import javax.mail.Message.RecipientType;
+import javax.mail.MessagingException;
+import javax.mail.Multipart;
+import javax.mail.PasswordAuthentication;
+import javax.mail.Session;
+import javax.mail.Transport;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+import javax.swing.AbstractAction;
+import javax.swing.JCheckBox;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+import javax.swing.KeyStroke;
+
+import net.oni2.aeinstaller.backend.LogPrintStream;
+import net.oni2.aeinstaller.backend.Paths;
+import net.oni2.aeinstaller.backend.StringDataSource;
+import net.oni2.resourcebundle.UTF8ResourceBundleLoader;
+import net.oni2.swingcomponents.HTMLLinkLabel;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.filefilter.IOFileFilter;
+import org.apache.commons.io.filefilter.NameFileFilter;
+import org.apache.commons.io.filefilter.NotFileFilter;
+import org.apache.commons.io.filefilter.TrueFileFilter;
+import org.javabuilders.BuildResult;
+import org.javabuilders.annotations.DoInBackground;
+import org.javabuilders.event.BackgroundEvent;
+import org.javabuilders.swing.SwingJavaBuilder;
+
+/**
+ * @author Christian Illy
+ */
+public class ReporterDialog extends JDialog {
+	private static final long serialVersionUID = -5719515325671846620L;
+
+	private ResourceBundle bundle = UTF8ResourceBundleLoader
+			.getBundle("net.oni2.aeinstaller.localization."
+					+ getClass().getSimpleName());
+	@SuppressWarnings("unused")
+	private BuildResult result = SwingJavaBuilder.build(this, bundle);
+
+	private HTMLLinkLabel lblInfo;
+	private HTMLLinkLabel lblFiles;
+	private JTextField txtMail;
+	private JTextArea txtMessage;
+	private JCheckBox chkGetCopy;
+
+	private final String SMTP_HOST_NAME = "mail.illy.bz";
+	private final String SMTP_AUTH_USER = "aei_reports@oni2.net";
+	private final String SMTP_AUTH_PWD = "mb0NkjHuWrDFfMDe2BkUDU2Dknkkvq";
+	private final String EMAIL_SUBJECT = "AE support request";
+	private final String EMAIL_TO = "ae-support@oni2.net";
+
+	/**
+	 * Open the settings
+	 */
+	public ReporterDialog() {
+		lblInfo.setText(bundle.getString("lblInfo"));
+		lblFiles.setText(bundle.getString("lblFiles"));
+
+		AbstractAction closeAction = new AbstractAction() {
+
+			private static final long serialVersionUID = 1L;
+
+			public void actionPerformed(ActionEvent arg0) {
+				dispose();
+			}
+		};
+		KeyStroke ksCtrlW = KeyStroke
+				.getKeyStroke('W', KeyEvent.CTRL_DOWN_MASK);
+		getRootPane()
+				.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
+				.put(ksCtrlW, "close");
+		getRootPane().getActionMap().put("close", closeAction);
+
+		setLocationRelativeTo(null);
+
+		initFields();
+	}
+
+	private void initFields() {
+	}
+
+	private class SMTPAuthenticator extends Authenticator {
+		public PasswordAuthentication getPasswordAuthentication() {
+			String username = SMTP_AUTH_USER;
+			String password = SMTP_AUTH_PWD;
+			return new PasswordAuthentication(username, password);
+		}
+	}
+
+	@DoInBackground(progressMessage = "send.title", cancelable = false, indeterminateProgress = true)
+	private boolean send(final BackgroundEvent evt) {
+		try {
+			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+			StringBuffer msgText = new StringBuffer();
+			msgText.append("Support request\nTime: " + sdf.format(new Date())
+					+ "\n");
+
+			// Set the host smtp address
+			Properties props = new Properties();
+			props.put("mail.smtp.host", SMTP_HOST_NAME);
+			props.put("mail.smtp.auth", "true");
+			Authenticator auth = new SMTPAuthenticator();
+			Session session = Session.getDefaultInstance(props, auth);
+
+			session.setDebug(false);
+
+			// create a message
+			Message msg = new MimeMessage(session);
+			msg.setFrom(new InternetAddress(txtMail.getText()));
+			msg.setRecipient(RecipientType.TO, new InternetAddress(EMAIL_TO));
+			if (chkGetCopy.isSelected())
+				msg.addRecipient(RecipientType.CC,
+						new InternetAddress(txtMail.getText()));
+			msg.setSubject(EMAIL_SUBJECT);
+
+			// Build multipart
+			Multipart multipart = new MimeMultipart();
+
+			// aei_output.log (live from string)
+			MimeBodyPart mimeBody = new MimeBodyPart();
+			DataSource source = new StringDataSource(LogPrintStream
+					.getInstance().getLog());
+			mimeBody.setDataHandler(new DataHandler(source));
+			mimeBody.setFileName("aei_output.log");
+			multipart.addBodyPart(mimeBody);
+
+			// updater_output.log
+			File f = new File(Paths.getInstallerPath(), "updater_output.log");
+			if (f.exists()) {
+				mimeBody = new MimeBodyPart();
+				source = new FileDataSource(f);
+				mimeBody.setDataHandler(new DataHandler(source));
+				mimeBody.setFileName("updater_output.log");
+				multipart.addBodyPart(mimeBody);
+			} else {
+				msgText.append("updater_output.log does not exist!\n");
+			}
+
+			// Initialization.log
+			f = new File(Paths.getInstallerPath(), "Initialization.log");
+			if (f.exists()) {
+				mimeBody = new MimeBodyPart();
+				source = new FileDataSource(f);
+				mimeBody.setDataHandler(new DataHandler(source));
+				mimeBody.setFileName("Initialization.log");
+				multipart.addBodyPart(mimeBody);
+			} else {
+				msgText.append("Initialization.log does not exist!\n");
+			}
+
+			// Installation.log
+			f = new File(Paths.getInstallerPath(), "Installation.log");
+			if (f.exists()) {
+				mimeBody = new MimeBodyPart();
+				source = new FileDataSource(f);
+				mimeBody.setDataHandler(new DataHandler(source));
+				mimeBody.setFileName("Installation.log");
+				multipart.addBodyPart(mimeBody);
+			} else {
+				msgText.append("Installation.log does not exist!\n");
+			}
+
+			// startup.txt
+			f = new File(Paths.getEditionBasePath(), "startup.txt");
+			if (f.exists()) {
+				mimeBody = new MimeBodyPart();
+				source = new FileDataSource(f);
+				mimeBody.setDataHandler(new DataHandler(source));
+				mimeBody.setFileName("startup.txt");
+				multipart.addBodyPart(mimeBody);
+			} else {
+				msgText.append("startup.txt does not exist!\n");
+			}
+
+			// debugger.txt
+			f = new File(Paths.getEditionBasePath(), "debugger.txt");
+			if (f.exists()) {
+				mimeBody = new MimeBodyPart();
+				source = new FileDataSource(f);
+				mimeBody.setDataHandler(new DataHandler(source));
+				mimeBody.setFileName("debugger.txt");
+				multipart.addBodyPart(mimeBody);
+			} else {
+				msgText.append("debugger.txt does not exist!\n");
+			}
+
+			// File list (live from string)
+			StringBuffer fileList = new StringBuffer();
+			int baseLength = Paths.getEditionBasePath().getAbsolutePath()
+					.length();
+			IOFileFilter svnDirFilter = new NameFileFilter(
+					new String[] { ".svn" });
+			IOFileFilter notFilter = new NotFileFilter(svnDirFilter);
+			Pattern packagePattern = Pattern.compile(
+					".*/packages/[0-9]{5}[^/]*/.+", Pattern.CASE_INSENSITIVE);
+			for (File flF : FileUtils.listFilesAndDirs(
+					Paths.getEditionBasePath(), TrueFileFilter.INSTANCE,
+					notFilter)) {
+				String name = flF.getAbsolutePath().substring(baseLength);
+				name = name.replace('\\', '/');
+				if (!packagePattern.matcher(name).matches())
+					fileList.append(name + "\n");
+			}
+
+			mimeBody = new MimeBodyPart();
+			source = new StringDataSource(fileList.toString());
+			mimeBody.setDataHandler(new DataHandler(source));
+			mimeBody.setFileName("filelist.txt");
+			multipart.addBodyPart(mimeBody);
+
+			// Build text part
+			msgText.append(txtMessage.getText());
+			mimeBody = new MimeBodyPart();
+			mimeBody.setText(msgText.toString());
+			multipart.addBodyPart(mimeBody, 0);
+
+			msg.setContent(multipart);
+
+			Transport.send(msg);
+
+			return true;
+		} catch (AuthenticationFailedException e) {
+			e.printStackTrace();
+		} catch (MessagingException e) {
+			e.printStackTrace();
+		}
+		return false;
+	}
+}
Index: java/installer2/src/net/oni2/aeinstaller/gui/reporter/ReporterDialog.yml
===================================================================
--- java/installer2/src/net/oni2/aeinstaller/gui/reporter/ReporterDialog.yml	(revision 886)
+++ java/installer2/src/net/oni2/aeinstaller/gui/reporter/ReporterDialog.yml	(revision 886)
@@ -0,0 +1,32 @@
+JDialog:
+  name: frame
+  title: frame.title
+  size: packed
+  locationRelativeTo: null
+  defaultCloseOperation: disposeOnClose
+  iconImage: img.ae
+  modalityType: applicationModal
+  minimumSize: 600x500
+  content:
+    - JButton(name=btnOk, text=btnOk, onAction=[$validate,send,dispose])
+    - JButton(name=btnCancel, text=btnCancel, onAction=[dispose])
+    - HTMLLinkLabel(name=lblInfo)
+    - JLabel(name=lblMail, text=lblMail)
+    - JTextField(name=txtMail)
+    - JLabel(name=lblMessage, text=lblMessage)
+    - JScrollPane(name=scrollMessage, vScrollBar=always, hScrollBar=asNeeded):
+        JTextArea(name=txtMessage)
+    - HTMLLinkLabel(name=lblFiles)
+    - JCheckBox(name=chkGetCopy, text=chkGetCopy)
+    - MigLayout: |
+         [min]                   [grow]
+         lblInfo+*                              [min]
+         lblMail                 txtMail        [min]
+         ^lblMessage             scrollMessage  [grow]
+         chkGetCopy+*                           [min]
+         lblFiles+*                             [min]
+         >btnOk+*=1,btnCancel=1                 [min]
+  
+validate:
+  - txtMail.text: {label: lblMail, email: true, mandatory: true}
+  - txtMessage.text: {label: lblMessage, mandatory: true, minLength: 20}
Index: java/installer2/src/net/oni2/aeinstaller/localization/MainWin.properties
===================================================================
--- java/installer2/src/net/oni2/aeinstaller/localization/MainWin.properties	(revision 880)
+++ java/installer2/src/net/oni2/aeinstaller/localization/MainWin.properties	(revision 886)
@@ -9,4 +9,6 @@
 menu.help=&Help
 menu.helpTooltip=Help
+menu.help=&Request help
+menu.helpTooltip=Request help including log files
 menu.exit=&Exit\tCtrl+Q
 menu.exitTooltip=Exit
Index: java/installer2/src/net/oni2/aeinstaller/localization/ReporterDialog.properties
===================================================================
--- java/installer2/src/net/oni2/aeinstaller/localization/ReporterDialog.properties	(revision 886)
+++ java/installer2/src/net/oni2/aeinstaller/localization/ReporterDialog.properties	(revision 886)
@@ -0,0 +1,16 @@
+frame.title=AE Installer: Request help
+btnOk=Send
+btnCancel=Cancel
+
+lblInfo=Request help with a problem by the AE support team. Please be as descriptive in the message as possible \
+(i.e. what exactly does not work as expected, what did you do up to this point) so \we can help you.
+lblMail=Your mail address:
+lblMessage=Message:
+chkGetCopy=Send a copy of the mail to you
+lblFiles=The following information will automatically be included with this mail:<ul>\
+<li>AEI's aei_output.log, updater_output.log, Initialization.log, Installation.log</li>\
+<li>Oni's startup.txt and debugger.txt</li>\
+<li>A list of all files below your AE/ folder</li>\
+</ul>None of this will include any personal data.
+ 
+send.title=Sending mail
