[495643] JRE execution environment not set

https://bugs.eclipse.org/bugs/show_bug.cgi?id=495643
diff --git a/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/ProductPage.java b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/ProductPage.java
index c5df0a8..45537c9 100644
--- a/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/ProductPage.java
+++ b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/ProductPage.java
@@ -823,6 +823,7 @@
           protected boolean applyEmptyProductVersion()
           {
             applyInstallation();
+            updateSetupContext();
             return true;
           }
 
diff --git a/plugins/org.eclipse.oomph.setup.jdt.edit/META-INF/MANIFEST.MF b/plugins/org.eclipse.oomph.setup.jdt.edit/META-INF/MANIFEST.MF
index dd407fa..06b8d2a 100644
--- a/plugins/org.eclipse.oomph.setup.jdt.edit/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.oomph.setup.jdt.edit/META-INF/MANIFEST.MF
@@ -13,5 +13,6 @@
  org.eclipse.oomph.setup.jdt;bundle-version="[1.7.0,2.0.0)";visibility:=reexport,
  org.eclipse.emf.edit;bundle-version="[2.10.0,3.0.0)";visibility:=reexport,
  org.eclipse.oomph.base.edit;bundle-version="[1.7.0,2.0.0)";visibility:=reexport,
- org.eclipse.oomph.setup.edit;bundle-version="[1.7.0,2.0.0)";visibility:=reexport
+ org.eclipse.oomph.setup.edit;bundle-version="[1.7.0,2.0.0)";visibility:=reexport,
+ org.eclipse.jdt.launching;bundle-version="[3.6.0,4.0.0)"
 Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.oomph.setup.jdt.edit/plugin.properties b/plugins/org.eclipse.oomph.setup.jdt.edit/plugin.properties
index 05509a8..c118e94 100644
--- a/plugins/org.eclipse.oomph.setup.jdt.edit/plugin.properties
+++ b/plugins/org.eclipse.oomph.setup.jdt.edit/plugin.properties
@@ -26,7 +26,11 @@
 _UI_JRETask_type = JRE
 _UI_JRETask_version_feature = Version
 _UI_JRETask_location_feature = Location
+_UI_JRETask_vMInstallType_feature = VM Install Type
+_UI_JRETask_executionEnvironmentDefault_feature = Execution Environment Default
 
 _UI_Unknown_feature = Unspecified
 
 
+_UI_JRETask_name_feature = Name
+_UI_JRETask_vMArguments_feature = VM Arguments
diff --git a/plugins/org.eclipse.oomph.setup.jdt.edit/src/org/eclipse/oomph/setup/jdt/provider/JRETaskItemProvider.java b/plugins/org.eclipse.oomph.setup.jdt.edit/src/org/eclipse/oomph/setup/jdt/provider/JRETaskItemProvider.java
index 8b9ecd7..1067b1a 100644
--- a/plugins/org.eclipse.oomph.setup.jdt.edit/src/org/eclipse/oomph/setup/jdt/provider/JRETaskItemProvider.java
+++ b/plugins/org.eclipse.oomph.setup.jdt.edit/src/org/eclipse/oomph/setup/jdt/provider/JRETaskItemProvider.java
@@ -20,6 +20,7 @@
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.common.util.UniqueEList;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.edit.domain.EditingDomain;
@@ -28,6 +29,9 @@
 import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 
+import org.eclipse.jdt.launching.IVMInstallType;
+import org.eclipse.jdt.launching.JavaRuntime;
+
 import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -53,7 +57,7 @@
     VERSION_VARIABLES.put("JavaSE-1.6", "${jre.location-1.6}");
     VERSION_VARIABLES.put("JavaSE-1.7", "${jre.location-1.7}");
     VERSION_VARIABLES.put("JavaSE-1.8", "${jre.location-1.8}");
