[546265] Provide support for command line arguments in the Windows
native executable

https://bugs.eclipse.org/bugs/show_bug.cgi?id=546265
diff --git a/plugins/org.eclipse.oomph.extractor.lib/META-INF/MANIFEST.MF b/plugins/org.eclipse.oomph.extractor.lib/META-INF/MANIFEST.MF
index e6181e7..d71f5df 100644
--- a/plugins/org.eclipse.oomph.extractor.lib/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.oomph.extractor.lib/META-INF/MANIFEST.MF
@@ -1,11 +1,11 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-SymbolicName: org.eclipse.oomph.extractor.lib
-Bundle-Version: 1.5.0.qualifier
+Bundle-Version: 1.6.0.qualifier
 Bundle-Localization: plugin
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-RequiredExecutionEnvironment: JRE-1.1
 Bundle-ClassPath: .
-Export-Package: org.eclipse.oomph.extractor.lib;version="1.5.0"
+Export-Package: org.eclipse.oomph.extractor.lib;version="1.6.0"
 Automatic-Module-Name: org.eclipse.oomph.extractor.lib
diff --git a/plugins/org.eclipse.oomph.extractor.lib/pom.xml b/plugins/org.eclipse.oomph.extractor.lib/pom.xml
index cd63b2e..1744649 100644
--- a/plugins/org.eclipse.oomph.extractor.lib/pom.xml
+++ b/plugins/org.eclipse.oomph.extractor.lib/pom.xml
@@ -20,7 +20,7 @@
   </parent>
   <groupId>org.eclipse.oomph</groupId>
   <artifactId>org.eclipse.oomph.extractor.lib</artifactId>
-  <version>1.5.0-SNAPSHOT</version>
+  <version>1.6.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 
 </project>
diff --git a/plugins/org.eclipse.oomph.extractor.lib/src/org/eclipse/oomph/extractor/lib/BINExtractor.java b/plugins/org.eclipse.oomph.extractor.lib/src/org/eclipse/oomph/extractor/lib/BINExtractor.java
index 443d208..e19923c 100644
--- a/plugins/org.eclipse.oomph.extractor.lib/src/org/eclipse/oomph/extractor/lib/BINExtractor.java
+++ b/plugins/org.eclipse.oomph.extractor.lib/src/org/eclipse/oomph/extractor/lib/BINExtractor.java
@@ -22,6 +22,7 @@
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
+import java.io.PrintStream;
 import java.io.Reader;
 import java.io.Writer;
 import java.util.Enumeration;
@@ -34,10 +35,15 @@
 {
   private static final String NL = System.getProperty("line.separator");
 
-  private static final String UTF_8 = "UTF-8";
+  private static final boolean DEBUG = "true".equals(System.getProperty("org.eclipse.oomph.extractor.lib.BINExtractor.log"));
 
   public static void main(String[] args) throws Exception
   {
+    if (args.length < 2)
+    {
+      exit();
+    }
+
     String executable = args[0];
     String targetFolder = args[1];
     String javaHome = null;
@@ -48,21 +54,45 @@
     File libdataFile = null;
     File descriptorFile = null;
     File zipFile = null;
+    File jreTarCabFile = null;
+    int extraArgs = args.length;
 
     if (args.length > 2)
     {
-      if ("-export".equals(args[2]))
+      String arg = args[2];
+      if ("-export".equals(arg))
       {
+        if (args.length < 7)
+        {
+          exit();
+        }
+
         export = true;
         markerFile = new File(args[3]);
         extractorFile = new File(args[4]);
         libdataFile = new File(args[5]);
         descriptorFile = new File(args[6]);
         zipFile = new File(targetFolder);
+        if (args.length > 7)
+        {
+          jreTarCabFile = new File(args[7]);
+        }
+        else
+        {
+          jreTarCabFile = new File(zipFile.getAbsoluteFile().getParentFile(), "jre.tar.cab");
+        }
+      }
+      else if ("--".equals(arg))
+      {
+        extraArgs = 3;
       }
       else
       {
-        javaHome = args[2];
+        javaHome = arg;
+        if (args.length > 3 && "--".equals(args[3]))
+        {
+          extraArgs = 4;
+        }
       }
     }
 
@@ -120,6 +150,12 @@
       {
         unzip(kmpStream, targetFolder);
       }
+
+      if (export && descriptor.getFormat() == 2)
+      {
+        kmpStream = new KMPInputStream(stream, pattern, failure);
+        copy(kmpStream, jreTarCabFile);
+      }
     }
     finally
     {
@@ -128,16 +164,74 @@
 
     if (!export)
     {
-      if (javaHome != null)
+      Vector vmArgs = null;
+      int vmArgStart = args.length;
+      int vmArgCount = 0;
+      for (int i = extraArgs; i < args.length; ++i)
       {
-        adjustIni(targetFolder + File.separator + descriptor.getIniPath(), javaHome);
+        String arg = args[i];
+        if ("-vmargs".equals(arg))
+        {
+          vmArgStart = i;
+          ++vmArgCount;
+          vmArgs = new Vector();
+        }
+        else if (vmArgs != null)
+        {
+          ++vmArgCount;
+          vmArgs.add(arg);
+        }
       }
 
+      PrintStream log = DEBUG ? new PrintStream(new File(targetFolder, "extractor.log"), "UTF-8") : null;
+      if (DEBUG)
+      {
+        for (int i = 0; i < args.length; ++i)
+        {
+          log.println("arg[" + i + "]='" + args[i] + "'");
+        }
+        log.println();
+
+        log.println("executable=" + executable);
+        log.println("targetFolder=" + targetFolder);
+        log.println("javaHome=" + javaHome);
+        log.println("vmArgs=" + vmArgs);
+        log.println();
+      }
+
+      if (javaHome != null || vmArgs != null && !vmArgs.isEmpty())
+      {
+        adjustIni(targetFolder + File.separator + descriptor.getIniPath(), javaHome, vmArgs);
+      }
+
+      String[] command = new String[args.length - extraArgs - vmArgCount + 1];
       String launcher = targetFolder + File.separator + descriptor.getLauncherPath();
-      Runtime.getRuntime().exec(launcher);
+      command[0] = launcher;
+      for (int i = extraArgs, j = 1; i < vmArgStart; ++i, ++j)
+      {
+        command[j] = args[i];
+      }
+
+      if (DEBUG)
+      {
+        for (int i = 0; i < command.length; ++i)
+        {
+          log.println("command[" + i + "]='" + command[i] + "'");
+        }
+
+        log.close();
+      }
+
+      Runtime.getRuntime().exec(command);
     }
   }
 
+  private static void exit()
+  {
+    System.out.println("Usage: <product>.exe <product.zip> -export <marker.txt> <extractor>.exe <extractor-lib>.jar <product-descriptor> [<jre.tar.cab>]");
+    System.exit(1);
+  }
+
   private static void copy(InputStream source, File targetFile) throws IOException
   {
     File parentFile = targetFile.getParentFile();
@@ -158,7 +252,7 @@
     }
   }
 
-  private static void adjustIni(String iniPath, String javaHome) throws IOException
+  private static void adjustIni(String iniPath, String javaHome, Vector vmArgs) throws IOException
   {
     File file = new File(iniPath);
     Vector lines = new Vector();
@@ -166,7 +260,7 @@
     if (file.exists())
     {
       InputStream in = new FileInputStream(file);
-      Reader reader = new InputStreamReader(in, UTF_8);
+      Reader reader = new InputStreamReader(in);
       BufferedReader bufferedReader = new BufferedReader(reader);
 
       String line;
@@ -180,32 +274,47 @@
       in.close();
     }
 
-    String value = getVMPath(javaHome);
-    String option = "-vm";
-    int optionIndex = lines.indexOf(option);
-
-    if (optionIndex != -1)
+    if (javaHome != null)
     {
-      lines.set(optionIndex + 1, value);
+      String value = getVMPath(javaHome);
+      String option = "-vm";
+      int optionIndex = lines.indexOf(option);
+
+      if (optionIndex != -1)
+      {
+        lines.set(optionIndex + 1, value);
+      }
+      else
+      {
+        int vmargsIndex = lines.indexOf("-vmargs");
+        if (vmargsIndex == -1)
+        {
+          vmargsIndex = lines.size();
+        }
+
+        lines.add(vmargsIndex, option);
+        lines.add(vmargsIndex + 1, value);
+      }
     }
-    else
+
+    if (vmArgs != null && !vmArgs.isEmpty())
     {
       int vmargsIndex = lines.indexOf("-vmargs");
       if (vmargsIndex == -1)
       {
+        lines.add("-vmargs");
         vmargsIndex = lines.size();
       }
 
-      lines.add(vmargsIndex, option);
-      lines.add(vmargsIndex + 1, value);
+      for (Enumeration it = vmArgs.elements(); it.hasMoreElements();)
+      {
+        lines.add(it.nextElement());
+      }
     }
 
-    // lines.add("-Xdebug");
-    // lines.add("-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8123");
-
     OutputStream out = new FileOutputStream(file);
 
-    Writer writer = new OutputStreamWriter(out, UTF_8);
+    Writer writer = new OutputStreamWriter(out);
     BufferedWriter bufferedWriter = new BufferedWriter(writer);
 
     for (Enumeration it = lines.elements(); it.hasMoreElements();)
@@ -226,6 +335,6 @@
       return new File(javaHome).getParent();
     }
 
-    return javaHome + File.separator + "bin";
+    return new File(javaHome, "bin").toString();
   }
 }
diff --git a/plugins/org.eclipse.oomph.extractor/.cproject b/plugins/org.eclipse.oomph.extractor/.cproject
index a0361b8..1253ce8 100644
--- a/plugins/org.eclipse.oomph.extractor/.cproject
+++ b/plugins/org.eclipse.oomph.extractor/.cproject
@@ -12,13 +12,13 @@
 				</extensions>
 			</storageModule>
 			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-				<configuration artifactName="extractor-64" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.exe.debug.674801650" name="Win64-Debug" parent="cdt.managedbuild.config.gnu.mingw.exe.debug" postbuildStep="..\Concat\concat.bat 64" prebuildStep="windres ../src/resources.rc -o ../Resources/resources.o">
+				<configuration artifactName="extractor-64" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.exe.debug.674801650" name="Win64-Debug" optionalBuildProperties="" parent="cdt.managedbuild.config.gnu.mingw.exe.debug" postbuildStep="     ..\Concat\repackage.bat 64     &amp;&amp;      ..\Concat\concat.bat 64     " prebuildStep="windres ../src/resources.rc -o ../Resources/resources.o">
 					<folderInfo id="cdt.managedbuild.config.gnu.mingw.exe.debug.674801650." name="/" resourcePath="">
 						<toolChain id="cdt.managedbuild.toolchain.gnu.mingw.exe.debug.654469412" name="MinGW GCC" resourceTypeBasedDiscovery="false" superClass="cdt.managedbuild.toolchain.gnu.mingw.exe.debug">
 							<targetPlatform id="cdt.managedbuild.target.gnu.platform.mingw.exe.debug.1054071445" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.mingw.exe.debug"/>
 							<builder buildPath="${workspace_loc:/org.eclipse.oomph.extractor}/Win64-Debug" enableAutoBuild="false" enableCleanBuild="true" enabledIncrementalBuild="true" id="cdt.managedbuild.tool.gnu.builder.mingw.base.230873755" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" superClass="cdt.managedbuild.tool.gnu.builder.mingw.base"/>
 							<tool id="cdt.managedbuild.tool.gnu.assembler.mingw.exe.debug.1373849291" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.exe.debug">
-								<option id="gnu.both.asm.option.include.paths.1235687244" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
+								<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.both.asm.option.include.paths.1235687244" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
 									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.oomph.jreinfo.lib}&quot;"/>
 								</option>
 								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1450580042" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
@@ -31,26 +31,26 @@
 							<tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.49045845" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug">
 								<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.mingw.exe.debug.option.optimization.level.765881170" name="Optimization Level" superClass="gnu.c.compiler.mingw.exe.debug.option.optimization.level" useByScannerDiscovery="false" valueType="enumerated"/>
 								<option id="gnu.c.compiler.mingw.exe.debug.option.debugging.level.74040717" name="Debug Level" superClass="gnu.c.compiler.mingw.exe.debug.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
-								<option id="gnu.c.compiler.option.dialect.std.382171319" name="Language standard" superClass="gnu.c.compiler.option.dialect.std" value="gnu.c.compiler.dialect.default" valueType="enumerated"/>
-								<option id="gnu.c.compiler.option.include.paths.938954516" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+								<option id="gnu.c.compiler.option.dialect.std.382171319" name="Language standard" superClass="gnu.c.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.c.compiler.dialect.default" valueType="enumerated"/>
+								<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.938954516" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
 									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.oomph.jreinfo.lib}&quot;"/>
 									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.oomph.jreinfo.lib/src}&quot;"/>
 								</option>
-								<option id="gnu.c.compiler.option.preprocessor.def.symbols.518684622" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols"/>
-								<option id="gnu.c.compiler.option.misc.other.1404040785" name="Other flags" superClass="gnu.c.compiler.option.misc.other" value="-c -fmessage-length=0" valueType="string"/>
+								<option id="gnu.c.compiler.option.preprocessor.def.symbols.518684622" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false"/>
+								<option id="gnu.c.compiler.option.misc.other.1404040785" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -fmessage-length=0" valueType="string"/>
 								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1657957449" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
 							</tool>
 							<tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.debug.1526528116" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.debug">
 								<option id="gnu.c.link.option.noshared.1110664043" name="No shared libraries (-static)" superClass="gnu.c.link.option.noshared" value="true" valueType="boolean"/>
-								<option id="gnu.c.link.option.libs.578848263" name="Libraries (-l)" superClass="gnu.c.link.option.libs" valueType="libs">
+								<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.libs.578848263" name="Libraries (-l)" superClass="gnu.c.link.option.libs" valueType="libs">
 									<listOptionValue builtIn="false" value="comdlg32"/>
 									<listOptionValue builtIn="false" value="ole32"/>
 									<listOptionValue builtIn="false" value="jreinfo"/>
 								</option>