-    VERSION_VARIABLES.put("JavaSE-1.9", "${jre.location-1.9}");
+    VERSION_VARIABLES.put("JavaSE-9", "${jre.location-9}");
   }
 
   /**
@@ -82,6 +86,10 @@
 
       addVersionPropertyDescriptor(object);
       addLocationPropertyDescriptor(object);
+      addNamePropertyDescriptor(object);
+      addVMInstallTypePropertyDescriptor(object);
+      addExecutionEnvironmentDefaultPropertyDescriptor(object);
+      addVMArgumentsPropertyDescriptor(object);
     }
     return itemPropertyDescriptors;
   }
@@ -135,6 +143,81 @@
   }
 
   /**
+   * This adds a property descriptor for the Name feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addNamePropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_JRETask_name_feature"), getString("_UI_PropertyDescriptor_description", "_UI_JRETask_name_feature", "_UI_JRETask_type"),
+        JDTPackage.Literals.JRE_TASK__NAME, true, false, false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the VM Install Type feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  protected void addVMInstallTypePropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(new ItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_JRETask_vMInstallType_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_JRETask_vMInstallType_feature", "_UI_JRETask_type"), JDTPackage.Literals.JRE_TASK__VM_INSTALL_TYPE,
+        true, false, false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null)
+    {
+      @Override
+      public Collection<?> getChoiceOfValues(Object object)
+      {
+        List<String> result = new UniqueEList<String>();
+        IVMInstallType[] vmInstallTypes = JavaRuntime.getVMInstallTypes();
+        for (IVMInstallType vmInstallType : vmInstallTypes)
+        {
+          result.add(vmInstallType.getId());
+        }
+
+        JRETask jreTask = (JRETask)object;
+        String vmInstallType = jreTask.getVMInstallType();
+        if (vmInstallType != null)
+        {
+          result.add(vmInstallType);
+        }
+
+        return result;
+      }
+    });
+  }
+
+  /**
+   * This adds a property descriptor for the Execution Environment Default feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addExecutionEnvironmentDefaultPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_JRETask_executionEnvironmentDefault_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_JRETask_executionEnvironmentDefault_feature", "_UI_JRETask_type"),
+        JDTPackage.Literals.JRE_TASK__EXECUTION_ENVIRONMENT_DEFAULT, true, false, false, ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE, null, null));
+  }
+
+  /**
+   * This adds a property descriptor for the VM Arguments feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addVMArgumentsPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(createItemPropertyDescriptor(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(), getResourceLocator(),
+        getString("_UI_JRETask_vMArguments_feature"), getString("_UI_PropertyDescriptor_description", "_UI_JRETask_vMArguments_feature", "_UI_JRETask_type"),
+        JDTPackage.Literals.JRE_TASK__VM_ARGUMENTS, true, true, false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
+  }
+
+  /**
    * This returns JRETask.gif.
    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
@@ -167,15 +250,15 @@
   public String getText(Object object)
   {
     JRETask jre = (JRETask)object;
-    String version = jre.getVersion();
+    String name = jre.getName();
     String location = jre.getLocation();
 
-    if (StringUtil.isEmpty(version))
+    if (StringUtil.isEmpty(name))
     {
       return getString("_UI_JRETask_type");
     }
 
-    String label = version;
+    String label = name;
     if (location != null)
     {
       if (location.length() == 0)
@@ -207,6 +290,10 @@
     {
       case JDTPackage.JRE_TASK__VERSION:
       case JDTPackage.JRE_TASK__LOCATION:
+      case JDTPackage.JRE_TASK__NAME:
+      case JDTPackage.JRE_TASK__VM_INSTALL_TYPE:
+      case JDTPackage.JRE_TASK__EXECUTION_ENVIRONMENT_DEFAULT:
+      case JDTPackage.JRE_TASK__VM_ARGUMENTS:
         fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
         return;
     }
diff --git a/plugins/org.eclipse.oomph.setup.jdt/model/JDT.ecore b/plugins/org.eclipse.oomph.setup.jdt/model/JDT.ecore
index 007e036..b5d39df 100644
--- a/plugins/org.eclipse.oomph.setup.jdt/model/JDT.ecore
+++ b/plugins/org.eclipse.oomph.setup.jdt/model/JDT.ecore
@@ -46,8 +46,8 @@
         <details key="label" value="JRE 1.8 Location"/>
       </eAnnotations>
       <eAnnotations source="Choice">
-        <details key="value" value="${jre.location-1.9}"/>
-        <details key="label" value="JRE 1.9 Location"/>
+        <details key="value" value="${jre.location-9}"/>
+        <details key="label" value="JRE 9 Location"/>
       </eAnnotations>
       <details key="name" value="jre.location-1.1"/>
       <details key="type" value="JRE"/>
@@ -80,8 +80,8 @@
         <details key="label" value="JRE 1.8 Location"/>
       </eAnnotations>
       <eAnnotations source="Choice">
-        <details key="value" value="${jre.location-1.9}"/>
-        <details key="label" value="JRE 1.9 Location"/>
+        <details key="value" value="${jre.location-9}"/>
+        <details key="label" value="JRE 9 Location"/>
       </eAnnotations>
       <details key="name" value="jre.location-1.2"/>
       <details key="type" value="JRE"/>
@@ -110,8 +110,8 @@
         <details key="label" value="JRE 1.8 Location"/>
       </eAnnotations>
       <eAnnotations source="Choice">
-        <details key="value" value="${jre.location-1.9}"/>
-        <details key="label" value="JRE 1.9 Location"/>
+        <details key="value" value="${jre.location-9}"/>
+        <details key="label" value="JRE 9 Location"/>
       </eAnnotations>
       <details key="name" value="jre.location-1.3"/>
       <details key="type" value="JRE"/>
@@ -136,8 +136,8 @@
         <details key="label" value="JRE 1.8 Location"/>
       </eAnnotations>
       <eAnnotations source="Choice">
-        <details key="value" value="${jre.location-1.9}"/>
-        <details key="label" value="JRE 1.9 Location"/>
+        <details key="value" value="${jre.location-9}"/>
+        <details key="label" value="JRE 9 Location"/>
       </eAnnotations>
       <details key="name" value="jre.location-1.4"/>
       <details key="type" value="JRE"/>
@@ -158,8 +158,8 @@
         <details key="label" value="JRE 1.8 Location"/>
       </eAnnotations>
       <eAnnotations source="Choice">
-        <details key="value" value="${jre.location-1.9}"/>
-        <details key="label" value="JRE 1.9 Location"/>
+        <details key="value" value="${jre.location-9}"/>
+        <details key="label" value="JRE 9 Location"/>
       </eAnnotations>
       <details key="name" value="jre.location-1.5"/>
       <details key="type" value="JRE"/>
@@ -176,8 +176,8 @@
         <details key="label" value="JRE 1.8 Location"/>
       </eAnnotations>
       <eAnnotations source="Choice">
-        <details key="value" value="${jre.location-1.9}"/>
-        <details key="label" value="JRE 1.9 Location"/>
+        <details key="value" value="${jre.location-9}"/>
+        <details key="label" value="JRE 9 Location"/>
       </eAnnotations>
       <details key="name" value="jre.location-1.6"/>
       <details key="type" value="JRE"/>
@@ -190,8 +190,8 @@
         <details key="label" value="JRE 1.8 Location"/>
       </eAnnotations>
       <eAnnotations source="Choice">
-        <details key="value" value="${jre.location-1.9}"/>
-        <details key="label" value="JRE 1.9 Location"/>
+        <details key="value" value="${jre.location-9}"/>
+        <details key="label" value="JRE 9 Location"/>
       </eAnnotations>
       <details key="name" value="jre.location-1.7"/>
       <details key="type" value="JRE"/>
@@ -200,8 +200,8 @@
     </eAnnotations>
     <eAnnotations source="http://www.eclipse.org/oomph/setup/Variable">
       <eAnnotations source="Choice">
-        <details key="value" value="${jre.location-1.9}"/>
-        <details key="label" value="JRE 1.9 Location"/>
+        <details key="value" value="${jre.location-9}"/>
+        <details key="label" value="JRE 9 Location"/>
       </eAnnotations>
       <details key="name" value="jre.location-1.8"/>
       <details key="type" value="JRE"/>
@@ -209,14 +209,30 @@
       <details key="description" value="The location of a JDK or JRE compatible with Java 1.8."/>
     </eAnnotations>
     <eAnnotations source="http://www.eclipse.org/oomph/setup/Variable">
-      <details key="name" value="jre.location-1.9"/>
+      <details key="name" value="jre.location-9"/>
       <details key="type" value="JRE"/>
-      <details key="label" value="JRE 1.9 Location"/>
-      <details key="description" value="The location of a JDK or JRE compatible with Java 1.9."/>
+      <details key="label" value="JRE 9 Location"/>
+      <details key="description" value="The location of a JDK or JRE compatible with Java 9."/>
     </eAnnotations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="version" lowerBound="1"
         eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="location" lowerBound="1"
         eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="vMInstallType" lowerBound="1"
+        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" defaultValueLiteral="org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType">
+      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
+        <details key="kind" value="attribute"/>
+        <details key="name" value="vmInstallType"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="executionEnvironmentDefault"
+        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean" defaultValueLiteral="true"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="vMArguments" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
+      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
+        <details key="kind" value="attribute"/>
+        <details key="name" value="vmArguments"/>
+      </eAnnotations>
+    </eStructuralFeatures>
   </eClassifiers>
 </ecore:EPackage>
diff --git a/plugins/org.eclipse.oomph.setup.jdt/model/JDT.genmodel b/plugins/org.eclipse.oomph.setup.jdt/model/JDT.genmodel
index 0de5adb..87bc9f1 100644
--- a/plugins/org.eclipse.oomph.setup.jdt/model/JDT.genmodel
+++ b/plugins/org.eclipse.oomph.setup.jdt/model/JDT.genmodel
@@ -12,6 +12,10 @@
     <genClasses ecoreClass="JDT.ecore#//JRETask" labelFeature="#//jdt/JRETask/version">
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute JDT.ecore#//JRETask/version"/>
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute JDT.ecore#//JRETask/location"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute JDT.ecore#//JRETask/name"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute JDT.ecore#//JRETask/vMInstallType"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute JDT.ecore#//JRETask/executionEnvironmentDefault"/>
+      <genFeatures createChild="false" propertyMultiLine="true" ecoreFeature="ecore:EAttribute JDT.ecore#//JRETask/vMArguments"/>
     </genClasses>
   </genPackages>
 </genmodel:GenModel>
diff --git a/plugins/org.eclipse.oomph.setup.jdt/src/org/eclipse/oomph/setup/jdt/JDTPackage.java b/plugins/org.eclipse.oomph.setup.jdt/src/org/eclipse/oomph/setup/jdt/JDTPackage.java
index 8ca1159..e5bdbe0 100644
--- a/plugins/org.eclipse.oomph.setup.jdt/src/org/eclipse/oomph/setup/jdt/JDTPackage.java
+++ b/plugins/org.eclipse.oomph.setup.jdt/src/org/eclipse/oomph/setup/jdt/JDTPackage.java
@@ -187,13 +187,49 @@
   int JRE_TASK__LOCATION = SetupPackage.SETUP_TASK_FEATURE_COUNT + 1;
 
   /**
+   * The feature id for the '<em><b>Name</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int JRE_TASK__NAME = SetupPackage.SETUP_TASK_FEATURE_COUNT + 2;
+
+  /**
+   * The feature id for the '<em><b>VM Install Type</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int JRE_TASK__VM_INSTALL_TYPE = SetupPackage.SETUP_TASK_FEATURE_COUNT + 3;
+
+  /**
+   * The feature id for the '<em><b>Execution Environment Default</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int JRE_TASK__EXECUTION_ENVIRONMENT_DEFAULT = SetupPackage.SETUP_TASK_FEATURE_COUNT + 4;
+
+  /**
+   * The feature id for the '<em><b>VM Arguments</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int JRE_TASK__VM_ARGUMENTS = SetupPackage.SETUP_TASK_FEATURE_COUNT + 5;
+
+  /**
    * The number of structural features of the '<em>JRE Task</em>' class.
    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
    * @generated
    * @ordered
    */
-  int JRE_TASK_FEATURE_COUNT = SetupPackage.SETUP_TASK_FEATURE_COUNT + 2;
+  int JRE_TASK_FEATURE_COUNT = SetupPackage.SETUP_TASK_FEATURE_COUNT + 6;
 
   /**
    * Returns the meta object for class '{@link org.eclipse.oomph.setup.jdt.JRETask <em>JRE Task</em>}'.
@@ -228,6 +264,50 @@
   EAttribute getJRETask_Location();
 
   /**
+   * Returns the meta object for the attribute '{@link org.eclipse.oomph.setup.jdt.JRETask#getName <em>Name</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Name</em>'.
+   * @see org.eclipse.oomph.setup.jdt.JRETask#getName()
+   * @see #getJRETask()
+   * @generated
+   */
+  EAttribute getJRETask_Name();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.oomph.setup.jdt.JRETask#getVMInstallType <em>VM Install Type</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>VM Install Type</em>'.
+   * @see org.eclipse.oomph.setup.jdt.JRETask#getVMInstallType()
+   * @see #getJRETask()
+   * @generated
+   */
+  EAttribute getJRETask_VMInstallType();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.oomph.setup.jdt.JRETask#isExecutionEnvironmentDefault <em>Execution Environment Default</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Execution Environment Default</em>'.
+   * @see org.eclipse.oomph.setup.jdt.JRETask#isExecutionEnvironmentDefault()
+   * @see #getJRETask()
+   * @generated
+   */
+  EAttribute getJRETask_ExecutionEnvironmentDefault();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.oomph.setup.jdt.JRETask#getVMArguments <em>VM Arguments</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>VM Arguments</em>'.
+   * @see org.eclipse.oomph.setup.jdt.JRETask#getVMArguments()
+   * @see #getJRETask()
+   * @generated
+   */
+  EAttribute getJRETask_VMArguments();
+
+  /**
    * Returns the factory that creates the instances of the model.
    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
@@ -276,6 +356,38 @@
      */
     EAttribute JRE_TASK__LOCATION = eINSTANCE.getJRETask_Location();
 
+    /**
+     * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute JRE_TASK__NAME = eINSTANCE.getJRETask_Name();
+
+    /**
+     * The meta object literal for the '<em><b>VM Install Type</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute JRE_TASK__VM_INSTALL_TYPE = eINSTANCE.getJRETask_VMInstallType();
+
+    /**
+     * The meta object literal for the '<em><b>Execution Environment Default</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute JRE_TASK__EXECUTION_ENVIRONMENT_DEFAULT = eINSTANCE.getJRETask_ExecutionEnvironmentDefault();
+
+    /**
+     * The meta object literal for the '<em><b>VM Arguments</b></em>' attribute feature.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    EAttribute JRE_TASK__VM_ARGUMENTS = eINSTANCE.getJRETask_VMArguments();
+
   }
 
 } // JDTPackage
diff --git a/plugins/org.eclipse.oomph.setup.jdt/src/org/eclipse/oomph/setup/jdt/JRETask.java b/plugins/org.eclipse.oomph.setup.jdt/src/org/eclipse/oomph/setup/jdt/JRETask.java
index 833faf5..8df4e25 100644
--- a/plugins/org.eclipse.oomph.setup.jdt/src/org/eclipse/oomph/setup/jdt/JRETask.java
+++ b/plugins/org.eclipse.oomph.setup.jdt/src/org/eclipse/oomph/setup/jdt/JRETask.java
@@ -23,6 +23,10 @@
  * <ul>
  *   <li>{@link org.eclipse.oomph.setup.jdt.JRETask#getVersion <em>Version</em>}</li>
  *   <li>{@link org.eclipse.oomph.setup.jdt.JRETask#getLocation <em>Location</em>}</li>
+ *   <li>{@link org.eclipse.oomph.setup.jdt.JRETask#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.oomph.setup.jdt.JRETask#getVMInstallType <em>VM Install Type</em>}</li>
+ *   <li>{@link org.eclipse.oomph.setup.jdt.JRETask#isExecutionEnvironmentDefault <em>Execution Environment Default</em>}</li>
+ *   <li>{@link org.eclipse.oomph.setup.jdt.JRETask#getVMArguments <em>VM Arguments</em>}</li>
  * </ul>
  *
  * @see org.eclipse.oomph.setup.jdt.JDTPackage#getJRETask()
@@ -35,7 +39,7 @@
  *        annotation="http://www.eclipse.org/oomph/setup/Variable name='jre.location-1.6' type='JRE' label='JRE 1.6 Location' description='The location of a JDK or JRE compatible with Java 1.6.'"
  *        annotation="http://www.eclipse.org/oomph/setup/Variable name='jre.location-1.7' type='JRE' label='JRE 1.7 Location' description='The location of a JDK or JRE compatible with Java 1.7.'"
  *        annotation="http://www.eclipse.org/oomph/setup/Variable name='jre.location-1.8' type='JRE' label='JRE 1.8 Location' description='The location of a JDK or JRE compatible with Java 1.8.'"
- *        annotation="http://www.eclipse.org/oomph/setup/Variable name='jre.location-1.9' type='JRE' label='JRE 1.9 Location' description='The location of a JDK or JRE compatible with Java 1.9.'"
+ *        annotation="http://www.eclipse.org/oomph/setup/Variable name='jre.location-9' type='JRE' label='JRE 9 Location' description='The location of a JDK or JRE compatible with Java 9.'"
  * @generated
  */
 public interface JRETask extends SetupTask
@@ -92,4 +96,111 @@
    */
   void setLocation(String value);
 