-								<option id="gnu.c.link.option.paths.1691466706" name="Library search path (-L)" superClass="gnu.c.link.option.paths" valueType="libPaths">
+								<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.paths.1691466706" name="Library search path (-L)" superClass="gnu.c.link.option.paths" valueType="libPaths">
 									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.oomph.jreinfo.lib/Win64-Debug}&quot;"/>
 								</option>
-								<option id="gnu.c.link.option.userobjs.1393010624" name="Other objects" superClass="gnu.c.link.option.userobjs" valueType="userObjs">
+								<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.link.option.userobjs.1393010624" name="Other objects" superClass="gnu.c.link.option.userobjs" valueType="userObjs">
 									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.oomph.extractor}/Resources/resources.o&quot;"/>
 								</option>
 								<option id="gnu.c.link.option.ldflags.2109398673" name="Linker flags" superClass="gnu.c.link.option.ldflags" value="-Wl,--subsystem=windows" valueType="string"/>
@@ -151,167 +151,12 @@
 				</externalSettings>
 			</storageModule>
 		</cconfiguration>
-		<cconfiguration id="cdt.managedbuild.config.gnu.mingw.exe.release.182685664.960933766">
-			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.exe.release.182685664.960933766" moduleId="org.eclipse.cdt.core.settings" name="Win32">
-				<externalSettings/>
-				<extensions>
-					<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
-					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-				</extensions>
-			</storageModule>
-			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-				<configuration artifactName="extractor-32" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" errorParsers="org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GCCErrorParser" id="cdt.managedbuild.config.gnu.mingw.exe.release.182685664.960933766" name="Win32" parent="cdt.managedbuild.config.gnu.mingw.exe.release" postannouncebuildStep="" postbuildStep="..\Concat\concat.bat 32" preannouncebuildStep="" prebuildStep="windres ../src/resources.rc -o ../Resources/resources.o">
-					<folderInfo id="cdt.managedbuild.config.gnu.mingw.exe.release.182685664.960933766." name="/" resourcePath="">
-						<toolChain errorParsers="" id="cdt.managedbuild.toolchain.gnu.mingw.exe.release.1412967965" name="MinGW GCC" resourceTypeBasedDiscovery="false" superClass="cdt.managedbuild.toolchain.gnu.mingw.exe.release">
-							<targetPlatform binaryParser="org.eclipse.cdt.core.PE" id="cdt.managedbuild.target.gnu.platform.mingw.exe.release.2005321545" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.mingw.exe.release"/>
-							<builder buildPath="${workspace_loc:/org.eclipse.oomph.extractor}/Win32" enableCleanBuild="true" enabledIncrementalBuild="true" errorParsers="" id="cdt.managedbuild.tool.gnu.builder.mingw.base.1684583584" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" superClass="cdt.managedbuild.tool.gnu.builder.mingw.base"/>
-							<tool command="as" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="org.eclipse.cdt.core.GASErrorParser" id="cdt.managedbuild.tool.gnu.assembler.mingw.exe.release.884798246" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.exe.release">
-								<option id="gnu.both.asm.option.include.paths.979247673" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.oomph.jreinfo.lib}&quot;"/>
-								</option>
-								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1526566031" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.837471074" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.release.1160036168" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.release">
-								<option id="gnu.cpp.compiler.mingw.exe.release.option.optimization.level.1713924244" name="Optimization Level" superClass="gnu.cpp.compiler.mingw.exe.release.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
-								<option id="gnu.cpp.compiler.mingw.exe.release.option.debugging.level.2145536489" name="Debug Level" superClass="gnu.cpp.compiler.mingw.exe.release.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
-							</tool>
-							<tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="org.eclipse.cdt.core.GCCErrorParser" id="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release.976656469" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release">
-								<option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.mingw.exe.release.option.optimization.level.1296005399" name="Optimization Level" superClass="gnu.c.compiler.mingw.exe.release.option.optimization.level" useByScannerDiscovery="false" valueType="enumerated"/>
-								<option id="gnu.c.compiler.mingw.exe.release.option.debugging.level.1958140003" name="Debug Level" superClass="gnu.c.compiler.mingw.exe.release.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.none" valueType="enumerated"/>
-								<option id="gnu.c.compiler.option.include.paths.12989555" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.oomph.jreinfo.lib}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.oomph.jreinfo.lib/src}&quot;"/>
-								</option>
-								<option id="gnu.c.compiler.option.dialect.std.1514838888" name="Language standard" superClass="gnu.c.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.c.compiler.dialect.default" valueType="enumerated"/>
-								<option id="gnu.c.compiler.option.misc.other.1108388371" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -fmessage-length=0 -m32" valueType="string"/>
-								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.697319660" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
-							</tool>
-							<tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="org.eclipse.cdt.core.GLDErrorParser" id="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.release.1502024761" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.release">
-								<option id="gnu.c.link.option.libs.1040925904" name="Libraries (-l)" superClass="gnu.c.link.option.libs" valueType="libs">
-									<listOptionValue builtIn="false" value="comdlg32"/>
-									<listOptionValue builtIn="false" value="ole32"/>
-									<listOptionValue builtIn="false" value="jreinfo"/>
-								</option>
-								<option id="gnu.c.link.option.paths.90215399" name="Library search path (-L)" superClass="gnu.c.link.option.paths" valueType="libPaths">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.oomph.jreinfo.lib/Win32}&quot;"/>
-								</option>
-								<option id="gnu.c.link.option.userobjs.829132867" name="Other objects" superClass="gnu.c.link.option.userobjs" valueType="userObjs">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.oomph.extractor}/Resources/resources.o&quot;"/>
-								</option>
-								<option id="gnu.c.link.option.ldflags.2088188954" name="Linker flags" superClass="gnu.c.link.option.ldflags" value="-Wl,--subsystem=windows" valueType="string"/>
-								<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1129003382" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
-									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
-									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
-								</inputType>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.release.1605511383" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.release"/>
-						</toolChain>
-					</folderInfo>
-					<sourceEntries>
-						<entry excluding="src" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
-						<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
-					</sourceEntries>
-				</configuration>
-			</storageModule>
-			<storageModule moduleId="org.eclipse.cdt.core.externalSettings">
-				<externalSettings containerId="org.eclipse.oomph.jreinfo.lib;cdt.managedbuild.config.gnu.mingw.lib.release.167023565.507219945" factoryId="org.eclipse.cdt.core.cfg.export.settings.sipplier">
-					<externalSetting>
-						<entry flags="VALUE_WORKSPACE_PATH" kind="includePath" name="/org.eclipse.oomph.jreinfo.lib"/>
-						<entry flags="VALUE_WORKSPACE_PATH" kind="libraryPath" name="/org.eclipse.oomph.jreinfo.lib/Win32"/>
-						<entry flags="RESOLVED" kind="libraryFile" name="jreinfo" srcPrefixMapping="" srcRootPath=""/>
-					</externalSetting>
-				</externalSettings>
-			</storageModule>
-		</cconfiguration>
-		<cconfiguration id="cdt.managedbuild.config.gnu.mingw.exe.debug.674801650.1961411357">
-			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.exe.debug.674801650.1961411357" moduleId="org.eclipse.cdt.core.settings" name="Win32-Debug">
-				<externalSettings/>
-				<extensions>
-					<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
-					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-				</extensions>
-			</storageModule>
-			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-				<configuration artifactName="extractor-32" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.exe.debug.674801650.1961411357" name="Win32-Debug" parent="cdt.managedbuild.config.gnu.mingw.exe.debug" postbuildStep="..\Concat\concat.bat 32" prebuildStep="windres ../src/resources.rc -o ../Resources/resources.o">
-					<folderInfo id="cdt.managedbuild.config.gnu.mingw.exe.debug.674801650.1961411357." name="/" resourcePath="">
-						<toolChain id="cdt.managedbuild.toolchain.gnu.mingw.exe.debug.382464846" name="MinGW GCC" resourceTypeBasedDiscovery="false" superClass="cdt.managedbuild.toolchain.gnu.mingw.exe.debug">
-							<targetPlatform id="cdt.managedbuild.target.gnu.platform.mingw.exe.debug.1414087962" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.mingw.exe.debug"/>
-							<builder buildPath="${workspace_loc:/org.eclipse.oomph.extractor}/Win64-Debug" enableAutoBuild="false" enableCleanBuild="true" enabledIncrementalBuild="true" id="cdt.managedbuild.tool.gnu.builder.mingw.base.695184200" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" superClass="cdt.managedbuild.tool.gnu.builder.mingw.base"/>
-							<tool id="cdt.managedbuild.tool.gnu.assembler.mingw.exe.debug.2139506133" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.exe.debug">
-								<option id="gnu.both.asm.option.include.paths.375483294" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.oomph.jreinfo.lib}&quot;"/>
-								</option>
-								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1819146844" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.1282749182" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug.1604365869" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug">
-								<option id="gnu.cpp.compiler.mingw.exe.debug.option.optimization.level.1848597158" name="Optimization Level" superClass="gnu.cpp.compiler.mingw.exe.debug.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
-								<option id="gnu.cpp.compiler.mingw.exe.debug.option.debugging.level.1826815994" name="Debug Level" superClass="gnu.cpp.compiler.mingw.exe.debug.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.1462769764" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug">
-								<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.mingw.exe.debug.option.optimization.level.532561417" name="Optimization Level" superClass="gnu.c.compiler.mingw.exe.debug.option.optimization.level" useByScannerDiscovery="false" valueType="enumerated"/>
-								<option id="gnu.c.compiler.mingw.exe.debug.option.debugging.level.2046043580" name="Debug Level" superClass="gnu.c.compiler.mingw.exe.debug.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
-								<option id="gnu.c.compiler.option.dialect.std.486636145" name="Language standard" superClass="gnu.c.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.c.compiler.dialect.default" valueType="enumerated"/>
-								<option id="gnu.c.compiler.option.include.paths.328505000" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.oomph.jreinfo.lib}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.oomph.jreinfo.lib/src}&quot;"/>
-								</option>
-								<option id="gnu.c.compiler.option.preprocessor.def.symbols.279053993" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false"/>
-								<option id="gnu.c.compiler.option.misc.other.443059880" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -fmessage-length=0 -m32" valueType="string"/>
-								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1131138861" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
-							</tool>
-							<tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.debug.554578889" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.debug">
-								<option id="gnu.c.link.option.noshared.1826979144" name="No shared libraries (-static)" superClass="gnu.c.link.option.noshared" value="true" valueType="boolean"/>
-								<option id="gnu.c.link.option.libs.245514406" name="Libraries (-l)" superClass="gnu.c.link.option.libs" valueType="libs">
-									<listOptionValue builtIn="false" srcPrefixMapping="" srcRootPath="" value="jreinfo"/>
-									<listOptionValue builtIn="false" value="comdlg32"/>
-									<listOptionValue builtIn="false" value="ole32"/>
-								</option>
-								<option id="gnu.c.link.option.paths.20842583" name="Library search path (-L)" superClass="gnu.c.link.option.paths" valueType="libPaths">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.oomph.jreinfo.lib/Win32-Debug}&quot;"/>
-								</option>
-								<option id="gnu.c.link.option.userobjs.561806797" name="Other objects" superClass="gnu.c.link.option.userobjs" valueType="userObjs">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.oomph.extractor}/Resources/resources.o&quot;"/>
-								</option>
-								<option id="gnu.c.link.option.ldflags.988751910" name="Linker flags" superClass="gnu.c.link.option.ldflags" value="-Wl,--subsystem=windows" valueType="string"/>
-								<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.954372336" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
-									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
-									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
-								</inputType>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.debug.1974247945" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.debug"/>
-						</toolChain>
-					</folderInfo>
-					<sourceEntries>
-						<entry excluding="src" flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name=""/>
-						<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
-					</sourceEntries>
-				</configuration>
-			</storageModule>
-			<storageModule moduleId="org.eclipse.cdt.core.externalSettings">
-				<externalSettings containerId="org.eclipse.oomph.jreinfo.lib;cdt.managedbuild.config.gnu.mingw.lib.debug.1520985581.1551298586" factoryId="org.eclipse.cdt.core.cfg.export.settings.sipplier">
-					<externalSetting>
-						<entry flags="VALUE_WORKSPACE_PATH" kind="includePath" name="/org.eclipse.oomph.jreinfo.lib"/>
-						<entry flags="VALUE_WORKSPACE_PATH" kind="libraryPath" name="/org.eclipse.oomph.jreinfo.lib/Win32-Debug"/>
-						<entry flags="RESOLVED" kind="libraryFile" name="jreinfo" srcPrefixMapping="" srcRootPath=""/>
-					</externalSetting>
-				</externalSettings>
-			</storageModule>
-		</cconfiguration>
 	</storageModule>
 	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
 		<project id="org.eclipse.oomph.bootstrap.mingw.cdt.managedbuild.target.gnu.mingw.exe.619767119" name="Executable" projectType="cdt.managedbuild.target.gnu.mingw.exe"/>
 	</storageModule>
 	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
 	<storageModule moduleId="refreshScope" versionNumber="2">
-		<configuration configurationName="Win32">
-			<resource resourceType="PROJECT" workspacePath="/org.eclipse.oomph.extractor"/>
-		</configuration>
 		<configuration configurationName="Win64"/>
 		<configuration configurationName="Win64-Debug">
 			<resource resourceType="PROJECT" workspacePath="/org.eclipse.oomph.extractor"/>
diff --git a/plugins/org.eclipse.oomph.extractor/.gitignore b/plugins/org.eclipse.oomph.extractor/.gitignore
index 1bfff73..178b5f9 100644
--- a/plugins/org.eclipse.oomph.extractor/.gitignore
+++ b/plugins/org.eclipse.oomph.extractor/.gitignore
@@ -1,6 +1,4 @@
 /Libdata/
 /Resources/