+  /**
+   * Returns the value of the '<em><b>Name</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Name</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Name</em>' attribute.
+   * @see #setName(String)
+   * @see org.eclipse.oomph.setup.jdt.JDTPackage#getJRETask_Name()
+   * @model
+   * @generated
+   */
+  String getName();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.oomph.setup.jdt.JRETask#getName <em>Name</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Name</em>' attribute.
+   * @see #getName()
+   * @generated
+   */
+  void setName(String value);
+
+  /**
+   * Returns the value of the '<em><b>VM Install Type</b></em>' attribute.
+   * The default value is <code>"org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType"</code>.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>VM Install Type</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>VM Install Type</em>' attribute.
+   * @see #setVMInstallType(String)
+   * @see org.eclipse.oomph.setup.jdt.JDTPackage#getJRETask_VMInstallType()
+   * @model default="org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType" required="true"
+   *        extendedMetaData="kind='attribute' name='vmInstallType'"
+   * @generated
+   */
+  String getVMInstallType();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.oomph.setup.jdt.JRETask#getVMInstallType <em>VM Install Type</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>VM Install Type</em>' attribute.
+   * @see #getVMInstallType()
+   * @generated
+   */
+  void setVMInstallType(String value);
+
+  /**
+   * Returns the value of the '<em><b>Execution Environment Default</b></em>' attribute.
+   * The default value is <code>"true"</code>.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>Execution Environment Default</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Execution Environment Default</em>' attribute.
+   * @see #setExecutionEnvironmentDefault(boolean)
+   * @see org.eclipse.oomph.setup.jdt.JDTPackage#getJRETask_ExecutionEnvironmentDefault()
+   * @model default="true"
+   * @generated
+   */
+  boolean isExecutionEnvironmentDefault();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.oomph.setup.jdt.JRETask#isExecutionEnvironmentDefault <em>Execution Environment Default</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Execution Environment Default</em>' attribute.
+   * @see #isExecutionEnvironmentDefault()
+   * @generated
+   */
+  void setExecutionEnvironmentDefault(boolean value);
+
+  /**
+   * Returns the value of the '<em><b>VM Arguments</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <p>
+   * If the meaning of the '<em>VM Arguments</em>' attribute isn't clear,
+   * there really should be more of a description here...
+   * </p>
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>VM Arguments</em>' attribute.
+   * @see #setVMArguments(String)
+   * @see org.eclipse.oomph.setup.jdt.JDTPackage#getJRETask_VMArguments()
+   * @model extendedMetaData="kind='attribute' name='vmArguments'"
+   * @generated
+   */
+  String getVMArguments();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.oomph.setup.jdt.JRETask#getVMArguments <em>VM Arguments</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>VM Arguments</em>' attribute.
+   * @see #getVMArguments()
+   * @generated
+   */
+  void setVMArguments(String value);
+
 } // JRETask
diff --git a/plugins/org.eclipse.oomph.setup.jdt/src/org/eclipse/oomph/setup/jdt/impl/JDTPackageImpl.java b/plugins/org.eclipse.oomph.setup.jdt/src/org/eclipse/oomph/setup/jdt/impl/JDTPackageImpl.java
index ba93484..d501f15 100644
--- a/plugins/org.eclipse.oomph.setup.jdt/src/org/eclipse/oomph/setup/jdt/impl/JDTPackageImpl.java
+++ b/plugins/org.eclipse.oomph.setup.jdt/src/org/eclipse/oomph/setup/jdt/impl/JDTPackageImpl.java
@@ -141,6 +141,46 @@
    * <!-- end-user-doc -->
    * @generated
    */
+  public EAttribute getJRETask_Name()
+  {
+    return (EAttribute)jreTaskEClass.getEStructuralFeatures().get(2);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getJRETask_VMInstallType()
+  {
+    return (EAttribute)jreTaskEClass.getEStructuralFeatures().get(3);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getJRETask_ExecutionEnvironmentDefault()
+  {
+    return (EAttribute)jreTaskEClass.getEStructuralFeatures().get(4);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EAttribute getJRETask_VMArguments()
+  {
+    return (EAttribute)jreTaskEClass.getEStructuralFeatures().get(5);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
   public JDTFactory getJDTFactory()
   {
     return (JDTFactory)getEFactoryInstance();
@@ -172,6 +212,10 @@
     jreTaskEClass = createEClass(JRE_TASK);
     createEAttribute(jreTaskEClass, JRE_TASK__VERSION);
     createEAttribute(jreTaskEClass, JRE_TASK__LOCATION);
+    createEAttribute(jreTaskEClass, JRE_TASK__NAME);
+    createEAttribute(jreTaskEClass, JRE_TASK__VM_INSTALL_TYPE);
+    createEAttribute(jreTaskEClass, JRE_TASK__EXECUTION_ENVIRONMENT_DEFAULT);
+    createEAttribute(jreTaskEClass, JRE_TASK__VM_ARGUMENTS);
   }
 
   /**
@@ -217,6 +261,14 @@
         !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
     initEAttribute(getJRETask_Location(), ecorePackage.getEString(), "location", null, 1, 1, JRETask.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
         !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getJRETask_Name(), ecorePackage.getEString(), "name", null, 0, 1, JRETask.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE,
+        !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getJRETask_VMInstallType(), ecorePackage.getEString(), "vMInstallType", "org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType", 1, 1,
+        JRETask.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getJRETask_ExecutionEnvironmentDefault(), ecorePackage.getEBoolean(), "executionEnvironmentDefault", "true", 0, 1, JRETask.class,
+        !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+    initEAttribute(getJRETask_VMArguments(), ecorePackage.getEString(), "vMArguments", null, 0, 1, JRETask.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
+        !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
     // Create resource
     createResource("http://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/models/JDT.ecore");
@@ -232,6 +284,8 @@
     createValidTriggersAnnotations();
     // http://www.eclipse.org/oomph/setup/Variable
     createVariableAnnotations();
+    // http:///org/eclipse/emf/ecore/util/ExtendedMetaData
+    createExtendedMetaDataAnnotations();
   }
 
   /**
@@ -264,7 +318,7 @@
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.6}", "label", "JRE 1.6 Location" });
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.7}", "label", "JRE 1.7 Location" });
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.8}", "label", "JRE 1.8 Location" });
-    addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.9}", "label", "JRE 1.9 Location" });
+    addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-9}", "label", "JRE 9 Location" });
     addAnnotation(jreTaskEClass, source, new String[] { "name", "jre.location-1.2", "type", "JRE", "label", "JRE 1.2 Location", "description",
         "The location of a JDK or JRE compatible with Java 1.2." });
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.3}", "label", "JRE 1.3 Location" });
@@ -273,7 +327,7 @@
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.6}", "label", "JRE 1.6 Location" });
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.7}", "label", "JRE 1.7 Location" });
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.8}", "label", "JRE 1.8 Location" });
-    addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.9}", "label", "JRE 1.9 Location" });
+    addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-9}", "label", "JRE 9 Location" });
     addAnnotation(jreTaskEClass, source, new String[] { "name", "jre.location-1.3", "type", "JRE", "label", "JRE 1.3 Location", "description",
         "The location of a JDK or JRE compatible with Java 1.3." });
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.4}", "label", "JRE 1.4 Location" });
@@ -281,34 +335,47 @@
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.6}", "label", "JRE 1.6 Location" });
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.7}", "label", "JRE 1.7 Location" });
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.8}", "label", "JRE 1.8 Location" });
-    addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.9}", "label", "JRE 1.9 Location" });
+    addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-9}", "label", "JRE 9 Location" });
     addAnnotation(jreTaskEClass, source, new String[] { "name", "jre.location-1.4", "type", "JRE", "label", "JRE 1.4 Location", "description",
         "The location of a JDK or JRE compatible with Java 1.4." });
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.5}", "label", "JRE 1.5 Location" });
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.6}", "label", "JRE 1.6 Location" });
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.7}", "label", "JRE 1.7 Location" });
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.8}", "label", "JRE 1.8 Location" });
-    addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.9}", "label", "JRE 1.9 Location" });
+    addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-9}", "label", "JRE 9 Location" });
     addAnnotation(jreTaskEClass, source, new String[] { "name", "jre.location-1.5", "type", "JRE", "label", "JRE 1.5 Location", "description",
         "The location of a JDK or JRE compatible with Java 1.5." });
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.6}", "label", "JRE 1.6 Location" });
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.7}", "label", "JRE 1.7 Location" });
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.8}", "label", "JRE 1.8 Location" });
-    addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.9}", "label", "JRE 1.9 Location" });
+    addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-9}", "label", "JRE 9 Location" });
     addAnnotation(jreTaskEClass, source, new String[] { "name", "jre.location-1.6", "type", "JRE", "label", "JRE 1.6 Location", "description",
         "The location of a JDK or JRE compatible with Java 1.6." });
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.7}", "label", "JRE 1.7 Location" });
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.8}", "label", "JRE 1.8 Location" });
-    addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.9}", "label", "JRE 1.9 Location" });
+    addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-9}", "label", "JRE 9 Location" });
     addAnnotation(jreTaskEClass, source, new String[] { "name", "jre.location-1.7", "type", "JRE", "label", "JRE 1.7 Location", "description",
         "The location of a JDK or JRE compatible with Java 1.7." });
     addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.8}", "label", "JRE 1.8 Location" });
-    addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.9}", "label", "JRE 1.9 Location" });
+    addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-9}", "label", "JRE 9 Location" });
     addAnnotation(jreTaskEClass, source, new String[] { "name", "jre.location-1.8", "type", "JRE", "label", "JRE 1.8 Location", "description",
         "The location of a JDK or JRE compatible with Java 1.8." });
-    addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-1.9}", "label", "JRE 1.9 Location" });
-    addAnnotation(jreTaskEClass, source, new String[] { "name", "jre.location-1.9", "type", "JRE", "label", "JRE 1.9 Location", "description",
-        "The location of a JDK or JRE compatible with Java 1.9." });
+    addAnnotation(jreTaskEClass, new boolean[] { true }, "Choice", new String[] { "value", "${jre.location-9}", "label", "JRE 9 Location" });
+    addAnnotation(jreTaskEClass, source, new String[] { "name", "jre.location-9", "type", "JRE", "label", "JRE 9 Location", "description",
+        "The location of a JDK or JRE compatible with Java 9." });
+  }
+
+  /**
+   * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void createExtendedMetaDataAnnotations()
+  {
+    String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";
+    addAnnotation(getJRETask_VMInstallType(), source, new String[] { "kind", "attribute", "name", "vmInstallType" });
+    addAnnotation(getJRETask_VMArguments(), source, new String[] { "kind", "attribute", "name", "vmArguments" });
   }
 
   /**
diff --git a/plugins/org.eclipse.oomph.setup.jdt/src/org/eclipse/oomph/setup/jdt/impl/JRETaskImpl.java b/plugins/org.eclipse.oomph.setup.jdt/src/org/eclipse/oomph/setup/jdt/impl/JRETaskImpl.java
index 982bf4c..3400397 100644
--- a/plugins/org.eclipse.oomph.setup.jdt/src/org/eclipse/oomph/setup/jdt/impl/JRETaskImpl.java
+++ b/plugins/org.eclipse.oomph.setup.jdt/src/org/eclipse/oomph/setup/jdt/impl/JRETaskImpl.java
@@ -10,10 +10,12 @@
  */
 package org.eclipse.oomph.setup.jdt.impl;
 
+import org.eclipse.oomph.setup.SetupTask;
 import org.eclipse.oomph.setup.SetupTaskContext;
 import org.eclipse.oomph.setup.impl.SetupTaskImpl;
 import org.eclipse.oomph.setup.jdt.JDTPackage;
 import org.eclipse.oomph.setup.jdt.JRETask;
+import org.eclipse.oomph.util.StringUtil;
 
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.ecore.EClass;
@@ -23,6 +25,7 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.launching.ExecutionArguments;
 import org.eclipse.jdt.launching.IVMInstall;
 import org.eclipse.jdt.launching.IVMInstallType;
 import org.eclipse.jdt.launching.JavaRuntime;
@@ -30,6 +33,9 @@
 import org.eclipse.jdt.launching.environments.IExecutionEnvironment;
 
 import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * <!-- begin-user-doc -->
@@ -41,6 +47,10 @@
  * <ul>
  *   <li>{@link org.eclipse.oomph.setup.jdt.impl.JRETaskImpl#getVersion <em>Version</em>}</li>
  *   <li>{@link org.eclipse.oomph.setup.jdt.impl.JRETaskImpl#getLocation <em>Location</em>}</li>
+ *   <li>{@link org.eclipse.oomph.setup.jdt.impl.JRETaskImpl#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.oomph.setup.jdt.impl.JRETaskImpl#getVMInstallType <em>VM Install Type</em>}</li>
+ *   <li>{@link org.eclipse.oomph.setup.jdt.impl.JRETaskImpl#isExecutionEnvironmentDefault <em>Execution Environment Default</em>}</li>
+ *   <li>{@link org.eclipse.oomph.setup.jdt.impl.JRETaskImpl#getVMArguments <em>VM Arguments</em>}</li>
  * </ul>
  *
  * @generated
@@ -88,6 +98,86 @@
   protected String location = LOCATION_EDEFAULT;
 
   /**
+   * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getName()
+   * @generated
+   * @ordered
+   */
+  protected static final String NAME_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getName()
+   * @generated
+   * @ordered
+   */
+  protected String name = NAME_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #getVMInstallType() <em>VM Install Type</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getVMInstallType()
+   * @generated
+   * @ordered
+   */
+  protected static final String VM_INSTALL_TYPE_EDEFAULT = "org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType";
+
+  /**
+   * The cached value of the '{@link #getVMInstallType() <em>VM Install Type</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getVMInstallType()
+   * @generated
+   * @ordered
+   */
+  protected String vMInstallType = VM_INSTALL_TYPE_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #isExecutionEnvironmentDefault() <em>Execution Environment Default</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #isExecutionEnvironmentDefault()
+   * @generated
+   * @ordered
+   */
+  protected static final boolean EXECUTION_ENVIRONMENT_DEFAULT_EDEFAULT = true;
+
+  /**
+   * The cached value of the '{@link #isExecutionEnvironmentDefault() <em>Execution Environment Default</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #isExecutionEnvironmentDefault()
+   * @generated
+   * @ordered
+   */
+  protected boolean executionEnvironmentDefault = EXECUTION_ENVIRONMENT_DEFAULT_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #getVMArguments() <em>VM Arguments</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getVMArguments()
+   * @generated
+   * @ordered
+   */
+  protected static final String VM_ARGUMENTS_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getVMArguments() <em>VM Arguments</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getVMArguments()
+   * @generated
+   * @ordered
+   */
+  protected String vMArguments = VM_ARGUMENTS_EDEFAULT;
+
+  /**
    * <!-- begin-user-doc -->
    * <!-- end-user-doc -->
    * @generated
@@ -163,6 +253,124 @@
    * <!-- end-user-doc -->
    * @generated
    */
+  public String getNameGen()
+  {
+    return name;
+  }
+
+  public String getName()
+  {
+    String name = getNameGen();
+    if (StringUtil.isEmpty(name))
+    {
+      String version = getVersion();
+      if (!StringUtil.isEmpty(version))
+      {
+        return "JRE for " + version;
+      }
+
+      return null;
+    }
+
+    return name;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setName(String newName)
+  {
+    String oldName = name;
+    name = newName;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, JDTPackage.JRE_TASK__NAME, oldName, name));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public String getVMInstallType()
+  {
+    return vMInstallType;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setVMInstallType(String newVMInstallType)
+  {
+    String oldVMInstallType = vMInstallType;
+    vMInstallType = newVMInstallType;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, JDTPackage.JRE_TASK__VM_INSTALL_TYPE, oldVMInstallType, vMInstallType));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean isExecutionEnvironmentDefault()
+  {
+    return executionEnvironmentDefault;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setExecutionEnvironmentDefault(boolean newExecutionEnvironmentDefault)
+  {
+    boolean oldExecutionEnvironmentDefault = executionEnvironmentDefault;
+    executionEnvironmentDefault = newExecutionEnvironmentDefault;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, JDTPackage.JRE_TASK__EXECUTION_ENVIRONMENT_DEFAULT, oldExecutionEnvironmentDefault,
+          executionEnvironmentDefault));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public String getVMArguments()
+  {
+    return vMArguments;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setVMArguments(String newVMArguments)
+  {
+    String oldVMArguments = vMArguments;
+    vMArguments = newVMArguments;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, JDTPackage.JRE_TASK__VM_ARGUMENTS, oldVMArguments, vMArguments));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
   @Override
   public Object eGet(int featureID, boolean resolve, boolean coreType)
   {
@@ -172,6 +380,14 @@
         return getVersion();
       case JDTPackage.JRE_TASK__LOCATION:
         return getLocation();
+      case JDTPackage.JRE_TASK__NAME:
+        return getName();
+      case JDTPackage.JRE_TASK__VM_INSTALL_TYPE:
+        return getVMInstallType();
+      case JDTPackage.JRE_TASK__EXECUTION_ENVIRONMENT_DEFAULT:
+        return isExecutionEnvironmentDefault();
+      case JDTPackage.JRE_TASK__VM_ARGUMENTS:
+        return getVMArguments();
     }
     return super.eGet(featureID, resolve, coreType);
   }
@@ -192,6 +408,18 @@
       case JDTPackage.JRE_TASK__LOCATION:
         setLocation((String)newValue);
         return;
+      case JDTPackage.JRE_TASK__NAME:
+        setName((String)newValue);
+        return;
+      case JDTPackage.JRE_TASK__VM_INSTALL_TYPE:
+        setVMInstallType((String)newValue);
+        return;
+      case JDTPackage.JRE_TASK__EXECUTION_ENVIRONMENT_DEFAULT:
+        setExecutionEnvironmentDefault((Boolean)newValue);
+        return;
+      case JDTPackage.JRE_TASK__VM_ARGUMENTS:
+        setVMArguments((String)newValue);
+        return;
     }
     super.eSet(featureID, newValue);
   }
@@ -212,6 +440,18 @@
       case JDTPackage.JRE_TASK__LOCATION:
         setLocation(LOCATION_EDEFAULT);
         return;
+      case JDTPackage.JRE_TASK__NAME:
+        setName(NAME_EDEFAULT);
+        return;
+      case JDTPackage.JRE_TASK__VM_INSTALL_TYPE:
+        setVMInstallType(VM_INSTALL_TYPE_EDEFAULT);
+        return;
+      case JDTPackage.JRE_TASK__EXECUTION_ENVIRONMENT_DEFAULT:
+        setExecutionEnvironmentDefault(EXECUTION_ENVIRONMENT_DEFAULT_EDEFAULT);
+        return;
+      case JDTPackage.JRE_TASK__VM_ARGUMENTS:
+        setVMArguments(VM_ARGUMENTS_EDEFAULT);
+        return;
     }
     super.eUnset(featureID);
   }
@@ -230,6 +470,14 @@
         return VERSION_EDEFAULT == null ? version != null : !VERSION_EDEFAULT.equals(version);
       case JDTPackage.JRE_TASK__LOCATION:
         return LOCATION_EDEFAULT == null ? location != null : !LOCATION_EDEFAULT.equals(location);
+      case JDTPackage.JRE_TASK__NAME:
+        return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+      case JDTPackage.JRE_TASK__VM_INSTALL_TYPE:
+        return VM_INSTALL_TYPE_EDEFAULT == null ? vMInstallType != null : !VM_INSTALL_TYPE_EDEFAULT.equals(vMInstallType);
+      case JDTPackage.JRE_TASK__EXECUTION_ENVIRONMENT_DEFAULT:
+        return executionEnvironmentDefault != EXECUTION_ENVIRONMENT_DEFAULT_EDEFAULT;
+      case JDTPackage.JRE_TASK__VM_ARGUMENTS:
+        return VM_ARGUMENTS_EDEFAULT == null ? vMArguments != null : !VM_ARGUMENTS_EDEFAULT.equals(vMArguments);
     }
     return super.eIsSet(featureID);
   }
@@ -252,59 +500,158 @@
     result.append(version);
     result.append(", location: ");
     result.append(location);
+    result.append(", name: ");
+    result.append(name);
+    result.append(", vMInstallType: ");
+    result.append(vMInstallType);
+    result.append(", executionEnvironmentDefault: ");
+    result.append(executionEnvironmentDefault);
+    result.append(", vMArguments: ");
+    result.append(vMArguments);
     result.append(')');
     return result.toString();
   }
 
+  @Override
+  public Object getOverrideToken()
+  {
+    return createToken(getName());
+  }
+
+  @Override
+  public void overrideFor(SetupTask overriddenSetupTask)
+  {
+    super.overrideFor(overriddenSetupTask);
+    JRETask overriddenJRETask = (JRETask)overriddenSetupTask;
+    mergeArguments(overriddenJRETask);
+  }
+
+  private void mergeArguments(JRETask overriddenJRETask)
+  {
+    String overridingValue = sanitizeArguments(getVMArguments());
+    String overriddenValue = sanitizeArguments(overriddenJRETask.getVMArguments());
+
+    if (overridingValue != null)
+    {
+      if (overriddenValue != null)
+      {
+        setVMArguments(overriddenValue + StringUtil.NL + overridingValue);
+      }
+      else
+      {
+        setVMArguments(overridingValue);
+      }
+    }
+  }
+
+  private String sanitizeArguments(String arguments)
+  {
+    if (StringUtil.isEmpty(arguments))
+    {
+      return null;
+    }
+
+    return arguments.trim().replaceAll("(\n\r?|\r\n?)", StringUtil.NL);
+  }
+
   public boolean isNeeded(SetupTaskContext context) throws Exception
   {
-    return JREHelper.isNeeded(context, getVersion(), getLocation());
+    return JREHelper.isNeeded(context, getName(), getVersion(), getLocation(), getVMInstallType(), isExecutionEnvironmentDefault(),
+        sanitizeArguments(getVMArguments()));
   }
 
   public void perform(SetupTaskContext context) throws Exception
   {
-    JREHelper.perform(context, getVersion(), getLocation());
+    JREHelper.perform(context, getName(), getVersion(), getLocation(), getVMInstallType(), isExecutionEnvironmentDefault(),
+        sanitizeArguments(getVMArguments()));
   }
 
   private static class JREHelper
   {
-    public static void perform(SetupTaskContext context, String version, String location) throws Exception
+    public static void perform(SetupTaskContext context, String name, String version, String location, String vmInstallTypeID,
+        boolean executionEnvironmentDefault, String vmArguments) throws Exception
     {
       IVMInstallType[] types = JavaRuntime.getVMInstallTypes();
-
       for (IVMInstallType type : types)
       {
-        if ("org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType".equals(type.getId()))
+        if (vmInstallTypeID.equals(type.getId()))
         {
-          context.log("Configurating a " + version + " JRE for location " + location);
-          File installLocation = new File(location);
+          IVMInstall realVM = getVMInstall(name, vmInstallTypeID);
+          boolean setAsDefault = false;
+          VMStandin vmStandin;
+          if (realVM == null)
+          {
+            setAsDefault = true;
+            context.log("Creating " + name + " with location " + location);
 
+            vmStandin = new VMStandin(type, EcoreUtil.generateUUID());
+            vmStandin.setName(name);
+          }
+          else
+          {
+            context.log("Updating " + name + " with location " + location);
+            vmStandin = new VMStandin(realVM);
+          }
+
+          File installLocation = new File(location);
           IStatus validationStatus = type.validateInstallLocation(installLocation);
           if (!validationStatus.isOK())
           {
             throw new CoreException(validationStatus);
           }
 
-          VMStandin vmStandin = new VMStandin(type, EcoreUtil.generateUUID());
           vmStandin.setInstallLocation(installLocation);
-          vmStandin.setName("JRE for " + version);
-          IVMInstall realVM = vmStandin.convertToRealVM();
 
-          JavaRuntime.setDefaultVMInstall(realVM, new NullProgressMonitor());
+          List<String> mergedVMArguments = new ArrayList<String>();
 
-          if ("J2SE-1.4".equals(version))
+          if (vmArguments != null)
+          {
+            String[] vmArgumentsArray = new ExecutionArguments(vmArguments, "").getVMArgumentsArray();
+            if (vmArgumentsArray != null)
+            {
+              for (String vmArgument : vmArgumentsArray)
+              {
+                mergedVMArguments.add(vmArgument);
+              }
+            }
+          }
+
+          String[] vmStandinVMArguments = vmStandin.getVMArguments();
+          if (vmStandinVMArguments != null)
+          {
+            for (String vmArgument : vmStandinVMArguments)
+            {
+              if (!mergedVMArguments.contains(vmArgument))
+              {
+                mergedVMArguments.add(vmArgument);
+              }
+            }
+          }
+
+          vmStandin.setVMArguments(mergedVMArguments.toArray(new String[mergedVMArguments.size()]));
+          if (!mergedVMArguments.isEmpty())
+          {
+            context.log("Setting VM arguments of " + name + " to " + StringUtil.implode(mergedVMArguments, '\0'));
+          }
+
+          realVM = vmStandin.convertToRealVM();
+          if (setAsDefault)
+          {
+            JavaRuntime.setDefaultVMInstall(realVM, new NullProgressMonitor());
+          }
+
+          if (executionEnvironmentDefault)
           {
             IExecutionEnvironment[] executionEnvironments = JavaRuntime.getExecutionEnvironmentsManager().getExecutionEnvironments();
-
             for (IExecutionEnvironment executionEnvironment : executionEnvironments)
             {
               String id = executionEnvironment.getId();
-              if (id.equals("CDC-1.1/Foundation-1.1"))
+              if (id.equals(version) || "CDC-1.1/Foundation-1.1".equals(id) && "J2SE-1.4".equals(version))
               {
                 if (executionEnvironment.getDefaultVM() == null)
                 {
+                  context.log("Setting the default execution environment to " + name);
                   executionEnvironment.setDefaultVM(realVM);
-                  break;
                 }
               }
             }
@@ -315,22 +662,84 @@
       }
     }
 
-    public static boolean isNeeded(SetupTaskContext context, String version, String location) throws Exception
+    public static boolean isNeeded(SetupTaskContext context, String name, String version, String location, String vmInstallTypeID,
+        boolean executionEnvironmentDefault, String vmArguments) throws Exception
+    {
+      // If there is already a VM install for this name...
+      IVMInstall vmInstall = getVMInstall(name, vmInstallTypeID);
+      if (vmInstall != null)
+      {
+        // If the JRE for that name doesn't have the expected location...
+        if (!vmInstall.getInstallLocation().equals(new File(location)))
+        {
+          return true;
+        }
+
+        // If the JRE for that name doesn't have VM arguments...
+        String[] vmInstallVMArguments = vmInstall.getVMArguments();
+        if (vmInstallVMArguments == null)
+        {
+          // But there should be VM arguments...
+          if (vmArguments != null)
+          {
+            return true;
+          }
+        }
+        else if (vmArguments != null)
+        {
+          // If the argument are not all already present...
+          String[] vmArgumentsArray = new ExecutionArguments(vmArguments, "").getVMArgumentsArray();
+          if (vmArgumentsArray != null && !Arrays.asList(vmInstallVMArguments).containsAll(Arrays.asList(vmArgumentsArray)))
+          {
+            return true;
+          }
+        }
+
+        // If this JRE should be the execution environment default.
+        if (executionEnvironmentDefault)
+        {
+          IExecutionEnvironment[] executionEnvironments = JavaRuntime.getExecutionEnvironmentsManager().getExecutionEnvironments();
+          for (IExecutionEnvironment executionEnvironment : executionEnvironments)
+          {
+            String id = executionEnvironment.getId();
+            if (id.equals(version) || "CDC-1.1/Foundation-1.1".equals(id) && "J2SE-1.4".equals(version))
+            {
+              // If the corresponding execution environment has no default, then the task is still needed, even though the JRE already exists.
+              if (executionEnvironment.getDefaultVM() == null)
+              {
+                return true;
+              }
+            }
+          }
+        }
+
+        // The JRE already exists so the task isn't needed.
+        return false;
+      }
+
+      // The JRE must be created.
+      return true;
+    }
+
+    private static IVMInstall getVMInstall(String name, String vmInstallTypeID) throws Exception
     {
       for (IVMInstallType vmInstallType : JavaRuntime.getVMInstallTypes())
       {
-        for (IVMInstall vmInstall : vmInstallType.getVMInstalls())
+        if (vmInstallType.getId().equals(vmInstallTypeID))
         {
-          File installLocation = vmInstall.getInstallLocation();
-          if (new File(location).equals(installLocation))
+          for (IVMInstall vmInstall : vmInstallType.getVMInstalls())
           {
-            return false;
+            if (vmInstall.getName().equals(name))
+            {
+              return vmInstall;
+            }
           }
+
+          break;
         }
       }
 
-      return true;
+      return null;
     }
   }
-
 } // JRETaskImpl
diff --git a/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/PropertyField.java b/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/PropertyField.java
index 4263f55..9ca315c 100644
--- a/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/PropertyField.java
+++ b/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/PropertyField.java
@@ -83,7 +83,7 @@
 
   private static final String EMPTY = "";
 
-  private static final Pattern JRE_LOCATION_VARIABLE_PATTERN = Pattern.compile("\\$\\{jre\\.location-([0-9]*)\\.([0-9]*)\\}");
+  private static final Pattern JRE_LOCATION_VARIABLE_PATTERN = Pattern.compile("\\$\\{jre\\.location-([0-9]+)(?:\\.([0-9]+))?\\}");
 
   public static PropertyField createField(final VariableTask variable)
   {
@@ -111,7 +111,7 @@
       case JRE:
         if (choices.isEmpty())
         {
-          JREField jreField = new JREField(new JREFilter(1, 8, null), choices);
+          JREField jreField = new JREField(new JREFilter(9, 0, null), choices);
           return jreField;
         }
 
@@ -124,8 +124,8 @@
             if (matcher.matches())
             {
               int major = Integer.valueOf(matcher.group(1));
-              int minor = Integer.valueOf(matcher.group(2)) - 1;
-              return new JREField(new JREFilter(major, minor, null), choices);
+              int minor = matcher.group(2) == null ? -1 : Integer.valueOf(matcher.group(2)) - 1;
+              return new JREField(new JREFilter(minor == -1 ? 1 : major, minor == -1 ? major - 1 : minor, null), choices);
             }
           }
         }
@@ -1309,7 +1309,7 @@
         {
           if (jre != null && (jreFilter == null || jre.isMatch(jreFilter)))
           {
-            transferValueToControl(jre.toString(), true);
+            transferValueToControl(jre.getJavaHome().getPath(), true);
           }
         }
 
diff --git a/setups/models/JDT.ecore b/setups/models/JDT.ecore
index cfd96eb..f1ccb1f 100644
--- a/setups/models/JDT.ecore
+++ b/setups/models/JDT.ecore
@@ -46,8 +46,8 @@
         <details key="label" value="JRE 1.8 Location"/>
       </eAnnotations>
       <eAnnotations source="Choice">
-        <details key="value" value="${jre.location-1.9}"/>
-        <details key="label" value="JRE 1.9 Location"/>
+        <details key="value" value="${jre.location-9}"/>
+        <details key="label" value="JRE 9 Location"/>
       </eAnnotations>
       <details key="name" value="jre.location-1.1"/>
       <details key="type" value="JRE"/>
@@ -80,8 +80,8 @@
         <details key="label" value="JRE 1.8 Location"/>
       </eAnnotations>
       <eAnnotations source="Choice">
-        <details key="value" value="${jre.location-1.9}"/>
-        <details key="label" value="JRE 1.9 Location"/>
+        <details key="value" value="${jre.location-9}"/>
+        <details key="label" value="JRE 9 Location"/>
       </eAnnotations>
       <details key="name" value="jre.location-1.2"/>
       <details key="type" value="JRE"/>
@@ -110,8 +110,8 @@
         <details key="label" value="JRE 1.8 Location"/>
       </eAnnotations>
       <eAnnotations source="Choice">
-        <details key="value" value="${jre.location-1.9}"/>
-        <details key="label" value="JRE 1.9 Location"/>
+        <details key="value" value="${jre.location-9}"/>
+        <details key="label" value="JRE 9 Location"/>
       </eAnnotations>
       <details key="name" value="jre.location-1.3"/>
       <details key="type" value="JRE"/>
@@ -136,8 +136,8 @@
         <details key="label" value="JRE 1.8 Location"/>
       </eAnnotations>
       <eAnnotations source="Choice">
-        <details key="value" value="${jre.location-1.9}"/>
-        <details key="label" value="JRE 1.9 Location"/>
+        <details key="value" value="${jre.location-9}"/>
+        <details key="label" value="JRE 9 Location"/>
       </eAnnotations>
       <details key="name" value="jre.location-1.4"/>
       <details key="type" value="JRE"/>
@@ -158,8 +158,8 @@
         <details key="label" value="JRE 1.8 Location"/>
       </eAnnotations>
       <eAnnotations source="Choice">
-        <details key="value" value="${jre.location-1.9}"/>
-        <details key="label" value="JRE 1.9 Location"/>
+        <details key="value" value="${jre.location-9}"/>
+        <details key="label" value="JRE 9 Location"/>
       </eAnnotations>
       <details key="name" value="jre.location-1.5"/>
       <details key="type" value="JRE"/>
@@ -176,8 +176,8 @@
         <details key="label" value="JRE 1.8 Location"/>
       </eAnnotations>
       <eAnnotations source="Choice">
-        <details key="value" value="${jre.location-1.9}"/>
-        <details key="label" value="JRE 1.9 Location"/>
+        <details key="value" value="${jre.location-9}"/>
+        <details key="label" value="JRE 9 Location"/>
       </eAnnotations>
       <details key="name" value="jre.location-1.6"/>
       <details key="type" value="JRE"/>
@@ -190,8 +190,8 @@
         <details key="label" value="JRE 1.8 Location"/>
       </eAnnotations>
       <eAnnotations source="Choice">
-        <details key="value" value="${jre.location-1.9}"/>
-        <details key="label" value="JRE 1.9 Location"/>
+        <details key="value" value="${jre.location-9}"/>
+        <details key="label" value="JRE 9 Location"/>
       </eAnnotations>
       <details key="name" value="jre.location-1.7"/>
       <details key="type" value="JRE"/>
@@ -200,8 +200,8 @@
     </eAnnotations>
     <eAnnotations source="http://www.eclipse.org/oomph/setup/Variable">
       <eAnnotations source="Choice">
-        <details key="value" value="${jre.location-1.9}"/>
-        <details key="label" value="JRE 1.9 Location"/>
+        <details key="value" value="${jre.location-9}"/>
+        <details key="label" value="JRE 9 Location"/>
       </eAnnotations>
       <details key="name" value="jre.location-1.8"/>
       <details key="type" value="JRE"/>
@@ -209,14 +209,30 @@
       <details key="description" value="The location of a JDK or JRE compatible with Java 1.8."/>
     </eAnnotations>
     <eAnnotations source="http://www.eclipse.org/oomph/setup/Variable">
-      <details key="name" value="jre.location-1.9"/>
+      <details key="name" value="jre.location-9"/>
       <details key="type" value="JRE"/>
-      <details key="label" value="JRE 1.9 Location"/>
-      <details key="description" value="The location of a JDK or JRE compatible with Java 1.9."/>
+      <details key="label" value="JRE 9 Location"/>
+      <details key="description" value="The location of a JDK or JRE compatible with Java 9."/>
     </eAnnotations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="version" lowerBound="1"
         eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="location" lowerBound="1"
         eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="vMInstallType" lowerBound="1"
+        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" defaultValueLiteral="org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType">
+      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
+        <details key="kind" value="attribute"/>
+        <details key="name" value="vmInstallType"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="executionEnvironmentDefault"
+        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean" defaultValueLiteral="true"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="vMArguments" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
+      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
+        <details key="kind" value="attribute"/>
+        <details key="name" value="vmArguments"/>
+      </eAnnotations>
+    </eStructuralFeatures>
   </eClassifiers>
 </ecore:EPackage>