-/Win32/
-/Win32-Debug/
 /Win64/
 /Win64-Debug/
diff --git a/plugins/org.eclipse.oomph.extractor/.settings/language.settings.xml b/plugins/org.eclipse.oomph.extractor/.settings/language.settings.xml
new file mode 100644
index 0000000..0b70b44
--- /dev/null
+++ b/plugins/org.eclipse.oomph.extractor/.settings/language.settings.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project>
+	<configuration id="cdt.managedbuild.config.gnu.mingw.exe.debug.674801650" name="Win64-Debug">
+		<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
+			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
+			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
+			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
+			<provider class="org.eclipse.cdt.managedbuilder.internal.language.settings.providers.GCCBuiltinSpecsDetectorMinGW" console="false" env-hash="-845865801771668038" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetectorMinGW" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings MinGW" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+				<language-scope id="org.eclipse.cdt.core.gcc"/>
+				<language-scope id="org.eclipse.cdt.core.g++"/>
+			</provider>
+		</extension>
+	</configuration>
+	<configuration id="cdt.managedbuild.config.gnu.mingw.exe.release.182685664" name="Win64">
+		<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
+			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
+			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
+			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
+			<provider class="org.eclipse.cdt.managedbuilder.internal.language.settings.providers.GCCBuiltinSpecsDetectorMinGW" console="false" env-hash="-310090825722575628" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetectorMinGW" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings MinGW" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+				<language-scope id="org.eclipse.cdt.core.gcc"/>
+				<language-scope id="org.eclipse.cdt.core.g++"/>
+			</provider>
+		</extension>
+	</configuration>
+	<configuration id="cdt.managedbuild.config.gnu.mingw.exe.release.182685664.960933766" name="Win32">
+		<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
+			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
+			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
+			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
+			<provider class="org.eclipse.cdt.managedbuilder.internal.language.settings.providers.GCCBuiltinSpecsDetectorMinGW" console="false" env-hash="-310090825722575628" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetectorMinGW" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings MinGW" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+				<language-scope id="org.eclipse.cdt.core.gcc"/>
+				<language-scope id="org.eclipse.cdt.core.g++"/>
+			</provider>
+		</extension>
+	</configuration>
+	<configuration id="cdt.managedbuild.config.gnu.mingw.exe.debug.674801650.1961411357" name="Win32-Debug">
+		<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
+			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
+			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
+			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
+			<provider class="org.eclipse.cdt.managedbuilder.internal.language.settings.providers.GCCBuiltinSpecsDetectorMinGW" console="false" env-hash="-845865801771668038" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetectorMinGW" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings MinGW" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+				<language-scope id="org.eclipse.cdt.core.gcc"/>
+				<language-scope id="org.eclipse.cdt.core.g++"/>
+			</provider>
+		</extension>
+	</configuration>
+</project>
diff --git a/plugins/org.eclipse.oomph.extractor/Concat/.gitignore b/plugins/org.eclipse.oomph.extractor/Concat/.gitignore
index 6abe939..148cd54 100644
--- a/plugins/org.eclipse.oomph.extractor/Concat/.gitignore
+++ b/plugins/org.eclipse.oomph.extractor/Concat/.gitignore
@@ -1 +1,3 @@
 /product/
+/jre.tar
+/jre.tar.cab
diff --git a/plugins/org.eclipse.oomph.extractor/Concat/concat.bat b/plugins/org.eclipse.oomph.extractor/Concat/concat.bat
index 3f778af..63bf53c 100644
--- a/plugins/org.eclipse.oomph.extractor/Concat/concat.bat
+++ b/plugins/org.eclipse.oomph.extractor/Concat/concat.bat
@@ -1,8 +1,26 @@
 @ECHO OFF
 
-IF NOT EXIST ..\Concat\descriptor-%1.txt EXIT
+ECHO "Composing eclipse-inst-%1.exe"
+
 IF NOT EXIST ..\Concat\product\product-%1.zip EXIT
 
+IF EXIST ..\Concat\jre.tar.cab (
+ECHO "Composing with JRE"
+IF NOT EXIST ..\Concat\descriptor-jre-%1.txt EXIT
+COPY /B extractor-%1.exe + ^
+  ..\marker.txt +  ^
+  ..\Libdata\libdata.jar + ^
+  ..\marker.txt +  ^
+  ..\Concat\descriptor-jre-%1.txt + ^
+  ..\marker.txt +  ^
+  ..\Concat\product\product-%1.zip + ^
+  ..\marker.txt  + ^
+  ..\Concat\jre.tar.cab + ^
+  ..\marker.txt ^
+  eclipse-inst-%1.exe
+) ELSE (
+ECHO "Composing without JRE"
+IF NOT EXIST ..\Concat\descriptor-%1.txt EXIT
 COPY /B extractor-%1.exe + ^
   ..\marker.txt +  ^
   ..\Libdata\libdata.jar + ^
@@ -10,5 +28,8 @@
   ..\Concat\descriptor-%1.txt + ^
   ..\marker.txt +  ^
   ..\Concat\product\product-%1.zip + ^
-  ..\marker.txt  ^
+  ..\marker.txt ^
   eclipse-inst-%1.exe
+)
+
+ECHO "Done"
diff --git a/plugins/org.eclipse.oomph.extractor/Concat/descriptor-jre-64.txt b/plugins/org.eclipse.oomph.extractor/Concat/descriptor-jre-64.txt
new file mode 100644
index 0000000..3c76d49
--- /dev/null
+++ b/plugins/org.eclipse.oomph.extractor/Concat/descriptor-jre-64.txt
@@ -0,0 +1,11 @@
+2
+1
+7
+0
+64
+0
+eclipse-inst.exe
+eclipse-inst.ini
+Eclipse Installer
+http://wiki.eclipse.org/Eclipse_Installer
+http://download.eclipse.org/oomph/jre/128x128.png
diff --git a/plugins/org.eclipse.oomph.extractor/Concat/make-jre-tar-cabinet.sh b/plugins/org.eclipse.oomph.extractor/Concat/make-jre-tar-cabinet.sh
new file mode 100644
index 0000000..56db4dc
--- /dev/null
+++ b/plugins/org.eclipse.oomph.extractor/Concat/make-jre-tar-cabinet.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+echo hello
+
+TARGET=$(pwd)
+echo $TARGET
+
+cd /c/Program\ Files/Java/jdk1.8.0_121
+tar -cf $TARGET/jre.tar jre
+cd -
+makecab jre.tar jre.tar.cab
diff --git a/plugins/org.eclipse.oomph.extractor/Concat/repackage.bat b/plugins/org.eclipse.oomph.extractor/Concat/repackage.bat
new file mode 100644
index 0000000..0f00494
--- /dev/null
+++ b/plugins/org.eclipse.oomph.extractor/Concat/repackage.bat
@@ -0,0 +1 @@
+"C:\Program Files\Git\bin\sh.exe" ..\Concat\repackage.sh %*
diff --git a/plugins/org.eclipse.oomph.extractor/Concat/repackage.sh b/plugins/org.eclipse.oomph.extractor/Concat/repackage.sh
new file mode 100644
index 0000000..090de3f
--- /dev/null
+++ b/plugins/org.eclipse.oomph.extractor/Concat/repackage.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+mkdir -p ../Libdata
+mkdir -p ../Concat/product
+cd ../../org.eclipse.oomph.extractor.lib/bin
+zip -r -9 -qq  ../../org.eclipse.oomph.extractor/Libdata/libdata.jar *
+cd -
+cp ../../../products/org.eclipse.oomph.setup.installer.product/target/products/*64.zip ../Concat/product/product-64.zip
\ No newline at end of file
diff --git a/plugins/org.eclipse.oomph.extractor/Get Libdata.launch b/plugins/org.eclipse.oomph.extractor/Get Libdata.launch
deleted file mode 100644
index 0389086..0000000
--- a/plugins/org.eclipse.oomph.extractor/Get Libdata.launch
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.ant.AntLaunchConfigurationType">
-<booleanAttribute key="org.eclipse.ant.ui.DEFAULT_VM_INSTALL" value="false"/>
-<stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${working_set:&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#13;&#10;&lt;resources&gt;&#13;&#10;&lt;item path=&quot;/org.eclipse.oomph.extractor&quot; type=&quot;4&quot;/&gt;&#13;&#10;&lt;/resources&gt;}"/>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/org.eclipse.oomph.extractor/get-libdata.ant"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.ant.ui.AntClasspathProvider"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.oomph.extractor"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.ant.ui.AntClasspathProvider"/>
-<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
-<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${workspace_loc:/org.eclipse.oomph.extractor/get-libdata.ant}"/>
-<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-Dextractor.project=${project_loc:/org.eclipse.oomph.extractor/get-libdata.ant}"/>
-<stringAttribute key="process_factory_id" value="org.eclipse.ant.ui.remoteAntProcessFactory"/>
-</launchConfiguration>
diff --git a/plugins/org.eclipse.oomph.extractor/get-libdata.ant b/plugins/org.eclipse.oomph.extractor/get-libdata.ant
deleted file mode 100644
index e2c06b6..0000000
--- a/plugins/org.eclipse.oomph.extractor/get-libdata.ant
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2015 Eike Stepper (Loehne, Germany) and others.
-  All rights reserved. This program and the accompanying materials
-  are made available under the terms of the Eclipse Public License v2.0
-  which accompanies this distribution, and is available at
-  http://www.eclipse.org/legal/epl-v20.html
-
-  Contributors:
-    Eike Stepper - initial API and implementation
--->
-<project name="get-libdata" default="install">
-
-	<target name="install">
-		<fail message="Specifiy -Dextractor.project=..." unless="extractor.project" />
-
-		<delete includeemptydirs="true" failonerror="false" verbose="false">
-			<fileset dir="${extractor.project}">
-				<include name="Libdata/**" />
-			</fileset>
-		</delete>
-
-		<p2.director metadatarepository="http://hudson.eclipse.org/oomph/job/integration/lastSuccessfulBuild/artifact/updates" artifactrepository="http://hudson.eclipse.org/oomph/job/integration/lastSuccessfulBuild/artifact/updates" destination="${extractor.project}/Libdata/tmp" profile="tmp" roaming="true">
-			<iu id="org.eclipse.oomph.extractor.lib" />
-		</p2.director>
-
-		<move tofile="${extractor.project}/Libdata/libdata.jar">
-			<fileset dir="${extractor.project}">
-				<include name="Libdata/tmp/plugins/*.jar" />
-			</fileset>
-		</move>
-
-		<delete includeemptydirs="true" failonerror="false" verbose="false">
-			<fileset dir="${extractor.project}">
-				<include name="Libdata/tmp/**" />
-			</fileset>
-		</delete>
-
-	</target>
-
-</project>
diff --git a/plugins/org.eclipse.oomph.extractor/src/extractor.c b/plugins/org.eclipse.oomph.extractor/src/extractor.c
index 97f5e17..acbbf31 100644
--- a/plugins/org.eclipse.oomph.extractor/src/extractor.c
+++ b/plugins/org.eclipse.oomph.extractor/src/extractor.c
@@ -19,7 +19,9 @@
 #include "extractor.h"
 #include "resources.h"
 
-static _TCHAR* lib = NULL;
+static char* lib = NULL;
+static char* cab = NULL;
+static BOOL debug = FALSE;
 
 // See https://de.wikipedia.org/wiki/DLL_Hijacking
 static void
@@ -34,30 +36,65 @@
   (CALLBACK*AddrSetDefaultDllDirectories) (DWORD);
 
   AddrSetDefaultDllDirectories addrSetDefaultDllDirectories = (AddrSetDefaultDllDirectories) //
-      GetProcAddress (GetModuleHandle (_T("kernel32.dll")), _T("SetDefaultDllDirectories"));
+      GetProcAddress (GetModuleHandle ("kernel32.dll"), "SetDefaultDllDirectories");
   if (addrSetDefaultDllDirectories)
   {
     addrSetDefaultDllDirectories (LOAD_LIBRARY_SEARCH_SYSTEM32);
   }
 }
 
-static _TCHAR*
-getTempFile (_TCHAR* prefix)
+static char*
+convertUTF16ToUTF8 (wchar_t* string)
 {
-  _TCHAR tempFolder[MAX_PATH];
+  // First compute the number of bytes needed to represent the UTF-16 string as UTF-8 characters, including room for the terminating null character.
+  int length = WideCharToMultiByte (CP_UTF8, 0, string, -1, NULL, 0, NULL, NULL) + 1;
+
+  // Allocate a buffer big enough to hold the result.
+  char *result = malloc (sizeof(char) * length);
+
+  // Do the actual conversion and return the result;
+  WideCharToMultiByte (CP_UTF8, 0, string, -1, result, length, NULL, NULL);
+
+  return result;
+}
+
+static wchar_t*
+convertUTF8ToUTF16 (char* string)
+{
+  // First compute the number of UTF-16 characters needed to represent the string's UTF-8 characters, including room for the terminating null character.
+  int length = MultiByteToWideChar (CP_UTF8, 0, string, -1, NULL, 0) + 1;
+
+  // Allocate a buffer big enough to hold the result.
+  wchar_t *result = malloc (sizeof(wchar_t) * length);
+
+  // Do the actual conversion and return the result;
+  MultiByteToWideChar (CP_UTF8, 0, string, -1, result, length);
+
+  return result;
+}
+
+static char*
+getTempFile (char* prefix, char* suffix)
+{
+  char tempFolder[MAX_PATH];
   DWORD dwRetVal = GetTempPath (MAX_PATH, tempFolder);
   if (dwRetVal == 0 || dwRetVal > MAX_PATH)
   {
     return NULL;
   }
 
-  _TCHAR tempFile[MAX_PATH];
+  char tempFile[MAX_PATH];
   if (GetTempFileName (tempFolder, prefix, 0, tempFile) == 0)
   {
     return NULL;
   }
 
-  return _tcsdup (tempFile);
+  char* result = malloc (strlen (tempFile) + strlen (suffix) + 2);
+  result[0] = 0;
+  strcat (result, tempFile);
+  strcat (result, suffix);
+
+  return result;
 }
 
 /****************************************************************************************
@@ -77,13 +114,13 @@
   return 0;
 }
 
-static _TCHAR*
+static char*
 browseForFolder (HWND hwndOwner, LPCTSTR lpszTitle)
 {
   CoInitialize (NULL);
 
-  _TCHAR* result = NULL;
-  TCHAR buffer[MAX_PATH];
+  char* result = NULL;
+  char buffer[MAX_PATH];
 
   BROWSEINFO browseInfo = { 0 };
   browseInfo.hwndOwner = hwndOwner;
@@ -98,7 +135,7 @@
   {
     if (SHGetPathFromIDList (itemIDList, buffer))
     {
-      result = _tcsdup (buffer);
+      result = strdup (buffer);
     }
 
     CoTaskMemFree (itemIDList);
@@ -108,10 +145,10 @@
   return result;
 }
 
-static _TCHAR*
+static char*
 browseForFile (HWND hwndOwner, LPCTSTR lpszTitle, LPCTSTR lpszFilter)
 {
-  _TCHAR szFile[MAX_PATH];
+  char szFile[MAX_PATH];
   szFile[0] = 0;
 
   OPENFILENAME ofn;
@@ -148,15 +185,15 @@
   int micro;
   int bitness;
   int jdk;
-  _TCHAR* launcherPath;
-  _TCHAR* iniPath;
-  _TCHAR* productName;
-  _TCHAR* productURI;
-  _TCHAR* imageURI;
+  char* launcherPath;
+  char* iniPath;
+  char* productName;
+  char* productURI;
+  char* imageURI;
 } REQ;
 
 static BOOL
-findDescriptor (_TCHAR* executable, REQ* req)
+findDescriptor (char* executable, REQ* req, BOOL ignoreCab)
 {
   marker[0] = 32;
   int size = sizeof(marker);
@@ -182,15 +219,19 @@
     ++i;
   }
 
-  FILE* file = fopen (executable, "rb");
+  wchar_t* wideExecutable = convertUTF8ToUTF16 (executable);
+  FILE* file = _wfopen (wideExecutable, L"rb");
+
   BOOL retcode = FALSE;
   byte b;
   long pos = 0;
   byte libdata[60000];
   int libdataSize = 0;
 
+  FILE *cabFile = NULL;
   int o;
-  for (o = 0; o < 2; ++o)
+  int markerLimit = 6;
+  for (o = 0; o < markerLimit; ++o)
   {
     int k = 0;
     for (;;)
@@ -204,6 +245,10 @@
       {
         libdata[libdataSize++] = b;
       }
+      else if (cabFile != NULL)
+      {
+        fwrite (&b, 1, 1, cabFile);
+      }
 
       while (k > 0 && marker[k] != b)
       {
@@ -220,61 +265,110 @@
         if (o == 0)
         {
           // We've found the marker that precedes libdata.jar. Skip...
+          if (debug)
+          {
+            printf ("Found marker\n");
+            fflush (stdout);
+          }
         }
         else if (o == 1)
         {
-          // Save the captured libdata.jar bytes to a temporary file.
-          lib = getTempFile (_T("ext"));
+          // We've found the libdata.jar. Skip...
+          if (debug)
+          {
+            printf ("Found libdata.jar\n");
+            fflush (stdout);
+          }
 
-          FILE *fp = fopen (lib, "wb");
+          // Save the captured libdata.jar bytes to a temporary file.
+          lib = getTempFile ("ext", ".jar");
+
+          FILE *fp = _wfopen (convertUTF8ToUTF16 (lib), L"wb");
           fwrite (libdata, libdataSize - size, 1, fp);
           fclose (fp);
 
           // Extract the product descriptor.
           int size = 2048;
-          _TCHAR buffer[size];
+          char buffer[size];
 
           fgets (buffer, size, file);
-          sscanf (buffer, _T("%d"), &req->format);
+          sscanf (buffer, "%d", &req->format);
+
+          if (req->format == 1 || ignoreCab)
+          {
+            markerLimit = 2;
+          }
 
           fgets (buffer, size, file);
-          sscanf (buffer, _T("%d"), &req->major);
+          sscanf (buffer, "%d", &req->major);
 
           fgets (buffer, size, file);
-          sscanf (buffer, _T("%d"), &req->minor);
+          sscanf (buffer, "%d", &req->minor);
 
           fgets (buffer, size, file);
-          sscanf (buffer, _T("%d"), &req->micro);
+          sscanf (buffer, "%d", &req->micro);
 
           fgets (buffer, size, file);
-          sscanf (buffer, _T("%d"), &req->bitness);
+          sscanf (buffer, "%d", &req->bitness);
 
           fgets (buffer, size, file);
-          sscanf (buffer, _T("%d"), &req->jdk);
+          sscanf (buffer, "%d", &req->jdk);
 
           fgets (buffer, size, file);
-          req->launcherPath = _tcsdup (_tcstok (buffer, _T("\n\r")));
+          req->launcherPath = strdup (strtok (buffer, "\n\r"));
 
           fgets (buffer, size, file);
-          req->iniPath = _tcsdup (_tcstok (buffer, _T("\n\r")));
+          req->iniPath = strdup (strtok (buffer, "\n\r"));
 
           fgets (buffer, size, file);
-          req->productName = _tcsdup (_tcstok (buffer, _T("\n\r")));
+          req->productName = strdup (strtok (buffer, "\n\r"));
 
           fgets (buffer, size, file);
-          req->productURI = _tcsdup (_tcstok (buffer, _T("\n\r")));
+          req->productURI = strdup (strtok (buffer, "\n\r"));
 
           fgets (buffer, size, file);
-          req->imageURI = _tcsdup (_tcstok (buffer, _T("\n\r")));
+          req->imageURI = strdup (strtok (buffer, "\n\r"));
 
           retcode = TRUE;
         }
+        else if (o == 2)
+        {
+          // We've found the preceding libdata.jar. Skip...
+          if (debug)
+          {
+            printf ("Finished libdata.jar\n");
+            fflush (stdout);
+          }
+        }
+        else if (o == 3)
+        {
+          if (debug)
+          {
+            printf ("Found start of cab\n");
+            fflush (stdout);
+          }
+          cab = getTempFile ("jre", ".cab");
+          cabFile = _wfopen (convertUTF8ToUTF16 (cab), L"wb");
+        }
+        else if (o == 4)
+        {
+          if (debug)
+          {
+            printf ("Found end of cab\n");
+            fflush (stdout);
+          }
 
-        break;
-      }
+          fclose (cabFile);
+        }
+        else
+        {
+          if (debug)
+          {
+            printf ("Found %d\n", o);
+            fflush (stdout);
+          }
+        }
 
-      if (retcode)
-      {
         break;
       }
 
@@ -286,43 +380,31 @@
   return retcode;
 }
 
-/****************************************************************************************
- * Java Library Management
- ***************************************************************************************/
-
 static BOOL
-execLib (_TCHAR* javaHome, _TCHAR* className, _TCHAR* args)
+execCommand (char *cmdline)
 {
+  if (debug)
+  {
+    printf ("Executing: %s\n", cmdline);
+    fflush (stdout);
+  }
+
   BOOL result = FALSE;
 
-  _TCHAR cmdline[2 * MAX_PATH];
-
-  _TCHAR* lastDot = strrchr (javaHome, '.');
-  if (lastDot != NULL && strcmp (lastDot, _T(".exe")) == 0)
-  {
-    if (snprintf (cmdline, sizeof(cmdline), _T("\"%s\" -cp \"%s\" %s %s"), javaHome, lib, className, args) >= sizeof(cmdline))
-    {
-      return FALSE;
-    }
-  }
-  else
-  {
-    if (snprintf (cmdline, sizeof(cmdline), _T("\"%s\\bin\\javaw\" -cp \"%s\" %s %s"), javaHome, lib, className, args) >= sizeof(cmdline))
-    {
-      return FALSE;
-    }
-  }
-
-  STARTUPINFO si;
+  STARTUPINFOW si;
   PROCESS_INFORMATION pi;
 
   ZeroMemory(&si, sizeof(si) );
   si.cb = sizeof(si);
+  si.dwFlags = STARTF_USESHOWWINDOW;
+  si.wShowWindow = SW_HIDE;
+
   ZeroMemory(&pi, sizeof(pi) );
 
-  // Start the child process.
-  if (!CreateProcess (NULL,   // No module name (use command line)
-      cmdline,        // Command line
+  // Start the child process using the UTF-16 command line.
+  wchar_t* wideCommandLine = convertUTF8ToUTF16 (cmdline);
+  if (!CreateProcessW (NULL,   // No module name (use command line)
+      wideCommandLine,        // Command line
       NULL,           // Process handle not inheritable
       NULL,           // Thread handle not inheritable
       FALSE,          // Set handle inheritance to FALSE
@@ -339,7 +421,7 @@
   WaitForSingleObject (pi.hProcess, INFINITE);
 
   DWORD exitCode;
-  if (FALSE != GetExitCodeProcess (pi.hProcess, &exitCode))
+  if (GetExitCodeProcess (pi.hProcess, &exitCode) != FALSE)
   {
     result = exitCode == 0;
   }
@@ -348,15 +430,62 @@
   CloseHandle (pi.hProcess);
   CloseHandle (pi.hThread);
 
-  //  exitCode = system (cmdline);
-  //  result = exitCode == 0;
-
-  //  exitCode = WinExec (cmdline, SW_HIDE);
-  //  result= exitCode > 31;
+  free (wideCommandLine);
 
   return result;
 }
 
+/****************************************************************************************
+ * Java Library Management
+ ***************************************************************************************/
+
+static BOOL
+execLib (char* javaHome, char *vmargs, char* className, char* args)
+{
+  size_t cmdlineSize = sizeof(char) * (strlen (javaHome) + (vmargs == NULL ? 0 : strlen (vmargs)) + strlen (className) + strlen (args) + MAX_PATH);
+
+  char* cmdline = malloc (cmdlineSize);
+
+  char* lastDot = strrchr (javaHome, '.');
+  if (lastDot != NULL && strcmp (lastDot, ".exe") == 0)
+  {
+    if (vmargs == NULL)
+    {
+      if (snprintf (cmdline, cmdlineSize, "\"%s\" -cp \"%s\" %s %s", javaHome, lib, className, args) >= cmdlineSize)
+      {
+        return FALSE;
+      }
+    }
+    else
+    {
+      if (snprintf (cmdline, cmdlineSize, "\"%s\" %s -cp \"%s\" %s %s", javaHome, vmargs, lib, className, args) >= cmdlineSize)
+      {
+        return FALSE;
+      }
+
+    }
+  }
+  else
+  {
+    if (vmargs == NULL)
+    {
+      if (snprintf (cmdline, cmdlineSize, "\"%s\\bin\\javaw\" -cp \"%s\" %s %s", javaHome, lib, className, args) >= cmdlineSize)
+      {
+        return FALSE;
+      }
+    }
+    else
+    {
+      if (snprintf (cmdline, cmdlineSize, "\"%s\\bin\\javaw\" %s -cp \"%s\" %s %s", javaHome, vmargs, lib, className, args) >= cmdlineSize)
+      {
+        return FALSE;
+      }
+    }
+  }
+
+  return execCommand (cmdline);
+}
+
 static BOOL
 validateJRE (JRE* jre, REQ* req)
 {
@@ -365,43 +494,44 @@
     return FALSE;
   }
 
-  _TCHAR args[4 * 12];
-  if (snprintf (args, sizeof(args), _T("%d %d %d %d"), req->major, req->minor, req->micro, req->bitness) >= sizeof(args))
+  char args[4 * 12];
+  if (snprintf (args, sizeof(args), "%d %d %d %d", req->major, req->minor, req->micro, req->bitness) >= sizeof(args))
   {
     return FALSE;
   }
 
-  return execLib (jre->javaHome, _T("org.eclipse.oomph.extractor.lib.JREValidator"), args);
+  return execLib (jre->javaHome, NULL, "org.eclipse.oomph.extractor.lib.JREValidator", args);
 }
 
 static BOOL
-extractProduct (JRE* jre, JRE* argJRE, _TCHAR* executable, _TCHAR* targetFolder)
+extractProduct (JRE* jre, JRE* argJRE, char* vmargs, char* executable, char* targetFolder, char* productCommandLineArguments)
 {
-  _TCHAR args[MAX_PATH];
+  size_t size = sizeof(char) * (MAX_PATH + strlen (productCommandLineArguments));
+  char* args = malloc (size);
 
   if (argJRE == NULL)
   {
-    if (snprintf (args, sizeof(args), _T("\"%s\" \"%s\""), executable, targetFolder) >= sizeof(args))
+    if (snprintf (args, size, "\"%s\" \"%s\" -- %s", executable, targetFolder, productCommandLineArguments) >= size)
     {
       return FALSE;
     }
   }
   else
   {
-    if (snprintf (args, sizeof(args), _T("\"%s\" \"%s\" \"%s\""), executable, targetFolder, argJRE->javaHome) >= sizeof(args))
+    if (snprintf (args, size, "\"%s\" \"%s\" \"%s\" -- %s", executable, targetFolder, argJRE->javaHome, productCommandLineArguments) >= size)
     {
       return FALSE;
     }
   }
 
-  return execLib (jre->javaHome, _T("org.eclipse.oomph.extractor.lib.BINExtractor"), args);
+  return execLib (jre->javaHome, vmargs, "org.eclipse.oomph.extractor.lib.BINExtractor", args);
 }
 
-static _TCHAR*
-getVM (_TCHAR* path)
+static char*
+getVM (char* path)
 {
-  _TCHAR vm[MAX_PATH];
-  if (snprintf (vm, sizeof(vm), _T("%s\\javaw.exe"), path) >= sizeof(vm))
+  char vm[MAX_PATH];
+  if (snprintf (vm, sizeof(vm), "%s\\javaw.exe", path) >= sizeof(vm))
   {
     return NULL;
   }
@@ -420,13 +550,13 @@
 {
   JRE* jres = findAllJREs ();
 
-  _TCHAR path[32000] = _T("");
-  if (GetEnvironmentVariable (_T("PATH"), path, sizeof(path)) != 0)
+  char path[32000] = "";
+  if (GetEnvironmentVariable ("PATH", path, sizeof(path)) != 0)
   {
-    _TCHAR* token = strtok (path, _T(";"));
+    char* token = strtok (path, ";");
     while (token != NULL)
     {
-      _TCHAR* vm = getVM (token);
+      char* vm = getVM (token);
       if (vm != NULL)
       {
         JRE* jre = malloc (sizeof(JRE));
@@ -444,7 +574,7 @@
         }
       }
 
-      token = strtok (NULL, _T(";"));
+      token = strtok (NULL, ";");
     }
 
     if (*defaultJRE != NULL)
@@ -457,58 +587,525 @@
   return jres;
 }
 
-/****************************************************************************************
- * Main Entry Point
- ***************************************************************************************/
-
-int
-main (int argc, char *argv[])
+static char*
+getProductCommandLineArguments (int argc, char*argv[])
 {
-  protectAgainstDLLHijacking ();
-
-  BOOL validateJREs = TRUE;
-  if (argc > 1)
+  // Compute the length of the result.
+  // Each argument will be surrounded by quotes and separated by a space, so include room for these three additional characters.
+  // Also include room for the terminating null character.
+  int length = 1;
+  int i = 0;
+  while (++i < argc)
   {
-    _TCHAR* option = argv[1];
-    if (_tcscmp (option, _T("-web")) == 0)
+    char * arg = argv[i];
+    length += strlen (arg) + 3;
+  }
+
+  // Allocate the result and initialize the bytes.
+  char* result = malloc (sizeof(char) * length);
+  memset (result, 0, sizeof(char) * length);
+
+  // Compose the arguments.
+  i = 0;
+  while (++i < argc)
+  {
+    if (i == 1 && strcmp ("-vm", argv[i]) == 0)
     {
-      validateJREs = FALSE;
+      // Ignore the VM argument and the value that follows.
+      ++i;
+    }
+    else
+    {
+      if (strlen (result) == 0)
+      {
+        strncat (result, "\"", length);
+      }
+      else
+      {
+        strncat (result, " \"", length);
+      }
+      strncat (result, argv[i], length);
+      strncat (result, "\"", length);
     }
   }
 
-  _TCHAR* executable = argv[0];
+  return result;
+}
+
+static int
+getArgv (char** argv[])
+{
+  // On Windows, the value of main's argv is not UTF-8 encoded but rather is using the system encoding, e.g., Latin-1.
+  // So we'd best get the raw Windows command line via Windows APIs, which uses a UTF-16 encoding.
+
+  // Get the command line using Windows API.
+  LPWSTR commandLineW = GetCommandLineW ();
+
+  // Split the command line into wide character (UTF-16) arguments.
+  int utf16Argc;
+  LPWSTR *utf16Argv = CommandLineToArgvW (commandLineW, &utf16Argc);
+
+  char** utf8Argv = malloc (sizeof(char*) * utf16Argc);
+
+  int i = -1;
+  while (++i < utf16Argc)
+  {
+    LPWSTR utf16Arg = utf16Argv[i];
+    utf8Argv[i] = convertUTF16ToUTF8 (utf16Arg);
+  }
+
+  *argv = utf8Argv;
+  return utf16Argc;
+}
+
+/****************************************************************************************
+ * Untar
+ ***************************************************************************************/
+
+/* Parse an octal number, ignoring leading and trailing nonsense. */
+static int
+parseoct (const char *p, size_t n)
+{
+  int i = 0;
+
+  while (*p < '0' || *p > '7')
+  {
+    ++p;
+    --n;
+  }
+  while (*p >= '0' && *p <= '7' && n > 0)
+  {
+    i *= 8;
+    i += *p - '0';
+    ++p;
+    --n;
+  }
+  return (i);
+}
+
+/* Returns true if this is 512 zero bytes. */
+static int
+is_end_of_archive (const char *p)
+{
+  int n;
+  for (n = 511; n >= 0; --n)
+    if (p[n] != '\0')
+      return (0);
+  return (1);
+}
+
+static char*
+getAbsolutePath (char* pathname, char* targetDir)
+{
+  size_t size = strlen (pathname) + strlen (targetDir) + 3;
+  char * result = malloc (sizeof(char) * size);
+  result[0] = 0;
+  strcat (result, targetDir);
+  strcat (result, pathname);
+  char*p = result;
+  while (*p != 0)
+  {
+    if (*p == '/')
+    {
+      *p = '\\';
+    }
+    ++p;
+  }
+
+  return result;
+}
+
+/* Create a directory, including parent directories as necessary. */
+static void
+create_dir (char *pathname, char *targetDir)
+{
+  char *p;
+  int r;
+
+  /* Strip trailing '/' */
+  if (pathname[strlen (pathname) - 1] == '/')
+  {
+    pathname[strlen (pathname) - 1] = '\0';
+  }
+
+  char* path = getAbsolutePath (pathname, targetDir);
+
+  /* Try creating the directory. */
+  r = mkdir (path);
+
+  if (r != 0)
+  {
+    /* On failure, try creating parent directory. */
+    p = strrchr (pathname, '/');
+    if (p != NULL)
+    {
+      *p = '\0';
+      create_dir (pathname, targetDir);
+      *p = '/';
+      r = mkdir (path);
+    }
+  }
+  if (r != 0)
+  {
+    fprintf (stderr, "Could not create directory %s\n", path);
+    fflush (stderr);
+  }
+}
+
+/* Create a file, including parent directory as necessary. */
+static FILE *
+create_file (char *pathname, char * targetDir)
+{
+  FILE *f;
+
+  char* path = getAbsolutePath (pathname, targetDir);
+  f = fopen (path, "wb");
+  if (f == NULL)
+  {
+    /* Try creating parent dir and then creating file. */
+    char *p = strrchr (pathname, '/');
+    if (p != NULL)
+    {
+      *p = '\0';
+      create_dir (pathname, targetDir);
+      *p = '/';
+      f = fopen (path, "wb");
+    }
+  }
+  return f;
+}
+
+/* Verify the tar checksum. */
+static int
+verify_checksum (const char *p)
+{
+  int n, u = 0;
+  for (n = 0; n < 512; ++n)
+  {
+    if (n < 148 || n > 155)
+      /* Standard tar checksum adds unsigned bytes. */
+      u += ((unsigned char *) p)[n];
+    else
+      u += 0x20;
+
+  }
+  return (u == parseoct (p + 148, 8));
+}
+
+/* Extract a tar archive. */
+static void
+untar (FILE *a, char *path, char* targetDir)
+{
+  char buff[512];
+  FILE *f = NULL;
+  size_t bytes_read;
+  int filesize;
+
+  if (debug)
+  {
+    printf ("Extracting from %s to %s\n", path, targetDir);
+    fflush (stdout);
+  }
+
+  for (;;)
+  {
+    bytes_read = fread (buff, 1, 512, a);
+    if (bytes_read < 512)
+    {
+      fprintf (stderr, "Short read on %s: expected 512, got %lu\n", path, (unsigned long) bytes_read);
+      fflush (stderr);
+      return;
+    }
+
+    if (is_end_of_archive (buff))
+    {
+      if (debug)
+      {
+        printf ("End of %s\n", path);
+        fflush (stdout);
+      }
+
+      return;
+    }
+    if (!verify_checksum (buff))
+    {
+      fprintf (stderr, "Checksum failure\n");
+      fflush (stderr);
+      return;
+    }
+    filesize = parseoct (buff + 124, 12);
+    switch (buff[156])
+    {
+      case '1':
+        if (debug)
+        {
+          printf (" Ignoring hardlink %s\n", buff);
+          fflush (stdout);
+        }
+        break;
+      case '2':
+        if (debug)
+        {
+          printf (" Ignoring symlink %s\n", buff);
+          fflush (stdout);
+        }
+        break;
+      case '3':
+        if (debug)
+        {
+          printf (" Ignoring character device %s\n", buff);
+          fflush (stdout);
+        }
+        break;
+      case '4':
+        if (debug)
+        {
+          printf (" Ignoring block device %s\n", buff);
+          fflush (stdout);
+        }
+        break;
+      case '5':
+        if (debug)
+        {
+          printf (" Extracting dir %s\n", buff);
+          fflush (stdout);
+        }
+
+        create_dir (buff, targetDir);
+        filesize = 0;
+        break;
+      case '6':
+        if (debug)
+        {
+          printf (" Ignoring FIFO %s\n", buff);
+          fflush (stdout);
+        }
+        break;
+      default:
+        if (debug)
+        {
+          printf (" Extracting file %s\n", buff);
+          fflush (stdout);
+        }
+        f = create_file (buff, targetDir);
+        break;
+    }
+    while (filesize > 0)
+    {
+      bytes_read = fread (buff, 1, 512, a);
+      if (bytes_read < 512)
+      {
+        fprintf (stderr, "Short read on %s: Expected 512, got %lu\n", path, (unsigned long) bytes_read);
+        fflush (stderr);
+        return;
+      }
+      if (filesize < 512)
+        bytes_read = filesize;
+      if (f != NULL)
+      {
+        if (fwrite (buff, 1, bytes_read, f) != bytes_read)
+        {
+          fprintf (stderr, "Failed write\n");
+          fflush (stderr);
+          fclose (f);
+          f = NULL;
+        }
+      }
+      filesize -= bytes_read;
+    }
+    if (f != NULL)
+    {
+      fclose (f);
+      f = NULL;
+    }
+  }
+}
+
+static BOOL
+extractTar (char * tarFile, char *targetDir, BOOL createRoot)
+{
+  char root[2];
+  root[0] = '/';
+  root[1] = 0;
+
+  if (createRoot)
+  {
+    create_dir (root, targetDir);
+  }
+
+  FILE *a = fopen (tarFile, "rb");
+  if (a == NULL)
+  {
+    fprintf (stderr, "Unable to open %s\n", tarFile);
+    fflush (stderr);
+    return 1;
+  }
+  else
+  {
+    untar (a, tarFile, targetDir);
+    fclose (a);
+    return 0;
+  }
+}
+
+/****************************************************************************************
+ * Main Entry Point
+ *
+ * On Windows the argv for the standard main function is not UTF-8 encoded rather is encoded using the system encoding, e.g., Latin-1.
+ * So it's best to use getArgv to convert the UTF-16 command line arguments to UTF-8.
+ ***************************************************************************************/
+
+int
+main (int argcIgnored, char** argvIngored)
+{
+  protectAgainstDLLHijacking ();
+
+  char** argv;
+  int argc = getArgv (&argv);
+
+  if (argc > 1 && strcmp (argv[1], "--debug") == 0)
+  {
+    debug = TRUE;
+
+    // Shift the args to remove this one.
+    --argc;
+    {
+      int i;
+      for (i = 1; i < argc; ++i)
+      {
+        argv[i] = argv[i + 1];
+      }
+    }
+  }
+
+  BOOL validateJREs = TRUE;
+  char* explicitJRE = NULL;
+  if (argc > 1)
+  {
+    char* option = argv[1];
+    if (strcmp (option, "-web") == 0)
+    {
+      validateJREs = FALSE;
+    }
+    else if (strcmp (option, "-vm") == 0 && argc > 2)
+    {
+      explicitJRE = argv[2];
+    }
+  }
+
+  char* executable = argv[0];
   REQ req;
 
-  if (!findDescriptor (executable, &req))
+  if (!findDescriptor (executable, &req, explicitJRE != NULL))
   {
-    printf (_T("No product descriptor\n"));
+    fprintf (stderr, "No product descriptor\n");
+    fflush (stderr);
     return EXIT_FAILURE_PRODUCT_DESCRIPTION;
   }
 
+  char sysdir[MAX_PATH];
+  if (!GetSystemDirectory (sysdir, sizeof(sysdir)))
+  {
+    return EXIT_FAILURE_SYSTEM_DIRECTORY;
+  }
+
+  char * tarFile = NULL;
+  if (cab != NULL && validateJREs)
+  {
+    if (debug)
+    {
+      printf ("CabFile in %s\n", cab);
+      fflush (stdout);
+    }
+
+    char * targetFolder = malloc (strlen (cab) + 10);
+    targetFolder[0] = 0;
+    strcat (targetFolder, cab);
+    strcat (targetFolder, ".jre");
+
+    char root[2];
+    root[0] = '/';
+    root[1] = 0;
+    create_dir (root, targetFolder);
+
+    if (debug)
+    {
+      printf ("targetFolder=%s\n", targetFolder);
+      fflush (stdout);
+    }
+
+    char expand[4 * MAX_PATH];
+    if (snprintf (expand, sizeof(expand), "\"%s\\expand.exe\" -r \"%s\" \"%s\"", sysdir, cab, targetFolder) >= sizeof(expand))
+    {
+      return EXIT_FAILURE_BUFFER_OVERFLOW;
+    }
+
+    execCommand (expand);
+
+    tarFile = malloc (strlen (targetFolder) + 30);
+    tarFile[0] = 0;
+    strcat (tarFile, targetFolder);
+    strcat (tarFile, "\\jre.tar");
+    strcat (targetFolder, "\\");
+    extractTar (tarFile, targetFolder, FALSE);
+    explicitJRE = malloc (strlen (targetFolder) + 30);
+    explicitJRE[0] = 0;
+    strcat (explicitJRE, targetFolder);
+    strcat (explicitJRE, "\\jre");
+  }
+
   if (validateJREs)
   {
     JRE* defaultJRE = NULL;
-    JRE* jre = findAllJREsAndVMs (&defaultJRE);
+    JRE* jre = NULL;
+    JRE* validatedJRE = NULL;
 
-    if (jre == NULL)
+    if (explicitJRE != NULL)
     {
-      _TCHAR message[400];
-      if (snprintf (message, sizeof(message),
-                    _T("The required %d-bit Java %d.%d.%d virtual machine could not be found.\nDo you want to browse your system for it?"), req.bitness,
-                    req.major, req.minor, req.micro) >= sizeof(message))
-      {
-        return EXIT_FAILURE_BUFFER_OVERFLOW;
-      }
+      jre = malloc (sizeof(JRE));
+      jre->javaHome = explicitJRE;
+      jre->jdk = 0;
+      jre->next = NULL;
 
-      if (MessageBox (NULL, message, _T("Eclipse Installer"), MB_YESNO | MB_ICONQUESTION) == IDYES)
+      if (!validateJRE (jre, &req))
       {
-        _TCHAR label[100];
-        if (snprintf (label, sizeof(label), _T("Select a %d-Bit Java %d.%d.%d Virtual Machine"), req.bitness, req.major, req.minor, req.micro) >= sizeof(label))
+        char message[400 + MAX_PATH];
+        if (snprintf (message, sizeof(message), "The required %d-bit Java %d.%d.%d virtual machine could not be found at the following location: '%s'",
+                      req.bitness, req.major, req.minor, req.micro, explicitJRE) >= sizeof(message))
         {
           return EXIT_FAILURE_BUFFER_OVERFLOW;
         }
 
-        _TCHAR* vm = browseForFile (NULL, label, _T("javaw.exe\0javaw.exe\0\0"));
+        MessageBox (NULL, message, "Eclipse Installer", MB_OK | MB_ICONERROR);
+        return EXIT_CANCEL;
+      }
+
+      validatedJRE = jre;
+    }
+    else
+    {
+      jre = findAllJREsAndVMs (&defaultJRE);
+    }
+
+    if (jre == NULL)
+    {
+      char message[400];
+      if (snprintf (message, sizeof(message),
+                    "The required %d-bit Java %d.%d.%d virtual machine could not be found.\nDo you want to browse your system for it?", req.bitness, req.major,
+                    req.minor, req.micro) >= sizeof(message))
+      {
+        return EXIT_FAILURE_BUFFER_OVERFLOW;
+      }
+
+      if (MessageBox (NULL, message, "Eclipse Installer", MB_YESNO | MB_ICONQUESTION) == IDYES)
+      {
+        char label[100];
+        if (snprintf (label, sizeof(label), "Select a %d-Bit Java %d.%d.%d Virtual Machine", req.bitness, req.major, req.minor, req.micro) >= sizeof(label))
+        {
+          return EXIT_FAILURE_BUFFER_OVERFLOW;
+        }
+
+        char* vm = browseForFile (NULL, label, "javaw.exe\0javaw.exe\0\0");
         if (vm != NULL)
         {
           jre = malloc (sizeof(JRE));
@@ -521,13 +1118,13 @@
 
     while (jre)
     {
-      if (validateJRE (jre, &req))
+      if (jre == validatedJRE || validateJRE (jre, &req))
       {
-        _TCHAR* targetFolder = getTempFile (_T("eoi"));
+        char* targetFolder = getTempFile ("eoi", "");
         if (targetFolder == NULL)
         {
-          _TCHAR label[MAX_PATH];
-          if (snprintf (label, sizeof(label), _T("Extract %s to:"), req.productName) >= sizeof(label))
+          char label[MAX_PATH];
+          if (snprintf (label, sizeof(label), "Extract %s to:", req.productName) >= sizeof(label))
           {
             return EXIT_FAILURE_BUFFER_OVERFLOW;
           }
@@ -544,8 +1141,20 @@
           return EXIT_CANCEL;
         }
 
-        JRE* argJRE = jre == defaultJRE ? NULL : jre;
-        if (extractProduct (jre, argJRE, executable, targetFolder))
+        if (tarFile != NULL)
+        {
+          char *jreTargetFolder = malloc (MAX_PATH);
+          jreTargetFolder[0] = 0;
+          strcat (jreTargetFolder, targetFolder);
+          strcat (jreTargetFolder, "\\");
+          extractTar (tarFile, jreTargetFolder, TRUE);
+          free (jreTargetFolder);
+        }
+
+        char* productCommandLineArguments = getProductCommandLineArguments (argc, argv);
+        JRE* argJRE = tarFile != NULL || jre == defaultJRE ? NULL : jre;
+        if (extractProduct (jre, argJRE, (debug ? "-Dorg.eclipse.oomph.extractor.lib.BINExtractor.log=true" : NULL), executable, targetFolder,
+                            productCommandLineArguments))
         {
           return EXIT_SUCCESS;
         }
@@ -557,15 +1166,9 @@
     }
   }
 
-  _TCHAR sysdir[MAX_PATH];
-  if (!GetSystemDirectory (sysdir, sizeof(sysdir)))
-  {
-    return EXIT_FAILURE_SYSTEM_DIRECTORY;
-  }
-
-  _TCHAR url[4 * MAX_PATH];
+  char url[4 * MAX_PATH];
   if (snprintf (url, sizeof(url),
-                _T("\"%s\\rundll32.exe\" %s\\url.dll,FileProtocolHandler \"http://download.eclipse.org/oomph/jre/?vm=1_%d_%d_%d_%d_%d&pn=%s&pu=%s&pi=%s\""), //
+                "\"%s\\rundll32.exe\" %s\\url.dll,FileProtocolHandler \"http://download.eclipse.org/oomph/jre/?vm=1_%d_%d_%d_%d_%d&pn=%s&pu=%s&pi=%s\"", //
                 sysdir, sysdir, req.major, req.minor, req.micro, req.bitness, req.jdk, req.productName, req.productURI, req.imageURI) >= sizeof(url))
   {
     return EXIT_FAILURE_BUFFER_OVERFLOW;
diff --git a/plugins/org.eclipse.oomph.jreinfo.dll/.cproject b/plugins/org.eclipse.oomph.jreinfo.dll/.cproject
index a7335aa..2c69984 100644
--- a/plugins/org.eclipse.oomph.jreinfo.dll/.cproject
+++ b/plugins/org.eclipse.oomph.jreinfo.dll/.cproject
@@ -163,107 +163,11 @@
 				</externalSettings>
 			</storageModule>
 		</cconfiguration>
-		<cconfiguration id="cdt.managedbuild.config.gnu.mingw.so.release.738149820.185951327">
-			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.so.release.738149820.185951327" moduleId="org.eclipse.cdt.core.settings" name="Win32">
-				<externalSettings>
-					<externalSetting>
-						<entry flags="VALUE_WORKSPACE_PATH" kind="includePath" name="/org.eclipse.oomph.jreinfo.dll"/>
-					</externalSetting>
-				</externalSettings>
-				<extensions>
-					<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
-					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-				</extensions>
-			</storageModule>
-			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-				<configuration artifactExtension="dll" artifactName="jreinfo" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.sharedLib" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.sharedLib,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" errorParsers="org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GCCErrorParser" id="cdt.managedbuild.config.gnu.mingw.so.release.738149820.185951327" name="Win32" parent="cdt.managedbuild.config.gnu.mingw.so.release" postannouncebuildStep="" postbuildStep="" preannouncebuildStep="" prebuildStep="">
-					<folderInfo id="cdt.managedbuild.config.gnu.mingw.so.release.738149820.185951327." name="/" resourcePath="">
-						<toolChain errorParsers="" id="cdt.managedbuild.toolchain.gnu.mingw.so.release.418930929" name="MinGW GCC" resourceTypeBasedDiscovery="true" superClass="cdt.managedbuild.toolchain.gnu.mingw.so.release">
-							<targetPlatform binaryParser="org.eclipse.cdt.core.PE" id="cdt.managedbuild.target.gnu.platform.mingw.so.release.184387489" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.mingw.so.release"/>
-							<builder buildPath="${workspace_loc:/org.eclipse.oomph.jreinfo.dll}/Release" enableCleanBuild="true" enabledIncrementalBuild="true" errorParsers="" id="cdt.managedbuild.tool.gnu.builder.mingw.base.877429264" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" superClass="cdt.managedbuild.tool.gnu.builder.mingw.base"/>
-							<tool command="as" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="org.eclipse.cdt.core.GASErrorParser" id="cdt.managedbuild.tool.gnu.assembler.mingw.so.release.490467873" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.so.release">
-								<option id="gnu.both.asm.option.include.paths.672268425" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.oomph.jreinfo.lib}&quot;"/>
-								</option>
-								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.700386769" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.679554232" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.so.release.243737828" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.so.release">
-								<option id="gnu.cpp.compiler.mingw.so.release.option.optimization.level.771741429" name="Optimization Level" superClass="gnu.cpp.compiler.mingw.so.release.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
-								<option id="gnu.cpp.compiler.mingw.so.release.option.debugging.level.966697602" name="Debug Level" superClass="gnu.cpp.compiler.mingw.so.release.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
-							</tool>
-							<tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="org.eclipse.cdt.core.GCCErrorParser" id="cdt.managedbuild.tool.gnu.c.compiler.mingw.so.release.247602404" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.so.release">
-								<option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.mingw.so.release.option.optimization.level.1647753313" name="Optimization Level" superClass="gnu.c.compiler.mingw.so.release.option.optimization.level" useByScannerDiscovery="false" valueType="enumerated"/>
-								<option id="gnu.c.compiler.mingw.so.release.option.debugging.level.2008268517" name="Debug Level" superClass="gnu.c.compiler.mingw.so.release.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.none" valueType="enumerated"/>
-								<option id="gnu.c.compiler.option.include.paths.977696533" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.oomph.jreinfo.lib}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.oomph.jreinfo.lib/src}&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${JAVA_HOME}\include&quot;"/>
-									<listOptionValue builtIn="false" value="&quot;${JAVA_HOME}\include\win32&quot;"/>
-								</option>
-								<option id="gnu.c.compiler.option.misc.other.822849452" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -fmessage-length=0 -m32" valueType="string"/>
-								<option id="gnu.c.compiler.option.preprocessor.def.symbols.1447506359" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols">
-									<listOptionValue builtIn="false" value="BIT32"/>
-								</option>
-								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1380511851" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
-							</tool>
-							<tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" errorParsers="org.eclipse.cdt.core.GLDErrorParser" id="cdt.managedbuild.tool.gnu.c.linker.mingw.so.release.1506927333" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.so.release">
-								<option defaultValue="true" id="gnu.c.link.mingw.so.release.option.shared.1623635417" name="Shared (-shared)" superClass="gnu.c.link.mingw.so.release.option.shared" valueType="boolean"/>
-								<option id="gnu.c.link.option.paths.1340346674" name="Library search path (-L)" superClass="gnu.c.link.option.paths" valueType="libPaths">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/org.eclipse.oomph.jreinfo.lib/Win32}&quot;"/>
-								</option>
-								<option id="gnu.c.link.option.libs.138762615" name="Libraries (-l)" superClass="gnu.c.link.option.libs" valueType="libs">
-									<listOptionValue builtIn="false" srcPrefixMapping="" srcRootPath="" value="jreinfo"/>
-								</option>
-								<inputType id="cdt.managedbuild.tool.gnu.c.linker.input.1192564644" superClass="cdt.managedbuild.tool.gnu.c.linker.input">
-									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
-									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
-								</inputType>
-								<outputType id="cdt.managedbuild.tool.gnu.c.linker.mingw.so.release.output.32266277" outputPrefix="" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.so.release.output"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.so.release.836040344" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.so.release">
-								<option defaultValue="true" id="gnu.cpp.link.mingw.so.release.option.shared.84825631" name="Shared (-shared)" superClass="gnu.cpp.link.mingw.so.release.option.shared" valueType="boolean"/>
-							</tool>
-						</toolChain>
-					</folderInfo>
-					<sourceEntries>
-						<entry excluding="src" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
-						<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
-					</sourceEntries>
-				</configuration>
-			</storageModule>
-			<storageModule moduleId="org.eclipse.cdt.core.externalSettings">
-				<externalSettings containerId="org.eclipse.oomph.jreinfo.lib;cdt.managedbuild.config.gnu.mingw.lib.release.167023565.507219945" factoryId="org.eclipse.cdt.core.cfg.export.settings.sipplier">
-					<externalSetting>
-						<entry flags="VALUE_WORKSPACE_PATH" kind="includePath" name="/org.eclipse.oomph.jreinfo.lib"/>
-						<entry flags="VALUE_WORKSPACE_PATH" kind="libraryPath" name="/org.eclipse.oomph.jreinfo.lib/Win32"/>
-						<entry flags="RESOLVED" kind="libraryFile" name="jreinfo" srcPrefixMapping="" srcRootPath=""/>
-					</externalSetting>
-				</externalSettings>
-			</storageModule>
-		</cconfiguration>
 	</storageModule>
 	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
 		<project id="org.eclipse.oomph.jreinfo.dll.cdt.managedbuild.target.gnu.mingw.so.919064623" name="Shared Library" projectType="cdt.managedbuild.target.gnu.mingw.so"/>
 	</storageModule>
 	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
-	<storageModule moduleId="refreshScope" versionNumber="2">
-		<configuration configurationName="Win32">
-			<resource resourceType="PROJECT" workspacePath="/org.eclipse.oomph.jreinfo.dll"/>
-		</configuration>
-		<configuration configurationName="Win64"/>
-		<configuration configurationName="Win64-Debug">
-			<resource resourceType="PROJECT" workspacePath="/org.eclipse.oomph.jreinfo.dll"/>
-		</configuration>
-		<configuration configurationName="Debug">
-			<resource resourceType="PROJECT" workspacePath="/org.eclipse.oomph.jreinfo.dll"/>
-		</configuration>
-		<configuration configurationName="Release">
-			<resource resourceType="PROJECT" workspacePath="/org.eclipse.oomph.jreinfo.dll"/>
-		</configuration>
-	</storageModule>
 	<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
 		<buildTargets>
 			<target name="HelloJNI.h" path="jni" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
diff --git a/plugins/org.eclipse.oomph.jreinfo.dll/.gitignore b/plugins/org.eclipse.oomph.jreinfo.dll/.gitignore
index 440075e..10c6823 100644
--- a/plugins/org.eclipse.oomph.jreinfo.dll/.gitignore
+++ b/plugins/org.eclipse.oomph.jreinfo.dll/.gitignore
@@ -1,4 +1,2 @@
-/Win32/
-/Win32-Debug/
 /Win64/
 /Win64-Debug/
diff --git a/plugins/org.eclipse.oomph.jreinfo.dll/.settings/language.settings.xml b/plugins/org.eclipse.oomph.jreinfo.dll/.settings/language.settings.xml
new file mode 100644
index 0000000..1d95a89
--- /dev/null
+++ b/plugins/org.eclipse.oomph.jreinfo.dll/.settings/language.settings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project>
+	<configuration id="cdt.managedbuild.config.gnu.mingw.so.debug.664190266" name="Win64-Debug">
+		<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
+			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
+			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
+			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
+			<provider class="org.eclipse.cdt.managedbuilder.internal.language.settings.providers.GCCBuiltinSpecsDetectorMinGW" console="false" env-hash="-310090825722575628" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetectorMinGW" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings MinGW" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+				<language-scope id="org.eclipse.cdt.core.gcc"/>
+				<language-scope id="org.eclipse.cdt.core.g++"/>
+			</provider>
+		</extension>
+	</configuration>
+	<configuration id="cdt.managedbuild.config.gnu.mingw.so.release.738149820" name="Win64">
+		<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
+			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
+			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
+			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
+			<provider class="org.eclipse.cdt.managedbuilder.internal.language.settings.providers.GCCBuiltinSpecsDetectorMinGW" console="false" env-hash="-310090825722575628" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetectorMinGW" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings MinGW" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+				<language-scope id="org.eclipse.cdt.core.gcc"/>
+				<language-scope id="org.eclipse.cdt.core.g++"/>
+			</provider>
+		</extension>
+	</configuration>
+</project>
diff --git a/plugins/org.eclipse.oomph.jreinfo.lib/.cproject b/plugins/org.eclipse.oomph.jreinfo.lib/.cproject
index 483c0f5..0ed0e92 100644
--- a/plugins/org.eclipse.oomph.jreinfo.lib/.cproject
+++ b/plugins/org.eclipse.oomph.jreinfo.lib/.cproject
@@ -95,109 +95,12 @@
 			</storageModule>
 			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
 		</cconfiguration>
-		<cconfiguration id="cdt.managedbuild.config.gnu.mingw.lib.release.167023565.507219945">
-			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.lib.release.167023565.507219945" moduleId="org.eclipse.cdt.core.settings" name="Win32">
-				<externalSettings>
-					<externalSetting>
-						<entry flags="VALUE_WORKSPACE_PATH" kind="includePath" name="/org.eclipse.oomph.jreinfo.lib"/>
-						<entry flags="VALUE_WORKSPACE_PATH" kind="libraryPath" name="/org.eclipse.oomph.jreinfo.lib/Win32"/>
-						<entry flags="RESOLVED" kind="libraryFile" name="jreinfo" srcPrefixMapping="" srcRootPath=""/>
-					</externalSetting>
-				</externalSettings>
-				<extensions>
-					<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
-					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-				</extensions>
-			</storageModule>
-			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-				<configuration artifactExtension="a" artifactName="jreinfo" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.staticLib" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.staticLib,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.lib.release.167023565.507219945" name="Win32" parent="cdt.managedbuild.config.gnu.mingw.lib.release">
-					<folderInfo id="cdt.managedbuild.config.gnu.mingw.lib.release.167023565.507219945." name="/" resourcePath="">
-						<toolChain id="cdt.managedbuild.toolchain.gnu.mingw.lib.release.628997617" name="MinGW GCC" resourceTypeBasedDiscovery="false" superClass="cdt.managedbuild.toolchain.gnu.mingw.lib.release">
-							<targetPlatform id="cdt.managedbuild.target.gnu.platform.mingw.lib.release.854579664" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.mingw.lib.release"/>
-							<builder buildPath="${workspace_loc:/org.eclipse.oomph.jreinfo.lib}/Release" enableCleanBuild="true" enabledIncrementalBuild="true" id="cdt.managedbuild.tool.gnu.builder.mingw.base.213098153" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" superClass="cdt.managedbuild.tool.gnu.builder.mingw.base"/>
-							<tool id="cdt.managedbuild.tool.gnu.assembler.mingw.lib.release.300268277" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.lib.release">
-								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.350409790" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.lib.release.910144490" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.lib.release"/>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.lib.release.493606654" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.lib.release">
-								<option id="gnu.cpp.compiler.mingw.lib.release.option.optimization.level.380726843" name="Optimization Level" superClass="gnu.cpp.compiler.mingw.lib.release.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
-								<option id="gnu.cpp.compiler.mingw.lib.release.option.debugging.level.566084904" name="Debug Level" superClass="gnu.cpp.compiler.mingw.lib.release.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.lib.release.1776690666" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.lib.release">
-								<option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.mingw.lib.release.option.optimization.level.1434177779" name="Optimization Level" superClass="gnu.c.compiler.mingw.lib.release.option.optimization.level" useByScannerDiscovery="false" valueType="enumerated"/>
-								<option id="gnu.c.compiler.mingw.lib.release.option.debugging.level.2075032380" name="Debug Level" superClass="gnu.c.compiler.mingw.lib.release.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.none" valueType="enumerated"/>
-								<option id="gnu.c.compiler.option.misc.other.1111171478" name="Other flags" superClass="gnu.c.compiler.option.misc.other" useByScannerDiscovery="false" value="-c -fmessage-length=0 -m32" valueType="string"/>
-								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.868396719" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.base.1761440157" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.base"/>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.base.1835856317" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.base"/>
-						</toolChain>
-					</folderInfo>
-					<sourceEntries>
-						<entry excluding="src" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
-						<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
-					</sourceEntries>
-				</configuration>
-			</storageModule>
-			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
-		</cconfiguration>
-		<cconfiguration id="cdt.managedbuild.config.gnu.mingw.lib.debug.1520985581.1551298586">
-			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.lib.debug.1520985581.1551298586" moduleId="org.eclipse.cdt.core.settings" name="Win32-Debug">
-				<externalSettings>
-					<externalSetting>
-						<entry flags="VALUE_WORKSPACE_PATH" kind="includePath" name="/org.eclipse.oomph.jreinfo.lib"/>
-						<entry flags="VALUE_WORKSPACE_PATH" kind="libraryPath" name="/org.eclipse.oomph.jreinfo.lib/Win32-Debug"/>
-						<entry flags="RESOLVED" kind="libraryFile" name="jreinfo" srcPrefixMapping="" srcRootPath=""/>
-					</externalSetting>
-				</externalSettings>
-				<extensions>
-					<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
-					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-				</extensions>
-			</storageModule>
-			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-				<configuration artifactExtension="a" artifactName="jreinfo" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.staticLib" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.staticLib,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.lib.debug.1520985581.1551298586" name="Win32-Debug" parent="cdt.managedbuild.config.gnu.mingw.lib.debug">
-					<folderInfo id="cdt.managedbuild.config.gnu.mingw.lib.debug.1520985581.1551298586." name="/" resourcePath="">
-						<toolChain id="cdt.managedbuild.toolchain.gnu.mingw.lib.debug.251656269" name="MinGW GCC" resourceTypeBasedDiscovery="false" superClass="cdt.managedbuild.toolchain.gnu.mingw.lib.debug">
-							<targetPlatform id="cdt.managedbuild.target.gnu.platform.mingw.lib.debug.1005847609" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.mingw.lib.debug"/>
-							<builder buildPath="${workspace_loc:/org.eclipse.oomph.jreinfo.lib}/Debug" enableCleanBuild="true" enabledIncrementalBuild="true" id="cdt.managedbuild.tool.gnu.builder.mingw.base.383878931" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" superClass="cdt.managedbuild.tool.gnu.builder.mingw.base"/>
-							<tool id="cdt.managedbuild.tool.gnu.assembler.mingw.lib.debug.1342461893" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.lib.debug">
-								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1432711440" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.lib.debug.537552304" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.lib.debug"/>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.lib.debug.1667767146" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.lib.debug">
-								<option id="gnu.cpp.compiler.mingw.lib.debug.option.optimization.level.266294699" name="Optimization Level" superClass="gnu.cpp.compiler.mingw.lib.debug.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
-								<option id="gnu.cpp.compiler.mingw.lib.debug.option.debugging.level.897035735" name="Debug Level" superClass="gnu.cpp.compiler.mingw.lib.debug.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
-							</tool>
-							<tool command="gcc" commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="cdt.managedbuild.tool.gnu.c.compiler.mingw.lib.debug.153872105" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.lib.debug">
-								<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.mingw.lib.debug.option.optimization.level.1707038621" name="Optimization Level" superClass="gnu.c.compiler.mingw.lib.debug.option.optimization.level" useByScannerDiscovery="false" valueType="enumerated"/>
-								<option id="gnu.c.compiler.mingw.lib.debug.option.debugging.level.1033965855" name="Debug Level" superClass="gnu.c.compiler.mingw.lib.debug.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
-								<option id="gnu.c.compiler.option.misc.other.1486079698" name="Other flags" superClass="gnu.c.compiler.option.misc.other" value="-c -fmessage-length=0 -m32" valueType="string"/>
-								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1597713028" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.base.901991190" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.base"/>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.base.2137237667" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.base"/>
-						</toolChain>
-					</folderInfo>
-					<sourceEntries>
-						<entry excluding="src" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
-						<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
-					</sourceEntries>
-				</configuration>
-			</storageModule>
-			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
-		</cconfiguration>
 	</storageModule>
 	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
 		<project id="org.eclipse.oomph.jreinfo.lib.cdt.managedbuild.target.gnu.mingw.lib.689344957" name="Static Library" projectType="cdt.managedbuild.target.gnu.mingw.lib"/>
 	</storageModule>
 	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
 	<storageModule moduleId="refreshScope" versionNumber="2">
-		<configuration configurationName="Win32">
-			<resource resourceType="PROJECT" workspacePath="/org.eclipse.oomph.jreinfo.lib"/>
-		</configuration>
 		<configuration configurationName="Win64"/>
 		<configuration configurationName="Win64-Debug"/>
 		<configuration configurationName="Debug">
diff --git a/plugins/org.eclipse.oomph.jreinfo.lib/.gitignore b/plugins/org.eclipse.oomph.jreinfo.lib/.gitignore
index 440075e..10c6823 100644
--- a/plugins/org.eclipse.oomph.jreinfo.lib/.gitignore
+++ b/plugins/org.eclipse.oomph.jreinfo.lib/.gitignore
@@ -1,4 +1,2 @@
-/Win32/
-/Win32-Debug/
 /Win64/
 /Win64-Debug/
diff --git a/plugins/org.eclipse.oomph.jreinfo.lib/.settings/language.settings.xml b/plugins/org.eclipse.oomph.jreinfo.lib/.settings/language.settings.xml
new file mode 100644
index 0000000..d629a8c
--- /dev/null
+++ b/plugins/org.eclipse.oomph.jreinfo.lib/.settings/language.settings.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project>
+	<configuration id="cdt.managedbuild.config.gnu.mingw.lib.debug.1520985581" name="Win64-Debug">
+		<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
+			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
+			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
+			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
+			<provider class="org.eclipse.cdt.managedbuilder.internal.language.settings.providers.GCCBuiltinSpecsDetectorMinGW" console="false" env-hash="-310090825722575628" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetectorMinGW" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings MinGW" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+				<language-scope id="org.eclipse.cdt.core.gcc"/>
+				<language-scope id="org.eclipse.cdt.core.g++"/>
+			</provider>
+		</extension>
+	</configuration>
+	<configuration id="cdt.managedbuild.config.gnu.mingw.lib.release.167023565" name="Win64">
+		<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
+			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
+			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
+			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
+			<provider class="org.eclipse.cdt.managedbuilder.internal.language.settings.providers.GCCBuiltinSpecsDetectorMinGW" console="false" env-hash="-310090825722575628" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetectorMinGW" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings MinGW" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+				<language-scope id="org.eclipse.cdt.core.gcc"/>
+				<language-scope id="org.eclipse.cdt.core.g++"/>
+			</provider>
+		</extension>
+	</configuration>
+	<configuration id="cdt.managedbuild.config.gnu.mingw.lib.release.167023565.507219945" name="Win32">
+		<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
+			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
+			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
+			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
+			<provider class="org.eclipse.cdt.managedbuilder.internal.language.settings.providers.GCCBuiltinSpecsDetectorMinGW" console="false" env-hash="-310090825722575628" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetectorMinGW" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings MinGW" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+				<language-scope id="org.eclipse.cdt.core.gcc"/>
+				<language-scope id="org.eclipse.cdt.core.g++"/>
+			</provider>
+		</extension>
+	</configuration>
+	<configuration id="cdt.managedbuild.config.gnu.mingw.lib.debug.1520985581.1551298586" name="Win32-Debug">
+		<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
+			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
+			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
+			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
+			<provider class="org.eclipse.cdt.managedbuilder.internal.language.settings.providers.GCCBuiltinSpecsDetectorMinGW" console="false" env-hash="-310090825722575628" id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetectorMinGW" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings MinGW" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
+				<language-scope id="org.eclipse.cdt.core.gcc"/>
+				<language-scope id="org.eclipse.cdt.core.g++"/>
+			</provider>
+		</extension>
+	</configuration>
+</project>
diff --git a/plugins/org.eclipse.oomph.jreinfo.lib/src/jreinfo.c b/plugins/org.eclipse.oomph.jreinfo.lib/src/jreinfo.c
index 39c7434..7a2fe2f 100644
--- a/plugins/org.eclipse.oomph.jreinfo.lib/src/jreinfo.c
+++ b/plugins/org.eclipse.oomph.jreinfo.lib/src/jreinfo.c
@@ -109,9 +109,13 @@
 {
   JRE* jres = NULL;
   jres = findJREs (jres, _T("Software\\Wow6432Node\\JavaSoft\\Java Development Kit"), 1);
+  jres = findJREs (jres, _T("Software\\Wow6432Node\\JavaSoft\\JDK"), 1);
   jres = findJREs (jres, _T("Software\\Wow6432Node\\JavaSoft\\Java Runtime Environment"), 0);
+  jres = findJREs (jres, _T("Software\\Wow6432Node\\JavaSoft\\JRE"), 0);
   jres = findJREs (jres, _T("Software\\JavaSoft\\Java Development Kit"), 1);
+  jres = findJREs (jres, _T("Software\\JavaSoft\\JDK"), 1);
   jres = findJREs (jres, _T("Software\\JavaSoft\\Java Runtime Environment"), 0);
+  jres = findJREs (jres, _T("Software\\JavaSoft\\JRE"), 0);
   jres = findJavaHome (jres);
   return jres;
 }
diff --git a/plugins/org.eclipse.oomph.jreinfo.win32.x86_64/META-INF/MANIFEST.MF b/plugins/org.eclipse.oomph.jreinfo.win32.x86_64/META-INF/MANIFEST.MF
index 44865b3..2596b02 100644
--- a/plugins/org.eclipse.oomph.jreinfo.win32.x86_64/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.oomph.jreinfo.win32.x86_64/META-INF/MANIFEST.MF
@@ -1,7 +1,7 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-SymbolicName: org.eclipse.oomph.jreinfo.win32.x86_64
-Bundle-Version: 1.4.0.qualifier
+Bundle-Version: 1.5.0.qualifier
 Bundle-Localization: fragment
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
diff --git a/plugins/org.eclipse.oomph.jreinfo.win32.x86_64/jreinfo.dll b/plugins/org.eclipse.oomph.jreinfo.win32.x86_64/jreinfo.dll
index c0f8735..28de9fb 100644
--- a/plugins/org.eclipse.oomph.jreinfo.win32.x86_64/jreinfo.dll
+++ b/plugins/org.eclipse.oomph.jreinfo.win32.x86_64/jreinfo.dll
Binary files differ
diff --git a/plugins/org.eclipse.oomph.jreinfo.win32.x86_64/pom.xml b/plugins/org.eclipse.oomph.jreinfo.win32.x86_64/pom.xml
index cc616a7..6dc8006 100644
--- a/plugins/org.eclipse.oomph.jreinfo.win32.x86_64/pom.xml
+++ b/plugins/org.eclipse.oomph.jreinfo.win32.x86_64/pom.xml
@@ -20,7 +20,7 @@
   </parent>
   <groupId>org.eclipse.oomph</groupId>
   <artifactId>org.eclipse.oomph.jreinfo.win32.x86_64</artifactId>
-  <version>1.4.0-SNAPSHOT</version>
+  <version>1.5.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 
   <build>
diff --git a/plugins/org.eclipse.oomph.jreinfo/META-INF/MANIFEST.MF b/plugins/org.eclipse.oomph.jreinfo/META-INF/MANIFEST.MF
index c5c334a..2e9f841 100644
--- a/plugins/org.eclipse.oomph.jreinfo/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.oomph.jreinfo/META-INF/MANIFEST.MF
@@ -1,7 +1,7 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-SymbolicName: org.eclipse.oomph.jreinfo
-Bundle-Version: 1.10.0.qualifier
+Bundle-Version: 1.11.0.qualifier
 Bundle-Localization: plugin
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
@@ -10,8 +10,8 @@
 Bundle-Activator: org.eclipse.oomph.internal.jreinfo.JREInfoPlugin$Implementation
 Bundle-ActivationPolicy: lazy
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
- org.eclipse.oomph.util;bundle-version="[1.10.0,2.0.0)";visibility:=reexport,
- org.eclipse.oomph.extractor.lib;bundle-version="[1.5.0,2.0.0)"
-Export-Package: org.eclipse.oomph.internal.jreinfo;version="1.10.0";x-internal:=true,
- org.eclipse.oomph.jreinfo;version="1.10.0";x-internal:=true
+ org.eclipse.oomph.util;bundle-version="[1.11.0,2.0.0)";visibility:=reexport,
+ org.eclipse.oomph.extractor.lib;bundle-version="[1.6.0,2.0.0)"
+Export-Package: org.eclipse.oomph.internal.jreinfo;version="1.11.0";x-internal:=true,
+ org.eclipse.oomph.jreinfo;version="1.11.0";x-internal:=true
 Automatic-Module-Name: org.eclipse.oomph.jreinfo
diff --git a/plugins/org.eclipse.oomph.jreinfo/pom.xml b/plugins/org.eclipse.oomph.jreinfo/pom.xml
index bf034c2..5c4f20d 100644
--- a/plugins/org.eclipse.oomph.jreinfo/pom.xml
+++ b/plugins/org.eclipse.oomph.jreinfo/pom.xml
@@ -20,7 +20,7 @@
   </parent>
   <groupId>org.eclipse.oomph</groupId>
   <artifactId>org.eclipse.oomph.jreinfo</artifactId>
-  <version>1.10.0-SNAPSHOT</version>
+  <version>1.11.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 
   <build>
diff --git a/plugins/org.eclipse.oomph.jreinfo/src/org/eclipse/oomph/jreinfo/JREManager.java b/plugins/org.eclipse.oomph.jreinfo/src/org/eclipse/oomph/jreinfo/JREManager.java
index d3fc012..0d9b80c 100644
--- a/plugins/org.eclipse.oomph.jreinfo/src/org/eclipse/oomph/jreinfo/JREManager.java
+++ b/plugins/org.eclipse.oomph.jreinfo/src/org/eclipse/oomph/jreinfo/JREManager.java
@@ -18,11 +18,15 @@
 import org.eclipse.oomph.util.PropertiesUtil;
 import org.eclipse.oomph.util.StringUtil;
 
+import org.eclipse.emf.common.util.URI;
+
+import org.eclipse.core.runtime.FileLocator;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.OperationCanceledException;
 import org.eclipse.core.runtime.Platform;
+import org.eclipse.osgi.service.datalocation.Location;
 
 import java.io.File;
 import java.io.FileFilter;
@@ -331,10 +335,16 @@
   {
     javaHomes.clear();
 
+    String installerLocation = getInstallerLocation();
     JREInfo info = JREInfo.getAll();
     while (info != null)
     {
-      javaHomes.add(info.javaHome);
+      // Ignore the JRE that is embedded in the installation itself.
+      if (installerLocation != null && !info.javaHome.startsWith(installerLocation))
+      {
+        javaHomes.add(info.javaHome);
+      }
+
       info = info.next;
     }
   }
@@ -474,4 +484,34 @@
 
     return 32;
   }
+
+  private static String getInstallerLocation()
+  {
+    try
+    {
+      String productID = PropertiesUtil.getProductID();
+      if ("org.eclipse.oomph.setup.installer.product".equals(productID))
+      {
+        Location location = Platform.getInstallLocation();
+        if (location != null)
+        {
+          URI result = URI.createURI(FileLocator.resolve(location.getURL()).toString());
+          if (result.isFile())
+          {
+            if (!result.hasTrailingPathSeparator())
+            {
+              result = result.appendSegment("");
+            }
+            return result.toFileString();
+          }
+        }
+      }
+    }
+    catch (Throwable ex)
+    {
+      //$FALL-THROUGH$
+    }
+
+    return null;
+  }
 }
diff --git a/plugins/org.eclipse.oomph.setup.installer/META-INF/MANIFEST.MF b/plugins/org.eclipse.oomph.setup.installer/META-INF/MANIFEST.MF
index 5b385a5..d2aaccf 100644
--- a/plugins/org.eclipse.oomph.setup.installer/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.oomph.setup.installer/META-INF/MANIFEST.MF
@@ -12,7 +12,7 @@
  org.eclipse.emf.edit.ui;bundle-version="[2.10.0,3.0.0)",
  org.eclipse.oomph.setup;bundle-version="[1.12.0,2.0.0)",
  org.eclipse.oomph.setup.edit;bundle-version="[1.12.0,2.0.0)",
- org.eclipse.oomph.setup.ui;bundle-version="[1.12.0,2.0.0)",
+ org.eclipse.oomph.setup.ui;bundle-version="[1.13.0,2.0.0)",
  org.eclipse.equinox.p2.operations;bundle-version="[2.0.0,3.0.0)",
  org.eclipse.equinox.p2.metadata;bundle-version="[2.0.0,3.0.0)",
  org.eclipse.equinox.p2.core;bundle-version="[2.0.0,3.0.0)",
diff --git a/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/KeepInstallerUtil.java b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/KeepInstallerUtil.java
index a107397..fe3d367 100644
--- a/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/KeepInstallerUtil.java
+++ b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/KeepInstallerUtil.java
@@ -16,8 +16,13 @@
 import org.eclipse.oomph.util.OomphPlugin.Preference;
 import org.eclipse.oomph.util.PropertiesUtil;
 
+import org.eclipse.core.runtime.Platform;
+
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * @author Eike Stepper
@@ -172,9 +177,13 @@
 
     if (startPermanentInstaller)
     {
+      // Include the application arguments in this launch.
+      List<String> command = new ArrayList<String>();
+      command.add(permanentLauncher);
+      command.addAll(Arrays.asList(Platform.getApplicationArgs()));
       try
       {
-        Runtime.getRuntime().exec(permanentLauncher);
+        Runtime.getRuntime().exec(command.toArray(new String[command.size()]));
       }
       catch (Exception ex)
       {
diff --git a/plugins/org.eclipse.oomph.setup.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.oomph.setup.ui/META-INF/MANIFEST.MF
index d99704c..fc1c368 100644
--- a/plugins/org.eclipse.oomph.setup.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.oomph.setup.ui/META-INF/MANIFEST.MF
@@ -2,17 +2,17 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.oomph.setup.ui;singleton:=true
-Bundle-Version: 1.12.0.qualifier
+Bundle-Version: 1.13.0.qualifier
 Bundle-ClassPath: .
 Bundle-Activator: org.eclipse.oomph.setup.ui.SetupUIPlugin$Implementation
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.oomph.setup.ui;version="1.12.0";x-internal:=true,
- org.eclipse.oomph.setup.ui.actions;version="1.12.0";x-internal:=true,
- org.eclipse.oomph.setup.ui.recorder;version="1.12.0";x-internal:=true,
- org.eclipse.oomph.setup.ui.synchronizer;version="1.12.0";x-internal:=true,
- org.eclipse.oomph.setup.ui.wizards;version="1.12.0";x-internal:=true
+Export-Package: org.eclipse.oomph.setup.ui;version="1.13.0";x-internal:=true,
+ org.eclipse.oomph.setup.ui.actions;version="1.13.0";x-internal:=true,
+ org.eclipse.oomph.setup.ui.recorder;version="1.13.0";x-internal:=true,
+ org.eclipse.oomph.setup.ui.synchronizer;version="1.13.0";x-internal:=true,
+ org.eclipse.oomph.setup.ui.wizards;version="1.13.0";x-internal:=true
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
  org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.core.filesystem;bundle-version="[1.0.0,2.0.0)",
@@ -31,8 +31,8 @@
  org.eclipse.oomph.setup.p2.edit;bundle-version="[1.10.0,2.0.0)",
  org.eclipse.oomph.setup.sync;bundle-version="[1.10.0,2.0.0)",
  org.eclipse.oomph.ui;bundle-version="[1.10.0,2.0.0)",
- org.eclipse.oomph.p2.edit;bundle-version="[1.10.0,2.0.0)";visibility:=reexport,
- org.eclipse.oomph.p2.core;bundle-version="[1.11.0,2.0.0)",
+ org.eclipse.oomph.p2.edit;bundle-version="[1.11.0,2.0.0)";visibility:=reexport,
+ org.eclipse.oomph.p2.core;bundle-version="[1.12.0,2.0.0)",
  org.eclipse.oomph.p2.ui;bundle-version="[1.10.0,2.0.0)",
  org.eclipse.oomph.jreinfo.ui;bundle-version="[1.10.0,2.0.0)",
  org.eclipse.oomph.preferences;bundle-version="[1.10.0,2.0.0)"
diff --git a/plugins/org.eclipse.oomph.setup.ui/pom.xml b/plugins/org.eclipse.oomph.setup.ui/pom.xml
index f628aa9..67d6978 100644
--- a/plugins/org.eclipse.oomph.setup.ui/pom.xml
+++ b/plugins/org.eclipse.oomph.setup.ui/pom.xml
@@ -20,7 +20,7 @@
   </parent>
   <groupId>org.eclipse.oomph</groupId>
   <artifactId>org.eclipse.oomph.setup.ui</artifactId>
-  <version>1.12.0-SNAPSHOT</version>
+  <version>1.13.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 
   <build>
diff --git a/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/wizards/ConfigurationProcessor.java b/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/wizards/ConfigurationProcessor.java
index 8b3038e..fbbd42e 100644
--- a/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/wizards/ConfigurationProcessor.java
+++ b/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/wizards/ConfigurationProcessor.java
@@ -155,6 +155,11 @@
       StringBuilder uris = new StringBuilder();
       for (Resource resource : setupWizard.getUnappliedConfigurationResources())
       {
+        if (uris.length() != 0)
+        {
+          uris.append(' ');
+        }
+
         uris.append(resource.getURI());
       }